FILES ----- dungeons\avian\avianairship\avianairship.dungeon dungeons\hylotl\hylotloceancity\citylayout1.json dungeons\hylotl\hylotloceancity\citylayout2.json dungeons\hylotl\hylotloceancity\citylayoutTemplate.json dungeons\hylotl\hylotloceancity\hylotlbedrooms2.json dungeons\hylotl\hylotloceancity\hylotlground1.json dungeons\hylotl\hylotloceancity\hylotlground2.json dungeons\hylotl\hylotloceancity\hylotlground3.json dungeons\hylotl\hylotloceancity\hylotllibrary1.json dungeons\hylotl\hylotloceancity\hylotllibrary1clue.json dungeons\hylotl\hylotloceancity\hylotloceancity.dungeon dungeons\hylotl\hylotloceancity\hylotlrestaurant1.json dungeons\hylotl\hylotloceancity\hylotlrestaurant1clue.json dungeons\hylotl\hylotloceancity\hylotlroofdojo1.json dungeons\hylotl\hylotloceancity\hylotlroofgallery1.json dungeons\hylotl\hylotloceancity\hylotlroofgallery1clue.json dungeons\hylotl\hylotloceancity\hylotlroofgarden1.json dungeons\hylotl\hylotloceancity\hylotlroofgarden1clue.json dungeons\hylotl\hylotloceancity\hylotlroofgarden2.json dungeons\hylotl\hylotloceancity\hylotlroofgenerator.json dungeons\hylotl\hylotloceancity\hylotlroofgraveyard1.json dungeons\hylotl\hylotloceancity\hylotltoproof1.json dungeons\hylotl\hylotloceancity\hylotlvertical1.json dungeons\hylotl\hylotloceancity\hylotlvertical2.json dungeons\hylotl\hylotloceancity\hylotlvertical3.json dungeons\hylotl\hylotloceancity\hylotlverticalwindows.json dungeons\other\ancientvault\ice\room4b.json dungeons\other\outpost\outpost.json monsters\monster.lua monsters\boss\bossMonster.lua monsters\boss\penguinMiniUfo\penguinMiniUfo.lua monsters\ghosts\wisper\wisper.animation objects\ancient\ancientconsole\ancientconsole.lua objects\ancient\ancientconsole\returnconsole.object scripts\actions\builders.lua [NEW] sfx\npc\monsters\wisper_fire.ogg [NEW] sfx\npc\monsters\wisper_windup1.ogg stats\player_primary.lua tiles\materials\ash.material tiles\materials\cloudblock.material tiles\materials\corruptdirt.material tiles\materials\drydirt.material tiles\materials\spidersilkblock.material DIFFS ----- dungeons\avian\avianairship\avianairship.dungeon 7c7 < "anchor" : [ "avianairship", "avianairshipclue1", "avianairshipclue2", "avianairshipclue3", "avianairshipclue4" ], --- > "anchor" : [ "avianairshipclue1", "avianairshipclue2", "avianairshipclue3", "avianairshipclue4" ], dungeons\hylotl\hylotloceancity\citylayout1.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\citylayout2.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\citylayoutTemplate.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotlbedrooms2.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotlground1.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotlground2.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotlground3.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotllibrary1.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotllibrary1clue.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotloceancity.dungeon 14a15,16 > > // BASE LAYOUTS 18,20c20,21 < //[ "maxSpawnCount", [3] ], < // [ "doNotCombineWith", [ "examplepiece" ] ] < [ "ignorePartMaximumRule" ] --- > [ "ignorePartMaximumRule" ], > [ "doNotCombineWith", [ "citylayout1", "citylayout2" ] ] 28,30c29,30 < //[ "maxSpawnCount", [3] ], < // [ "doNotCombineWith", [ "examplepiece" ] ] < [ "ignorePartMaximumRule" ] --- > [ "ignorePartMaximumRule" ], > [ "doNotCombineWith", [ "citylayout1", "citylayout2" ] ] 34a35,36 > > // BOTTOM FLOOR PIECES 39,40d40 < // [ "doNotCombineWith", [ "examplepiece" ] ] < //[ "ignorePartMaximumRule" ] 49,50d48 < // [ "doNotCombineWith", [ "examplepiece" ] ] < //[ "ignorePartMaximumRule" ] 59,60d56 < // [ "doNotCombineWith", [ "examplepiece" ] ] < //[ "ignorePartMaximumRule" ] 65,94c61,62 < { < "name" : "hylotlvertical1", < "rules" : [ < [ "maxSpawnCount", [2] ] < // [ "doNotCombineWith", [ "examplepiece" ] ] < //[ "ignorePartMaximumRule" ] < ], < "def" : [ "tmx", "hylotlvertical1.json" ], < "chance" : 1 < }, < { < "name" : "hylotlvertical2", < "rules" : [ < [ "maxSpawnCount", [2] ] < // [ "doNotCombineWith", [ "examplepiece" ] ] < //[ "ignorePartMaximumRule" ] < ], < "def" : [ "tmx", "hylotlvertical2.json" ], < "chance" : 1 < }, < { < "name" : "hylotlvertical3", < "rules" : [ < [ "maxSpawnCount", [2] ] < // [ "doNotCombineWith", [ "examplepiece" ] ] < //[ "ignorePartMaximumRule" ] < ], < "def" : [ "tmx", "hylotlvertical3.json" ], < "chance" : 1 < }, --- > > // MIDDLE PIECES 98,100c66 < [ "maxSpawnCount", [2] ] < // [ "doNotCombineWith", [ "examplepiece" ] ] < //[ "ignorePartMaximumRule" ] --- > [ "maxSpawnCount", [1] ] 103c69 < "chance" : 1 --- > "chance" : 0.1 108,110c74 < [ "maxSpawnCount", [2] ] < // [ "doNotCombineWith", [ "examplepiece" ] ] < //[ "ignorePartMaximumRule" ] --- > [ "doNotCombineWith", [ "hylotlrestaurant1", "hylotlrestaurant1clue" ] ] 113c77 < "chance" : 1 --- > "chance" : 0.1 118,120c82 < [ "maxSpawnCount", [1] ], < [ "doNotCombineWith", [ "hylotlrestaurant1", "hylotlroofgallery1clue", "hylotllibrary1clue", "hylotltoproof1clue", "hylotlroofgarden1clue" ] ] < //[ "ignorePartMaximumRule" ] --- > [ "doNotCombineWith", [ "hylotllibrary1clue", "hylotlrestaurant1", "hylotlrestaurant1clue", "hylotlroofgallery1clue", "hylotlroofgarden1clue", "hylotltoproof1clue" ] ] 128,130c90 < [ "maxSpawnCount", [2] ] < // [ "doNotCombineWith", [ "examplepiece" ] ] < //[ "ignorePartMaximumRule" ] --- > [ "doNotCombineWith", [ "hylotllibrary1", "hylotllibrary1clue" ] ] 133c93 < "chance" : 1 --- > "chance" : 0.1 138,140c98 < [ "maxSpawnCount", [1] ], < [ "doNotCombineWith", [ "hylotllibrary1", "hylotlroofgallery1clue", "hylotlrestaurant1clue", "hylotltoproof1clue", "hylotlroofgarden1clue" ] ] < //[ "ignorePartMaximumRule" ] --- > [ "doNotCombineWith", [ "hylotllibrary1", "hylotllibrary1clue", "hylotlrestaurant1clue", "hylotlroofgallery1clue", "hylotlroofgarden1clue", "hylotltoproof1clue" ] ] 148,150c106 < [ "maxSpawnCount", [2] ] < // [ "doNotCombineWith", [ "examplepiece" ] ] < //[ "ignorePartMaximumRule" ] --- > [ "doNotCombineWith", [ "hylotlverticalwindows" ] ] 153c109 < "chance" : 1 --- > "chance" : 0.1 155a112,137 > "name" : "hylotlvertical1", > "rules" : [ > [ "doNotCombineWith", [ "hylotlvertical1" ] ] > ], > "def" : [ "tmx", "hylotlvertical1.json" ], > "chance" : 0.1 > }, > { > "name" : "hylotlvertical2", > "rules" : [ > [ "doNotCombineWith", [ "hylotlvertical2" ] ] > ], > "def" : [ "tmx", "hylotlvertical2.json" ], > "chance" : 0.1 > }, > { > "name" : "hylotlvertical3", > "rules" : [ > [ "doNotCombineWith", [ "hylotlvertical3" ] ] > ], > "def" : [ "tmx", "hylotlvertical3.json" ], > "chance" : 0.1 > }, > > // ROOF PIECES > { 158,160c140 < [ "maxSpawnCount", [2] ] < // [ "doNotCombineWith", [ "examplepiece" ] ] < //[ "ignorePartMaximumRule" ] --- > [ "doNotCombineWith", [ "hylotlroofgallery1", "hylotlroofgallery1clue" ] ] 163c143 < "chance" : 0 --- > "chance" : 0.1 168,170c148 < [ "maxSpawnCount", [1] ], < [ "doNotCombineWith", [ "hylotlroofgallery1", "hylotlrestaurant1clue", "hylotllibrary1clue", "hylotltoproof1clue", "hylotlroofgarden1clue" ] ] < //[ "ignorePartMaximumRule" ] --- > [ "doNotCombineWith", [ "hylotllibrary1clue", "hylotlrestaurant1clue", "hylotlroofgallery1", "hylotlroofgallery1clue", "hylotlroofgarden1clue", "hylotltoproof1clue" ] ] 173c151 < "chance" : 0 --- > "chance" : 1 178,180c156 < [ "maxSpawnCount", [2] ], < [ "doNotCombineWith", [ "hylotlroofgarden2" ] ] < //[ "ignorePartMaximumRule" ] --- > [ "doNotCombineWith", [ "hylotlroofgarden1", "hylotlroofgarden1clue" ] ] 183c159 < "chance" : 1 --- > "chance" : 0.1 188,190c164 < [ "maxSpawnCount", [2] ], < [ "doNotCombineWith", [ "hylotlroofgarden2", "hylotlroofgarden1", "hylotlrestaurant1clue", "hylotllibrary1clue", "hylotltoproof1clue", "hylotlroofgallery1clue" ] ] < //[ "ignorePartMaximumRule" ] --- > [ "doNotCombineWith", [ "hylotllibrary1clue", "hylotlrestaurant1clue", "hylotlroofgallery1clue", "hylotlroofgarden1", "hylotlroofgarden1clue", "hylotltoproof1clue" ] ] 198,200c172 < [ "maxSpawnCount", [2] ], < [ "doNotCombineWith", [ "hylotlroofgarden1" ] ] < //[ "ignorePartMaximumRule" ] --- > [ "doNotCombineWith", [ "hylotlroofgarden2" ] ] 203c175 < "chance" : 1 --- > "chance" : 0.1 208,210c180 < [ "maxSpawnCount", [2] ] < // [ "doNotCombineWith", [ "examplepiece" ] ] < //[ "ignorePartMaximumRule" ] --- > [ "doNotCombineWith", [ "hylotlroofgraveyard1" ] ] 213c183 < "chance" : 1 --- > "chance" : 0.1 218,220c188 < [ "maxSpawnCount", [3] ] < // [ "doNotCombineWith", [ "examplepiece" ] ] < //[ "ignorePartMaximumRule" ] --- > [ "doNotCombineWith", [ "hylotlroofdojo1" ] ] 223c191 < "chance" : 1 --- > "chance" : 0.1 228,230c196 < [ "maxSpawnCount", [3] ] < // [ "doNotCombineWith", [ "examplepiece" ] ] < //[ "ignorePartMaximumRule" ] --- > [ "doNotCombineWith", [ "hylotltoproof1", "hylotltoproof1clue" ] ] 233c199 < "chance" : 0 --- > "chance" : 0.1 238,240c204 < [ "maxSpawnCount", [1] ], < [ "doNotCombineWith", [ "hylotltoproof1", "hylotlrestaurant1clue", "hylotllibrary1clue", "hylotlroofgallery1clue", "hylotlroofgarden1clue" ] ] < //[ "ignorePartMaximumRule" ] --- > [ "doNotCombineWith", [ "hylotllibrary1clue", "hylotlrestaurant1clue", "hylotlroofgallery1clue", "hylotlroofgarden1clue", "hylotltoproof1", "hylotltoproof1clue" ] ] 243c207 < "chance" : 0 --- > "chance" : 1 248d211 < [ "maxSpawnCount", [1] ], dungeons\hylotl\hylotloceancity\hylotlrestaurant1.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotlrestaurant1clue.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotlroofdojo1.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotlroofgallery1.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotlroofgallery1clue.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotlroofgarden1.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotlroofgarden1clue.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotlroofgarden2.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotlroofgenerator.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotlroofgraveyard1.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotltoproof1.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotlvertical1.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotlvertical2.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotlvertical3.json [TMX file differences are left out for huge size.] dungeons\hylotl\hylotloceancity\hylotlverticalwindows.json [TMX file differences are left out for huge size.] dungeons\other\ancientvault\ice\room4b.json [TMX file differences are left out for huge size.] dungeons\other\outpost\outpost.json [TMX file differences are left out for huge size.] monsters\monster.lua 30c30 < self.behavior = root.behavior(config.getParameter("behavior"), config.getParameter("behaviorConfig", {})) --- > self.behavior = root.behavior(config.getParameter("behavior"), sb.jsonMerge(config.getParameter("behaviorConfig", {}), skillBehaviorConfig())) 172a173,187 > end > > function skillBehaviorConfig() > local skills = config.getParameter("skills", {}) > local skillConfig = {} > > for _,skillName in pairs(skills) do > local skillHostileActions = root.monsterSkillParameter(skillName, "hostileActions") > if skillHostileActions then > construct(skillConfig, "hostileActions") > util.appendLists(skillConfig.hostileActions, skillHostileActions) > end > end > > return skillConfig monsters\boss\bossMonster.lua 61,65c61,65 < trackTargets(self.keepTargetInSight, self.queryTargetDistance, self.trackTargetDistance, self.switchTargetDistance) < < for skillName, params in pairs(self.skillParameters) do < if type(_ENV[skillName].onUpdate) == "function" then < _ENV[skillName].onUpdate(dt) --- > if not status.resourcePositive("health") then > local inState = self.state.stateDesc() > if inState ~= "dieState" and not self.state.pickState({ die = true }) then > self.state.endState() > self.dead = true 67d66 < end 69,75c68 < if hasTarget() and status.resourcePositive("health") then < script.setUpdateDelta(1) < updatePhase(dt) < < monster.setDamageBar("Special") < monster.setAggressive(true) < setBattleMusicEnabled(true) --- > self.state.update(dt) 77c70 < animator.setGlobalTag("phase", "phase"..currentPhase()) --- > setBattleMusicEnabled(false) 79,82c72,76 < if not hasTarget() and status.resourcePositive("health") and self.hadTarget then < --Lost target, reset boss < if currentPhase() then < self.phaseStates[currentPhase()].endState() --- > trackTargets(self.keepTargetInSight, self.queryTargetDistance, self.trackTargetDistance, self.switchTargetDistance) > > for skillName, params in pairs(self.skillParameters) do > if type(_ENV[skillName].onUpdate) == "function" then > _ENV[skillName].onUpdate(dt) 84,91d77 < self.phase = nil < self.lastPhase = nil < setPhaseStates(self.phases) < status.setResource("health", status.stat("maxHealth")) < < if bossReset then bossReset() end < monster.setDamageBar("None") < monster.setAggressive(false) 94c80,105 < if status.resourcePositive("health") then script.setUpdateDelta(10) end --- > if hasTarget() then > script.setUpdateDelta(1) > updatePhase(dt) > > monster.setDamageBar("Special") > monster.setAggressive(true) > setBattleMusicEnabled(true) > > animator.setGlobalTag("phase", "phase"..currentPhase()) > else > if self.hadTarget then > --Lost target, reset boss > if currentPhase() then > self.phaseStates[currentPhase()].endState() > end > self.phase = nil > self.lastPhase = nil > setPhaseStates(self.phases) > status.setResource("health", status.stat("maxHealth")) > > if bossReset then bossReset() end > monster.setDamageBar("None") > monster.setAggressive(false) > end > > script.setUpdateDelta(10) 96,97c107,111 < if not self.state.update(dt) then < self.state.pickState() --- > if not self.state.update(dt) then > self.state.pickState() > end > > setBattleMusicEnabled(false) 100c114 < setBattleMusicEnabled(false) --- > self.hadTarget = hasTarget() 102,103d115 < < self.hadTarget = hasTarget() 108,115d119 < < if not status.resourcePositive("health") then < local inState = self.state.stateDesc() < if inState ~= "dieState" and not self.state.pickState({ die = true }) then < self.state.endState() < self.dead = true < end < end monsters\boss\penguinMiniUfo\penguinMiniUfo.lua 8c8 < --- > 13,18c13 < message.setHandler("despawn", function() < monster.setDropPool(nil) < monster.setDeathParticleBurst(nil) < monster.setDeathSound(nil) < status.addEphemeralEffect("monsterdespawn") < end) --- > message.setHandler("despawn", despawn) 24,26c19 < if not status.resourcePositive("health") then return true end < < return false --- > return not status.resourcePositive("health") 32c25,30 < self.minionTimer = self.timerSync:result() --- > if self.timerSync:succeeded() then > self.minionTimer = self.timerSync:result() > else > despawn() > end > self.timerSync = nil 34d31 < self.timerSync = nil 65c62,69 < end \ No newline at end of file --- > end > > function despawn() > monster.setDropPool(nil) > monster.setDeathParticleBurst(nil) > monster.setDeathSound(nil) > status.addEphemeralEffect("monsterdespawn") > end monsters\ghosts\wisper\wisper.animation 20c20,23 < "cycle" : 0.8 --- > "cycle" : 0.8, > "properties" : { > "immediateSound" : "/sfx/npc/monsters/wisper_windup1.ogg" > } 24c27,30 < "cycle" : 0.3 --- > "cycle" : 0.3, > "properties" : { > "immediateSound" : "/sfx/npc/monsters/wisper_fire.ogg" > } objects\ancient\ancientconsole\ancientconsole.lua 20c20 < self.isOutpostGate = world.terrestrial() or world.type() == "outpost" --- > self.isOutpostGate = world.terrestrial() objects\ancient\ancientconsole\returnconsole.object 38,40c38 < "collisionSpaces" : [ [-3, 0], [-2, 0], [-1, 0], [0, 0], [1, 0], [2, 0] ], < < "detectArea" : [ [-2, 0], [2.3, 5] ] --- > "collisionSpaces" : [ [-3, 0], [-2, 0], [-1, 0], [0, 0], [1, 0], [2, 0] ] 54,56c52 < "collisionSpaces" : [ [-1, 0], [0, 0], [1, 0], [2, 0], [3, 0], [4, 0] ], < < "detectArea" : [ [-0.3, 0], [4, 5] ] --- > "collisionSpaces" : [ [-1, 0], [0, 0], [1, 0], [2, 0], [3, 0], [4, 0] ] 64,66d59 < "outpost" : "starscape.png", < "portal" : "portal.png" < }, 68,72c61,64 < "scripts" : [ "/objects/ancient/ancientconsole/ancientconsole.lua" ], < "scriptDelta" : 20, < < "interactAction" : "OpenTeleportDialog", < "interactData" : "/interface/warping/returnwarp.config", --- > // these should never be displayed on this gate > "outpost" : "", > "portal" : "" > }, 74c66 < "startActive" : true --- > "startActive" : false scripts\actions\builders.lua 36,37c36 < < local newTree = root.behavior({name = "sequenceActions-"..nodeId, root = sequence, scripts = jarray()}, {}) --- > local newTree = root.behavior({name = "sequenceActions-"..nodeId, root = sequence, scripts = jarray()}, config.getParameter("behaviorConfig", {})) 86c85 < local newTree = root.behavior({name = "selectorActions-"..nodeId, root = selector, scripts = jarray()}, {}) --- > local newTree = root.behavior({name = "selectorActions-"..nodeId, root = selector, scripts = jarray()}, config.getParameter("behaviorConfig", {})) 135c134 < local newTree = root.behavior({name = "parallelActions-"..nodeId, root = parallel, scripts = jarray()}, {}) --- > local newTree = root.behavior({name = "parallelActions-"..nodeId, root = parallel, scripts = jarray()}, config.getParameter("behaviorConfig", {})) stats\player_primary.lua 28c28 < if notification.killed then --- > if notification.hitType == "Kill" then tiles\materials\ash.material 12,13d11 < "tillableMod" : 31, < "soil" : true, tiles\materials\cloudblock.material 12,13d11 < "tillableMod" : 31, < "soil" : true, tiles\materials\corruptdirt.material 12c12 < "tillableMod" : 31, --- > "tillableMod" : 32, tiles\materials\drydirt.material 12c12 < "tillableMod" : 31, --- > "tillableMod" : 32, tiles\materials\spidersilkblock.material 12,13d11 < "tillableMod" : 31, < "soil" : true, 22c20 < "multiColored" : true, --- > "multiColored" : false,