FILES ----- player.config [NEW] behaviors\monsters\unique\kluextotem.behavior behaviors\sequences\beamout.behavior [NEW] behaviors\sequences\apexmission\lanaend.behavior behaviors\sequences\apexmission\lanastart.behavior behaviors\sequences\avianmission\tonauacdoor.behavior dungeons\missions\apexmissions\apexmission1.json dungeons\missions\avianmissions\avianmission1.json dungeons\other\museum\museum.json interface\games\fossilgame\fossilgame.lua interface\games\fossilgame\generator.lua interface\games\fossilgame\level.lua interface\games\fossilgame\tileset.lua interface\games\fossilgame\tools.lua [NEW] interface\games\fossilgame\treasurechest.png interface\tooltips\filledcapturepod.png items\active\fossilhammers\fossilhammer.lua items\active\grapple\grapple.lua items\augments\back\poisonblockaugment.png items\augments\pet\bouncycollar.png items\augments\pet\damagecollar.png [NEW] items\augments\pet\default.png items\augments\pet\electricbombcollar.png items\augments\pet\firebombcollar.png items\augments\pet\ghostlycollar.png items\augments\pet\healingcollar.png items\augments\pet\healthcollar.png items\augments\pet\icebombcollar.png items\augments\pet\lightcollar.png items\augments\pet\obliviouscollar.png items\augments\pet\poisonbombcollar.png items\augments\pet\thornscollar.png items\fossils\humanoid\alpacafossil1.item items\fossils\humanoid\apexfossil1.item items\fossils\humanoid\avianfossil1.item [NEW] items\fossils\humanoid\avioscalefossil1.item [NEW] items\fossils\humanoid\avioscalefossil1icon.png [NEW] items\fossils\humanoid\avioscalefossil2.item [NEW] items\fossils\humanoid\avioscalefossil2icon.png [NEW] items\fossils\humanoid\avioscalefossil3.item [NEW] items\fossils\humanoid\avioscalefossil3icon.png items\fossils\humanoid\floaranfossil1.item items\fossils\humanoid\froggfossil1.item items\fossils\humanoid\glitchfossil1.item items\fossils\humanoid\humanfossil1.item items\fossils\humanoid\hylotlfossil1.item [NEW] items\fossils\humanoid\mysteriousfossil1.item [NEW] items\fossils\humanoid\mysteriousfossil1icon.png [NEW] items\fossils\humanoid\mysteriousfossil2.item [NEW] items\fossils\humanoid\mysteriousfossil2icon.png [NEW] items\fossils\humanoid\mysteriousfossil3.item [NEW] items\fossils\humanoid\mysteriousfossil3icon.png monsters\monster.lua monsters\boss\penguin\behavior.lua monsters\boss\penguintank\behavior.lua [NEW] monsters\mission\kluextotem\body.monsterpart [NEW] monsters\mission\kluextotem\bodylit.monsterpart [NEW] monsters\mission\kluextotem\default.frames [NEW] monsters\mission\kluextotem\kluextotem.animation [NEW] monsters\mission\kluextotem\kluextotem.monstertype [NEW] monsters\mission\kluextotem\kluextotem.png [NEW] monsters\mission\kluextotem\kluextotemlit.png npcs\bmain.lua npcs\story\lana.npctype objects\apex\classiclight\classiclight.object objects\avian\avianbench1\avianbench1.png objects\avian\avianbench1\avianbench1icon.png objects\fossils\dirtyfossils\dirtyfossil1.object objects\fossils\dirtyfossils\dirtyfossil2.object objects\fossils\dirtyfossils\dirtyfossil3.object objects\fossils\dirtyfossils\dirtyfossil4.object objects\fossils\dirtyfossils\dirtyfossil5.object objects\fossils\dirtyfossils\dirtyfossil6.object objects\fossils\dirtyfossils\dirtyfossil7.object objects\fossils\dirtyfossils\dirtyfossil8.object objects\fossils\displaystands\fossildisplay.lua objects\fossils\displaystands\fossildisplay3\fossildisplay3.png [NEW] objects\fossils\humanoidfossils\fossilavioscale\avioscalelegsdisplay.png [NEW] objects\fossils\humanoidfossils\fossilavioscale\avioscaleskulldisplay.png [NEW] objects\fossils\humanoidfossils\fossilavioscale\avioscaletorsodisplay.png [NEW] objects\fossils\humanoidfossils\fossilmysterious\mysteriouslegsdisplay.png [NEW] objects\fossils\humanoidfossils\fossilmysterious\mysteriousskulldisplay.png [NEW] objects\fossils\humanoidfossils\fossilmysterious\mysterioustorsodisplay.png objects\generic\woodenarmchair1\woodenarmchair1.object objects\generic\woodenarmchair2\woodenarmchair2.object objects\generic\woodenbed\woodenbed.object objects\generic\woodenbed2\woodenbed2.object objects\generic\woodenbookcase\woodenbookcase.object objects\generic\woodencabinet1\woodencabinet1.object objects\generic\woodencabinet2\woodencabinet2.object objects\generic\woodencabinet3\woodencabinet3.object objects\generic\woodenceilingbookcase1\woodenceilingbookcase1.object objects\generic\woodenceilingcabinet1\woodenceilingcabinet1.object objects\generic\woodenceilingcabinet2\woodenceilingcabinet2.object objects\generic\woodenchair\woodenchair.object objects\generic\woodenchest\woodenchest.object objects\generic\woodencouch1\woodencouch1.object objects\generic\woodencouch2\woodencouch2.object objects\generic\woodencrate1\woodencrate1.object objects\generic\woodencrate2\woodencrate2.object objects\generic\woodendesk\woodendesk.object objects\generic\woodendoor\woodendoor.object objects\human\bunkerpanel1\bunkerpanel1.object objects\human\prisoncontrolpanel\prisoncontrolpanel.object objects\spawner\pettether\pettethericon.png parallax\images\cityscape0\base\1.png parallax\images\cityscape1\base\1.png parallax\images\cityscape2\base\1.png parallax\images\cityscape3\base\1.png parallax\images\cityscape4\base\1.png parallax\images\cityscape5\base\1.png parallax\images\cityscape6\base\1.png projectiles\activeitems\chakram\chakramprojectile.lua projectiles\activeitems\grapplehook\grapplehook.lua projectiles\unsorted\monstercaptureenergy\monstercaptureenergy.lua radiomessages\tutorial.radiomessages [NEW] recipes\creaturecapture\pettether.recipe scripts\poly.lua scripts\vec2.lua scripts\actions\crawling.lua stagehands\mission\apexmissionbattleeffect.stagehand stats\effects\crash\crash.lua stats\effects\deathbomb\deathbombelectric.statuseffect stats\effects\deathbomb\deathbombfire.statuseffect stats\effects\deathbomb\deathbombice.statuseffect stats\effects\deathbomb\deathbombpoison.statuseffect tech\dash\airdash.tech tech\dash\blinkdash.tech tech\dash\dash.tech tech\distortionsphere\distortionsphere.lua tech\distortionsphere\distortionsphere.tech tech\distortionsphere\spikesphere.lua tech\distortionsphere\spikesphere.tech tech\distortionsphere\spikesphere.techitem DIFFS ----- player.config 528c528 < "jumpSpeed" : 20.0, --- > "jumpSpeed" : 23.0, behaviors\sequences\beamout.behavior 7,8c7,8 < "/scripts/actions/status.lua", < "/npcs/bmain.lua" --- > "/npcs/bmain.lua", > "/scripts/actions/status.lua" 61a62,67 > }, > { > "title": "setDeathParticleBurst", > "type": "action", > "name": "setDeathParticleBurst", > "parameters": {} behaviors\sequences\apexmission\lanastart.behavior 2a3 > "description": "", 5d5 < "/scripts/behavior.lua", 7a8 > "/scripts/behavior.lua", 30,32c31,33 < "title": "sequence", < "type": "composite", < "name": "sequence", --- > "title": "queryEntity", > "type": "action", > "name": "queryEntity", 34,37c35,41 < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" --- > "entityTypes": [ > "player" > ], > "orderBy": "nearest", > "position": "self", > "range": 20, > "withoutEntity": "self" 39,68c43,45 < "children": [ < { < "title": "queryEntity", < "type": "action", < "name": "queryEntity", < "parameters": { < "entityTypes": [ < "player" < ], < "orderBy": "nearest", < "position": "self", < "range": 20, < "withoutEntity": "self" < }, < "output": { < "list": "players" < } < }, < { < "title": "listGet", < "type": "action", < "name": "listGet", < "parameters": { < "list": "players" < }, < "output": { < "entity": "player" < } < } < ] --- > "output": { > "entity": "player" > } 144a122,143 > "title": "findObject", > "type": "action", > "name": "findObject", > "parameters": { > "position": "self", > "range": 5, > "orderBy": "nearest", > "name": "smallwallbutton" > }, > "output": { > "entity": "button" > } > }, > { > "title": "interactObject", > "type": "action", > "name": "interactObject", > "parameters": { > "entity": "button" > } > }, > { 179,181c178,180 < "title": "parallel", < "type": "composite", < "name": "parallel", --- > "title": "repeater", > "type": "decorator", > "name": "repeater", 183,184c182,183 < "fail": -1, < "success": 1 --- > "maxLoops": -1, > "untilSuccess": true 186,204c185,207 < "children": [ < { < "title": "failer", < "type": "decorator", < "name": "failer", < "parameters": {}, < "child": { < "title": "selector", < "type": "composite", < "name": "selector", < "parameters": {}, < "children": [ < { < "title": "entityExists", < "type": "action", < "name": "entityExists", < "parameters": { < "entity": "target" < } --- > "child": { > "title": "inverter", > "type": "decorator", > "name": "inverter", > "parameters": {}, > "child": { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": { > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" > }, > "children": [ > { > "title": "repeater", > "type": "decorator", > "name": "repeater", > "parameters": { > "maxLoops": -1, > "untilSuccess": true 206,207c209,210 < { < "title": "sequence", --- > "child": { > "title": "dynamic", 209,215c212,213 < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" < }, --- > "name": "dynamic", > "parameters": {}, 218,238c216,218 < "title": "queryEntity", < "type": "action", < "name": "queryEntity", < "parameters": { < "entityTypes": [ < "monster", < "npc" < ], < "orderBy": "nearest", < "position": "self", < "range": 40, < "withoutEntity": "self" < }, < "output": { < "list": "targets" < } < }, < { < "title": "filter", < "type": "decorator", < "name": "filter", --- > "title": "parallel", > "type": "composite", > "name": "parallel", 240,241c220,221 < "list": "targets", < "type": "entity" --- > "fail": 1, > "success": 99 243,259c223,316 < "child": { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" < }, < "children": [ < { < "title": "entityInSight", < "type": "action", < "name": "entityInSight", < "parameters": { < "entity": "filterItem" --- > "children": [ > { > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "entityExists", > "type": "action", > "name": "entityExists", > "parameters": { > "entity": "target" > } > }, > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": { > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" > }, > "children": [ > { > "title": "queryEntity", > "type": "action", > "name": "queryEntity", > "parameters": { > "entityTypes": [ > "monster", > "npc" > ], > "orderBy": "nearest", > "position": "self", > "range": 40, > "withoutEntity": "self" > }, > "output": { > "list": "targets" > } > }, > { > "title": "filter", > "type": "decorator", > "name": "filter", > "parameters": { > "list": "targets", > "type": "entity" > }, > "child": { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": { > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" > }, > "children": [ > { > "title": "entityInSight", > "type": "action", > "name": "entityInSight", > "parameters": { > "entity": "filterItem" > } > }, > { > "title": "isValidTarget", > "type": "action", > "name": "isValidTarget", > "parameters": { > "entity": "filterItem" > } > } > ] > } > }, > { > "title": "listPop", > "type": "action", > "name": "listPop", > "parameters": { > "list": "targets" > }, > "output": { > "entity": "target" > } > } > ] 261,265c318,328 < }, < { < "title": "isValidTarget", < "type": "action", < "name": "isValidTarget", --- > ] > }, > { > "title": "succeeder", > "type": "decorator", > "name": "succeeder", > "parameters": {}, > "child": { > "title": "parallel", > "type": "composite", > "name": "parallel", 267,268c330,346 < "entity": "filterItem" < } --- > "fail": -1, > "success": -1 > }, > "children": [ > { > "title": "npccombat", > "type": "module", > "name": "npccombat", > "parameters": {} > }, > { > "title": "runner", > "type": "action", > "name": "runner", > "parameters": {} > } > ] 270,318c348,349 < ] < } < }, < { < "title": "listPop", < "type": "action", < "name": "listPop", < "parameters": { < "list": "targets" < }, < "output": { < "entity": "target" < } < } < ] < } < ] < } < }, < { < "title": "repeater", < "type": "decorator", < "name": "repeater", < "parameters": { < "maxLoops": -1, < "untilSuccess": true < }, < "child": { < "title": "selector", < "type": "composite", < "name": "selector", < "parameters": {}, < "children": [ < { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": 1, < "success": -1 < }, < "children": [ < { < "title": "entityExists", < "type": "action", < "name": "entityExists", < "parameters": { < "entity": "target" < } --- > } > ] 321c352 < "title": "parallel", --- > "title": "sequence", 323c354 < "name": "parallel", --- > "name": "sequence", 325,326c356,359 < "fail": -1, < "success": -1 --- > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" 330,333c363,406 < "title": "npccombat", < "type": "module", < "name": "npccombat", < "parameters": {} --- > "title": "succeeder", > "type": "decorator", > "name": "succeeder", > "parameters": {}, > "child": { > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": 1, > "success": -1 > }, > "children": [ > { > "title": "inverter", > "type": "decorator", > "name": "inverter", > "parameters": {}, > "child": { > "title": "findObject", > "type": "action", > "name": "findObject", > "parameters": { > "position": "self", > "range": 2, > "orderBy": "nearest", > "name": "largecastledoor" > }, > "output": { > "entity": "castledoor" > } > } > }, > { > "title": "move", > "type": "action", > "name": "move", > "parameters": { > "direction": 1, > "run": true > } > } > ] > } 336c409 < "title": "runner", --- > "title": "faceDirection", 338,339c411,467 < "name": "runner", < "parameters": {} --- > "name": "faceDirection", > "parameters": { > "direction": -1 > } > }, > { > "title": "dynamic", > "type": "composite", > "name": "dynamic", > "parameters": {}, > "children": [ > { > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "entityExists", > "type": "action", > "name": "entityExists", > "parameters": { > "entity": "castledoor" > } > }, > { > "title": "inverter", > "type": "decorator", > "name": "inverter", > "parameters": {}, > "child": { > "title": "lineTileCollision", > "type": "action", > "name": "lineTileCollision", > "parameters": { > "position": "self", > "offset": [ > 4, > 0 > ], > "collisionType": [ > "Null", > "Block", > "Dynamic" > ] > } > } > } > ] > }, > { > "title": "runner", > "type": "action", > "name": "runner", > "parameters": {} > } > ] 344,358d471 < }, < { < "title": "inverter", < "type": "decorator", < "name": "inverter", < "parameters": {}, < "child": { < "title": "move", < "type": "action", < "name": "move", < "parameters": { < "direction": 1, < "run": true < } < } 360,397d472 < ] < } < } < ] < }, < { < "title": "faceDirection", < "type": "action", < "name": "faceDirection", < "parameters": { < "direction": -1 < } < }, < { < "title": "repeater", < "type": "decorator", < "name": "repeater", < "parameters": { < "maxLoops": -1, < "untilSuccess": true < }, < "child": { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": -1, < "success": 1 < }, < "children": [ < { < "title": "cooldown", < "type": "decorator", < "name": "cooldown", < "parameters": { < "cooldown": 1, < "onFail": false, < "onSuccess": true 399c474 < "child": { --- > { 405c480 < "title": "lineTileCollision", --- > "title": "entityExists", 407c482 < "name": "lineTileCollision", --- > "name": "entityExists", 409,418c484 < "position": "self", < "offset": [ < 4, < 0 < ], < "collisionType": [ < "Null", < "Block", < "Dynamic" < ] --- > "entity": "castledoor" 421,450c487 < } < }, < { < "title": "runner", < "type": "action", < "name": "runner", < "parameters": {} < } < ] < } < }, < { < "title": "repeater", < "type": "decorator", < "name": "repeater", < "parameters": { < "maxLoops": -1, < "untilSuccess": true < }, < "child": { < "title": "inverter", < "type": "decorator", < "name": "inverter", < "parameters": {}, < "child": { < "title": "selector", < "type": "composite", < "name": "selector", < "parameters": {}, < "children": [ --- > }, 452c489 < "title": "sequence", --- > "title": "selector", 454,460c491,492 < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" < }, --- > "name": "selector", > "parameters": {}, 463,530c495,506 < "title": "selector", < "type": "composite", < "name": "selector", < "parameters": {}, < "children": [ < { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" < }, < "children": [ < { < "title": "findObject", < "type": "action", < "name": "findObject", < "parameters": { < "position": "self", < "range": 5, < "orderBy": "nearest", < "name": "apexcooldoor" < } < } < ] < }, < { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" < }, < "children": [ < { < "title": "findObject", < "type": "action", < "name": "findObject", < "parameters": { < "position": "self", < "range": 5, < "orderBy": "nearest", < "name": "electricdoor" < } < } < ] < } < ] < }, < { < "title": "inverter", < "type": "decorator", < "name": "inverter", < "parameters": {}, < "child": { < "title": "move", < "type": "action", < "name": "move", < "parameters": { < "direction": 1, < "run": true < } --- > "title": "findObject", > "type": "action", > "name": "findObject", > "parameters": { > "position": "self", > "range": 5, > "orderBy": "nearest", > "name": "apexcooldoor" > }, > "output": { > "entity": "", > "list": "" 534,536c510,512 < "title": "repeater", < "type": "decorator", < "name": "repeater", --- > "title": "findObject", > "type": "action", > "name": "findObject", 538,539c514,517 < "maxLoops": -1, < "untilSuccess": true --- > "position": "self", > "range": 5, > "orderBy": "nearest", > "name": "electricdoor" 541,589c519,521 < "child": { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": -1, < "success": 1 < }, < "children": [ < { < "title": "cooldown", < "type": "decorator", < "name": "cooldown", < "parameters": { < "cooldown": 1, < "onFail": false, < "onSuccess": true < }, < "child": { < "title": "inverter", < "type": "decorator", < "name": "inverter", < "parameters": {}, < "child": { < "title": "lineTileCollision", < "type": "action", < "name": "lineTileCollision", < "parameters": { < "position": "self", < "offset": [ < 4, < 0 < ], < "collisionType": [ < "Null", < "Block", < "Dynamic" < ] < } < } < } < }, < { < "title": "runner", < "type": "action", < "name": "runner", < "parameters": {} < } < ] --- > "output": { > "entity": "", > "list": "" 592a525,563 > } > ] > } > } > }, > { > "title": "dynamic", > "type": "composite", > "name": "dynamic", > "parameters": {}, > "children": [ > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": { > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" > }, > "children": [ > { > "title": "queryEntity", > "type": "action", > "name": "queryEntity", > "parameters": { > "entityTypes": [ > "player" > ], > "orderBy": "nearest", > "position": "self", > "range": 20, > "withoutEntity": "self" > }, > "output": { > "entity": "player", > "list": "players" > } 595,625c566,572 < "title": "failer", < "type": "decorator", < "name": "failer", < "parameters": {}, < "child": { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": -1, < "success": -1 < }, < "children": [ < { < "title": "controlMove", < "type": "action", < "name": "controlMove", < "parameters": { < "direction": 1, < "run": true < } < }, < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": 0.5 < } < } < ] --- > "title": "entityInRange", > "type": "action", > "name": "entityInRange", > "parameters": { > "entity": "player", > "yRange": 3, > "position": "self" 628a576,581 > }, > { > "title": "runner", > "type": "action", > "name": "runner", > "parameters": {} 629a583,590 > ] > }, > { > "title": "faceDirection", > "type": "action", > "name": "faceDirection", > "parameters": { > "direction": 1 633c594 < "title": "swapItemSlots", --- > "title": "findObject", 635,636c596,648 < "name": "swapItemSlots", < "parameters": {} --- > "name": "findObject", > "parameters": { > "position": "self", > "range": 5, > "orderBy": "nearest", > "name": "largecastledoor" > }, > "output": { > "entity": "castledoor" > } > }, > { > "title": "succeeder", > "type": "decorator", > "name": "succeeder", > "parameters": {}, > "child": { > "title": "callScriptedEntity", > "type": "action", > "name": "callScriptedEntity", > "parameters": { > "entity": "castledoor", > "func": "openDoor" > } > } > }, > { > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": -1, > "success": -1 > }, > "children": [ > { > "title": "controlMove", > "type": "action", > "name": "controlMove", > "parameters": { > "direction": 1, > "run": false > } > }, > { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": 0.5 > } > } > ] 665,708c677,691 < "title": "dynamic", < "type": "composite", < "name": "dynamic", < "parameters": {}, < "children": [ < { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" < }, < "children": [ < { < "title": "entityInSight", < "type": "action", < "name": "entityInSight", < "parameters": { < "entity": "player" < } < }, < { < "title": "sequentialdialog", < "type": "module", < "name": "sequentialdialog", < "parameters": { < "dialogWaitTime": 4, < "dialogEndWait": 2, < "dialogKey": "dialog.lana.mid", < "dialogTarget": "player" < } < } < ] < }, < { < "title": "runner", < "type": "action", < "name": "runner", < "parameters": {} < } < ] --- > "title": "swapItemSlots", > "type": "action", > "name": "swapItemSlots", > "parameters": {} > }, > { > "title": "sequentialdialog", > "type": "module", > "name": "sequentialdialog", > "parameters": { > "dialogWaitTime": 4, > "dialogEndWait": 2, > "dialogKey": "dialog.lana.mid", > "dialogTarget": "player" > } behaviors\sequences\avianmission\tonauacdoor.behavior 2a3 > "description": "", 4c5 < "/scripts/actions/movement.lua", --- > "/scripts/actions/position.lua", 5a7 > "/scripts/actions/movement.lua", 25c27 < "title": "onGround", --- > "title": "offsetPosition", 27,28c29,39 < "name": "onGround", < "parameters": {} --- > "name": "offsetPosition", > "parameters": { > "offset": [ > 32, > -32 > ], > "position": "self" > }, > "output": { > "position": "bossPosition" > } 31,33c42,44 < "title": "sequence", < "type": "composite", < "name": "sequence", --- > "title": "cooldown", > "type": "decorator", > "name": "cooldown", 35,38c46,48 < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" --- > "cooldown": 1, > "onFail": true, > "onSuccess": true 40,42c50,56 < "children": [ < { < "title": "queryEntity", --- > "child": { > "title": "inverter", > "type": "decorator", > "name": "inverter", > "parameters": {}, > "child": { > "title": "findMonster", 44c58 < "name": "queryEntity", --- > "name": "findMonster", 46,48d59 < "entityTypes": [ < "player" < ], 50c61 < "position": "self", --- > "position": "bossPosition", 52,55c63,64 < "withoutEntity": "self" < }, < "output": { < "list": "players" --- > "type": "kluextotem", > "orderby": "nearest" 56a66,82 > } > } > }, > { > "title": "succeeder", > "type": "decorator", > "name": "succeeder", > "parameters": {}, > "child": { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": { > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" 58,67c84,86 < { < "title": "filter", < "type": "decorator", < "name": "filter", < "parameters": { < "list": "players", < "type": "entity" < }, < "child": { < "title": "entityInSight", --- > "children": [ > { > "title": "findObject", 69c88 < "name": "entityInSight", --- > "name": "findObject", 71c90,111 < "entity": "filterItem" --- > "position": "self", > "range": 10, > "orderBy": "nearest", > "name": "bardoor2sideways" > }, > "output": { > "entity": "hatch" > } > }, > { > "title": "succeeder", > "type": "decorator", > "name": "succeeder", > "parameters": {}, > "child": { > "title": "callScriptedEntity", > "type": "action", > "name": "callScriptedEntity", > "parameters": { > "entity": "hatch", > "func": "openDoor" > } 74c114,128 < }, --- > ] > } > }, > { > "title": "onGround", > "type": "action", > "name": "onGround", > "parameters": {} > }, > { > "title": "dynamic", > "type": "composite", > "name": "dynamic", > "parameters": {}, > "children": [ 76,78c130,132 < "title": "listGet", < "type": "action", < "name": "listGet", --- > "title": "sequence", > "type": "composite", > "name": "sequence", 80c134,137 < "list": "players" --- > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" 82,84c139,191 < "output": { < "entity": "player" < } --- > "children": [ > { > "title": "queryEntity", > "type": "action", > "name": "queryEntity", > "parameters": { > "entityTypes": [ > "player" > ], > "orderBy": "nearest", > "position": "self", > "range": 20, > "withoutEntity": "self" > }, > "output": { > "list": "players" > } > }, > { > "title": "filter", > "type": "decorator", > "name": "filter", > "parameters": { > "list": "players", > "type": "entity" > }, > "child": { > "title": "entityInSight", > "type": "action", > "name": "entityInSight", > "parameters": { > "entity": "filterItem" > } > } > }, > { > "title": "listGet", > "type": "action", > "name": "listGet", > "parameters": { > "list": "players" > }, > "output": { > "entity": "player" > } > } > ] > }, > { > "title": "runner", > "type": "action", > "name": "runner", > "parameters": {} 177c284 < "name": "bardoor3" --- > "name": "plantdoor2" 180c287 < "entity": "bardoor" --- > "entity": "door" 193c300 < "entity": "bardoor", --- > "entity": "door", dungeons\missions\apexmissions\apexmission1.json [TMX file differences are left out for huge size.] dungeons\missions\avianmissions\avianmission1.json [TMX file differences are left out for huge size.] dungeons\other\museum\museum.json [TMX file differences are left out for huge size.] interface\games\fossilgame\fossilgame.lua 22c22 < if treaureChance or (math.random() < treaureChance) then --- > if treaureChance and (math.random() < treaureChance) then 29d28 < world.logInfo("treasureIcon=%s",self.treasureIconPath) 40,48d38 < self.level.onComplete = function() < if self.level.fossilDamaged then < lose() < else < win() < end < end < < 99a90 > self.treasureIndicator= Sprite:new("/interface/games/fossilgame/treasurechest.png", {16,16}, {1,1}) 157,161d147 < self.won = true < self.splash = self.winScreen < self.splashOffset= {0,0} < self.level:removeFossil() < console.playSound("/sfx/objects/colonydeed_partyhorn.ogg") 163,164c149,157 < self.fossilPreview = Sprite:new(root.itemConfig(self.fossilName).config.displayImage) < self.fossilPreview:fitToBox(66,66) --- > if not (self.won==true) then > self.won = true > self.splash = self.winScreen > self.splashOffset= {0,0} > self.level:removeFossil() > console.playSound("/sfx/objects/colonydeed_partyhorn.ogg") > > self.fossilPreview = Sprite:new(root.itemConfig(self.fossilName).config.displayImage) > self.fossilPreview:fitToBox(66,66) 166,167c159,161 < self.previewOffset={157-(self.fossilPreview.size[1]*self.fossilPreview.scale)/2, < 160-self.fossilPreview.size[2]*self.fossilPreview.scale} --- > self.previewOffset={157-(self.fossilPreview.size[1]*self.fossilPreview.scale)/2, > 160-self.fossilPreview.size[2]*self.fossilPreview.scale} > end 172c166,168 < self.level:removeTreasure() --- > > self.level:spawnTreasureParticles() > 177c173 < self.treasurePreview:fitToBox(50,50) --- > self.treasurePreview:fitToBox(48,48) 180c176 < 75-self.treasurePreview.size[2]*self.treasurePreview.scale} --- > 70-self.treasurePreview.size[2]*self.treasurePreview.scale} 184,187c180,185 < self.lost = true < self.splash = self.loseScreen < self.splashOffset= {0,0} < console.playSound("/sfx/interface/energy_out2.ogg") --- > if not (self.lost==true) then > self.lost = true > self.splash = self.loseScreen > self.splashOffset= {0,0} > console.playSound("/sfx/interface/energy_out2.ogg") > end 200a199 > checkWinConditions() 220a220,255 > function waitForTreasureComplete() > return (self.treasureName and self.treasureComplete==false and self.level.treasureDamaged==false) > end > > function waitForTreasureReveal() > return (self.treasureName and self.level:isTreasureCoveredByDirt() and self.level.treasureDamaged==false) > end > > > function checkWinConditions() > if self.treasureName and self.level.treasureDamaged==false then > if self.treasureComplete==false then > if self.level:isEntireTreasureUncovered() then > winTreasure() > end > end > end > > if (self.level.fossilDamaged==true) then > lose() > elseif self.level:isFossilEntirelyUncovered() and waitForTreasureComplete()==false then > win() > end > > if toolUsesRemaining()==0 then > if waitForTreasureReveal()==false then > if self.level:isFossilEntirelyUncovered() then > win() > else > lose() > end > end > end > end > > 222c257 < self.level:draw() --- > self.level:draw(not self.treasureComplete) 240c275 < console.canvasDrawText("BONUS", {position = {85, 60}, width = 88}, 12) --- > console.canvasDrawText("BONUS", {position = {83, 60}, width = 88}, 12) 260c295,299 < self.fossilCounter:draw({230, 136}) --- > self.fossilCounter:draw({225, 136}) > > if (self.treasureComplete) then > self.treasureIndicator:draw({285, 140}) > end 289,310d327 < < if (self.level.fossilDamaged==true) then < lose() < end < < if toolUsesRemaining()==0 then < if self.level:checkUnbrushedBone()==false and (not self.treasureName or self.level:checkUnbrushedTreasure()==false) then < lose() < end < -- incomplete() < end < < if self.treasureName and self.level.treasureDamaged==false then < if self.treasureComplete==false then < < if self.level:countUncoveredTreasure()>=4 then < winTreasure() < end < < end < end < 358c375 < world.sendEntityMessage(self.fossilId, "smash", false) --don't give booby prize --- > world.sendEntityMessage(self.fossilId, "smash", true) --don't give booby prize 360c377 < world.sendEntityMessage(self.fossilId, "smash", true) --give booby prize --- > world.sendEntityMessage(self.fossilId, "smash", false) --give booby prize 361a379 > interface\games\fossilgame\generator.lua 29a30,31 > -- world.logInfo("toolUses=%s",toolUses) > 100,107c102 < x=treasurePos[1] < y=treasurePos[2] < < level:addTreasure({x,y}) < level:addTreasure({x+1,y}) < level:addTreasure({x,y+1}) < level:addTreasure({x+1,y+1}) < --- > level:setTreasurePos(treasurePos) interface\games\fossilgame\level.lua 8c8 < function Level:new(size, tileSize, position, dirt, rock, bone, treasure) --- > function Level:new(size, tileSize, position, dirt, rock, bone) 20d19 < treasureLayer = TileLayer:new(size, tileSize), 22a22,26 > fossilDamaged=false, > hasTreasure=false, > treasurePos={}, > treasureDamaged=false, > 48,51d51 < self.treasureLayer:setMaterialData(self.treasureMaterial) < self.treasureLayer:fill(false) < self.treasureLayer.position = self.position < 69,70d68 < self.fossilDamaged=false < self.treasureDamaged=false 81d78 < treasureMaterial = self.treasureMaterial, 86d82 < treasureLayer = self.boneLayer.tiles, 90a87,88 > hasTreasure = self.hasTreasure, > treasurePos = self.treasurePos, 96c94 < local level = self:new(levelData.size, levelData.tileSize, levelData.position, levelData.dirtMaterial, levelData.rockMaterial, levelData.boneMaterial, leveldata.treasureMaterial) --- > local level = self:new(levelData.size, levelData.tileSize, levelData.position, levelData.dirtMaterial, levelData.rockMaterial, levelData.boneMaterial) 102d99 < level.treasureLayer.tiles = levelData.treasureLayer 106a104,105 > level.hasTreasure = levelData.hasTreasure > level.treasurePos = levelData.treasurePos 113d111 < 118d115 < 123,129d119 < if self.progress == #self.fossilTiles then < if not self.complete then < self.complete = true < if self.onComplete then self.onComplete() end < end < end < 133c123 < function Level:draw() --- > function Level:draw(showTreasure) 136c126,130 < self.treasureLayer:draw() --- > > if (self.hasTreasure==true and showTreasure==true) then > self:drawTreasure() > end > 143a138,141 > function Level:isFossilEntirelyUncovered() > return self.progress >= #self.fossilTiles > end > ----------------------------------------------------- 187a186 > -- self:spawnBoneParticles(tile) 198,200d196 < for i,tile in pairs(self.fossilTiles) do < self.boneLayer:damageTile(tile) < end 202,205d197 < console.playSound("/sfx/blocks/footstep_bone.ogg", 0, 1.0) < end < self.fossilDamaged = true < end 207,212c199,201 < function Level:checkUnbrushedBone() < for x = 0, self.size[1] - 1 do < for y = 0, self.size[2] - 1 do < if (self:dirtAt({x,y}) and self:fossilAt({x,y}) and not self:rockAt({x,y})) then < return true < end --- > for i,tile in pairs(self.fossilTiles) do > self.boneLayer:damageTile(tile) > self:spawnBoneParticles(tile) 213a203 > console.playSound("/sfx/blocks/footstep_bone.ogg", 0, 1.0) 216c206 < return false --- > self.fossilDamaged = true 217a208 > 219,221c210 < function Level:treasureAt(tilePosition) < return self.treasureLayer:tile(tilePosition) < end --- > function Level:treasureAt(tilePos) 223,224c212,213 < function Level:removeTreasure() < self.treasureLayer:fill(false) --- > return (tilePos[1]==self.treasurePos[1] or tilePos[1]==self.treasurePos[1]+1) > and (tilePos[2]==self.treasurePos[2] or tilePos[2]==self.treasurePos[2]+1) 226a216 > function Level:setTreasurePos(tilePos) 228,229c218,219 < function Level:addTreasure(tilePosition) < self.treasureLayer:setTile(tilePosition, true) --- > self.hasTreasure = true > self.treasurePos = tilePos 233,240d222 < for x = 0, self.size[1] - 1 do < for y = 0, self.size[2] - 1 do < if self:treasureAt({x,y}) then < self.treasureLayer:damageTile({x,y}) < end < end < end < 247,254c229,240 < function Level:countUncoveredTreasure() < < local count=0 < < for x = 0, self.size[1] - 1 do < for y = 0, self.size[2] - 1 do < if self:treasureAt({x,y}) and self:dirtAt({x,y})==false and self:rockAt({x,y})==false then < count=count+1 --- > function Level:isEntireTreasureUncovered() > Tx=self.treasurePos[1] > Ty=self.treasurePos[2] > > local checkPos={} > > for x = 0, 1 do > for y = 0, 1 do > checkPos[1]=Tx+x > checkPos[2]=Ty+y > if self:treasureAt(checkPos)==false or self:dirtAt(checkPos) or self:rockAt(checkPos) then > return false 259c245 < return count --- > return true 262,265c248,259 < function Level:checkUnbrushedTreasure() < for x = 0, self.size[1] - 1 do < for y = 0, self.size[2] - 1 do < if (self:dirtAt({x,y}) and self:treasureAt({x,y}) and not self:rockAt({x,y})) then --- > --this means there is treasure with mud over it but not rock > function Level:isTreasureCoveredByDirt() > Tx=self.treasurePos[1] > Ty=self.treasurePos[2] > > local checkPos={} > > for x = 0, 1 do > for y = 0, 1 do > checkPos[1]=Tx+x > checkPos[2]=Ty+y > if (self:dirtAt(checkPos) and self:treasureAt(checkPos) and not self:rockAt(checkPos)) then 274a269,281 > > ----------------------------------------------------- > function Level:drawTreasure() > local screenX = self.treasurePos[1] * self.tileSize + self.position[1] > local screenY = self.treasurePos[2] * self.tileSize + self.position[2] > local quad = {screenX, screenY, screenX + self.tileSize*2, screenY + self.tileSize*2} > > local texCoords = {0, 0, 15, 15} > console.canvasDrawImageRect("/interface/games/fossilgame/treasurechest.png", texCoords, quad, {255,255,255,255}) > if self.treasureDamaged then > console.canvasDrawImageRect("/interface/games/fossilgame/treasurechest.png", texCoords, quad, {255,0,0,255}) > end > end 296,297d302 < < 335c340 < function Level:spawnTileParticle(tilePosition, color) --- > function Level:spawnTileParticle(tilePosition, tileSize, color) 337c342 < local position = { math.random(screen[1], screen[1] + self.tileSize), math.random(screen[2], screen[2] + self.tileSize) } --- > local position = { math.random(screen[1], screen[1] + tileSize), math.random(screen[2], screen[2] + tileSize) } 348c353 < self:spawnTileParticle(tilePosition, color) --- > self:spawnTileParticle(tilePosition, self.tileSize, color) 356c361 < self:spawnTileParticle(tilePosition, color) --- > self:spawnTileParticle(tilePosition, self.tileSize, color) 359a365,379 > function Level:spawnTreasureParticles() > for i = 1, 50 do > local colorFade = math.random() > local color = {150 + colorFade * 100, 150 + colorFade * 100, 50 + colorFade * 100, 255} > self:spawnTileParticle(self.treasurePos, self.tileSize*2, color) > end > end > > function Level:spawnBoneParticles(tilePosition) > for i = 1, 10 do > local colorFade = math.random() > local color = {200 + colorFade * 100, 200 + colorFade * 100, 170 + colorFade * 100, 255} > self:spawnTileParticle(tilePosition, self.tileSize, color) > end > end interface\games\fossilgame\tileset.lua 80d79 < local layers = {} 92,96c91,93 < function TileLayer:drawTileDamage(x, y) < local screenX = x * self.tileSize + self.position[1] < local screenY = y * self.tileSize + self.position[2] < local quad = {screenX, screenY, screenX + self.tileSize, screenY + self.tileSize} < end --- > ---------------------------------------------------------------------------------- > > ---------------------------------------------------------------------------------- 102d98 < local centerQuad = {quad[1], quad[2], quad[3], quad[4]} interface\games\fossilgame\tools.lua 104c104 < world.logInfo("triggering tool=%s",self.name) --- > -- world.logInfo("triggering tool=%s",self.name) 130d129 < world.logInfo("base case") 133c132 < return uses --- > return uses or 0 135a135 > return 0 items\active\fossilhammers\fossilhammer.lua 115c115 < sb.logInfo("Checking fossil") --- > -- sb.logInfo("Checking fossil") items\active\grapple\grapple.lua 97c97 < local swingAngle = aimVector[1] > 0 and vec2.angle(aimVector) or math.pi - vec2.angle(aimVector) --- > local swingAngle = vec2.angle(aimVector) items\fossils\humanoid\alpacafossil1.item 21c21 < "apexDescription" : "The skeleton of a distant ancestor. Fine and well formed.", --- > "apexDescription" : "The skeleton of a distant ancestor. Fine and well formed.-todo-", items\fossils\humanoid\apexfossil1.item 21c21 < "apexDescription" : "The skeleton of a distant ancestor. Fine and well formed.", --- > "apexDescription" : "The skeleton of a distant ancestor. Fine and well formed.-todo-", items\fossils\humanoid\avianfossil1.item 21c21 < "apexDescription" : "The light, hollow skeleton of an Avian.", --- > "apexDescription" : "The light, hollow skeleton of an Avian.-todo-", items\fossils\humanoid\floaranfossil1.item 21c21 < "apexDescription" : "The skeleton of a Floran, the bones are like a fine grained wood.", --- > "apexDescription" : "The skeleton of a Floran, the bones are like a fine grained wood.-todo-", items\fossils\humanoid\froggfossil1.item 21c21 < "apexDescription" : "The skeleton of a distant ancestor. Fine and well formed.", --- > "apexDescription" : "The skeleton of a distant ancestor. Fine and well formed.-todo-", items\fossils\humanoid\glitchfossil1.item 21c21 < "apexDescription" : "The structural framework of a Glitch. The metal has a patina of rust.", --- > "apexDescription" : "The structural framework of a Glitch. The metal has a patina of rust.-todo-", items\fossils\humanoid\humanfossil1.item 21c21 < "apexDescription" : "The skeleton of a human. Thin, brittle, and without character.", --- > "apexDescription" : "The skeleton of a human. Thin, brittle, and without character.-todo-", items\fossils\humanoid\hylotlfossil1.item 21c21 < "apexDescription" : "The skeleton of a Hylotl. All three eye sockets are empty.", --- > "apexDescription" : "The skeleton of a Hylotl. All three eye sockets are empty.-todo-", monsters\monster.lua 411c411 < if light == nil or active == nil then return false end --- > if args.light == nil or args.active == nil then return false end monsters\boss\penguin\behavior.lua 81c81 < local desiredAimAngle = vec2.angle(toTarget) --- > local desiredAimAngle = vec2.angle({toTarget[1] * mcontroller.facingDirection(), toTarget[2]}) monsters\boss\penguintank\behavior.lua 45c45 < local targetAngle = vec2.angle(toTarget) --- > local targetAngle = vec2.angle({toTarget[1] * mcontroller.facingDirection(), toTarget[2]}) npcs\bmain.lua 51a52,53 > > self.uniqueId = config.getParameter("uniqueId") 56a59,62 > if self.uniqueId and not entity.uniqueId() then > world.setUniqueId(entity.id(), self.uniqueId) > end > npcs\story\lana.npctype 17a18 > "keepAlive" : true, 39a41,54 > ] > } > }, > "end" : { > "default" : { > "default" : [ > "Hey, it's Big Ape's artifacty thing. Let's nab it!" > ] > } > }, > "teleporter" : { > "default" : { > "default" : [ > "Smell ya later!" objects\apex\classiclight\classiclight.object 19c19 < "lightColor" : [153, 153, 130], --- > "lightColor" : [179, 179, 152], objects\fossils\dirtyfossils\dirtyfossil1.object 48c48,50 < "smashDropOptions" : [ --- > "smashDropOptions" : [ ], > > "breakDropOptions" : [ 64,65c66 < {"texturePath" : "/tiles/materials/bonematerial.png", "variants" : 9}, < {"texturePath" : "/interface/games/fossilgame/treasuretile.png", "variants" : 5}] --- > {"texturePath" : "/tiles/materials/bonematerial.png", "variants" : 9}] objects\fossils\dirtyfossils\dirtyfossil2.object 48c48,50 < "smashDropOptions" : [ --- > "smashDropOptions" : [ ], > > "breakDropOptions" : [ objects\fossils\dirtyfossils\dirtyfossil3.object 48c48,50 < "smashDropOptions" : [ --- > "smashDropOptions" : [ ], > > "breakDropOptions" : [ objects\fossils\dirtyfossils\dirtyfossil4.object 48c48,50 < "smashDropOptions" : [ --- > "smashDropOptions" : [ ], > > "breakDropOptions" : [ objects\fossils\dirtyfossils\dirtyfossil5.object 48c48,50 < "smashDropOptions" : [ --- > "smashDropOptions" : [ ], > > "breakDropOptions" : [ objects\fossils\dirtyfossils\dirtyfossil6.object 48c48,50 < "smashDropOptions" : [ --- > "smashDropOptions" : [ ], > > "breakDropOptions" : [ objects\fossils\dirtyfossils\dirtyfossil7.object 48c48,50 < "smashDropOptions" : [ --- > "smashDropOptions" : [ ], > > "breakDropOptions" : [ objects\fossils\dirtyfossils\dirtyfossil8.object 48c48,50 < "smashDropOptions" : [ --- > "smashDropOptions" : [ ], > > "breakDropOptions" : [ objects\fossils\displaystands\fossildisplay.lua 89a90 > local count=0 105c106 < --- > count=count+1 109c110 < if (#self.fossilList==0) then --- > if (count==0) then 120a122,124 > world.logInfo("fossilList4=%s",self.fossilList) > > 122a127 > objects\generic\woodenarmchair1\woodenarmchair1.object 13,14c13,14 < "floranDescription" : "Sssoft chair for Floran behind.", < "glitchDescription" : "Review. Comfort rating 80%", --- > "floranDescription" : "Sssoft chair with sssmooth wooden arms.", > "glitchDescription" : "Content. I could happily while away the hours in this chair.", 16a17 > "novakidDescription" : "An attractive lookin' armchair.", objects\generic\woodenarmchair2\woodenarmchair2.object 5,6c5,6 < "description" : "A luxurious wooden armchair.", < "shortdescription" : "Soft Wooden Armchair", --- > "description" : "A luxurious armchair.", > "shortdescription" : "Soft Armchair", 11c11 < "apexDescription" : "A wooden armchair covered in soft cushions.", --- > "apexDescription" : "An armchair covered in soft cushions.", 15,16c15,17 < "humanDescription" : "The kind of chair someone has for life.", < "hylotlDescription" : "An attractive blue.", --- > "humanDescription" : "The kind of chair you have for life.", > "hylotlDescription" : "An attractive blue hue.", > "novakidDescription" : "Soft, like sitting on a marshmallow.", objects\generic\woodenbed\woodenbed.object 13c13 < "avianDescription" : "A wooden frame and comfortable mattress.", --- > "avianDescription" : "A wooden frame and a comfortable mattress. What more could you need?", 15c15 < "glitchDescription" : "Drowsy. Power levels low. Sleep mode required.", --- > "glitchDescription" : "Drowsy. My power levels are low. This bed looks inviting.", 17a18 > "novakidDescription" : "A decent place to get some shut-eye.", objects\generic\woodenbed2\woodenbed2.object 11,12c11,12 < "apexDescription" : "A simple wooden bed, nice and comfortable.", < "avianDescription" : "A wooden frame and comfortable mattress.", --- > "apexDescription" : "A simple wooden bed, nice and comfortable.", > "avianDescription" : "A wooden frame and a comfortable mattress. What more could you need?", 14c14 < "glitchDescription" : "Drowsy. Power levels low. Sleep mode required.", --- > "glitchDescription" : "Drowsy. My power levels are low. This bed looks inviting.", 16a17 > "novakidDescription" : "A decent place to get some shut-eye.", objects\generic\woodenbookcase\woodenbookcase.object 8c8 < "description" : "Hey look at this book, 50 Shades of Green. It's about aliens.", --- > "description" : "A tall wooden bookcase full of books.", 18a19 > "novakidDescription" : "A large, plain bookcase.", objects\generic\woodencabinet1\woodencabinet1.object 8c8 < "shortdescription" : "Large Wooden Cabinet", --- > "shortdescription" : "Double Wooden Cabinet", 16c16 < "glitchDescription" : "Unimpressed. Not much storage.", --- > "glitchDescription" : "Unimpressed. Not much storage here.", 18c18,19 < "hylotlDescription" : "Small but useful.", --- > "hylotlDescription" : "Small but useful storage.", > "novakidDescription" : "Seems safe enough as far as unlocked storage goes.", objects\generic\woodencabinet2\woodencabinet2.object 16c16 < "glitchDescription" : "Content. A lot of storage space.", --- > "glitchDescription" : "Content. There is a lot of storage space inside.", 18a19 > "novakidDescription" : "There's a lot of space here for storin' things.", objects\generic\woodencabinet3\woodencabinet3.object 8c8 < "shortdescription" : "Long Wooden Cabinet", --- > "shortdescription" : "Wide Wooden Cabinet", 15,16c15,16 < "floranDescription" : "Medium ssstorage.", < "glitchDescription" : "Dry observation. Medium storage.", --- > "floranDescription" : "Medium ssize ssstorage.", > "glitchDescription" : "Neutral. A medium amount of storage.", 18a19 > "novakidDescription" : "Only two drawers? I could do with more.", objects\generic\woodenceilingbookcase1\woodenceilingbookcase1.object 9c9 < "shortdescription" : "Suspended Bookshelf", --- > "shortdescription" : "Wall Bookshelf", 13c13 < "apexDescription" : "This bookcase hangs on the wall.", --- > "apexDescription" : "A bookcase that hangs on the wall.", 16c16 < "glitchDescription" : "Comment. A bookcase for the wall.", --- > "glitchDescription" : "Delighted. A wall mounted bookcase, how charming.", 18c18,19 < "hylotlDescription" : "This sits on the wall to save space.", --- > "hylotlDescription" : "These books are mounted on the wall to save space.", > "novakidDescription" : "A great space-saving idea.", objects\generic\woodenceilingcabinet1\woodenceilingcabinet1.object 11c11 < "shortdescription" : "Suspended Cabinet", --- > "shortdescription" : "Double Wall Cabinet", 15c15 < "avianDescription" : "For storing items up high.", --- > "avianDescription" : "A wall cabinet, for storing items up high.", 17c17 < "glitchDescription" : "Approval. Suspended storage. Useful.", --- > "glitchDescription" : "Optimistic. Suspended storage. Useful.", 19a20 > "novakidDescription" : "A handy wall mounted cabinet.", objects\generic\woodenceilingcabinet2\woodenceilingcabinet2.object 11c11 < "shortdescription" : "Suspended Cabinet", --- > "shortdescription" : "Single Wall Cabinet", 15c15 < "avianDescription" : "For storing items up high.", --- > "avianDescription" : "A wall cabinet, for storing items up high.", 17c17 < "glitchDescription" : "Approval. Suspended storage. Useful.", --- > "glitchDescription" : "Optimistic. Suspended storage. Useful.", 19a20 > "novakidDescription" : "A handy wall mounted cabinet.", objects\generic\woodenchair\woodenchair.object 13,15c13,15 < "avianDescription" : "A harsh wooden chair.", < "floranDescription" : "Chair needss pillow. Floran butt get sssore.", < "glitchDescription" : "Concise. Uncomfortable.", --- > "avianDescription" : "A rough wooden chair.", > "floranDescription" : "Chair needss pillow. Thiss wood too rough.", > "glitchDescription" : "Disappointed. Uncomfortable seating.", 17c17,18 < "hylotlDescription" : "Little effort has been made to make this comfortable.", --- > "hylotlDescription" : "Little effort has been made to make this chair comfortable.", > "novakidDescription" : "I'm a fan of simple carpentry.", objects\generic\woodenchest\woodenchest.object 17c17 < "glitchDescription" : "Anticipation. What could be inside?", --- > "glitchDescription" : "Eager. What could be inside?", 19a20 > "novakidDescription" : "It's always a thrill to find an unopened chest.", objects\generic\woodencouch1\woodencouch1.object 16c16,17 < "hylotlDescription" : "A good spot for meditation.", --- > "hylotlDescription" : "Not too soft, not too firm. A good spot for meditation.", > "novakidDescription" : "A good place to sit and watch a sun go down.", objects\generic\woodencouch2\woodencouch2.object 6c6 < "shortdescription" : "Large Fluffy Couch", --- > "shortdescription" : "Soft Couch", 12c12 < "avianDescription" : "If I shall never obtain wings I would sit content here for all eternity.", --- > "avianDescription" : "I could sit content here for all eternity.", 14c14 < "glitchDescription" : "Tactile. Such softness.", --- > "glitchDescription" : "Amazed. Such softness.", 16c16,17 < "hylotlDescription" : "Such comfort. Instant Zen.", --- > "hylotlDescription" : "Such comfort. I am able to achieve instant calm.", > "novakidDescription" : "There's such a thing as too soft.", objects\generic\woodencrate1\woodencrate1.object 18c18 < "glitchDescription" : "Curiosity. Is there anything inside?", --- > "glitchDescription" : "Curious. Is there anything inside?", 20a21,22 > "novakidDescription" : "A regular wooden crate.", > objects\generic\woodencrate2\woodencrate2.object 18c18 < "glitchDescription" : "Curiosity. Is there anything inside?", --- > "glitchDescription" : "Curious. Is there anything inside?", 20a21 > "novakidDescription" : "A regular wooden crate.", objects\generic\woodendesk\woodendesk.object 16c16 < "glitchDescription" : "Observe. A place to process data.", --- > "glitchDescription" : "Calm. A place to process data.", 18c18,19 < "hylotlDescription" : "A desk at which to complete writing tasks.", --- > "hylotlDescription" : "A desk at which you can undergo written tasks.", > "novakidDescription" : "I ain't got time to sit around at a desk.", objects\generic\woodendoor\woodendoor.object 14,16c14,16 < "avianDescription" : "A hand made wooden door.", < "floranDescription" : "Floran alsso make wooden door.", < "glitchDescription" : "Observe. Appears to be a hand-made door.", --- > "avianDescription" : "A handmade wooden door.", > "floranDescription" : "Floran alsso make similar wooden door.", > "glitchDescription" : "Cheerful. It appears to be a handmade door.", 18c18,19 < "hylotlDescription" : "This door provides little in the way of security.", --- > "hylotlDescription" : "A humble wooden door.", > "novakidDescription" : "Kinda rustic lookin' but it'll do.", objects\human\bunkerpanel1\bunkerpanel1.object 10c10 < "avianDescription" : "This doesn't appear to be very scientific. The reading says the environment is \*pretty good I guess\*.", --- > "avianDescription" : "This doesn't appear to be very scientific. The reading says the environment is *pretty good I guess*.", 15c15 < "novakidDescription" : "I'm sure this data is interestin' to someone out there. That someone ain't me." --- > "novakidDescription" : "I'm sure this data is interestin' to someone out there. That someone ain't me.", objects\human\prisoncontrolpanel\prisoncontrolpanel.object 15c15 < "humanDescription" : "Tempted to gather up a bunch of prisoners then release them, just so I can yell \"Jailbreak!\", --- > "humanDescription" : "Tempted to gather up a bunch of prisoners then release them, just so I can yell \"Jailbreak!\"", projectiles\activeitems\chakram\chakramprojectile.lua 25c25 < elseif mcontroller.isSticking() then --- > elseif mcontroller.stickingDirection() then projectiles\activeitems\grapplehook\grapplehook.lua 9c9 < if mcontroller.isSticking() and projectile.timeToLive() > 0 then --- > if mcontroller.stickingDirection() and projectile.timeToLive() > 0 then 18c18 < return mcontroller.isSticking() --- > return mcontroller.stickingDirection() projectiles\unsorted\monstercaptureenergy\monstercaptureenergy.lua 18a19 > return radiomessages\tutorial.radiomessages 6c6 < "text" : "It is good that you have are eating sufficiently, but I advise that you not consume further food until your body has time to process it." --- > "text" : "It is good that you are eating sufficiently, but I advise that you not consume further food until your body has time to process it." scripts\poly.lua 1a2 > require "/scripts/util.lua" scripts\vec2.lua 69d68 < if vector[1] < 0 then angle = math.pi - angle end scripts\actions\crawling.lua 25,26c25 < < local ground, headingDirection, headingAngle = setGroundDirection(findGroundDirection()) --- > local ground, headingDirection, headingAngle = setGroundDirection(groundDirection) 29,30d27 < local controlForce = baseParameters.groundForce < local mass = baseParameters.mass stagehands\mission\apexmissionbattleeffect.stagehand 13c13,22 < "effects" : [ "invulnerable" ] --- > "effects" : [ > { > "stat" : "maxHealth", > "amount" : 10000 > }, > { > "stat" : "healthRegen", > "amount" : 10000 > } > ] stats\effects\crash\crash.lua 6,8c6,7 < local stuns = status.statusProperty("stuns", {}) < stuns["crash"] = true < status.setStatusProperty("stuns", stuns) --- > status.setResource("stunned", math.max(status.resource("stunned"), effect.duration())) > mcontroller.setVelocity({0, 0}) 12a12 > facingSuppressed = true, 18,20c18 < local stuns = status.statusProperty("stuns", {}) < stuns["crash"] = nil < status.setStatusProperty("stuns", stuns) --- > stats\effects\deathbomb\deathbombelectric.statuseffect 6c6 < "bombConfig" : "/projectiles/explosions/regularexplosion2/electricexplosionknockback.config", --- > "bombConfig" : "/projectiles/explosions/regularexplosion2/electricexplosionknockbackstatus.config", stats\effects\deathbomb\deathbombfire.statuseffect 6c6 < "bombConfig" : "/projectiles/explosions/regularexplosion2/fireexplosionknockback.config", --- > "bombConfig" : "/projectiles/explosions/regularexplosion2/fireexplosionknockbackstatus.config", stats\effects\deathbomb\deathbombice.statuseffect 6c6 < "bombConfig" : "/projectiles/explosions/regularexplosion2/iceexplosionknockback.config", --- > "bombConfig" : "/projectiles/explosions/regularexplosion2/iceexplosionknockbackstatus.config", stats\effects\deathbomb\deathbombpoison.statuseffect 6c6 < "bombConfig" : "/projectiles/explosions/regularexplosion2/poisonexplosionknockback.config", --- > "bombConfig" : "/projectiles/explosions/regularexplosion2/poisonexplosionknockbackstatus.config", tech\dash\airdash.tech 8,12c8,12 < "maximumDoubleTapTime" : 0.2, < "dashControlForce" : 1500, < "dashSpeed" : 40, < "dashDuration" : 0.17, < "dashCooldown" : 0.8, --- > "maximumDoubleTapTime" : 0.25, > "dashControlForce" : 3000, > "dashSpeed" : 60, > "dashDuration" : 0.2, > "dashCooldown" : 1.5, tech\dash\blinkdash.tech 8c8 < "maximumDoubleTapTime" : 0.2, --- > "maximumDoubleTapTime" : 0.25, 12c12 < "dashCooldown" : 0.8, --- > "dashCooldown" : 1.5, tech\dash\dash.tech 8,12c8,12 < "maximumDoubleTapTime" : 0.2, < "dashControlForce" : 1500, < "dashSpeed" : 40, < "dashDuration" : 0.17, < "dashCooldown" : 0.8, --- > "maximumDoubleTapTime" : 0.25, > "dashControlForce" : 3000, > "dashSpeed" : 60, > "dashDuration" : 0.2, > "dashCooldown" : 1.5, tech\distortionsphere\distortionsphere.lua 20d19 < -- FIXME: this position change isn't serialized when the player logs out 22,25c21,26 < local pos = restorePosition() < if pos then < mcontroller.setPosition(pos) < end --- > storage.lastActivePosition = mcontroller.position() > > -- try to restore position. if techs are being switched, this will work and the storage will > -- be cleared anyway. if the client's disconnecting, this won't work but the storage will remain to > -- restore the position later in update() > mcontroller.setPosition(vec2.add(storage.lastActivePosition, {0, positionOffset()})) 26a28,29 > else > storage.lastActivePosition = nil 31c34,44 < local specialActivated = not self.specialLast and args.moves["special"] == 1 --- > if storage.lastActivePosition then > -- restore position if the player was logged out (in the same planet/universe) with the tech active > if vec2.mag(vec2.sub(mcontroller.position(), storage.lastActivePosition)) < 0.1 then > mcontroller.setPosition(vec2.add(storage.lastActivePosition, {0, positionOffset()})) > end > storage.lastActivePosition = nil > end > > if not self.specialLast and args.moves["special"] == 1 then > attemptActivation() > end 34c47,57 < if not self.active and not tech.parentLounging() and specialActivated and tech.consumeTechEnergy(self.energyCost) then --- > if self.active then > mcontroller.controlParameters(self.transformedMovementParameters) > > updateRotationFrame(args.dt) > end > > self.lastPosition = mcontroller.position() > end > > function attemptActivation() > if not self.active and not tech.parentLounging() and tech.consumeTechEnergy(self.energyCost) then 40c63 < elseif self.active and specialActivated then --- > elseif self.active then 49,56d71 < < if self.active then < mcontroller.controlParameters(self.transformedMovementParameters) < < updateRotationFrame(args.dt) < end < < self.lastPosition = mcontroller.position() 80c95 < return minY(self.transformedMovementParameters.standingPoly) - minY(self.basePoly) --- > return minY(self.transformedMovementParameters.collisionPoly) - minY(self.basePoly) 83,85c98,100 < function transformPosition() < local pos = mcontroller.position() < local groundPos = world.resolvePolyCollision(self.transformedMovementParameters.standingPoly, {pos[1], pos[2] - positionOffset()}, 1) --- > function transformPosition(pos) > pos = pos or mcontroller.position() > local groundPos = world.resolvePolyCollision(self.transformedMovementParameters.collisionPoly, {pos[1], pos[2] - positionOffset()}, 1) 89c104 < return world.resolvePolyCollision(self.transformedMovementParameters.standingPoly, pos, 1) --- > return world.resolvePolyCollision(self.transformedMovementParameters.collisionPoly, pos, 1) 93,94c108,109 < function restorePosition() < local pos = mcontroller.position() --- > function restorePosition(pos) > pos = pos or mcontroller.position() tech\distortionsphere\distortionsphere.tech 9,10c9 < "standingPoly" : [ [-0.75, -0.4], [-0.4, -0.75], [0.4, -0.75], [0.75, -0.4], [0.75, 0.4], [0.4, 0.75], [-0.4, 0.75], [-0.75, 0.4] ], < "crouchingPoly" : [ [-0.75, -0.4], [-0.4, -0.75], [0.4, -0.75], [0.75, -0.4], [0.75, 0.4], [0.4, 0.75], [-0.4, 0.75], [-0.75, 0.4] ], --- > "collisionPoly" : [ [-0.75, -0.4], [-0.4, -0.75], [0.4, -0.75], [0.75, -0.4], [0.75, 0.4], [0.4, 0.75], [-0.4, 0.75], [-0.75, 0.4] ], tech\distortionsphere\spikesphere.lua 1a2,3 > require "/scripts/rect.lua" > require "/scripts/poly.lua" 4,19c6,9 < local specialActivated = not self.specialLast and args.moves["special"] == 1 < self.specialLast = args.moves["special"] == 1 < < if not self.active and specialActivated and not tech.parentLounging() and tech.consumeTechEnergy(self.energyCost) then < local pos = transformPosition() < if pos then < mcontroller.setPosition(pos) < activate() < end < elseif self.active and specialActivated then < local pos = restorePosition() < if pos then < mcontroller.setPosition(pos) < deactivate() < else < -- error noise? --- > if storage.lastActivePosition then > -- restore position if the player was logged out (in the same planet/universe) with the tech active > if vec2.mag(vec2.sub(mcontroller.position(), storage.lastActivePosition)) < 0.1 then > mcontroller.setPosition(vec2.add(storage.lastActivePosition, {0, positionOffset()})) 20a11 > storage.lastActivePosition = nil 23,24c14,17 < if self.active then < mcontroller.controlParameters(self.transformedMovementParameters) --- > if not self.specialLast and args.moves["special"] == 1 then > attemptActivation() > end > self.specialLast = args.moves["special"] == 1 26c19,70 < if mcontroller.isSticking() then --- > if self.active then > local groundDirection = findGroundDirection() > if groundDirection then > local ground, headingDirection, headingAngle = setGroundDirection(groundDirection) > > -- Rotate to ground slope > local newDirection = groundSlopeDirection(headingAngle) > if newDirection then > headingDirection = newDirection > headingAngle = math.atan(headingDirection[2], headingDirection[1]) > ground = vec2.rotate(headingDirection, -math.pi / 2) > end > > mcontroller.controlApproachVelocity(vec2.mul(ground, self.ballSpeed), 400) > > local moveInput = 0 > if ground[1] < -0.1 then > if args.moves["up"] then moveInput = moveInput - 1 end > if args.moves["down"] then moveInput = moveInput + 1 end > elseif ground[1] > 0.1 then > if args.moves["up"] then moveInput = moveInput + 1 end > if args.moves["down"] then moveInput = moveInput - 1 end > end > > if ground[2] < -0.1 then > if args.moves["right"] then moveInput = moveInput + 1 end > if args.moves["left"] then moveInput = moveInput - 1 end > elseif ground[2] > 0.1 then > if args.moves["right"] then moveInput = moveInput - 1 end > if args.moves["left"] then moveInput = moveInput + 1 end > end > > -- if args.moves["left"] then > -- moveInput = -1 > -- elseif args.moves["right"] then > -- moveInput = 1 > -- end > > if moveInput ~= 0 then > moveInput = math.min(1, math.max(-1, moveInput)) > > local moveDirection = vec2.mul(headingDirection, moveInput) > mcontroller.controlApproachVelocityAlongAngle(math.atan(moveDirection[2], moveDirection[1]), self.ballSpeed, 2000) > > self.angle = math.fmod(math.pi * 2 + self.angle + self.ballSpeed * -moveInput * args.dt, math.pi * 2) > > world.debugLine(mcontroller.position(), vec2.add(vec2.mul(moveDirection, 5), mcontroller.position()), "yellow") > else > mcontroller.controlApproachVelocity({0, 0}, 500) > end > > world.debugLine(mcontroller.position(), vec2.add(mcontroller.position(), vec2.mul(vec2.rotate(headingDirection, -math.pi / 2), 5)), "blue") 27a72,74 > self.transformedMovementParameters.gravityEnabled = false > else > self.transformedMovementParameters.gravityEnabled = true 29a77,78 > mcontroller.controlParameters(self.transformedMovementParameters) > 33a83,125 > end > > function updateRotationFrame(dt) > -- Rotation frames for the ball are given as one *half* rotation so two > -- full cycles of each of the ball frames completes a total rotation. > local rotationFrame = math.floor(self.angle / math.pi * self.ballFrames) % self.ballFrames > animator.setGlobalTag("rotationFrame", rotationFrame) > end > > function groundSlopeDirection(headingAngle) > local bounds = mcontroller.boundBox() > > local leftLine = poly.translate(poly.rotate({{bounds[1] - 0.1, bounds[4] - 0.5}, {bounds[1] - 0.1, bounds[2] - 1}}, headingAngle), mcontroller.position()) > local rightLine = poly.translate(poly.rotate({{bounds[3] + 0.1, bounds[4] - 0.5}, {bounds[3] + 0.1, bounds[2] - 1}}, headingAngle), mcontroller.position()) > > world.debugLine(leftLine[1], leftLine[2], "red") > world.debugLine(rightLine[1], rightLine[2], "red") > > local collisionSet = leftLine[2][2] < leftLine[1][2] and {"Null", "Block", "Dynamic", "Platform"} or {"Null", "Block", "Dynamic"} > local leftIntersect = world.lineCollision(leftLine[1], leftLine[2], collisionSet) or leftLine[2] > local rightIntersect = world.lineCollision(rightLine[1], rightLine[2], collisionSet) or rightLine[2] > if leftIntersect and rightIntersect then > return vec2.norm(world.distance(rightIntersect, leftIntersect)) > end > end > > function setGroundDirection(ground) > local headingDirection = {-ground[2], ground[1]} > local headingAngle = math.atan(headingDirection[2], headingDirection[1]) > return ground, headingDirection, headingAngle > end > > function findGroundDirection() > local bounds = mcontroller.boundBox() > local groundRect = {bounds[1], bounds[2] - config.getParameter("groundStickDistance", 0.25), bounds[3], bounds[2]} > local directions = {{0,-1}, {1,0}, {0,1}, {-1,0}} > for i = 1, 4 do > local angle = (i - 1) * math.pi / 2 > local collisionSet = i == 1 and {"Null", "Block", "Dynamic", "Platform"} or {"Null", "Block", "Dynamic"} > if world.rectTileCollision(rect.translate(rect.rotate(groundRect, angle), mcontroller.position()), collisionSet) then > return directions[i] > end > end tech\distortionsphere\spikesphere.tech 9,10c9 < "standingPoly" : [ [-0.75, -0.4], [-0.4, -0.75], [0.4, -0.75], [0.75, -0.4], [0.75, 0.4], [0.4, 0.75], [-0.4, 0.75], [-0.75, 0.4] ], < "crouchingPoly" : [ [-0.75, -0.4], [-0.4, -0.75], [0.4, -0.75], [0.75, -0.4], [0.75, 0.4], [0.4, 0.75], [-0.4, 0.75], [-0.75, 0.4] ], --- > "collisionPoly" : [ [-0.8, -0.4], [-0.4, -0.8], [0.4, -0.8], [0.8, -0.4], [0.8, 0.4], [0.4, 0.8], [-0.4, 0.8], [-0.8, 0.4] ], 12,14c11,16 < "groundForce" : 450.0, < "normalGroundFriction" : 1.5, < "ambulatingGroundFriction" : 0.2, --- > "airForce" : 0.0, > "liquidForce" : 0.0, > "groundForce" : 0.0, > > "normalGroundFriction" : 8, > "ambulatingGroundFriction" : 8, 17,20c19 < "jumpSpeed" : 10.0, < "jumpControlForce" : 800.0, < "jumpInitialPercentage" : 0.75, < "jumpHoldTime" : 0.1 --- > "jumpSpeed" : 0.0 24,31c23,24 < "jumpSpeed" : 6.0, < "jumpControlForce" : 800.0, < "jumpInitialPercentage" : 0.75, < "jumpHoldTime" : 0.1 < }, < < "stickyCollision" : true, < "stickyForce" : 100 --- > "jumpSpeed" : 0.0 > } tech\distortionsphere\spikesphere.techitem 3c3 < "rarity" : "Uncommon", --- > "rarity" : "Legendary",