The first devlog covered the title screen, map selection, and the Thorn Forest's first two maps. This second post covers the third and fourth maps, two old problems with how the rocks look that have now been solved, the character name changes, a top-to-bottom overhaul of how combat feels, and enemy AI.
The images for this post haven't been captured yet; they'll be added once the map and the combat have settled.
20 · Map 1-3: Mushroom Hollows
The third map is 640 tiles wide and takes place almost entirely underground. It is made up of ten sections: Descent, Spore Gallery, Collapsing Well, Mushroom Cave, Crystal Chamber, Flooded Gallery, Spore Storm, Root Climb, Last Stand, and Daylight. It has 69 enemies, 111 gems in total, four campfires, and 92 objects.
The design logic is the same as in the first two maps: every step you have to climb is at most two tiles, every gap you have to jump is at most three tiles, and the main path doesn't require a double jump or a wall jump. Hidden areas are the exception to this rule: they are reached from one-way wooden platforms, so players who want to can stop by, and those who don't can keep going.
The reward in the middle of the map is a Heart Crystal sitting on top of a root platform. Picking it up permanently increases Arin's maximum health. In the flooded gallery, falling into the water costs health but doesn't end the run; there is a walkable bed beneath the water and steps on both banks. Spore Storm sets up a three-wave ambush, while in Last Stand you have to clear the arena before the gate opens. The map ends with a shaft of daylight seeping in from above.
The map took its current shape over four measured passes: the early passes had nine-tile water gaps, thirteen pits you couldn't climb back out of, and one softlock point. All of them were closed off; the reachability analysis currently reports no blockers, no forced forward moves, and no softlocks.
21 · The seam in the rock
Inside the caves, a thin blue line showed up where the rocks met the back wall. The reason was this: the rock tiles have transparent pixels along their edges, and the parallax sky at the very back was leaking through that transparent strip.
The fix was to draw a solid back-wall tile behind a rock tile whenever it touches only the back wall and has no contact at all with open air. Rocks that face open air keep their old edges, so the silhouettes of the hills outside are still crisp. The line of sky inside the cave, however, is gone.
Note: the bright turquoise strip on top of the night rocks isn't part of this bug. That is a layer of ice drawn into the tile image itself.
22 · The cave's inner corners
The second visual problem was the cave corners: when a rock tile had solid neighbors on all four sides but a diagonal neighbor was empty, a sharp right angle appeared. The tileset has no separate "inner corner" tile for this.
The fix came from within the tileset itself: the tile with the crystal notch, flipped upside down, gives exactly the corner that was needed. In Godot, flipping a tile doesn't require creating a separate variant; the transform flag is added directly to the tile ID. This way, the rock wraps around the corner instead of cutting it at a right angle. This rule was applied to 1 corner in the first map, 2 in the second, and 52 in the third.
A second idea tried at the same time was rolled back: chamfering the tips of rock ledges with diagonal tiles. Those diagonal tiles are actually the tips of a round rock mass; used at the end of a ledge, they look like ice ramps jutting out of the ground. It was tried, looked at, and shelved.
23 · Names
The character names moved from Turkish to Latin and mythological roots. The game's text stays in Turkish; only the names changed:
- Vesta (formerly Deren): the Roman goddess of the hearth and fire; we meet her at the burning village's first campfire
- Silvan (formerly Sarp): Silvanus, Rome's god of the forest; the runaway hunter
- Corin (formerly Kerem): a short name of Latin origin; the child found in a cage
- Nestor Dede (formerly Yaşar Dede): the aged mentor from the Iliad
Arin, Aldric, and Morvena already fit this pattern, so they didn't change.
24 · Combat was rewritten
Combat felt heavy. Measuring it made the reason clear: while swinging the sword, the character was nailed to the ground, and a single swing lasted 433 milliseconds. Since the gap between enemy attacks was 1.2 seconds, the player couldn't get away during that window and just took damage.
Five changes were made. Each one sits behind its own setting, so they can be turned off one by one.
Hitting on the move. A grounded swing now keeps moving forward at 55% of running speed. The direction at the moment the swing starts is locked, so the character doesn't turn around mid-swing, but the walk isn't interrupted. Measurement: the distance covered during one swing went from 11 pixels to 26 pixels.
Hit cancel. A hit that connects with an enemy chains directly into the next hit, a dash, or a jump, without waiting for the recovery frames. A swing that whiffs still pays its penalty. In other words, landing a hit is rewarded and missing is punished.
Press and hold. As long as the attack button is held down, the combo continues on its own. This was necessary because tapping a button over and over is hard on mobile. But a single tap shouldn't produce two hits, so a threshold was added: a press shorter than 0.25 seconds is always a single hit, and a longer press keeps the combo going. Measurement: presses of 33, 100, 167, 233, and 267 milliseconds all produce a single hit; at 300 milliseconds, the second hit begins.
Input memory. So that an early press doesn't get swallowed, the attack buffer was increased from 0.15 to 0.2 seconds, and the combo window from 0.2 to 0.3 seconds.
Auto-aim. Touch controls have no way to aim: a player who attacked without pressing a direction ended up swinging at thin air while an enemy stood behind them. Now, when you attack with no direction held, the character turns toward the nearest living enemy within 36 pixels. If a direction is held, the player's input wins and auto-aim doesn't kick in. If there's no enemy nearby, the facing direction doesn't change at all.
There is also one setting that was tried and rolled back: speeding up the swing animation from 1.25x to 1.5x. It looked good as a number, but in actual play it was too much, and it was returned to its old value. Speed now comes from hit canceling, not from the animation.
25 · Map 1-4: Watchtower Ruins
The fourth map comes up from underground and climbs the border's old watchtower. Goblins have made it their nest: there are sentries on the terraces, a courtyard sown with traps, a garden full of cages, a supply depot under the rubble, and an ambush at the foot of the tower. Ten sections: Ruin Road, Sentry Post, Trap Courtyard, Broken Wall, Cage Garden, Supply Depot, Tower Base, Tower Climb, Tower Top, and East Gate.
The map's story moment happens in the cage garden: Corin is being held in a cage. When you break the lock, goblins come in three waves, and both ends of the garden close off with thorn gates. Once freed, Corin tells you that Nestor Dede was taken to the camp to the east, and that at the top of the tower there is an old guard chest the goblins couldn't open.
That chest is the chapter's first gear reward: a copper sword and shield. Arin still enters the map with the wooden set and comes down from the tower in copper. Opening the chest equips the set instantly, so the rest of the way is played with the new gear.
The numbers: 640 tiles wide, 46 placed enemies plus 18 wave enemies, 98 gems in total, four campfires, two arenas, seven chests, and an NPC.
The layout rules are the same as in the previous maps: every step you climb is two tiles, and under every gap there is ground two rows down — so a wrong jump costs health, not the run. The tower climb is made up of six stone steps, all two rows high; hidden chests sit on one-way wooden planks, because the touch controls have no down button.
The reachability analysis came out clean on the first pass: no blockers, no forced forward moves, no softlocks, all 64 enemies on solid ground, and every chest and Corin in a "reachable and returnable" state.
26 · Enemies: bat, goblin, mushroom
Once combat had been reworked, it was the enemies' turn. All three were handled the same way: measure first, then change, then measure again.
Bat. It hovers 36 pixels above the player, a height the sword can't reach, and its only attack, the dive, was both the only moment it could be hit and the only moment you took damage. The trade always came out one for one. The dive now has three stages: the bat first rises a little and waits for half a second (so you can tell it's coming), then dives, then hangs there dazed for about a second where the dive ended — during that time it deals no damage and is within sword range. That's the window to hit it. A dive met with the shield knocks the bat back and puts it into a longer recovery. This also required a fix to the player's shield: an attack coming from directly above is blocked no matter which way you're facing. On top of that, the bat no longer deals contact damage and dies to a single sword hit; its chase speed dropped from 58 to 42, and the range at which it gives up the chase dropped from 220 to 150.
Goblin. It used to stop and wait when it reached an edge; when the player went up a ledge, there was nothing it could do. Now, if the player is above, it jumps up onto a step of up to two tiles, it jumps a gap if there's ground to land on on the other side, and if the player is below, it drops down from the ledge. Before all three decisions, the landing point is scanned: it never jumps into water or onto thorns. This was measured in the test room — it climbs onto a two-tile ledge, crosses a 32-pixel gap, and stops at the edge if there are thorns in that same gap.
Mushroom. In the story it was described as an enemy that "launches spores from a distance," but in the code its ranged attack was never switched on: when it saw the player, it hid under its cap and did nothing unless you came almost right up to its nose. Now it stays out in the open within spore range and lobs spores, hides only once the player gets really close, and at contact range it opens its cap and sprays. Measurement: from 90 and 60 pixels, three spores each in 8 seconds; at 44 pixels, hidden 74% of the time; at 22 pixels, melee.
27 · Map 1-5: Misty Grove
The fifth map takes place east of the tower, on the Veil's own ground: the purple mist thickens, the tree trunks are wrapped in thorns, and under the moss stands a temple whose inscriptions no one has read in a lifetime. There is a half-erased sentence on the stone: "...the seal, by Morvena's hand... may it never be broken..." This is the first time the name of the chapter's main villain comes up, and it is left only as a hint.
Ten sections: Mist's Edge, Thorned Trees, Broken Altar, Marsh Pass, Temple Courtyard, Hall of Pillars, Seal Chamber, Mist Maze, Last Watch, and Root Mouth. 56 placed enemies plus 20 wave enemies, 109 gems in total, five campfires, two arenas, and nine chests.
Marsh Pass has two pools of dark water. Each one has a two-tile landing on both banks, and stones in the water that go all the way down to the bed: the stones are at most three tiles apart, so crossing is a walk and a few jumps. Falling into the water costs health but doesn't end the run — two steps lead back up from the bed.
The temple is made up of two rooms: the Hall of Pillars, whose roof is still standing, and the Seal Chamber, where the seal stone sits on a two-tile terrace. The map ends at the cave mouth where the roots reach down — the entrance to the sixth map.
On the first pass, the reachability analysis flagged the water crossing as "requires a double jump"; after the stones were added, the report is completely clean: no blockers, no forced forward moves, no softlocks, all 76 enemies on solid ground, and every chest reachable and returnable.
28 · Death, arenas, and rewards: the rough edges of gameplay
This round, the small rules that made the game feel "unplayable" were fixed one by one.
Dying doesn't empty the map. It used to be that when you died, the enemies you had killed stayed dead, and from the checkpoint onward you'd be walking through an empty map. Now every enemy ahead of the checkpoint is reset, while the ones behind it stay dead. Measurement: of the 26 enemies killed ahead of the checkpoint, all 26 came back; the 7 behind it did not.
Death isn't a hard cut. After the death animation, the screen fades to black, the map is rebuilt behind the black, and then the screen fades back in.
Arena waves don't hit without warning. Each spawn point is first marked with a cloud of dust, the enemy arrives 0.7 seconds later, and once it arrives it doesn't move for 0.8 seconds. A spawn that would land right on top of the player is shifted two tiles away. Measurement: the first damage used to come at 0 seconds; now it comes 1.5 seconds after the wave appears.
No traps on arena floors. Traps, thorns, and barrels between the gates were moved outside; the audit tool now checks for this as a rule.
No enemies right by the campfire. The area within six tiles of each checkpoint was cleared, and this was added to the audit too.
You don't get hit while you're on top of a mob. From the moment you land on an enemy's back, that enemy can't deal damage, either through contact or with its sword. Jumping over it no longer costs health.
Flying spores and slime can be cut. Swinging the sword pops ranged shots in midair.
What comes out of the chest is what's in the chest. The chest that gives the copper sword and shield no longer sends gems flying out, but the icons of those two pieces themselves.
When a map ends, you return to the map selection screen. After the results card, the game doesn't jump straight to the next map; the player chooses where to go.
29 · Combat became two-sided
Two complaints came up in playtesting, and both were fair.
"Why do I take damage when I touch a creature?" Enemies had passive contact damage: walking past them, jumping over them, even just touching them cost health. Contact damage was set to zero for every enemy in the forest. Now only a real attack — the hit frames of a sword swing, or a shot — costs health.
"When I spam attacks, they can't fight back at all." This was a deeper problem: every hit put the enemy into a stunned state, and a fast combo kept it there forever. Three rules were added:
- Poise: not every hit stuns; by default, a stun happens on every second hit, and the hits in between are just a white flash and a small knockback.
- Stun cooldown: once stunned, an enemy can't be stunned again for one second. So after every stun there is a guaranteed window to hit back.
- A started attack isn't interrupted: an enemy that has entered its attack animation finishes that swing even if it gets hit.
Measurement — the goblin's state while the player swings the sword nonstop for 10 seconds:
- Frames spent attacking: 23 → 333
- Frames spent stunned: 575 → 244
- Frames where its sword actually connected: 0 → 57
- Health lost by the player: 0 → 5
In short: now the fight goes both ways.
30 · What gear and gems mean
The copper sword and shield at the end of the fourth map had been purely visual until then: the sprite changed, but the damage was still the same as with the wooden sword. Now the gear's material is tied directly to the numbers:
- Sword material → damage. Wood 1, copper 2, iron 3... One tier per chapter.
- Armor material → health. Extra hearts equal to the best armor tier equipped. With copper chest armor, health goes from 5 to 6.
- Heart Crystals are counted separately, so changing armor never swallows a crystal you've found.
Also, the rewards that come out of chests are now really what's inside them: the chest that gives the copper set sends out the sword's and shield's own icons, not gems.
What gems will be used for, however, is still an open question — right now they're counted, saved, and shown on the end-of-map card, but there's nowhere to spend them. That's the subject of the next round.
31 · The game is bilingual
The game has been in Turkish from the start. Now the settings screen has a Language row: Türkçe and English. The choice applies instantly, any open screens rewrite themselves, and the preference is saved in settings.cfg.
Behind the scenes, there's a small dictionary called Loc: a key for each piece of text and its equivalent in both languages. Menus, settings, map selection, the HUD, the pause menu, map and chapter cards, reward text, and chapter/map names are all read from there. Dialogue, on the other hand, wasn't split into separate files: each line carries its own translation right next to it, so a line and its English sit in the same place. All 73 lines across the five maps have been translated.
The arena battle cry depends on the language too: SAVAŞ! in Turkish, FIGHT! in English.
32 · The Travelling Smith: something to spend gems on
Gems can now be spent. In the middle of every map, Faber stands by a campfire: a travelling blacksmith. In your first conversation he introduces himself, and on every interaction after that he opens his stall.
The stall has three rows:
- Whetstone (3 tiers): Raises the sword to the next metal. Price: 60 / 130 / 220 gems
- Heart Vessel (2 tiers): Max health +1. Price: 80 / 150 gems
- Nimble Boots: Dash cooldown is 30% shorter. Price: 80 gems
Buying everything costs 720 gems; Chapter 1 has 525 gems in total. So on every run you have to make a choice: will you sharpen the sword, raise your health, or make movement easier? What you buy stays with you when you move on to Chapter 2, so the investment isn't wasted.
While the stall is open, the game pauses, just like during dialogue. The panel is drawn with the in-game HUD theme — the menu theme, at twice the size, didn't fit on the 384x216 screen. Purchases are saved instantly, and a whetstone you buy is added to the sword's damage right away; you feel the difference as soon as you close the stall.
The smith and the stall are in both languages: Gezgin Demirci / Travelling Smith.
33 · A workshop for the smith, a forge for gear
Faber no longer just stands by the roadside. On every map, he has his own wooden platform two tiles above the path: a workbench, a pile of ore next to it, and a burning forge. You can pass underneath it, so it doesn't block the path, and you get up onto it with a single jump. Looking at it from afar, you think "someone works here"; no sign needed.
Only two things sit on the workbench: a tempered sword and a copper ingot, both slowly bobbing up and down, each to a different rhythm. Faber isn't rooted to the spot either — when no one's around, he slowly paces back and forth over half a tile by his workbench, stopping now and then. When the player comes within talking range, he stops and turns toward them.
Until you talk to him, he has an exclamation mark over his head. Once you've talked to him, the exclamation mark goes away, replaced by a speech bubble that appears when you get close.
The packs don't include a blacksmith character. We made the assets/npcs/smith folder by recoloring the red-bearded villager's blue pants to a leather color — a single palette swap, and every animation works as is.
The stall became two pages
On the Workshop page, three rows remain: whetstone, heart vessel, nimble boots. We cut the "Shield Plating" row — brief invulnerability after a block, something that was hard to explain on screen and hard to notice while playing.
The Whetstone on the Workshop page is no longer a flat damage bonus: it raises the sword itself to the next metal, so the blade in your hand changes color. How many times you've sharpened it isn't kept in a separate counter; it's stored in the sword's material — the copper sword from the chest also counts as the first sharpening.
The Forge page only deals with armor: helmet, chest armor, and leg armor, each one to the next material up — wood → copper → iron → gold. The sword was taken out of here (the whetstone upgrades it), and so were the shield, gloves, and boots: seven cards didn't fit on one page, the names wrapped, and the cards slid down out of line with each other. The three large cards sit in a single row, and the tier badge ("1/3") moved to the price line, so a long name no longer pushes the button down.
- Copper: 2 ingots + 25 gems
- Iron: 3 ingots + 50 gems
- Gold: 5 ingots + 100 gems
Here's the important part: an upgrade requires both ingots and gems. You might have six copper ingots in your pouch, but if you don't have enough gems, the forge won't light. Each half of the price turns red separately when you don't have enough of it, and the tab bar shows the ingots you're carrying.
The pages are pictures, not text: each card shows the piece's own icon, and the icon changes color with the material — the wooden sword is brown, copper is orange, iron is gray. Below it is the price, and below that a + button. The only thing to read is the piece's name.
Upgrades are tied directly to the game's numbers: the sword's material determines damage, and the armor's material determines health. A copper sword hits for 2 instead of 1, and copper chest armor adds a heart.
Where do ingots come from?
We spread 10 copper and 9 iron ingots across Chapter 1; there's no gold. For the three armor slots, the ore alone looks like enough for both a copper and an iron set, but the gems aren't: that's the real brake. Gold is waiting for Chapter 2's ore.
Most of the ingots are in hidden chests that you find by straying from the path. The rest are carried by armored gray goblins, which drop them when killed. But only once: the drop is tied to the tile where the enemy spawns on the map. If you die and walk the same path again, the goblin comes back, but its ore doesn't. Enemies spawned in arena waves have no such tile, so they don't drop anything.
34 · The main menu is now the burning village itself
The scenery behind the menu used to be a daytime forest; it had nothing to do with the game's opening scene. Now it's the Burning Village at night: forest_01's own night sky, its own orange ground, and clouds reddened by the flames. Arin is on the left by the campfire, and on the right is one of the village's houses — with its door, a torn banner, and fire burning on its roof.
Here's the important part: the house isn't a hand-drawn rectangle. The scene was hooked up to the real tile system the maps run on, and the house is built from the same shape as the houses on the map — a plank roof, a back-wall body, and a door underneath. The wall's edges, the rock texture, and the corners are chosen by the game's own autotiler, not by us. Along the way, the back wall's inner corners are now rounded too, just like the ground's corners: the same notch tile, flipped upside down at the bottom corners.
A scale bug also turned up: the scene was being drawn at double size, but the calculations were done at single size, and on top of that, the scale we used to enlarge the hero clashed with its direction-flipping code. The result was a squat character with its legs sunk below the ground. Both were fixed: we now set the scale in one place, and the hero's enlargement lives on a separate node.

Behind the scenes: every change gets measured
Every number in this post is a measurement, not a guess. For the combat changes, the sword is swung in the game's own test room, and we count how many physics frames the swing lasts and how many pixels are covered during it; press durations are swept frame by frame and the number of resulting hits is printed out. For visual changes, the before and after of the same spot are captured and their pixels are compared.
There's a reason for this: a combat setting or a rock rule doesn't just affect the spot you're looking at; it affects every map at once. Before saying "it got better," you need to know what changed and by how much.
What's next?
- The Thorn Forest's remaining three maps: Root Cave, Goblin Camp, and the Slime King's Swamp.
- The second wave of combat: hitting from the air and bouncing off enemies, last-moment shield parries, attacking during a dash, and a poise meter for enemies.
- Sound. Right now the game has no sound at all; without hit and impact sounds, no amount of tuning makes combat feel quite right.
Credits
- Character, enemy, tile, and item art: Eduardo Scarpato (im-dagon), Dagon's Fantasy packs: eduardscarpato.itch.io
- UI and title lettering: Franuka, RPG UI Pack: franuka.itch.io/rpg-ui-pack
- Text font: Silver, Poppy Works (CC BY 4.0): poppyworks.itch.io/silver