FILES ----- [ALL PNGS CRUNCHED, ABOUT 20545-SOMETHING LINES OMITTED.] assetmissing.png humanoid.config universe_server.config behaviors\npc\combat.behavior behaviors\npc\guard.behavior [NEW] behaviors\npc\hound.behavior behaviors\npc\merchant.behavior behaviors\npc\play.behavior behaviors\npc\react.behavior behaviors\npc\sit.behavior behaviors\npc\sleep.behavior behaviors\npc\tenant.behavior behaviors\npc\tracking.behavior behaviors\npc\wander.behavior biomes\surface_detached\spring.biome dungeons\microdungeons\biomes\forest\clearing1.json dungeons\microdungeons\biomes\forest\clearing2.json dungeons\microdungeons\biomes\forest\clearing3.json dungeons\microdungeons\biomes\forest\clearing4.json dungeons\microdungeons\biomes\forest\forestmicrodungeons.dungeon [NEW] dungeons\microdungeons\biomes\forest\forestwell1.json [NEW] dungeons\microdungeons\biomes\forest\forestwell2.json [NEW] dungeons\microdungeons\biomes\forest\forestwell3.json dungeons\microdungeons\biomes\forest\lake1.json dungeons\microdungeons\biomes\forest\lake2.json [NEW] dungeons\microdungeons\biomes\forest\lake3.json [NEW] dungeons\microdungeons\biomes\forest\largepond1.json [NEW] dungeons\microdungeons\biomes\forest\largepond2.json [NEW] dungeons\microdungeons\biomes\forest\medpond1.json [NEW] dungeons\microdungeons\biomes\forest\medpond2.json [NEW] dungeons\microdungeons\biomes\forest\medpond3.json [NEW] dungeons\microdungeons\biomes\forest\pondcamp.json [NEW] dungeons\microdungeons\biomes\forest\ruinlarge1.json [NEW] dungeons\microdungeons\biomes\forest\ruinmedium1.json [NEW] dungeons\microdungeons\biomes\forest\ruinmedium2.json [NEW] dungeons\microdungeons\biomes\forest\ruinsmall1.json [NEW] dungeons\microdungeons\biomes\forest\smallpond1.json [NEW] dungeons\microdungeons\biomes\forest\smallpond2.json [NEW] dungeons\microdungeons\biomes\forest\smallpond3.json [NEW] dungeons\microdungeons\biomes\garden\lake3.json dungeons\microdungeons\biomes\garden\wall3.json dungeons\microdungeons\biomes\garden\well3.json [NEW] dungeons\microdungeons\biomes\shroom\shroomhouse1.json [NEW] dungeons\microdungeons\biomes\spring\crittergroup1.json [NEW] dungeons\microdungeons\biomes\spring\crittergroup2.json [NEW] dungeons\microdungeons\biomes\spring\crittergroup3.json [NEW] dungeons\microdungeons\biomes\spring\largepool1.json [NEW] dungeons\microdungeons\biomes\spring\largepool2.json [NEW] dungeons\microdungeons\biomes\spring\largepool3.json [NEW] dungeons\microdungeons\biomes\spring\largepool4.json [NEW] dungeons\microdungeons\biomes\spring\largepool5.json [NEW] dungeons\microdungeons\biomes\spring\largepool6.json [NEW] dungeons\microdungeons\biomes\spring\largepool7.json dungeons\microdungeons\biomes\spring\medpool1.json [NEW] dungeons\microdungeons\biomes\spring\medpool10.json dungeons\microdungeons\biomes\spring\medpool2.json dungeons\microdungeons\biomes\spring\medpool3.json dungeons\microdungeons\biomes\spring\medpool4.json dungeons\microdungeons\biomes\spring\medpool5.json [NEW] dungeons\microdungeons\biomes\spring\medpool6.json [NEW] dungeons\microdungeons\biomes\spring\medpool7.json [NEW] dungeons\microdungeons\biomes\spring\medpool8.json [NEW] dungeons\microdungeons\biomes\spring\medpool9.json dungeons\microdungeons\biomes\spring\smallpool1.json [NEW] dungeons\microdungeons\biomes\spring\smallpool10.json dungeons\microdungeons\biomes\spring\smallpool2.json dungeons\microdungeons\biomes\spring\smallpool3.json dungeons\microdungeons\biomes\spring\smallpool4.json dungeons\microdungeons\biomes\spring\smallpool5.json [NEW] dungeons\microdungeons\biomes\spring\smallpool6.json [NEW] dungeons\microdungeons\biomes\spring\smallpool7.json [NEW] dungeons\microdungeons\biomes\spring\smallpool8.json [NEW] dungeons\microdungeons\biomes\spring\smallpool9.json npcs\bmain.lua npcs\default_reactions.config npcs\merchant.npctype npcs\merchantpools.config npcs\npc.config npcs\shroomguard.npctype npcs\shroommerchant.npctype npcs\subbiome\spring.npctype scripts\pathing.lua scripts\tenant.lua scripts\actions\reaction.lua scripts\behavior\composite.lua stagehands\coordinator\npccombat.lua [NEW] tenants\sub-biome\shroom.tenant DIFFS ----- humanoid.config 98a99,131 > "dances" : { > "posedance" : { > "states" : ["idle"], > "cycle" : 2.0, > "cyclic" : true, > "stances" : [ > // body, frontArm, backArm, headOffset, frontArmOffset, backArmOffset > [ "idle.1", "idle.1", "idle.1", [0, 0], [0, 0], [0, 0] ], > [ "idle.2", "idle.2", "idle.2", [-1, 0], [0, 0], [0, 0] ], > [ "idle.3", "idle.3", "idle.3", [-1, 0], [0, 0], [0, 0] ], > [ "idle.4", "idle.4", "idle.4", [-1, 0], [0, 0], [0, 0] ], > [ "idle.5", "idle.5", "idle.5", [0, 0], [0, 0], [0, 0] ], > [ "idle.2", "idle.5", "idle.5", [-1, 0], [0, 0], [0, 0] ], > [ "idle.4", "idle.3", "idle.3", [-1, 0], [1, 0], [1, 0] ], > [ "idle.5", "idle.2", "idle.2", [0, 0], [0, 0], [0, 0] ], > [ "idle.4", "idle.1", "idle.1", [0, 0], [0, 0], [0, 0] ], > [ "idle.5", "idle.3", "idle.3", [0, 0], [2, 0], [2, 0] ] > ] > }, > "typing" : { > "states" : ["idle"], > "cycle" : 0.5, > "cyclic" : true, > "stances" : [ > // body, frontArm, backArm, headOffset, frontArmOffset, backArmOffset > [ "idle.2", "rotation", "swimIdle.1", [0, 0], [2, 0], [-2, 0] ], > [ "idle.2", "rotation", "swimIdle.2", [-1, 0], [2, -1], [-1, 0] ], > [ "idle.2", "rotation", "swimIdle.1", [-1, 0], [1, 0], [-2, 1] ], > [ "idle.2", "rotation", "swimIdle.2", [0, 0], [1, -1], [-1, 1] ] > ] > } > }, > universe_server.config 37c37 < "terrestrialSize" : "small" --- > "terrestrialSize" : "large" behaviors\npc\combat.behavior 115c115 < "position": "" --- > "position": "targetPosition" 127,141c127,166 < "title": "moveToPosition", < "type": "action", < "name": "moveToPosition", < "parameters": { < "avoidLiquid": true, < "groundPosition": false, < "maxGround": 5, < "minGround": -10, < "position": "movePosition", < "run": true, < "failFast": false < }, < "output": { < "direction": "direction" < } --- > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "moveToPosition", > "type": "action", > "name": "moveToPosition", > "parameters": { > "avoidLiquid": true, > "groundPosition": false, > "maxGround": 5, > "minGround": -10, > "position": "movePosition", > "run": true, > "failFast": false > }, > "output": { > "direction": "direction" > } > }, > { > "title": "moveToPosition", > "type": "action", > "name": "moveToPosition", > "parameters": { > "avoidLiquid": true, > "groundPosition": true, > "maxGround": 5, > "minGround": -20, > "position": "targetPosition", > "run": true, > "failFast": false > }, > "output": { > "direction": "direction" > } > } > ] 152a178,185 > "title": "entityInSight", > "type": "action", > "name": "entityInSight", > "parameters": { > "entity": "target" > } > }, > { 228a262,286 > }, > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": { > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" > }, > "children": [ > { > "title": "hasRangedSheathed", > "type": "action", > "name": "hasRangedSheathed", > "parameters": {} > }, > { > "title": "swapItemSlots", > "type": "action", > "name": "swapItemSlots", > "parameters": {} > } > ] 592a651,658 > { > "title": "entityInSight", > "type": "action", > "name": "entityInSight", > "parameters": { > "entity": "target" > } > }, behaviors\npc\guard.behavior 2a3 > "description": "", 20a22,27 > "parameters": {} > }, > { > "type": "module", > "path": "/behaviors/npc/hound.behavior", > "title": "NPC Hound", behaviors\npc\merchant.behavior 10a11 > "/scripts/actions/entities.lua", 124,127c125,250 < "title": "wasInteracted", < "type": "action", < "name": "wasInteracted", < "parameters": {} --- > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "wasInteracted", > "type": "action", > "name": "wasInteracted", > "parameters": {} > }, > { > "title": "setEntity", > "type": "action", > "name": "setEntity", > "parameters": { > "entity": "interactionSource" > }, > "output": { > "entity": "customer" > } > }, > { > "title": "", > "type": "action", > "name": "faceEntity", > "parameters": { > "entity": "interactionSource" > } > }, > { > "title": "unsetFlag", > "type": "action", > "name": "unsetFlag", > "parameters": { > "name": "sayTout" > } > } > ] > }, > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "entityConfigParameter", > "type": "action", > "name": "entityConfigParameter", > "parameters": { > "default": -1, > "path": "noticePlayersRadius" > }, > "output": { > "number": "noticePlayersRadius" > } > }, > { > "title": "greaterThan", > "type": "action", > "name": "greaterThan", > "parameters": { > "first": "noticePlayersRadius", > "second": 0 > } > }, > { > "title": "cooldown", > "type": "decorator", > "name": "cooldown", > "parameters": { > "cooldown": 20, > "onFail": false > }, > "child": { > "title": "queryEntity", > "type": "action", > "name": "queryEntity", > "parameters": { > "entityTypes": [ > "player" > ], > "orderBy": "nearest", > "position": "self", > "range": "noticePlayersRadius", > "withoutEntity": "self" > }, > "output": { > "entity": "customer" > } > } > }, > { > "title": "entityInSight", > "type": "action", > "name": "entityInSight", > "parameters": { > "entity": "customer" > } > }, > { > "title": "", > "type": "action", > "name": "faceEntity", > "parameters": { > "entity": "customer" > } > }, > { > "title": "setFlag", > "type": "action", > "name": "setFlag", > "parameters": { > "name": "sayTout" > } > } > ] > } > ] 142,148d264 < "type": "action", < "name": "faceEntity", < "parameters": { < "entity": "interactionSource" < } < }, < { 193a310,334 > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "hasFlag", > "type": "action", > "name": "hasFlag", > "parameters": { > "name": "sayTout" > } > }, > { > "title": "sayToEntity", > "type": "action", > "name": "sayToEntity", > "parameters": { > "dialogType": "merchant.dialog.start", > "entity": "customer" > } > } > ] > }, > { 199a341,365 > }, > { > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "hasFlag", > "type": "action", > "name": "hasFlag", > "parameters": { > "name": "sayTout" > } > }, > { > "title": "sayToEntity", > "type": "action", > "name": "sayToEntity", > "parameters": { > "dialogType": "merchant.dialog.end", > "entity": "customer" > } > } > ] 210,227c376,398 < "title": "sayToEntity", < "type": "action", < "name": "sayToEntity", < "parameters": { < "dialogType": "returnToStore.dialog.follow", < "entity": "interactionSource" < } < }, < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": [ < 1, < 2 < ] < } --- > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "hasFlag", > "type": "action", > "name": "hasFlag", > "parameters": { > "name": "sayTout" > } > }, > { > "title": "sayToEntity", > "type": "action", > "name": "sayToEntity", > "parameters": { > "dialogType": "returnToStore.dialog.follow", > "entity": "customer" > } > } > ] 235,257c406,430 < "title": "selector", < "type": "composite", < "name": "selector", < "parameters": {}, < "children": [ < { < "type": "module", < "path": "/behaviors/tenant/returnhome.behavior", < "title": "/behaviors/tenant/returnhome.behavior", < "parameters": {} < }, < { < "title": "moveToPosition", < "type": "action", < "name": "moveToPosition", < "parameters": { < "avoidLiquid": true, < "groundPosition": true, < "maxGround": 5, < "minGround": -5, < "position": "spawn", < "run": false, < "failFast": false --- > "type": "module", > "path": "/behaviors/tenant/returnhome.behavior", > "title": "/behaviors/tenant/returnhome.behavior", > "parameters": {} > } > }, > { > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "hasFlag", > "type": "action", > "name": "hasFlag", > "parameters": { > "name": "sayTout" > } 259,260c432,439 < "output": { < "direction": "direction" --- > { > "title": "sayToEntity", > "type": "action", > "name": "sayToEntity", > "parameters": { > "dialogType": "returnToStore.dialog.tout", > "entity": "customer" > } 261a441,449 > ] > }, > { > "title": "sayToEntity", > "type": "action", > "name": "sayToEntity", > "parameters": { > "dialogType": "returnToStore.dialog.welcome", > "entity": "customer" 263,264c451,452 < ] < } --- > } > ] 292a481,505 > } > } > ] > }, > { > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "hasFlag", > "type": "action", > "name": "hasFlag", > "parameters": { > "name": "sayTout" > } > }, > { > "title": "sayToEntity", > "type": "action", > "name": "sayToEntity", > "parameters": { > "dialogType": "merchant.dialog.end", > "entity": "customer" behaviors\npc\play.behavior 156,167c156,211 < "title": "moveToPosition", < "type": "action", < "name": "moveToPosition", < "parameters": { < "avoidLiquid": true, < "groundPosition": true, < "maxGround": 5, < "minGround": -5, < "position": "playTarget", < "run": false, < "failFast": false < } --- > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "objectPlayStandPosition", > "type": "action", > "name": "objectPlayStandPosition", > "parameters": { > "target": "playTarget" > }, > "output": { > "position": "standPosition" > } > }, > { > "title": "moveToPosition", > "type": "action", > "name": "moveToPosition", > "parameters": { > "avoidLiquid": true, > "groundPosition": true, > "maxGround": 5, > "minGround": -5, > "position": "standPosition", > "run": false, > "failFast": false > }, > "output": { > "direction": "direction" > } > } > ] > }, > { > "title": "moveToPosition", > "type": "action", > "name": "moveToPosition", > "parameters": { > "avoidLiquid": true, > "groundPosition": true, > "maxGround": 5, > "minGround": -5, > "position": "playTarget", > "run": false, > "failFast": false > } > } > ] behaviors\npc\react.behavior 113c113 < "reactionName": "wagglearms" --- > "reactionName": "computerTyping" 117c117 < "title": "logInfo", --- > "title": "dance", 119c119 < "name": "logInfo", --- > "name": "dance", 121,129c121 < "text": "TODO arm animation" < } < }, < { < "title": "emote", < "type": "action", < "name": "emote", < "parameters": { < "emote": "blabbering" --- > "dance": "typing" behaviors\npc\sit.behavior 53a54 > "title": "", 57,58c58,59 < "success": 2, < "fail": 1 --- > "fail": 1, > "success": -1 69a71,78 > "direction": "direction" > } > }, > { > "title": "faceDirection", > "type": "action", > "name": "faceDirection", > "parameters": { behaviors\npc\sleep.behavior 66a67 > "title": "", 70,71c71,72 < "success": 2, < "fail": 1 --- > "fail": 1, > "success": -1 80a82,89 > "direction": "direction" > } > }, > { > "title": "faceDirection", > "type": "action", > "name": "faceDirection", > "parameters": { behaviors\npc\tenant.behavior 10c10,11 < "/scripts/actions/time.lua" --- > "/scripts/actions/time.lua", > "/scripts/tenant.lua" 140,143c141,207 < "type": "module", < "path": "/behaviors/tenant/returnhome.behavior", < "title": "Tenant - Return Home", < "parameters": {} --- > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": -1, > "success": 1 > }, > "children": [ > { > "type": "module", > "path": "/behaviors/tenant/returnhome.behavior", > "title": "Tenant - Return Home", > "parameters": {} > }, > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "wasInteracted", > "type": "action", > "name": "wasInteracted", > "parameters": {} > }, > { > "title": "isCarryingRent", > "type": "action", > "name": "isCarryingRent", > "parameters": {} > }, > { > "title": "spawnRentTreasure", > "type": "action", > "name": "spawnRentTreasure", > "parameters": {} > } > ] > } > ] > }, > { > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "inverter", > "type": "decorator", > "name": "inverter", > "parameters": {}, > "child": { > "title": "isCarryingRent", > "type": "action", > "name": "isCarryingRent", > "parameters": {} > } > }, > { > "title": "spawnRentTreasure", > "type": "action", > "name": "spawnRentTreasure", > "parameters": {} > } > ] behaviors\npc\tracking.behavior 2a3 > "description": "", 364c365 < "entity": "newTarget" --- > "entity": "queriedTarget" behaviors\npc\wander.behavior 84a85,92 > }, > { > "title": "faceDirection", > "type": "action", > "name": "faceDirection", > "parameters": { > "direction": "direction" > } 166a175,182 > }, > { > "title": "faceDirection", > "type": "action", > "name": "faceDirection", > "parameters": { > "direction": "direction" > } 208,267c224,249 < "title": "faceDirection", < "type": "action", < "name": "faceDirection", < "parameters": { < "direction": "direction" < } < }, < { < "title": "", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": 1, < "success": 3 < }, < "children": [ < { < "title": "Stay inside/outside", < "type": "composite", < "name": "sequence", < "parameters": {}, < "children": [ < { < "title": "", < "type": "action", < "name": "offsetDirection", < "parameters": { < "direction": "direction", < "multiplier": 2 < }, < "output": { < "position": "ahead" < } < }, < { < "type": "composite", < "name": "selector", < "parameters": {}, < "children": [ < { < "title": "Both inside", < "type": "composite", < "name": "sequence", < "parameters": {}, < "children": [ < { < "type": "action", < "name": "isInside", < "parameters": { < "position": "start" < } < }, < { < "type": "action", < "name": "isInside", < "parameters": { < "position": "ahead" < } < } < ] --- > "title": "succeeder", > "type": "decorator", > "name": "succeeder", > "parameters": {}, > "child": { > "title": "", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": 1, > "success": -1 > }, > "children": [ > { > "title": "Stay inside/outside", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "", > "type": "action", > "name": "offsetDirection", > "parameters": { > "direction": "direction", > "multiplier": 2 269,279c251,266 < { < "title": "Both outside", < "type": "composite", < "name": "sequence", < "parameters": {}, < "children": [ < { < "type": "decorator", < "name": "inverter", < "parameters": {}, < "child": { --- > "output": { > "position": "ahead" > } > }, > { > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "Both inside", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { 285,291c272,273 < } < }, < { < "type": "decorator", < "name": "inverter", < "parameters": {}, < "child": { --- > }, > { 298,301c280,354 < } < ] < } < ] --- > ] > }, > { > "title": "Both outside", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "type": "decorator", > "name": "inverter", > "parameters": {}, > "child": { > "type": "action", > "name": "isInside", > "parameters": { > "position": "start" > } > } > }, > { > "type": "decorator", > "name": "inverter", > "parameters": {}, > "child": { > "type": "action", > "name": "isInside", > "parameters": { > "position": "ahead" > } > } > } > ] > } > ] > } > ] > }, > { > "title": "", > "type": "action", > "name": "move", > "parameters": { > "direction": "direction" > } > }, > { > "title": "faceDirection", > "type": "action", > "name": "faceDirection", > "parameters": { > "direction": "direction" > } > }, > { > "title": "", > "type": "action", > "name": "openDoors", > "parameters": { > "direction": "facing", > "distance": 1.5 > } > }, > { > "title": "failer", > "type": "decorator", > "name": "failer", > "parameters": {}, > "child": { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": 4 > } 303,327d355 < ] < }, < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": 4 < } < }, < { < "title": "", < "type": "action", < "name": "move", < "parameters": { < "direction": "direction" < } < }, < { < "title": "", < "type": "action", < "name": "openDoors", < "parameters": { < "direction": "facing", < "distance": 1.5 329,330c357,358 < } < ] --- > ] > } biomes\surface_detached\spring.biome 27c27 < "grassMod" : [ "grass" ], --- > "grassMod" : [ "flowerygrass" ], 92,103d91 < }, < { < "mode" : "floor", < "priority" : 2.0, < "variants" : 1, < "distribution" : "/biomes/distributions.config:scatteredSmall", < < "type" : "tree", < "treeFoliageHueShiftMax" : 180, < "treeStemHueShiftMax" : 15, < "treeStemList" : [ "birch", "cocoa", "pine", "roottree", "something", "twisted", "wood", "giantflower" ], < "treeFoliageList" : [ "rose", "bubbles", "cloudy", "lotus", "orangeflower", "redflower", "whitepetals" ] dungeons\microdungeons\biomes\forest\clearing1.json [TMX file differences are left out for huge size.] dungeons\microdungeons\biomes\forest\clearing2.json [TMX file differences are left out for huge size.] dungeons\microdungeons\biomes\forest\clearing3.json [TMX file differences are left out for huge size.] dungeons\microdungeons\biomes\forest\clearing4.json [TMX file differences are left out for huge size.] dungeons\microdungeons\biomes\forest\forestmicrodungeons.dungeon 7c7 < "anchor" : [ "lake1", "lake2", "clearing1", "clearing2", "clearing3", "clearing4" ], --- > "anchor" : [ "lake1", "lake2", "lake3", "clearing1", "clearing2", "clearing3", "clearing4", "ruinsmall1" ], 30a31,37 > "name" : "lake3", > "rules" : [ > [ "maxSpawnCount", [1] ] > ], > "def" : [ "tmx", "lake3.json" ] > }, > { 56a64,70 > }, > { > "name" : "ruinsmall1", > "rules" : [ > [ "maxSpawnCount", [1] ] > ], > "def" : [ "tmx", "ruinsmall1.json" ] dungeons\microdungeons\biomes\forest\lake1.json [TMX file differences are left out for huge size.] dungeons\microdungeons\biomes\forest\lake2.json [TMX file differences are left out for huge size.] dungeons\microdungeons\biomes\garden\wall3.json [TMX file differences are left out for huge size.] dungeons\microdungeons\biomes\garden\well3.json [TMX file differences are left out for huge size.] dungeons\microdungeons\biomes\spring\medpool1.json [TMX file differences are left out for huge size.] dungeons\microdungeons\biomes\spring\medpool2.json [TMX file differences are left out for huge size.] dungeons\microdungeons\biomes\spring\medpool3.json [TMX file differences are left out for huge size.] dungeons\microdungeons\biomes\spring\medpool4.json [TMX file differences are left out for huge size.] dungeons\microdungeons\biomes\spring\medpool5.json [TMX file differences are left out for huge size.] dungeons\microdungeons\biomes\spring\smallpool1.json [TMX file differences are left out for huge size.] dungeons\microdungeons\biomes\spring\smallpool2.json [TMX file differences are left out for huge size.] dungeons\microdungeons\biomes\spring\smallpool3.json [TMX file differences are left out for huge size.] dungeons\microdungeons\biomes\spring\smallpool4.json [TMX file differences are left out for huge size.] dungeons\microdungeons\biomes\spring\smallpool5.json [TMX file differences are left out for huge size.] monsters\ground\smallquadruped\smallquadruped.monstertype 88,96c88 < "specialSkills" : [ "burrowSpecial" ] < }, < { < "baseSkills" : [ "meleeAttack" ], < "specialSkills" : [ "pounceAttack" ] < }, < { < "baseSkills" : [ "meleeAttack" ], < "specialSkills" : [ "chargeAttack" ] --- > "specialSkills" : [ "shockingWaveAttack", "staticDischargeAttack", "bubbleBlastAttack", "waterGunAttack", "burninghaloAttack", "gasBelchAttack", "rainbowVomitAttack", "shockingBoltAttack", "plasmaTorpedoAttack", "eyeballSprayAttack", "bloodVomitAttack", "acidicSpitAttack", "fireballAttack", "icerockShotAttack", "doubleBarbSprayAttack", "miniDragonBreathAttack", "acidSprayAttack", "beamBurstAttack", "plasmaSweepAttack", "eyeballShotAttack", "glitterAttack", "darkGravityBallAttack", "fireSwirlAttack", "rockRollAttack", "iceBlastAttack", "snotBubbleAttack", "leafyGustAttack", "mudBallAttack", "lightBallAttack", "shardSprayAttack", "blueFlameAttack", "smokeRingAttack", "putridWaveAttack", "boneRainAttack", "orbOfZotsAttack", "snotShotAttack", "fishBreathAttack", "explosivePhlegmAttack", "cellBlastAttack" ] npcs\bmain.lua 282a283,290 > function dance(args, output) > args = parseArgs(args, { > dance = nil > }) > entity.dance(args.dance) > return true > end > 343c351,378 < end \ No newline at end of file --- > end > > function entityHandItemType(entityId, slot) > local handItem = world.entityHandItem(entityId, slot) > if handItem ~= nil then > return world.itemType(handItem) > end > end > > function entityHoldingSword(args, output) > args = parseArgs(args, { > entity = nil > }) > local entityId = BData:getEntity(args.entity) > if entityId == nil then return false end > > return entityHandItemType(entityId, "primary") == "sword" or entityHandItemType(entityId, "alt") == "sword" > end > > function entityHoldingGun(args, output) > args = parseArgs(args, { > entity = nil > }) > local entityId = BData:getEntity(args.entity) > if entityId == nil then return false end > > return entityHandItemType(entityId, "primary") == "gun" or entityHandItemType(entityId, "alt") == "gun" > end npcs\default_reactions.config 6,7c6,7 < "computer" : [ < [1.0, "wagglearms"] --- > "videogame" : [ > [1.0, "computerTyping"] 9c9 < "finishedVideogame" : [ --- > "videogameComplete" : [ 10a11,14 > ], > "artwork" : [ > [1.0, "smile"], > [1.0, "love"] npcs\merchant.npctype 442a443,446 > "human" : [ > "Welcome to my store! Now, would you like to see my merchandise?", > "Here we are. Now, how can I help you?" > ], 453a458,465 > ], > "hylotl" : [ > "Now we are here, would you like to begin trading?", > "Now we are in a calmer environment, would you like to trade?" > ], > "floran" : [ > "Now you can ssspend.", > "Now do you want to ssspend pixels?" 464c476 < "Cheap buys!!!" --- > "Cheap buys!" 524,526c536,542 < "Guards! Help me!", < "Help! Guards! Help!", < "Guards! I've been accosted!" --- > "Time to flee!", > "Help! I'm being attacked!", > "I'm under attack!" > ], > "floran" : [ > "Time to ssscram!", > "Floran not have ssspear to fight back!" 529c545 < "Fear. Guards! Help me!", --- > "Fear. Help me!", 531,532c547 < "Abused. Guards! I've been accosted!", < "Afraid. Get away from me! Guards!", --- > "Afraid. Get away from me!", 539c554 < "What have you done!?" --- > "Help!" 544c559 < "Afraid. Leave me be! Guards!", --- > "Afraid. Leave me be!", 557,559c572,574 < "Encourage. Put 'em to the sword!", < "Excitement. Avenge me!", < "Aggressive. Strike him down!", --- > "Encourage. Put them to the sword!", > "Excitement. Save us!", > "Aggressive. Strike them down!", 565,567c580,587 < "Phew, I think I got away.", < "I've escaped with my life!", < "Is this the safe zone?" --- > "I think I got away.", > "Phew!", > "A close call!", > "That was close..." > ], > "floran" : [ > "Now I can sssell more ssstuff.", > "Now I'm sssafe." 572d591 < "Wishful. If only I could afford a keep.", npcs\merchantpools.config 30a31,50 > "shroommerchant" : [ > [0, [ > { "item" : { "name" : "mushroom" } }, > { "item" : { "name" : "cornseed" } }, > { "item" : { "name" : "riceseed" } }, > { "item" : { "name" : "flowerygrassseeds" } }, > { "item" : { "name" : "potatoseed" } }, > { "item" : { "name" : "carrotseed" } }, > { "item" : { "name" : "tomatoseed" } }, > { "item" : { "name" : "sugarcaneseed" } }, > { "item" : { "name" : "beakseedseed" } }, > { "item" : { "name" : "coffeeseed" } }, > { "item" : { "name" : "feathercrownseed" } }, > { "item" : { "name" : "kiwiseed" } }, > { "item" : { "name" : "grapesseed" } }, > { "item" : { "name" : "neonmelonseed" } }, > { "item" : { "name" : "grassseeds" } } > ]] > ], > npcs\npc.config 2a3 > "danceCooldown" : 2, npcs\shroomguard.npctype 57d56 < "", 64d62 < "", 75d72 < "", 86d82 < "", 97d92 < "", 108d102 < "", npcs\shroommerchant.npctype 3c3,5 < "baseType" : "merchant", --- > > "damageTeam" : 1, > "levelVariance" : [-0.5, -0.5], 7,9c9,12 < "damageTeam" : 1, < "levelVariance" : [0, 0], < --- > "scripts" : [ > "/npcs/bmain.lua" > ], > "initialScriptDelta" : 5, 10a14,23 > "behavior" : "/behaviors/npc/merchant.behavior", > "personality" : "normal", > > "idleTimeRange" : [2.0, 10.0], > > "tenant" : { > "emoteCooldownTimeRange" : [1.0, 2.0], > "complaintCooldownTimeRange" : [5.0, 10.0], > "severeComplaintTime" : 25.0, > "finalComplaintTime" : 35.0, 12c25,66 < "noticePlayersRadius" : 30.0, --- > "dialog" : { > "grumbles" : { > "tagCriteria" : { > "default" : [ > "No shroom habba homshroom?" > ] > }, > "enclosedArea" : { > "default" : [ > "Nay homshroom fix!" > ] > }, > "otherDeed" : { > "default" : [ > "Nay shropshroom mesta shropshroom!" > ] > }, > "severe" : { > "default" : [ > "Nay clink! Nay plesta!" > ] > }, > "final" : { > "default" : [ > "Nay foom, nuva shropshroom nay!" > ] > } > }, > "arrivedHome" : { > "beacon" : { > "default" : [ > "Clink?" > ] > }, > "rent" : { > "default" : [ > "Foomfoom plesta shropshroom!" > ] > } > } > } > }, 15,22c69,70 < "waitTime" : 10, < "storeRadius" : -1, < "categories" : { < "default" : [ "randomguns", "randomswords" ] < }, < "buyFactorRange" : [ 1.0, 1.0 ], < "sellFactorRange" : [ 0.2, 0.2 ], < "numItems" : 10, --- > "waitTime" : 40, > "storeRadius" : 8, 26,31c74 < "default" : [ < "Welcome to my shop.", < "See anything you like?", < "What can I do ya for?" < ], < "floran" : { --- > "default" : { 47c90 < } --- > } 48a92 > 51,54d94 < "See ya next time!" < ], < "floran" : { < "default" : [ 59,60c99,170 < ] < } --- > ] > } > }, > > > "poolsFile" : "/npcs/merchantpools.config", > "categories" : { > "default" : ["shroommerchant" ] > }, > "buyFactorRange" : [ 1.0, 1.0 ], > "sellFactorRange" : [ 0.2, 0.2 ], > "numItems" : 10 > }, > > "returnToStore" : { > "waitTime" : 10, > "waitTargetDistance" : 10, > > "dialog" : { > "follow" : { > "default" : [ > "Nay halhoom clink! Come!", > "Nab clink, come hoom shropshroom!" > ] > }, > > "welcome" : { > "default" : [ > "Halhalhoom, clinker! Exchanga habble pixels! Chop clink!", > "Halhoom megaclinker. Habba chop chop workest!" > ] > }, > > "tout" : { > "default" : [ > "Clink!", > "Chop workest!" > ] > } > } > }, > > "flee" : { > "reactionTimeRange" : [0.2, 1.0], > "safeDistance" : 100, > "safeDistanceWithGuards" : 40, > "safeTimer" : 10, > "stuckTime" : 4, > "stuckCooldown" : 10, > "dialogTimeRange" : [4, 10], > > "dialog" : { > "helpme" : { > "default" : [ > "No shopshroom chop!" > ] > }, > "helpthem" : { > "default" : [ > "Chop!" > ] > }, > "encourage" : { > "default" : [ > "Chop no shopshroom! Chop!" > ] > }, > "safe" : { > "default" : [ > "Halhoom megaclinker!", > "Halhalhoom!" > ] 65,84c175,228 < "meleeAttack" : { < "swingDistance" : 5, < "swingTime" : 0.4, < "swingCooldownTime" : 0.6, < "runThreshold" : 9, < "searchTime" : 10, < "backoffDistanceRange" : [8.0, 12.0], < "repositionCooldownTimeRange" : [2.0, 3.0] < }, < < "rangedAttack" : { < "minDistance" : 10, < "maxDistance" : 30, < "coverYOffset" : -1.5, < "coverYClearanceOffset" : 0.5, < "coverDistance" : 2.5, < "coverHideTimeRange" : [0.5, 1.0], < "coverFireTimeRange" : [1.0, 3.0], < "attackerSpacing" : 2.5, < "searchTime" : 10 --- > "sit" : { > "timeOfDayRanges" : [ [0.6, 1.0], [0.0, 0.2] ], > "moveTimeLimit" : 30, > "searchRadius" : 25, > "sitRadius" : 3, > "cooldown" : 60, > "timeRange" : [ 15, 240 ] > }, > > "sleep" : { > "searchRadius" : 15, > "lieDownRadius" : 3, > "moveToBedTimeLimit" : 10.0, > "timeOfDayRanges" : [ [ [ 0.7, 0.75 ], [ 0.95, 1.0 ] ] ], > "cooldown" : 30 > }, > > "wander" : { > "timeRange" : [1.0, 3.0], > "chatDistance" : 4, > "indoorTimeOfDayRanges" : [ [0.0, 0.2], [0.5, 1.0] ], > "indoorSearchRadius" : 60, > "indoorLookaheadDistance" : 4, > "moveToTargetTime" : 10.0, > "changeDirectionCooldown" : 2, > "dropDownChance" : 5, > "cooldown" : 10, > "maxDistanceFromSpawnPoint" : 3 > }, > > "chat" : { > "distanceRange" : [ 2.0, 4.0 ], > "conversations" : [ > [ > [ 2, "blabbering", "idle" ], > [ 1, "idle", "laugh" ], > [ 2, "idle", "blabbering" ], > [ 1, "sad", "idle" ] > ], > [ > [ 2, "idle", "blabbering" ], > [ 2, "blabbering", "happy" ], > [ 1, "wink", "laugh" ], > [ 2, "happy", "happy" ] > ], > [ > [ 2, "idle", "blabbering" ], > [ 2, "blabbering", "blabbering" ], > [ 2, "blabbering", "annoyed" ], > [ 3, "shouting", "shouting" ], > [ 2, "annoyed", "annoyed" ] > ] > ], > "cooldown" : 10 88d231 < 90,99d232 < "default" : [ < [0, [ < { < "head" : [ { "name" : "shroomhead" } ], < "chest" : [ { "name" : "florantier2chest" } ], < "legs" : [ { "name" : "florantier2pants" } ], < "sheathedprimary" : [ [ "generatedsword", 1, { "definition" : "commonbroadsword" } ] ] < } < ] ] < ], 103,106c236,247 < "head" : [ { "name" : "shroomhead" } ], < "chest" : [ { "name" : "florantier2chest" } ], < "legs" : [ { "name" : "florantier2pants" } ], < "sheathedprimary" : [ [ "generatedsword", 1, { "definition" : "commonbroadsword" } ] ] --- > "head" : [ > { "name" : "shroomhead", "parameters" : { "colorIndex" : 0 } }, > { "name" : "shroomhead2", "parameters" : { "colorIndex" : 0 } }, > { "name" : "shroomhead3", "parameters" : { "colorIndex" : 0 } }, > { "name" : "shroomhead4", "parameters" : { "colorIndex" : 0 } } > ], > "chest" : [ > { "name" : "florantier2chest", "parameters" : { "colorIndex" : 11 } } > ], > "legs" : [ > { "name" : "florantier2pants", "parameters" : { "colorIndex" : 11 } } > ] 108c249 < ] ] --- > ]] 111a253,254 > "dropPools" : [ "basicMonsterTreasure" ], > 170a314,340 > } > }, > > "persistent" : true, > > "splashConfig" : { > "splashSpeedMin" : 10.0, > "splashMinWaterLevel" : 0.4, > "splashBottomSensor" : [0, -2.0], > "splashTopSensor" : [0, 2.0], > "numSplashParticles" : 8, > "splashYVelocityFactor" : 0.2, > > "splashParticle" : { > "type" : "ember", > "position" : [0, -1], > "finalVelocity" : [0, -20], > "approach" : [0, 50], > "color" : [60, 150, 224, 100], > "size" : 4.0, > "timeToLive" : 0.5, > "destructionAction" : "shrink", > "destructionTime" : 0.2 > }, > > "splashParticleVariance" : { > "velocity" : [10, 0] npcs\subbiome\spring.npctype 219,229c219,225 < "glitch" : [ < "Excited. Now we can do business.", < "Pleased. I prefer to sell my wares at my store." < ], < "avian" : [ < "Now we can trade to our heart's content!", < "Now I can show you my wares!" < ], < "apex" : [ < "Now we are in private, we can talk business.", < "Now there is no-one to spy on us, we can trade wares." --- > "floran" : [ > "Yesss, now you can buy sssome of my ssseeds.", > "Here we are, now ssspend on some plantsss!" > ], > "hylotl" : [ > "Here we are! Now, would you like to buy some plants and seeds?", > "Welcome to my store! Now would you like to purchase some natural produce?" 235,238d230 < "Get all your goods here!", < "Everything you need, right here.", < "Hey you, come check out my goods!", < "Best deals around!", 240c232 < "Cheap buys!!!" --- > "Cheap buys!" 242,257d233 < "apex" : { < "default" : [ < "What can I sell you? Be quick about it.", < "My store accepts pixels and BigCoins.", < "By my beard, a customer!", < "Please don't sell me anything that will get me arrested." < ] < }, < < "avian" : { < "default" : [ < "Welcome, traveller. What can I sell you?", < "Buy or sell!", < "Hey there. See anything you like?" < ] < }, 267,274d242 < "glitch" : { < "default" : [ < "Friendly. Welcome to my store.", < "Cozening. You know you want to buy everything!", < "Reminder. Destroying merchandise is discouraged." < ] < }, < 300,302c268,274 < "Guards! Help me!", < "Help! Guards! Help!", < "Guards! I've been accosted!" --- > "Time to flee!", > "Help!", > "I'm under attack!" > ], > "floran" : [ > "Help Floran!", > "Sssave me!" 304,310c276,277 < "glitch" : [ < "Fear. Guards! Help me!", < "Intimidated. Please don't hurt me!", < "Abused. Guards! I've been accosted!", < "Afraid. Get away from me! Guards!", < "Terrified. Save me!", < "Shocked. No! Get away from me!" --- > "hylotl" : [ > "I need assistance!" 315c282 < "What have you done!?" --- > "Help!" 345,350c312,318 < "glitch" : [ < "Relieved. Phew, I think I got away.", < "Thankful. I've escaped with my life!", < "Wishful. If only I could afford a keep.", < "Hopeful. Am I safe?", < "Embarrassed. I think I leaked a little oil." --- > "floran" : [ > "Now I can sssell more ssseeds.", > "Now I'm sssafe." > ], > "hylotl" : [ > "Am I safe?", > "Now I can sell more of my natural produce." objects\arttrophies\paintingmonalisa\paintingmonalisa.object 31c31,37 < ] --- > ], > > "npcPlay" : { > "influence" : [ > "artwork" > ] > } objects\colony\colonydeed\colonydeed.lua 61c61,67 < world.spawnTreasure(self.position, rent.pool, getRentLevel()) --- > local primary = primaryTenant() > if self.npcsDeliverRent and primary and world.callScriptedEntity(primary, "tenant.canDeliverRent") then > world.callScriptedEntity(primary, "tenant.deliverRent", rent.pool, getRentLevel()) > else > world.spawnTreasure(self.position, rent.pool, getRentLevel()) > callTenantsHome("rent") > end 63d68 < callTenantsHome("rent") 66d70 < entity.setAnimationState("deedState", "beacon") 67a72 > entity.setAnimationState("deedState", "beacon") 203a209,219 > end > > function primaryTenant() > -- Return the entityId of the first tenant > for _,tenant in ipairs(storage.occupier.tenants) do > if tenant.uniqueId and world.findUniqueEntity(tenant.uniqueId) then > local entityId = world.loadUniqueEntity(tenant.uniqueId) > return entityId > end > end > return nil objects\colony\colonydeed\colonydeed.object 43a44 > "npcsDeliverRent" : true, //whether NPC tenants or the colonydeed should deliver the rent objects\generic\arcademachine\arcademachine.object 32,36c32,39 < "npcInfluenceSequence": [ < "computer", < "computer", < "finishedVideogame" < ], --- > "npcPlay" : { > "influence" : [ > "videogame", > "videogame", > "videogameComplete" > ], > "standPosition" : [0.0, 0.0] > }, scripts\pathing.lua 33c33 < newPather.deltaX = 1 --- > newPather.deltaX = mcontroller.facingDirection() 95c95 < moveX(self.toTarget[1], run) --- > moveX(self.toTarget[1], false) 117c117 < --Find a new path if the target position has changed and is in a different direction --- > --Find a new path if the target position has changed 119,121c119 < local toPathTarget = world.distance(self.pathTarget, mcontroller.position()) < local toTargetPosition = world.distance(self.targetPosition, mcontroller.position()) < if world.magnitude(self.targetPosition, self.pathTarget) > 4 and (toPathTarget[1] * toTargetPosition[1] < 0 or toPathTarget[2] * toTargetPosition[2] < 0) then --- > if world.magnitude(self.targetPosition, self.pathTarget) > 0 then 232c230 < moveX(self.delta[1], self.run) --- > moveX(self.delta[1], false) 275c273 < moveX(self.delta[1], options.run) --- > moveX(self.delta[1], false) 367a366 > self.pathing.deltaX = mcontroller.facingDirection() 489c488 < return mcontroller.baseParameters().runSpeed * script.updateDt() * 2 --- > return mcontroller.baseParameters().walkSpeed * script.updateDt() scripts\tenant.lua 33a34,42 > function tenant.canDeliverRent() > return world.entityType(entity.id()) == "npc" > end > > function tenant.deliverRent(pool, level) > storage.rent = {pool = pool, level = level} > tenant.returnHome("rent") > end > 47a57,73 > end > > function isCarryingRent(args, output) > args = parseArgs(args, {}) > return storage.rent ~= nil > end > > function spawnRentTreasure(args, output) > args = parseArgs(args, {}) > > if not storage.rent then > return false > end > > world.spawnTreasure(mcontroller.position(), storage.rent.pool, storage.rent.level) > storage.rent = nil > return true scripts\actions\reaction.lua 129c129 < local influences = world.callScriptedEntity(target, "entity.configParameter", "npcInfluenceSequence") --- > local influences = world.callScriptedEntity(target, "entity.configParameter", "npcPlay.influence") 132a133,154 > end > return true > end > > -- param target > -- output position > function objectPlayStandPosition(args, output) > args = parseArgs(args, { > target = "" > }) > > local target = BData:getEntity(args.target) > if target == nil then return false end > > local standPosition = world.callScriptedEntity(target, "entity.configParameter", "npcPlay.standPosition") > if standPosition == nil then return false end > standPosition[1] = standPosition[1] * world.callScriptedEntity(target, "entity.direction") > local position = world.entityPosition(target) > standPosition[1] = standPosition[1] + position[1] > standPosition[2] = standPosition[2] + position[2] > if output.position then > BData:setPosition(output.position, standPosition) scripts\behavior\composite.lua 185c185 < if i < self.current and result == "running" then --- > if i < self.current and result == "running" or result == true then stagehands\coordinator\npccombat.lua 63,64c63,69 < local startLine = {entityPosition[1] + dir * dirRanges[dir], entityPosition[2]} < local attackPosition = attackPositionInRange(startLine, entityPosition) --- > > local attackPosition, newRange = attackPositionInRange(dirRanges[dir], dir, entityPosition, world.entityPosition(ranged)) > if not attackPosition then > dir = -dir > attackPosition, newRange = attackPositionInRange(dirRanges[dir], dir, entityPosition, world.entityPosition(ranged)) or entityPosition > end > 67,68c72 < local toAttack = world.distance(attackPosition, entityPosition) < dirRanges[dir] = math.abs(toAttack[1]) - 2 --- > dirRanges[dir] = newRange or maxRange 78c82 < local groundPosition = findGroundAttackPosition(startLine, -20, 5, endLine, self.npcBounds, self.npcPoly) --- > local groundPosition = findGroundAttackPosition(startLine, -4, 4, endLine, self.npcBounds, self.npcPoly) 89,103d92 < function attackPositionInRange(startLine, endLine) < local toEnd = world.distance(endLine, startLine) < local dir = util.toDirection(toEnd[1]) < < while toEnd[1] * dir > 0 do < local attackPosition = findAttackPositionInRange(math.abs(toEnd[1]), endLine, -dir, self.npcBounds, self.npcPoly) < if attackPosition then < return attackPosition < end < startLine[1] = startLine[1] + dir < toEnd = world.distance(endLine, startLine) < end < < return endLine < end 106,109d94 < local groundRegion = { < position[1] + bounds[1], position[2] + bounds[2] - 1, < position[1] + bounds[3], position[2] + bounds[2] < } 111,112c96,103 < if world.rectTileCollision(groundRegion, {"Null", "Block", "Dynamic", "Platform"}) and collisionResolve then < return collisionResolve --- > if collisionResolve then > local groundRegion = { > collisionResolve[1] + bounds[1], collisionResolve[2] + bounds[2] - 1, > collisionResolve[1] + bounds[3], collisionResolve[2] + bounds[2] > } > if world.rectTileCollision(groundRegion, {"Null", "Block", "Dynamic", "Platform"}) then > return collisionResolve > end 124a116,125 > end > end > > function attackPositionInRange(range, direction, center, losPosition) > while range >= 0 do > local attackPosition = findAttackPositionInRange(range, center, direction, self.npcBounds, self.npcPoly) > if attackPosition and not world.lineTileCollision(losPosition, attackPosition) then > return attackPosition, range > end > range = range - 1 tiles\materials\pillarblock.material 4c4 < "particleColor" : [89, 127, 52, 255], --- > "particleColor" : [89, 89, 89, 255],