FILES ----- player.config [NEW] animations\teleport\playerwarpabort.frames [NEW] animations\teleport\playerwarpabort.png biomes\distributions.config biomes\core\gardencorelayer.biome biomes\underground\underground0a.biome biomes\underground\underground0b.biome biomes\underground\underground0c.biome biomes\underground\underground0d.biome biomes\underground\underground1a.biome biomes\underground\underground1b.biome biomes\underground\underground1c.biome biomes\underground\underground1d.biome biomes\underground\underground3a.biome biomes\underground\underground3b.biome biomes\underground\underground3c.biome biomes\underground\underground3d.biome biomes\underground\underground5a.biome biomes\underground\underground5b.biome biomes\underground\underground5c.biome biomes\underground\underground5d.biome dungeons\missions\floranmissions\floranmission1.dungeon dungeons\missions\penguinmissions\penguinmission1.dungeon dungeons\missions\penguinmissions\penguinmission2.dungeon dungeons\other\outpost\outpost.dungeon dungeons\other\outpost\outpoststatic-objects.png dungeons\other\outpost\outpoststatic.png [NEW] interface\crafting\2stopicon.png [NEW] interface\windowconfig\teleshop.config [NEW] items\generic\crafting\teleportercore.item [NEW] items\generic\crafting\teleportercore.png monsters\ground\approachstate.lua monsters\ground\groundmonster.lua monsters\ground\wanderstate.lua monsters\ground\skills\chargeattack.lua npcs\chatstate.lua npcs\fleestate.lua npcs\main.lua npcs\meleeattackstate.lua npcs\rangedattackstate.lua npcs\wanderstate.lua npcs\guard\guardstate.lua npcs\guard\returntopoststate.lua [NEW] objects\bonus\devstatuegeorge\devstatuegeorge.frames [NEW] objects\bonus\devstatuegeorge\devstatuegeorge.object [NEW] objects\bonus\devstatuegeorge\devstatuegeorge.png [NEW] objects\bonus\devstatuegeorge\devstatuegeorgeicon.png objects\hoard\barrelgoldfilled\barrelgoldfilled.object objects\hoard\diamonddisplay\diamonddisplay.object objects\hoard\goldenpedestal\goldenpedestal.object objects\hoard\goldvase1\goldvase1.object objects\hoard\goldvase2\goldvase2.object objects\hoard\goldvase3\goldvase3.object objects\hoard\goldvase4\goldvase4.object objects\hoard\goldvase5\goldvase5.object objects\hoard\goldvase5\goldvase5.png objects\hoard\goldvase5\goldvase5icon.png objects\hoard\grail\grail.object objects\hoard\mysteriouslight\mysteriouslight.object objects\hoard\safe\safe.object objects\hoard\treasurechest\treasurechest.object objects\holiday\bigpresent\bigpresent.object objects\holiday\decoratedtree\decoratedtree.object objects\holiday\dreidel\dreidel.object objects\holiday\giantbells\giantbells.object objects\holiday\giantbow1\giantbow1.object objects\holiday\giantbow2\giantbow2.object objects\holiday\giantsanta\giantsanta.object objects\holiday\giantsnowflake\giantsnowflake.object objects\holiday\giftmonsterbox\giftmonsterbox.object objects\holiday\giftmonsterbox\giftmonstersmallbox.object objects\holiday\goldball\goldball.object objects\holiday\greencandycane1\greencandycane1.object objects\holiday\greencandycane2\greencandycane2.object objects\holiday\greencandycane3\greencandycane3.object objects\holiday\greengumdrop1\greengumdrop1.object objects\holiday\greengumdrop2\greengumdrop2.object objects\holiday\heartforge\heartforge.object objects\holiday\holidaycandles\holidaycandles.object objects\holiday\holidaycraftingtable\holidaycraftingtable.object objects\holiday\holidaylights\holidaylights.object objects\holiday\holidaypole\holidaypole.object objects\holiday\holly\holly.object objects\holiday\lollipop1\lollipop1.object objects\holiday\lollipop2\lollipop2.object objects\holiday\menorah\menorah.object objects\holiday\present1\present1.object objects\holiday\present2\present2.object objects\holiday\present3\present3.object objects\holiday\present4\present4.object objects\holiday\purplegumdrop1\purplegumdrop1.object objects\holiday\purplegumdrop2\purplegumdrop2.object objects\holiday\redball\redball.object objects\holiday\redcandycane1\redcandycane1.object objects\holiday\redcandycane2\redcandycane2.object objects\holiday\redcandycane3\redcandycane3.object objects\holiday\redgumdrop1\redgumdrop1.object objects\holiday\redgumdrop2\redgumdrop2.object objects\holiday\scifisleigh\scifisleigh.object objects\holiday\smallbow\smallbow.object objects\holiday\smallholidaytree\smallholidaytree.object objects\holiday\smallsnowflake\smallsnowflake.object objects\holiday\stocking1\stocking1.object objects\holiday\stocking2\stocking2.object objects\holiday\undecoratedtree\undecoratedtree.object objects\holiday\wazlights\wazlights.object [NEW] objects\outpost\2stopteleshop\2stopshop.frames [NEW] objects\outpost\2stopteleshop\2stopshop.object [NEW] objects\outpost\2stopteleshop\2stopshop.png [NEW] objects\outpost\2stopteleshop\2stopshoplit.frames [NEW] objects\outpost\2stopteleshop\2stopshoplit.png [NEW] objects\outpost\2stopteleshop\2stoptele.frames [NEW] objects\outpost\2stopteleshop\2stoptele.object [NEW] objects\outpost\2stopteleshop\2stoptele.png [NEW] objects\outpost\2stopteleshop\2stoptelelit.frames [NEW] objects\outpost\2stopteleshop\2stoptelelit.png [NEW] objects\outpost\2stopteleshop\icon.png [NEW] objects\teleporter\blackteleporter\blackteleporter.object [NEW] objects\teleporter\blackteleporter\blackteleporter.png [NEW] objects\teleporter\blackteleporter\blackteleportericon.png [NEW] objects\teleporter\blackteleporter\blackteleporterlit.png [NEW] objects\teleporter\blackteleporter\default.frames [NEW] objects\teleporter\brassteleporter\brassteleporter.object [NEW] objects\teleporter\brassteleporter\brassteleporter.png [NEW] objects\teleporter\brassteleporter\brassteleportericon.png [NEW] objects\teleporter\brassteleporter\brassteleporterlit.png [NEW] objects\teleporter\brassteleporter\default.frames [NEW] objects\teleporter\futureteleporter\default.frames [NEW] objects\teleporter\futureteleporter\futureteleporter.object [NEW] objects\teleporter\futureteleporter\futureteleporter.png [NEW] objects\teleporter\futureteleporter\futureteleportericon.png [NEW] objects\teleporter\futureteleporter\futureteleporterlit.png [NEW] objects\teleporter\scienceteleporter\default.frames [NEW] objects\teleporter\scienceteleporter\scienceteleporter.object [NEW] objects\teleporter\scienceteleporter\scienceteleporter.png [NEW] objects\teleporter\scienceteleporter\scienceteleportericon.png [NEW] objects\teleporter\scienceteleporter\scienceteleporterlit.png [NEW] objects\teleporter\stoneteleporter\default.frames [NEW] objects\teleporter\stoneteleporter\stoneteleporter.object [NEW] objects\teleporter\stoneteleporter\stoneteleporter.png [NEW] objects\teleporter\stoneteleporter\stoneteleportericon.png [NEW] objects\teleporter\stoneteleporter\stoneteleporterlit.png [NEW] objects\teleporter\tombteleporter\default.frames [NEW] objects\teleporter\tombteleporter\tombteleporter.object [NEW] objects\teleporter\tombteleporter\tombteleporter.png [NEW] objects\teleporter\tombteleporter\tombteleportericon.png [NEW] objects\teleporter\tombteleporter\tombteleporterlit.png [NEW] objects\teleporter\woodenteleporter\default.frames [NEW] objects\teleporter\woodenteleporter\woodenteleporter.object [NEW] objects\teleporter\woodenteleporter\woodenteleporter.png [NEW] objects\teleporter\woodenteleporter\woodenteleportericon.png [NEW] objects\teleporter\woodenteleporter\woodenteleporterlit.png objects\undergroundbiome\smashablerocks\copperrock\copperrock.object objects\undergroundbiome\smashablerocks\copperrocksmall\copperrocksmall.object objects\undergroundbiome\smashablerocks\diamondrock\diamondrock.object objects\undergroundbiome\smashablerocks\diamondrocksmall\diamondrocksmall.object objects\undergroundbiome\smashablerocks\goldrock\goldrock.object objects\undergroundbiome\smashablerocks\goldrocksmall\goldrocksmall.object objects\undergroundbiome\smashablerocks\platinumrock\platinumrock.object objects\undergroundbiome\smashablerocks\platinumrocksmall\platinumrocksmall.object objects\undergroundbiome\smashablerocks\silverrock\silverrock.object objects\undergroundbiome\smashablerocks\silverrocksmall\silverrocksmall.object player\playereffects.animation [NEW] recipes\teleporter\blackteleporter.recipe [NEW] recipes\teleporter\brassteleporter.recipe [NEW] recipes\teleporter\futureteleporter.recipe [NEW] recipes\teleporter\scienceteleporter.recipe [NEW] recipes\teleporter\stoneteleporter.recipe [NEW] recipes\teleporter\teleportercore.recipe [NEW] recipes\teleporter\tombteleporter.recipe [NEW] recipes\teleporter\woodenteleporter.recipe scripts\pathing.lua species\florannamegen.config tiles\materials\eyepiles.material treasure\common.treasurepools treasure\default.treasurechests treasure\recycle.treasurepools DIFFS ----- player.config 197d196 < { "item" : "remoteteleporter" }, biomes\distributions.config 396a397,402 > > "undergroundOreRocks" : { > "type" : "random", > > "blockProbability" : 0.015 > }, biomes\core\gardencorelayer.biome 49c49 < "distribution" : "/biomes/distributions.config:veryRare", --- > "distribution" : "/biomes/distributions.config:undergroundOreRocks", biomes\underground\underground0a.biome 60c60 < "distribution" : "/biomes/distributions.config:veryRare", --- > "distribution" : "/biomes/distributions.config:undergroundOreRocks", biomes\underground\underground0b.biome 60c60 < "distribution" : "/biomes/distributions.config:veryRare", --- > "distribution" : "/biomes/distributions.config:undergroundOreRocks", biomes\underground\underground0c.biome 60c60 < "distribution" : "/biomes/distributions.config:veryRare", --- > "distribution" : "/biomes/distributions.config:undergroundOreRocks", biomes\underground\underground0d.biome 60c60 < "distribution" : "/biomes/distributions.config:veryRare", --- > "distribution" : "/biomes/distributions.config:undergroundOreRocks", biomes\underground\underground1a.biome 60c60 < "distribution" : "/biomes/distributions.config:veryRare", --- > "distribution" : "/biomes/distributions.config:undergroundOreRocks", biomes\underground\underground1b.biome 60c60 < "distribution" : "/biomes/distributions.config:veryRare", --- > "distribution" : "/biomes/distributions.config:undergroundOreRocks", biomes\underground\underground1c.biome 60c60 < "distribution" : "/biomes/distributions.config:veryRare", --- > "distribution" : "/biomes/distributions.config:undergroundOreRocks", biomes\underground\underground1d.biome 60c60 < "distribution" : "/biomes/distributions.config:veryRare", --- > "distribution" : "/biomes/distributions.config:undergroundOreRocks", biomes\underground\underground3a.biome 60c60 < "distribution" : "/biomes/distributions.config:veryRare", --- > "distribution" : "/biomes/distributions.config:undergroundOreRocks", biomes\underground\underground3b.biome 60c60 < "distribution" : "/biomes/distributions.config:veryRare", --- > "distribution" : "/biomes/distributions.config:undergroundOreRocks", biomes\underground\underground3c.biome 60c60 < "distribution" : "/biomes/distributions.config:veryRare", --- > "distribution" : "/biomes/distributions.config:undergroundOreRocks", biomes\underground\underground3d.biome 60c60 < "distribution" : "/biomes/distributions.config:veryRare", --- > "distribution" : "/biomes/distributions.config:undergroundOreRocks", biomes\underground\underground5a.biome 60c60 < "distribution" : "/biomes/distributions.config:veryRare", --- > "distribution" : "/biomes/distributions.config:undergroundOreRocks", biomes\underground\underground5b.biome 60c60 < "distribution" : "/biomes/distributions.config:veryRare", --- > "distribution" : "/biomes/distributions.config:undergroundOreRocks", biomes\underground\underground5c.biome 60c60 < "distribution" : "/biomes/distributions.config:veryRare", --- > "distribution" : "/biomes/distributions.config:undergroundOreRocks", biomes\underground\underground5d.biome 60c60 < "distribution" : "/biomes/distributions.config:veryRare", --- > "distribution" : "/biomes/distributions.config:undergroundOreRocks", dungeons\missions\floranmissions\floranmission1.dungeon 2336,2341d2335 < "value" : [6, 6, 6, 255], < "comment" : "devstatuegeorge", < "brush" : [ [ "clear" ], [ "object", "devstatuegeorge" ] ] < }, < < { dungeons\missions\penguinmissions\penguinmission1.dungeon 2311,2316d2310 < "value" : [6, 6, 6, 255], < "comment" : "devstatuegeorge", < "brush" : [ [ "clear" ], [ "object", "devstatuegeorge" ] ] < }, < < { dungeons\missions\penguinmissions\penguinmission2.dungeon 2312,2317d2311 < "value" : [6, 6, 6, 255], < "comment" : "devstatuegeorge", < "brush" : [ [ "clear" ], [ "object", "devstatuegeorge" ] ] < }, < < { dungeons\other\outpost\outpost.dungeon 1859,1860c1859,1866 < "comment" : "remoteteleporter", < "brush" : [ [ "clear" ], [ "object", "remoteteleporter", { "parameters" : { "interactData" : "/interface/warping/outpostteleporter.config", "teleporterUniqueId" : "outpost" } } ] ] --- > "comment" : "2stoptele", > "brush" : [ [ "clear" ], [ "object", "2stoptele", { "parameters" : { "interactData" : "/interface/warping/outpostteleporter.config", "teleporterUniqueId" : "outpost" } } ] ] > }, > > { > "value" : [80, 217, 22, 255], > "comment" : "ironanvil", > "brush" : [ [ "clear" ], [ "object", "2stopshop" ] ] monsters\ground\approachstate.lua 37c37 < local moved = moveTo(option.approachPoint, dt, {run = option.approachDistance >= 1.0}) --- > local moved = moveTo(option.approachPoint, dt, {run = option.approachDistance >= 1.0, mustEndOnGround = true}) 41c41 < moved = moveTo(option.approachPoint, dt, {run = option.approachDistance >= 1.0, returnBest = true, maxDistance = 15}) --- > moved = moveTo(option.approachPoint, dt, {run = option.approachDistance >= 1.0, returnBest = true, maxDistance = 15, mustEndOnGround = true}) monsters\ground\groundmonster.lua 327,331c327,339 < if self.jumpTimer > 0 and not self.onGround then < mcontroller.controlHoldJump() < else < if self.jumpTimer <= 0 then < if jumpThresholdX == nil then jumpThresholdX = 4 end --- > if self.jumpTimer <= 0 then > if jumpThresholdX == nil then jumpThresholdX = 4 end > > -- We either need to be blocked by something, the target is above us and > -- we are about to fall, or the target is significantly high above us > local doJump = false > if isBlocked() then > doJump = true > elseif (delta[2] >= 0 and willFall() and math.abs(delta[1]) > 7) then > doJump = true > elseif (math.abs(delta[1]) < jumpThresholdX and delta[2] > entity.configParameter("jumpTargetDistance")) then > doJump = true > end 333,347c341,342 < -- We either need to be blocked by something, the target is above us and < -- we are about to fall, or the target is significantly high above us < local doJump = false < if isBlocked() then < doJump = true < elseif (delta[2] >= 0 and willFall() and math.abs(delta[1]) > 7) then < doJump = true < elseif (math.abs(delta[1]) < jumpThresholdX and delta[2] > entity.configParameter("jumpTargetDistance")) then < doJump = true < end < < if doJump then < self.jumpTimer = entity.randomizeParameterRange("jumpTime") < controlJump() < end --- > if doJump then > controlJump() 449c444 < function willFall() --- > function willFall(direction) 452a448,449 > --Snap the position forward > position[1] = direction > 0 and math.ceil(position[1]) or math.floor(position[1]) 454,455c451,458 < if not validStandingPosition(position) then < return true --- > local bounds = mcontroller.boundBox() > > local groundRegion = { > math.floor(position[1] + bounds[1]), math.ceil(position[2] + bounds[2] - 1), > math.ceil(position[1] + bounds[3]), math.ceil(position[2] + bounds[2]) > } > if world.rectTileCollision(groundRegion, "Any") then > return false 457c460 < return false --- > return true monsters\ground\wanderstate.lua 23,25c23 < if self.jumpTimer > 0 and not mcontroller.onGround() then < mcontroller.controlHoldJump() < elseif self.territory ~= 0 then --- > if self.territory ~= 0 then 35d32 < self.jumpTimer = entity.randomizeParameterRange("jumpTime") monsters\ground\skills\chargeattack.lua 8d7 < world.logInfo("Blocked: %s | Falling: %s", isBlocked(), willFall()) npcs\chatstate.lua 69c69 < if not move(toPartner[1], dt) then --- > if not move(toPartner[1]) then 73c73 < if not move(-toPartner[1], dt) then --- > if not move(-toPartner[1]) then npcs\fleestate.lua 63c63 < move(fromTarget[1], dt, { run = true }) --- > move(fromTarget[1], { run = true }) npcs\main.lua 343a344 > self.debug = true 476c477 < function move(direction, dt, options) --- > function move(direction, options) 479a481 > self.pathing.deltaX = direction npcs\meleeattackstate.lua 113c113,116 < stateData.targetPosition = targetPosition --- > local groundPosition = findGroundPosition(targetPosition, -5, 2) > if groundPosition then > stateData.targetPosition = groundPosition > end 145c148 < local tokenEntityPosition = world.entityPosition(stateData.awaitingAttackToken) --- > local tokenEntityPosition = findGroundPosition(world.entityPosition(stateData.awaitingAttackToken), -2, 2) 164c167 < local sidePosition = { --- > local sidePosition = findGroundPosition({ 167c170 < } --- > }, -2, 2) 169,171c172,176 < local running = world.magnitude(position, sidePosition) > entity.configParameter("meleeAttack.runThreshold") < moveTo(sidePosition, dt, {run = running}) < controlFace(toTarget[1]) --- > if sidePosition then > local running = world.magnitude(position, sidePosition) > entity.configParameter("meleeAttack.runThreshold") > moveTo(sidePosition, dt, {run = running}) > controlFace(toTarget[1]) > end npcs\rangedattackstate.lua 103c103 < move(-toTarget[1], dt) --- > move(-toTarget[1]) 109c109 < move(toTarget[1], dt) --- > move(toTarget[1]) npcs\wanderstate.lua 147c147 < local moved, reason = move(stateData.direction, dt, { --- > local moved, reason = move(stateData.direction, { npcs\guard\guardstate.lua 155c155,171 < local moved = moveTo(stateData.patrolTarget, dt) --- > local toTarget = world.distance(stateData.patrolTarget, position) > if toTarget[1] < 1 and toTarget[2] < 1 then > return false > end > > local moved > if not stateData.pathing then > moved = move(toTarget[1]) > > if moved and toTarget[1] > 1 then > return false > else > stateData.pathing = true > end > end > > moved = moveTo(stateData.patrolTarget) 158,159c174 < local toTarget = world.distance(stateData.patrolTarget, position) < controlFace(self.pathing.deltaX or toTarget[1]) --- > controlFace(self.pathing.deltaX) 167c182 < stateData.patrolTarget = vec2.add({ -direction * stateData.patrolDistance, 0 }, storage.spawnPosition) --- > stateData.patrolTarget = findGroundPosition(vec2.add({ -direction * stateData.patrolDistance, 0 }, storage.spawnPosition), -5, 5) npcs\guard\returntopoststate.lua 16c16 < if distance < entity.configParameter("returnToPost.minDistance") then --- > if distance < entity.configParameter("returnToPost.minDistance") or stateData.timer <= 0 then 18a19,26 > stateData.timer = stateData.timer - dt > > --Try to path to the spawn position > local moved = moveTo(storage.spawnPosition, dt) > if moved ~= false then > controlFace(self.pathing.deltaX) > return false > end 19a28,35 > -- If direct pathing fails, try to path in the general direction of the spawn position > moved = moveTo(storage.spawnPosition, dt, {returnBest = true, maxDistance = 40, mustEndOnGround = true}) > if moved ~= false then > controlFace(self.pathing.deltaX) > return false > end > > --If pathing at all fails, just walk in the horizontal direction of the spawn position 21,22c37,41 < moveTo(storage.spawnPosition, dt, {returnBest = true, maxDistance = 25, mustEndOnGround = true}) < controlFace(self.pathing.deltaX or toSpawn[1]) --- > moved = move(toSpawn[1]) > if moved ~= false and toSpawn[1] > 1 then > controlFace(self.pathing.deltaX) > return false > end 24,25c43,45 < stateData.timer = stateData.timer - dt < return stateData.timer < 0 --- > --Can't move at all, set the current position as a new spawn position > storage.spawnPosition = findGroundPosition(mcontroller.position(), -5, 5) or mcontroller.position() > return true objects\hoard\barrelgoldfilled\barrelgoldfilled.object 6c6 < "description" : "A barrel filled with treasure! (Potentially unobtainable)", --- > "description" : "A barrel filled with treasure!", 10c10 < "price" : 1000, --- > "price" : 675, objects\hoard\diamonddisplay\diamonddisplay.object 7c7 < "price" : 1000, --- > "price" : 1750, objects\hoard\goldenpedestal\goldenpedestal.object 8c8 < "price" : 1000, --- > "price" : 425, objects\hoard\goldvase1\goldvase1.object 7,8c7,8 < "category" : "pot", < "price" : 500, --- > "category" : "decorative", > "price" : 375, 10,15c10,15 < "apexDescription" : "A wicker basket. Easily broken.", < "avianDescription" : "A woven basket. Perhaps there are goodies inside.", < "floranDescription" : "Sssssmash basssket!", < "glitchDescription" : "Examine. A wicker basket. What's inside I wonder?", < "humanDescription" : "A very bashable wicker basket.", < "hylotlDescription" : "There could be something inside this basket.", --- > "apexDescription" : "A golden odd jug for special ceremonies.", > "avianDescription" : "A golden odd jug for special ceremonies.", > "floranDescription" : "A golden odd jug for special ceremonies.", > "glitchDescription" : "A golden odd jug for special ceremonies.", > "humanDescription" : "A golden odd jug for special ceremonies.", > "hylotlDescription" : "A golden odd jug for special ceremonies.", 21d20 < 23,24c22,23 < "frames" : 1, < "animationCycle" : 1.0, --- > "direction" : "left", > "flipImages" : true, 27a27,31 > }, > { > "image" : "goldvase1.png:", > "imagePosition" : [-8, 0], > "direction" : "right", 28a33,34 > "spaceScan" : 0.1, > "anchors" : [ "bottom" ] 30,36d35 < ], < "smashSounds" : [ "/sfx/objects/capsule_break1.wav", "/sfx/objects/capsule_break2.wav", "/sfx/objects/capsule_break3.wav" ], < "smashDropOptions" : [ < [ [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ] ] < ], < "breakDropOptions" : [ < [ [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ] ] objects\hoard\goldvase2\goldvase2.object 7,8c7,8 < "category" : "pot", < "price" : 500, --- > "category" : "decorative", > "price" : 350, 10,15c10,15 < "apexDescription" : "A wicker basket. Easily broken.", < "avianDescription" : "A woven basket. Perhaps there are goodies inside.", < "floranDescription" : "Sssssmash basssket!", < "glitchDescription" : "Examine. A wicker basket. What's inside I wonder?", < "humanDescription" : "A very bashable wicker basket.", < "hylotlDescription" : "There could be something inside this basket.", --- > "apexDescription" : "A golden jug for special ceremonies.", > "avianDescription" : "A golden jug for special ceremonies.", > "floranDescription" : "A golden jug for special ceremonies.", > "glitchDescription" : "A golden jug for special ceremonies.", > "humanDescription" : "A golden jug for special ceremonies.", > "hylotlDescription" : "A golden jug for special ceremonies.", 21,24c21,23 < < "imagePosition" : [-8, 0], < "frames" : 1, < "animationCycle" : 1.0, --- > "imagePosition" : [-7, 0], > "direction" : "left", > "flipImages" : true, 27a27,31 > }, > { > "image" : "goldvase2.png:", > "imagePosition" : [-9, 0], > "direction" : "right", 28a33,34 > "spaceScan" : 0.1, > "anchors" : [ "bottom" ] 30,36d35 < ], < "smashSounds" : [ "/sfx/objects/capsule_break1.wav", "/sfx/objects/capsule_break2.wav", "/sfx/objects/capsule_break3.wav" ], < "smashDropOptions" : [ < [ [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ] ] < ], < "breakDropOptions" : [ < [ [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ] ] objects\hoard\goldvase3\goldvase3.object 7,8c7,8 < "category" : "pot", < "price" : 500, --- > "category" : "decorative", > "price" : 275, 10,15c10,15 < "apexDescription" : "A wicker basket. Easily broken.", < "avianDescription" : "A woven basket. Perhaps there are goodies inside.", < "floranDescription" : "Sssssmash basssket!", < "glitchDescription" : "Examine. A wicker basket. What's inside I wonder?", < "humanDescription" : "A very bashable wicker basket.", < "hylotlDescription" : "There could be something inside this basket.", --- > "apexDescription" : "A slim golden jug for special ceremonies.", > "avianDescription" : "A slim golden jug for special ceremonies.", > "floranDescription" : "A slim golden jug for special ceremonies.", > "glitchDescription" : "A slim golden jug for special ceremonies.", > "humanDescription" : "A slim golden jug for special ceremonies.", > "hylotlDescription" : "A slim golden jug for special ceremonies.", 21d20 < 23,24c22,23 < "frames" : 1, < "animationCycle" : 1.0, --- > "direction" : "left", > "flipImages" : true, 27a27,31 > }, > { > "image" : "goldvase3.png:", > "imagePosition" : [0, 0], > "direction" : "right", 28a33,34 > "spaceScan" : 0.1, > "anchors" : [ "bottom" ] 30,36d35 < ], < "smashSounds" : [ "/sfx/objects/capsule_break1.wav", "/sfx/objects/capsule_break2.wav", "/sfx/objects/capsule_break3.wav" ], < "smashDropOptions" : [ < [ [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ] ] < ], < "breakDropOptions" : [ < [ [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ] ] objects\hoard\goldvase4\goldvase4.object 7,8c7,8 < "category" : "pot", < "price" : 500, --- > "category" : "decorative", > "price" : 275, 10,15c10,15 < "apexDescription" : "A wicker basket. Easily broken.", < "avianDescription" : "A woven basket. Perhaps there are goodies inside.", < "floranDescription" : "Sssssmash basssket!", < "glitchDescription" : "Examine. A wicker basket. What's inside I wonder?", < "humanDescription" : "A very bashable wicker basket.", < "hylotlDescription" : "There could be something inside this basket.", --- > "apexDescription" : "A slim golden jug for special ceremonies.", > "avianDescription" : "A slim golden jug for special ceremonies.", > "floranDescription" : "A slim golden jug for special ceremonies.", > "glitchDescription" : "A slim golden jug for special ceremonies.", > "humanDescription" : "A slim golden jug for special ceremonies.", > "hylotlDescription" : "A slim golden jug for special ceremonies.", 21d20 < 23,24c22,23 < "frames" : 1, < "animationCycle" : 1.0, --- > "direction" : "left", > "flipImages" : true, 27a27,31 > }, > { > "image" : "goldvase4.png:", > "imagePosition" : [0, 0], > "direction" : "right", 28a33,34 > "spaceScan" : 0.1, > "anchors" : [ "bottom" ] 30,36d35 < ], < "smashSounds" : [ "/sfx/objects/capsule_break1.wav", "/sfx/objects/capsule_break2.wav", "/sfx/objects/capsule_break3.wav" ], < "smashDropOptions" : [ < [ [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ] ] < ], < "breakDropOptions" : [ < [ [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ] ] objects\hoard\goldvase5\goldvase5.object 7,8c7,8 < "category" : "pot", < "price" : 500, --- > "category" : "decorative", > "price" : 325, 10,15c10,15 < "apexDescription" : "A wicker basket. Easily broken.", < "avianDescription" : "A woven basket. Perhaps there are goodies inside.", < "floranDescription" : "Sssssmash basssket!", < "glitchDescription" : "Examine. A wicker basket. What's inside I wonder?", < "humanDescription" : "A very bashable wicker basket.", < "hylotlDescription" : "There could be something inside this basket.", --- > "apexDescription" : "A slim golden jug for special ceremonies.", > "avianDescription" : "A slim golden jug for special ceremonies.", > "floranDescription" : "A slim golden jug for special ceremonies.", > "glitchDescription" : "A slim golden jug for special ceremonies.", > "humanDescription" : "A slim golden jug for special ceremonies.", > "hylotlDescription" : "A slim golden jug for special ceremonies.", 21,24c21,23 < < "imagePosition" : [0, 0], < "frames" : 1, < "animationCycle" : 1.0, --- > "imagePosition" : [-6, 0], > "direction" : "left", > "flipImages" : true, 27a27,31 > }, > { > "image" : "goldvase5.png:", > "imagePosition" : [-10, 0], > "direction" : "right", 28a33,34 > "spaceScan" : 0.1, > "anchors" : [ "bottom" ] 30,36d35 < ], < "smashSounds" : [ "/sfx/objects/capsule_break1.wav", "/sfx/objects/capsule_break2.wav", "/sfx/objects/capsule_break3.wav" ], < "smashDropOptions" : [ < [ [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ] ] < ], < "breakDropOptions" : [ < [ [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ], [ "goldcoin", 1, { } ] ] objects\hoard\grail\grail.object 7c7 < "price" : 1000, --- > "price" : 500, objects\hoard\mysteriouslight\mysteriouslight.object 5c5 < "price" : 600, --- > "price" : 225, objects\hoard\safe\safe.object 8c8 < "price" : 500, --- > "price" : 450, objects\hoard\treasurechest\treasurechest.object 8c8 < "price" : 500, --- > "price" : 625, 31,32c31,32 < "openSounds" : [ "/sfx/objects/chest_small_open.wav" ], < "closeSounds" : [ "/sfx/objects/chest_small_close.wav" ], --- > "openSounds" : [ "/sfx/objects/chest_large_open.wav" ], > "closeSounds" : [ "/sfx/objects/chest_large_close.wav" ], objects\holiday\bigpresent\bigpresent.object 9c9 < "price" : 300, --- > "price" : 0, objects\holiday\decoratedtree\decoratedtree.object 6c6 < "price" : 300, --- > "price" : 0, objects\holiday\dreidel\dreidel.object 9c9 < "price" : 200, --- > "price" : 0, objects\holiday\giantbells\giantbells.object 9c9 < "price" : 750, --- > "price" : 0, objects\holiday\giantbow1\giantbow1.object 6c6 < "price" : 350, --- > "price" : 0, objects\holiday\giantbow2\giantbow2.object 6c6 < "price" : 350, --- > "price" : 0, objects\holiday\giantsanta\giantsanta.object 6c6 < "price" : 500, --- > "price" : 0, objects\holiday\giantsnowflake\giantsnowflake.object 6c6 < "price" : 350, --- > "price" : 0, objects\holiday\giftmonsterbox\giftmonsterbox.object 5d4 < 7c6 < "price" : 300, --- > "price" : 0, objects\holiday\giftmonsterbox\giftmonstersmallbox.object 5d4 < 7c6 < "price" : 300, --- > "price" : 0, objects\holiday\goldball\goldball.object 9c9 < "price" : 500, --- > "price" : 0, objects\holiday\greencandycane1\greencandycane1.object 6c6 < "price" : 200, --- > "price" : 0, objects\holiday\greencandycane2\greencandycane2.object 6c6 < "price" : 200, --- > "price" : 0, objects\holiday\greencandycane3\greencandycane3.object 6c6 < "price" : 200, --- > "price" : 0, objects\holiday\greengumdrop1\greengumdrop1.object 9c9 < "price" : 300, --- > "price" : 0, objects\holiday\greengumdrop2\greengumdrop2.object 9c9 < "price" : 450, --- > "price" : 0, objects\holiday\heartforge\heartforge.object 14c14 < "price" : 500, --- > "price" : 0, objects\holiday\holidaycandles\holidaycandles.object 6c6 < "price" : 150, --- > "price" : 0, objects\holiday\holidaycraftingtable\holidaycraftingtable.object 14c14 < "price" : 500, --- > "price" : 0, objects\holiday\holidaylights\holidaylights.object 6c6 < "price" : 150, --- > "price" : 0, objects\holiday\holidaypole\holidaypole.object 6c6 < "price" : 300, --- > "price" : 0, objects\holiday\holly\holly.object 9c9 < "price" : 300, --- > "price" : 0, objects\holiday\lollipop1\lollipop1.object 9c9 < "price" : 500, --- > "price" : 0, objects\holiday\lollipop2\lollipop2.object 9c9 < "price" : 250, --- > "price" : 0, objects\holiday\menorah\menorah.object 6c6 < "price" : 1000, --- > "price" : 0, objects\holiday\present1\present1.object 11c11 < "price" : 300, --- > "price" : 0, objects\holiday\present2\present2.object 11c11 < "price" : 300, --- > "price" : 0, objects\holiday\present3\present3.object 11c11 < "price" : 300, --- > "price" : 0, objects\holiday\present4\present4.object 11c11 < "price" : 300, --- > "price" : 0, objects\holiday\purplegumdrop1\purplegumdrop1.object 9c9 < "price" : 300, --- > "price" : 0, objects\holiday\purplegumdrop2\purplegumdrop2.object 9c9 < "price" : 450, --- > "price" : 0, objects\holiday\redball\redball.object 9c9 < "price" : 500, --- > "price" : 0, objects\holiday\redcandycane1\redcandycane1.object 6c6 < "price" : 200, --- > "price" : 0, objects\holiday\redcandycane2\redcandycane2.object 6c6 < "price" : 200, --- > "price" : 0, objects\holiday\redcandycane3\redcandycane3.object 6c6 < "price" : 200, --- > "price" : 0, objects\holiday\redgumdrop1\redgumdrop1.object 9c9 < "price" : 300, --- > "price" : 0, objects\holiday\redgumdrop2\redgumdrop2.object 9c9 < "price" : 450, --- > "price" : 0, objects\holiday\scifisleigh\scifisleigh.object 9c9 < "price" : 2000, --- > "price" : 0, objects\holiday\smallbow\smallbow.object 6c6 < "price" : 350, --- > "price" : 0, objects\holiday\smallholidaytree\smallholidaytree.object 6c6 < "price" : 300, --- > "price" : 0, objects\holiday\smallsnowflake\smallsnowflake.object 6c6 < "price" : 350, --- > "price" : 0, objects\holiday\stocking1\stocking1.object 6c6 < "price" : 250, --- > "price" : 0, objects\holiday\stocking2\stocking2.object 6c6 < "price" : 250, --- > "price" : 0, objects\holiday\undecoratedtree\undecoratedtree.object 6c6 < "price" : 300, --- > "price" : 0, objects\holiday\wazlights\wazlights.object 6c6 < "price" : 300, --- > "price" : 0, objects\undergroundbiome\smashablerocks\copperrock\copperrock.object 54a55,56 > "health" : 20, > objects\undergroundbiome\smashablerocks\copperrocksmall\copperrocksmall.object 53a54,55 > > "health" : 10, objects\undergroundbiome\smashablerocks\diamondrock\diamondrock.object 53a54,55 > > "health" : 60, objects\undergroundbiome\smashablerocks\diamondrocksmall\diamondrocksmall.object 53a54,55 > > "health" : 30, objects\undergroundbiome\smashablerocks\goldrock\goldrock.object 54a55,56 > "health" : 40, > objects\undergroundbiome\smashablerocks\goldrocksmall\goldrocksmall.object 53a54,55 > > "health" : 20, objects\undergroundbiome\smashablerocks\platinumrock\platinumrock.object 54a55,56 > "health" : 50, > objects\undergroundbiome\smashablerocks\platinumrocksmall\platinumrocksmall.object 54a55,56 > "health" : 25, > objects\undergroundbiome\smashablerocks\silverrock\silverrock.object 54a55,56 > "health" : 30, > objects\undergroundbiome\smashablerocks\silverrocksmall\silverrocksmall.object 54a55,56 > "health" : 15, > player\playereffects.animation 45c45 < "frames" : 16, --- > "frames" : 13, 84a85,89 > }, > "abort" : { > "properties" : { > "image" : "/animations/teleport/playerwarpabort.png:" > } 97,99d101 < "none" : { }, < "defaultIn" : { }, < "defaultOut" : { }, scripts\pathing.lua 4d3 < self.pathing.deltaX = direction 19c18,19 < boundBox = mcontroller.boundBox() --- > boundBox = mcontroller.boundBox(), > smallJumpMultiplier = 1 / math.sqrt(2) -- 0.5 multiplier to jump height 81a82,86 > local edgeDelta = world.distance(currentEdge.target.position, currentEdge.source.position) > if edgeDelta[1] ~= 0 then > self.pathing.deltaX = edgeDelta[1] > 0 and 1 or -1 > end > 108a114 > self.pathing.wasOffGround = false 120d125 < --Approach the jump position more precisely to follow the jump arc accurately 122,123c127,130 < if delta[1] > 0.2 then < moveX(delta[1]) --- > > --Approach the jump position more precisely to follow the jump arc accurately > if math.abs(delta[1]) > tickMoveDistance() then > moveX(delta[1], options.run) 141,142c148,149 < --Teleport to node position for very accurate jumping < --(Not noticeable) --- > -- Teleport to node position for very accurate jumping > -- Teleporting should be kept unnoticeable 144c151 < --mcontroller.setPosition(currentEdge.source.position) --- > mcontroller.setPosition(currentEdge.source.position) 157c164,175 < timedDrop(timeToFall(-delta[2])) --- > if onSolidGround() then > script.setUpdateDelta(1) > if math.abs(delta[1]) > tickMoveDistance() then > moveX(delta[1], options.run) > return "running" > else > mcontroller.setPosition({nextPathPosition[1], position[2]}) > end > end > > timedDrop(math.max(timeToFall(-delta[2]), 0.05)) > mcontroller.setXVelocity(0) 164,167c182,200 < if mcontroller.onGround() then < -- Jump failed and we landed somehow. < -- Might have to walk a little bit to the next node < if world.magnitude(delta) < 1 then --- > > -- Advance path if the target position is in a different direction than the arc is pointing > local arcDistance = world.distance(currentEdge.target.position, currentEdge.source.position) > local targetDistance = world.distance(currentEdge.target.position, mcontroller.position()) > if (arcDistance[1] ~= 0 and arcDistance[1] * targetDistance[1] < 0) or > (arcDistance[1] == 0 and arcDistance[2] * targetDistance[2] < 0) then > advancePath() > end > > if self.pathing.wasOffGround and mcontroller.onGround() then > -- We were off the ground and then we weren't. Jump failed and we landed > -- somehow. Might have to walk a little bit to the next node > local nextEdge = self.pathing.path.path[self.pathing.path.currentEdgeIndex+2] or {} > if not nextEdge.action or nextEdge.action ~= "Arc" then > advancePath() > return "running" > end > > if math.abs(delta[1]) <= 1 and delta[2] <= 1 then 176c209 < moveX(delta[1], options.run) --- > moveX(delta[1], false) 186a220,226 > > elseif mcontroller.onGround() then > -- We're being asked to drop off a ledge, and haven't quite left it yet > > moveX(delta[1]) > return "running" > 187a228,229 > self.pathing.wasOffGround = true > 195,201d236 < -- Advance path if the target position is in a different direction than the arc is pointing < local arcDirection = world.distance(currentEdge.target.position, currentEdge.source.position) < local targetDirection = world.distance(currentEdge.target.position, mcontroller.position()) < if arcDirection[1] * targetDirection[1] < 0 or arcDirection[2] * targetDirection[2] < 0 then < advancePath() < end < 205d239 < world.debugLine(position, vec2.add(position, currentEdge.target.velocity), "green") 207d240 < self.pathing.deltaX = currentEdge.target.velocity[1] > 0 and 1 or -1 234,239c267 < local distance = world.magnitude(world.distance(mcontroller.position(), targetPosition)) < -- Update quickly near the target, and slowly at a long distance from the target < local expiryMultiplier = 1.0/9.0 + distance * 7.0 / 90.0 < -- At 5 tiles, expiryMultiplier = 0.5 < -- At 50 tiles, expiryMultiplier = 4.0 < return world.time() + expiryMultiplier * (1 + math.random()) --- > return world.time() + 1 + math.random() 265c293 < -- Simple pathing call count --- > -- Simple pathing benchmark 270c298 < -- world.logInfo("Path count: %s", findPathCount) --- > -- world.logInfo("Path count: %s | Path length: %s | In state: %s", findPathCount, self.pathing.path and #self.pathing.path.path, self.state and self.state.stateDesc()) 335c363 < if targetDistance < 0.1 then --- > if math.abs(toTarget[1]) < tickMoveDistance() and math.abs(toTarget[2]) < 1 then 359d386 < self.pathing.goalJumpPosition = goalPosition 369c396 < if self.pathing.downHoldTimer <= 0 then --- > if self.pathing.downHoldTimer <= 0 or mcontroller.onGround() then 373,377d399 < < if self.pathing.goalJumpPosition then < local goalDelta = world.distance(self.pathing.goalJumpPosition, mcontroller.position()) < moveX(goalDelta[1], options.run) < end 423c445 < return false --- > return nil 432c454 < position[1] + bounds[1], position[2] + bounds[2] - 0.5, --- > position[1] + bounds[1], position[2] + bounds[2] - 1, 437a460,464 > --roughly the max movement in one tick (very fuzzy) > function tickMoveDistance() > return mcontroller.baseParameters().runSpeed * script.updateDt() * 2 > end > 458d484 < species\florannamegen.config 6,7c6,7 < [ { "mode" : "alts" }, "Vine", "Stab", "Slice", "Thorn", "Bite", "Crush", "Kill", "Space", "Fish", "Death", "Ghost", "Tree", "Petal", "Fern", "Green", "Floran", "Hunt", "Bark", "Trunk", "Meat", "Flesh", "Scale", "Hair", "Land", "Kiss", "Cute", "Fire", "Sap", "Dirt", "Ape", "Bird", "Blood" ], < [ { "mode" : "alts" }, "-eater", "biter", "-slicer", "cutter", "nerfer", "-stabber", "burner", "finger", "hunter", "chaser", "punch", "roaster", "-singer", "killer", "fearer", "licker", "-eater", "watch", "knife", "blade", "-spike", "drinker", "bleeder", "-eraser", "puller", "razer", "-squasher", "worrier", "dancer" ] --- > [ { "mode" : "alts" }, "Arrow", "Ash", "Aster", "Bark", "Bay", "Beech", "Birch", "Black", "Bone", "Bramble", "Choke", "Clover", "Currant", "Dagger", "Daisy", "Death", "Dew", "Edge", "Fallow", "Fennel", "Field", "Flax", "Flesh", "Gorse", "Grass", "Green", "Hedge", "Holly", "Hop", "Ivy", "Leek", "Lily", "Loam", "Lotus", "Maple", "Mist", "Moss", "Moon", "Murder", "Myrtle", "Neem", "Nettle", "Noose", "Pea", "Pepper", "Pine", "Poppy", "Rain", "Reed", "Rose", "Rue", "Rush", "Rye", "Sage", "Sap", "Saw", "Sedge", "Shade", "Shadow", "Sickle", "Spring", "Star", "Strangle", "Summer", "Sun", "Thistle", "Track", "Wild", "Willow", "Winter", "Yarrow", "Yew" ], > [ { "mode" : "alts" }, "berry", "bind", "weed", "cap", "cress", "bush", "thorn", "vine", "root", "nut", "wort", "flower", "bloom", "blossom", "foot", "heart", "blade", "spike", "spine", "sticker", "creep", "wood", "leaf", "brush", "seed", "foil", "apple", "bud", "pole", "drop", "plum", "blight", "bite", "blood", "gore", "gut", "cut", "grip", "chop", "barb", "corn", "frond", "stalk", "bane", "trap", "chaser", "hunter", "-eater" ] tiles\materials\eyepiles.material 8,11c8,9 < "description" : "-todo-", < "glitchDescription" : "Studying. A pile of very interesting tomes.", < "floranDescription" : "Floran will try to read all books.", < "footstepSound" : "/sfx/blocks/footstep_wood.wav", --- > "description" : "A tumbling heap of squishy eyeballs.", > "footstepSound" : "/sfx/blocks/footstep_brains.wav", 16d13 < "damageTable" : "/tiles/flammableDamage.config", 23c20 < "multiColored" : true, --- > "multiColored" : false, treasure\common.treasurepools 953c953 < "techcardTreasure" : [ --- > "techChestTreasure" : [ 955,956c955,957 < "fill" : [ < {"item" : "blanktechcard"} --- > "pool" : [ > {"weight" : 0.7, "item" : "blanktechcard"}, > {"weight" : 0.3, "item" : "teleportercore"} treasure\default.treasurechests 23c23 < "treasurePool" : "techcardTreasure", --- > "treasurePool" : "techChestTreasure", treasure\recycle.treasurepools 5,15c5 < {"item" : [ "circuitboard", 2 ]} < ], < "poolRounds" : [ < [0.5, 0], < [0.25, 1], < [0.25, 2] < ], < "pool" : [ < {"weight" : 1.0, "item" : [ "diamond" ]}, < {"weight" : 1.0, "item" : [ "goldbar", 5 ]}, < {"weight" : 1.0, "item" : [ "durasteelbar", 5 ]} --- > {"item" : [ "teleportercore", 1 ]}