<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Syoo Games — Devlog</title>
  <link>https://syoogames.com/en/</link>
  <description>A one-person indie game studio from Turkey. Two games in development, and a devlog that documents the whole process in the open.</description>
  <language>en-us</language>
  <atom:link href="https://syoogames.com/en/feed.xml" rel="self" type="application/rss+xml"/>
  <lastBuildDate>Mon, 12 Oct 2026 14:07:50 +0300</lastBuildDate>
  <item>
    <title>Thornveil Devlog #8: The Phone, Ads and the First Closed Test</title>
    <link>https://syoogames.com/en/devlog/thornveil-devlog-8-the-phone-ads-and-the-first-closed-test</link>
    <guid isPermaLink="true">https://syoogames.com/en/devlog/thornveil-devlog-8-the-phone-ads-and-the-first-closed-test</guid>
    <pubDate>Wed, 23 Sep 2026 09:00:00 +0300</pubDate>
    <description>The seventh post closed with the end of four chapters. In this post not a single map was built. Instead the game was installed on a phone, everything found there was fixed, ads were added, and the first closed test build was uploaded to Google Play.</description>
    <enclosure url="https://syoogames.com/uploads/2026/09/46-telefon-menu-d5803cb4-1024.webp" type="image/webp"/>
    <content:encoded><![CDATA[<p>The seventh post closed with the end of four chapters. In this post not a single map was built. Instead the game was installed on a phone, everything found there was fixed, ads were added, and the first closed test build was uploaded to Google Play.</p>
<p>This post is partly a bug log too. A game that runs flawlessly on desktop and doesn&#039;t run on a phone, and the reason for that sitting in completely unexpected places — that is the summary of this part.</p>
<hr>
<h2 id="46-on-the-phone">46 · On the phone</h2>
<figure class="post-figure"><img src="/uploads/2026/09/46-telefon-menu-d5803cb4.webp" alt="Thornveil&#039;s main menu on a phone screen, landscape: the THORNVEIL logo, the DİKEN PEÇESİ subtitle, the Start / Settings / Quit buttons, the burning village behind" loading="lazy" decoding="async"><figcaption>Thornveil&#039;s main menu on a phone screen</figcaption></figure>
<p>The first problem seen on the first install was that the game didn&#039;t fill the screen. The phone was 1640x720, but the game was drawing 1473x648 — a fifth of the screen was a black band.</p>
<p>The cause was how integer scaling was calculated. The game is drawn to a 384x216-pixel canvas, and the engine first finds the fractional scale, then rounds it down. 720 / 216 = 3.33, rounded down it&#039;s 3, and whatever is left over on both axes stays black.</p>
<p>The fix was to change not the scale but the <strong>canvas</strong>: the largest integer multiple the screen can divide exactly is found, and the canvas is set to match. For 1640x720 the multiple is 3 and the canvas 546x240. The scale is exactly 3, every art pixel is 3x3 screen pixels, and 2 pixels are left over on screen.</p>
<p>A phone whose height isn&#039;t a multiple of 216 sees <strong>a little more</strong> of the world, never less — maps are never cropped. 1080p phones and the desktop window stayed exactly the same.</p>
<h2 id="47-playing-with-your-fingers">47 · Playing with your fingers</h2>
<figure class="post-figure"><img src="/uploads/2026/09/47-dokunmatik-kontroller-b949a550.webp" alt="A rope bridge crossing in the forest, touch controls along the bottom of the screen: two direction arrows on the left, dash, shield, jump and sword discs on the right" loading="lazy" decoding="async"><figcaption>A rope bridge crossing in the forest</figcaption></figure>
<p>Playing on the phone turned up three things that were never noticed on desktop, and all three were fixed — and all three kick in <strong>only on a real phone</strong>:</p>
<ul><li><strong>The &quot;!&quot; mark is twice as big.</strong> The mark above a 20-pixel enemy wasn&#039;t readable at arm&#039;s length. An integer multiple was used, so the pixels stayed square.</li><li><strong>The flashing after a hit is 1.15 seconds instead of 0.9.</strong> It takes a finger longer to find the disc again than it takes a hand that is already on the keys.</li><li><strong>Vibration.</strong> A short vibration when you take a hit, when a parry holds, and when the sword connects. It can be turned off in the settings.</li></ul>
<p>A mistake was made here and it&#039;s worth noting: on the first attempt these three were tied to the question &quot;are the touch controls on?&quot;. But in the project, showing the mouse as touch is on, so that question answers &quot;yes&quot; on desktop too — which means the desktop balance had quietly changed. A boss test caught it. Now there is a separate question: &quot;is this really a phone?&quot;</p>
<h2 id="the-two-bugs-the-owner-found-on-his-phone">The two bugs the owner found on his phone</h2>
<p><strong>Some checkpoints were starting the character inside the ground.</strong> In <code>forest_03</code> three torches stood at the bottom of a two-tile chimney: ground everywhere, rock at head height on both sides. Arin, spawning there, could only jump straight up, and on a touchscreen that reads like &quot;I&#039;m stuck in the ground&quot;.</p>
<p>Now both the placement script and the audit script require <strong>two tiles of clear headroom on at least one side</strong>, and a test proves this inside the engine for all 390 spawn points.</p>
<p><strong>Rarely, enemies were spawning outside the arena.</strong> An ambush wave shifts a spawn point two tiles sideways if it would land on top of the player. That shift was limited only by a distance from the centre of the trigger area, not by the arena&#039;s real walls. In a narrow arena this could put the enemy outside the gate. Now the walls are read from the arena&#039;s own gates, and the shift is only a preference — it isn&#039;t done if it would cross the gate.</p>
<hr>
<h2 id="48-ads">48 · Ads</h2>
<figure class="post-figure"><img src="/uploads/2026/09/48-magaza-banner-40231bfa.webp" alt="Thornveil&#039;s store feature graphic: the THORNVEIL logo above the burning village, with &quot;A pixel action platformer&quot; written below it" loading="lazy" decoding="async"><figcaption>Thornveil&#039;s store feature graphic</figcaption></figure>
<p>The game is free and will be supported by ads. The rules were set from the start:</p>
<ul><li><strong>Rewarded ads in four places</strong>, all from a single panel and all completely optional: the ad billboard on the map (one extra heart for that map), a free heart vessel at Faber&#039;s workshop, gems on the end-of-map card, and a revive where you fell after a death. Refusing costs nothing.</li><li><strong>An interstitial in one place only</strong>: after a map is finished, when you press &quot;Continue&quot;, behind the black. Never in the middle of play, on death, in dialogue, or at the end of a chapter.</li><li>An ad that hasn&#039;t loaded is skipped instantly, so the card never waits.</li></ul>
<p>The panel itself has a rule too: the reward is stated <strong>before</strong> you agree, &quot;Watch&quot; and &quot;Cancel&quot; are the same size, and neither is dressed up.</p>
<p>The revive option was deliberately kept narrow — the owner wanted it, I argued against it because it bends the &quot;only death sends you back to the campfire&quot; rule. The compromise: once per map, half health, the checkpoint isn&#039;t moved, no save is written, and the death still counts on the card.</p>
<h3 id="the-ad-itself-wasnt-filling-the-screen">The ad itself wasn&#039;t filling the screen</h3>
<p>When a live ad opened on the phone, a band was left on two edges. Instead of guessing, it was measured while the ad was on screen: the game&#039;s window was <code>[0,0][1640,720]</code>, the ad&#039;s window <code>[72,0][1640,720]</code>. When the screenshot was read pixel by pixel, <strong>the game itself</strong> was visible in the 72 pixels on the left (the notch strip), and in the 96 pixels on the right the navigation bar had come back.</p>
<p>It isn&#039;t solved with a theme: the ad screen forces its own theme, and nothing set application-wide reaches it. The first fix I tried did nothing at all for exactly this reason — it was proven by reading the APK&#039;s own manifest. The solution is at runtime: the app gives every screen other than Godot&#039;s the settings it gives to Godot&#039;s own window.</p>
<h2 id="a-black-screen-after-the-syoo-games-title">A black screen after the Syoo Games title</h2>
<p>The bug that came up after the upload to the closed test is the most instructive part of this post.</p>
<p>The game opens, the studio title appears, then the screen stays black. <strong>The music plays.</strong> Touching does nothing, but pressing the back button opens the menu. And this only happens <strong>on the first install</strong>.</p>
<p>My first guess was the screen-filling code: on the first launch the app might be born in the phone&#039;s current orientation, and the window might be reporting its portrait measurements before it has turned landscape. Then the canvas is calculated wrong, the integer scale rounds down to zero and nothing is drawn. It made sense, it was fixed, a test was written — <strong>and the screen stayed black.</strong></p>
<p>Measurement gave the real answer: the game was drawing 87 frames per second in the background, so the engine was working perfectly well, it was just drawing something black. And there was no window sitting on top of it either.</p>
<p>The cause turned out to be the &quot;this game contains ads&quot; notice shown on the first launch. Two things were going wrong at the same time:</p>
<ol><li>The notice pauses the game tree. The menu&#039;s animation opening out of black is an ordinary tween, so when it&#039;s paused it <strong>freezes on full black</strong>. The thing that would have cleared it was the thing that was frozen. 2. The notice panel was being added to layer 0, while the black curtain is on layer 100. So even without the pause the panel stayed under the black and wasn&#039;t visible.</li></ol>
<p>The back button closes the notice and lifts the pause, the animation carries on from where it left off, and the menu arrived. On the second launch the notice never ran again, so the bug wasn&#039;t visible either.</p>
<p>The owner&#039;s decision was to remove the notice entirely: &quot;no game says that.&quot; True — Google&#039;s requirement is the &quot;Contains ads&quot; label on the store page, not an in-app window. The notice was removed and two structural tests were written in its place, because the real lesson here was this: <strong>nothing should pause the game during the opening animation.</strong></p>
<h2 id="the-store-side">The store side</h2>
<ul><li>Eight screenshots and the 1024x500 feature graphic are captured from inside the game. The text is printed in the game&#039;s own bitmap font, on the same pixel grid; no image is scaled. The shot list and the texts are in a single file, so changing a headline doesn&#039;t mean touching code.</li><li>The touch discs are off in the screenshots — on the first attempt they were on and were covering the art.</li><li>The privacy policy was prepared as a single TR + EN page, together with <code>app-ads.txt</code>.</li><li>The Play package (AAB) was signed with the owner&#039;s own upload key. On the first attempt it had been signed with Godot&#039;s default key; Play doesn&#039;t accept a package signed with a debug certificate.</li></ul>
<h2 id="numbers">Numbers</h2>
<ul><li>Version 0.3.6, version code 7. Seven builds so far.</li><li>Five new test suites: screen filling, touch feel, ad hooks, spawn points (390 points), arena spawns (9142 checks).</li><li>A steady 89 fps in the phone test, no crashes, no script errors.</li></ul>
<h2 id="whats-next">What&#039;s next?</h2>
<p>Closed test feedback. Chapters 5 and 6 won&#039;t be started before that: one fix coming out of combat would mean going over 16 new maps at once. The list of pending items is in <code>docs/MOBIL_OYNANIS_PLANI.md</code> and <code>docs/DEVAM_PLANI.md</code>.</p>
<p>One of them stands out, and it has been proposed twice and not approved twice: <strong>attack order</strong>. Today all four members of a group can swing at the same time, and on a phone that&#039;s impossible to read. If only one ordinary enemy could go into an attack at a time, the density would stay the same but the fight would form a queue.</p>
<hr>
<h2 id="credits">Credits</h2>
<p>Same as the list in the fifth post. The full list: <code>docs/CREDITS.md</code> and, in the game, <strong>Settings → Credits</strong>.</p>]]></content:encoded>
  </item>
  <item>
    <title>Thornveil Devlog #7: The Frozen North</title>
    <link>https://syoogames.com/en/devlog/thornveil-devlog-7-the-frozen-north</link>
    <guid isPermaLink="true">https://syoogames.com/en/devlog/thornveil-devlog-7-the-frozen-north</guid>
    <pubDate>Tue, 22 Sep 2026 04:00:00 +0300</pubDate>
    <description>The sixth post closed with the desert finished. With this post the fourth chapter is playable too: eight maps, a mini-boss, a chapter boss, and the game&#039;s first choice. That brings the total to 32 maps.</description>
    <enclosure url="https://syoogames.com/uploads/2026/09/41-kar-girisi-7469796c-1024.webp" type="image/webp"/>
    <content:encoded><![CDATA[<p>The sixth post closed with the desert finished. With this post the fourth chapter is playable too: eight maps, a mini-boss, a chapter boss, and the game&#039;s first <strong>choice</strong>. That brings the total to 32 maps.</p>
<p>Two jobs were done at once in this chapter. One is the snow itself; the other is the two changes the owner asked for while playing the game on his phone — half-heart damage and more frequent spawn points. Both of them touch all 32 maps at once.</p>
<hr>
<h2 id="41-the-threshold-of-the-north">41 · The threshold of the north</h2>
<figure class="post-figure"><img src="/uploads/2026/09/41-kar-girisi-7469796c.webp" alt="A snowy slope: snowdrifts and a bare tree on the left, a snow-covered rock outcrop and a tree with orange leaves on the right, blue mountain ranges behind, snow falling from the sky" loading="lazy" decoding="async"><figcaption>A snowy slope</figcaption></figure>
<p>The snow pack&#039;s rock is really the forest&#039;s rock repainted — the same tile layout, with snow caps and icicles on top. That is why the snow theme uses exactly the same structure as the forest&#039;s; only the sheets change. The sky is the forest&#039;s own clouds too, with the mountain ranges in blue.</p>
<p>Snowfall is one of the theme&#039;s numbers (between 0 and 1). Nearby flakes are bigger and faster, distant ones smaller; the breeze blows them sideways. Where the flakes stop is worked out: the first row of rock coming down from the top of the map is the snow line, which means <strong>it doesn&#039;t snow inside caves</strong>. The back wall isn&#039;t counted in this, because the space under a back-wall cluster standing out in the open is still sky.</p>
<p>A different decision from the desert: in the snow, <strong>the back wall is allowed out in the open too</strong>. The pack&#039;s own promo image uses it that way, and the cold blue back rock reads as distant rock, not as a hole in the sky.</p>
<h2 id="42-the-cursed-villager">42 · The Cursed Villager</h2>
<figure class="post-figure"><img src="/uploads/2026/09/42-kar-lanetli-koylu-17ec6704.webp" alt="Two wolves on the snowy road: one has leapt onto Arin, on the right stands a villager who hasn&#039;t transformed yet; blue mountains behind" loading="lazy" decoding="async"><figcaption>Two wolves on the snowy road</figcaption></figure>
<p>The chapter&#039;s main enemy isn&#039;t a werewolf, it is <strong>a cursed villager</strong>. While he walks the road he doesn&#039;t touch anyone, and he takes no damage when he is hit — a blow only wakes the curse. When Arin gets close, or hits him, the transformation animation starts; nothing can cut him during it.</p>
<p>In wolf form he has three moves, all with a &quot;!&quot;: claw, double claw, and a leap. The leap carries the longest warning and lands where Arin is heading, but it never lands in a pit or on thorns. The shield stops the claws, which means a parry opens him up.</p>
<p>When he is beaten he doesn&#039;t die: he turns back, the Veil leaves him as purple motes, the man drops to the ground and fades. <strong>Nobody is killed on screen.</strong> The story of chapters 4-6 is built on forgiveness, and this enemy had to fit it.</p>
<p>There are two more enemies alongside him: the <strong>albino bat</strong> (its dive chills you; a 1-pixel outline was added because the white-grey body disappeared against the snowy sky) and the <strong>blue slime</strong> (its ice spit chills you).</p>
<p><strong>Chill</strong> works differently from poison: Arin slows down (0.65), glows ice blue, and the hearts on the HUD change color — but it never bites. The cold slows you; the wolves are the ones that bite. Chill and poison don&#039;t stack on each other; the slower one wins.</p>
<h2 id="43-the-blizzard">43 · The blizzard</h2>
<figure class="post-figure"><img src="/uploads/2026/09/43-kar-tipi-7706e1bd.webp" alt="A snowy plain under a blizzard: white-blue streaks of snow driving horizontally, the air hazy, Arin walking against the wind" loading="lazy" decoding="async"><figcaption>A snowy plain under a blizzard</figcaption></figure>
<p>The blizzard is the desert&#039;s sandstorm itself. The same clock, the same gusts, the same push, the same checks — only the look changes: white-blue streaks, a cold haze, and tumbling clumps of snow.</p>
<p>That is the good side of using a system in a second biome: every problem solved in the sandstorm (seams showing, it being drawn inside caves, a jump against the wind not carrying far enough) was already solved in the blizzard by itself.</p>
<p>The snow&#039;s own trap is <strong>thin ice</strong>: a piece of ice sitting on the water that cracks when you step on it, then slowly sinks, and the water takes it. Since water drowns you, standing on it is a real risk.</p>
<h2 id="44-the-frost-king">44 · The Frost King</h2>
<figure class="post-figure"><img src="/uploads/2026/09/44-kar-ayaz-kral-4f320a24.webp" alt="An ice cave: a crowned blue slime king in the air, a &quot;FROST KING&quot; health bar above him, icicles hanging from the ceiling" loading="lazy" decoding="async"><figcaption>An ice cave</figcaption></figure>
<p>The seventh map&#039;s mini-boss. The Slime King&#039;s cold cousin: the same skeleton, different moves, and icicles falling from the ceiling.</p>
<p>The icicles are on the maps as this chapter&#039;s own trap as well: first they warn you by swaying, then they drop and take a heart, the shield meets what comes from above, you get past underneath with a dash, and after a while they grow back again.</p>
<h2 id="45-master-brontes">45 · Master Brontes</h2>
<figure class="post-figure"><img src="/uploads/2026/09/45-kar-brontes-ddca9b48.webp" alt="A snowy cave hall: a big grey wolf standing across from Arin, a &quot;MASTER BRONTES&quot; health bar above him, a smith&#039;s workbench and a sword on the left" loading="lazy" decoding="async"><figcaption>A snowy cave hall</figcaption></figure>
<p>The chapter&#039;s boss is <strong>Faber&#039;s master</strong>. There was a surprise here in the story plan: in the first draft the boss was Faber himself, and then it was changed to his master Brontes — if the smith himself became the enemy, the relationship built up over the chapter would go to waste.</p>
<p>After Brontes is beaten, the game&#039;s <strong>first choice</strong> arrives: spare him or finish him. Option support was added to the dialogue system for this — a line can carry at most three buttons, the buttons appear once the text finishes, presses don&#039;t count for 0.45 seconds (so nothing gets picked by accident), and <strong>the back button can&#039;t skip a choice</strong>: backing out of a decision isn&#039;t one of the answers.</p>
<p>The choice is saved as a story flag, and it is the first link in the chain that decides which of the sixth chapter&#039;s two endings you reach.</p>
<hr>
<h2 id="half-heart">Half heart</h2>
<p>While playing on his phone, the owner said &quot;we still can&#039;t get past the first chapter.&quot; The problem wasn&#039;t the number of enemies — at his own request the enemy count on every map had been nearly doubled — but when every hit takes a full heart, four hearts add up to four mistakes.</p>
<p>Now <strong>an ordinary enemy&#039;s hit takes half of what it says</strong>. Four hearts hold up to eight ordinary blows. Bosses, traps, hazards, fire, and instant deaths stayed the same.</p>
<p>The rule that makes the distinction is simple: anything in the <code>enemies</code> group without a <code>defeated</code> signal is an ordinary enemy. All of the bosses have that signal. Projectiles carry whoever fired them too, so the Bandit Chief&#039;s arrow lands full and an ordinary archer&#039;s arrow lands half.</p>
<p>This had one side effect: armor&#039;s lower bound was already half a heart, which means armor can&#039;t be felt at all on an ordinary blow any more. It is still felt on two-heart moves, on bosses, and on traps.</p>
<h2 id="road-torches">Road torches</h2>
<p>The second request was more frequent checkpoints. But the &quot;two campfires per map&quot; rule was the owner&#039;s own rule, and it had a reason: with more than that, health keeps filling up and the action slips away.</p>
<p>The solution was to split the two apart. A <strong>road torch</strong> lights when you touch it and carries <strong>only the spawn point</strong>: it doesn&#039;t refill health, it doesn&#039;t save, and it doesn&#039;t change the &quot;continue where you left off&quot; option. The two fires are still the only place health fills up.</p>
<p><strong>287 torches</strong> were placed across the 32 maps — 76 in the forest, 65 in the jungle, 75 in the desert, 71 in the snow. The placement isn&#039;t done by hand: a script looks for solid ground in a way that keeps the longest distance between two spawn points under 70 tiles, and it doesn&#039;t put one between an arena&#039;s gates or next to a placed enemy. Two exceptions were left because of the terrain: a 91-tile rope bridge in <code>forest_02</code>, and a treetop path made up entirely of branches in <code>jungle_04</code>.</p>
<h2 id="above-diamond">Above diamond</h2>
<p>The hero&#039;s dress-up system carries all eleven of the pack&#039;s materials, but the forge stopped at diamond. Five more tiers were opened up for the remaining chapters: amethyst, emerald, aquamarine, obsidian, and ruby. Each chapter&#039;s ore belongs to that chapter, and a chapter&#039;s ~1000 gems cover 92-95% of that chapter&#039;s set.</p>
<p><strong>Angelical is never forged.</strong> No map scatters it and the forge stops at ruby; the sixth chapter&#039;s last map hands over the whole set at once.</p>
<p>One detail is in the ingot icons again: the pack&#039;s atlas draws a real ingot only for copper, iron, gold, and obsidian; the rest are cut stones. The ingots for the five new materials were derived by mapping the gold ingot&#039;s ramp onto that material&#039;s armor palette. So that the rule stays verifiable, every time the script runs it checks that it can reproduce the pack&#039;s own iron and obsidian ingots exactly.</p>
<h2 id="the-trailer">The trailer</h2>
<p>The owner&#039;s request was clear: gameplay up front, action, hard music, and the picture has to stay sharp. No frame is scaled in the trailer captures — each format is captured at its own resolution, at exactly 5x. For now only the vertical Reels version has been produced.</p>
<h2 id="numbers">Numbers</h2>
<ul><li>All 70 test suites pass.</li><li>32 maps, four chapters, eight bosses.</li><li>287 road torches.</li><li>New sound events: wolf howl/growl/claw/leap, frost bat, ice spit, chill.</li></ul>
<h2 id="whats-next">What&#039;s next?</h2>
<p>The fifth chapter, the Silent Graveyard, and the sixth chapter, the Masmorra Dungeon, are planned but not built. The phone side comes first: the owner plays the game on his phone, and the list coming from there has grown long.</p>
<hr>
<h2 id="credits">Credits</h2>
<p>Same as the list in the fifth post. The snow chapter didn&#039;t add any new packs. The full list: <code>docs/CREDITS.md</code> and, in the game, <strong>Settings → Credits</strong>.</p>]]></content:encoded>
  </item>
  <item>
    <title>Thornveil Devlog #6: The Scorching Desert</title>
    <link>https://syoogames.com/en/devlog/thornveil-devlog-6-the-scorching-desert</link>
    <guid isPermaLink="true">https://syoogames.com/en/devlog/thornveil-devlog-6-the-scorching-desert</guid>
    <pubDate>Mon, 21 Sep 2026 09:00:00 +0300</pubDate>
    <description>The fifth post closed with the Poison Jungle finished, and the desert&#039;s plan was waiting on the owner&#039;s decisions. The decision was &quot;you make them all.&quot; With this post, the third chapter can be played from start to finish too: eight maps, a mini-boss, a chapter boss, and an end-of-chapter card. The game now has 24 maps.</description>
    <enclosure url="https://syoogames.com/uploads/2026/09/36-col-kumlarin-esigi-df69ae21-1024.webp" type="image/webp"/>
    <content:encoded><![CDATA[<p>The fifth post closed with the Poison Jungle finished, and the desert&#039;s plan was waiting on the owner&#039;s decisions. The decision was &quot;you make them all.&quot; With this post, the third chapter can be played from start to finish too: eight maps, a mini-boss, a chapter boss, and an end-of-chapter card. The game now has 24 maps.</p>
<p>The desert was a good place to try something different from the jungle. In the jungle the danger was the enemy; in the desert the ground itself is a danger too. Something can come up from under the sand, the ground you walk on can swallow you, the wind pushes you back.</p>
<p>The images were captured in-game at 1920x1080. The game is drawn to a 384x216-pixel canvas and scaled up to the screen in integer multiples, so every pixel is a 5x5 block.</p>
<hr>
<h2 id="36-sands-edge">36 · Sands&#039; Edge</h2>
<figure class="post-figure"><img src="/uploads/2026/09/36-col-kumlarin-esigi-df69ae21.webp" alt="Desert map: cacti and a gem on the left, Arin in copper gear in the middle, a rocky mesa on the right — a goblin on top of it, sand scorpions and bones on its slope; brown desert hills and a yellowish sky behind" loading="lazy" decoding="async"><figcaption>Desert map</figcaption></figure>
<p>The first map starts where the jungle dried up. For the first hundred tiles there are still palms and the jungle&#039;s own slimes, then it slowly turns into cacti and gravel.</p>
<p>There is a rule to how the desert looks: <strong>the dark back wall only in enclosed places</strong>. In the jungle we used the back wall out in the open as a mass of leaves; doing the same thing in the desert looked like a hole in the sky. Now depth comes only from the distant hills; the back wall is only in caves, tunnels, and halls. The audit script (<code>terrain_audit.py</code>) reports every back wall cell left under open sky.</p>
<p>The new enemy is the <strong>Sand Scorpion</strong>. If it sees Arin on the sand, it dives: its body disappears, and in its place a mound moving through the sand and a dust trail are drawn. In this state it can&#039;t be hit, and a parry does nothing. When it gets under Arin&#039;s feet the sand boils — bubbles over his feet and the familiar cream &quot;!&quot; mark — and 0.65 seconds later it bursts out of there. The shield doesn&#039;t help (it pushes first, then hits), the dash does. Afterwards it stays exposed for a second; that&#039;s where the punishment is.</p>
<p>Only ground made out of desert tiles counts as sand. Wooden scaffolding, rope bridges, palace stone, and other biomes&#039; rock are not sand, and there is no diving there.</p>
<h2 id="37-bat-hollows">37 · Bat Hollows</h2>
<figure class="post-figure"><img src="/uploads/2026/09/37-col-yarasa-kovuklari-a4dfb3ae.webp" alt="A cave inside the red canyon: ember bats hanging from the ceiling, metal and sand scorpions on the ground, the smith Faber&#039;s rock shelf on the right, diamond gems everywhere" loading="lazy" decoding="async"><figcaption>A cave inside the red canyon</figcaption></figure>
<p>The fourth map is vertical: 320x72 tiles, climbed from the canyon floor up to its rim. The desert&#039;s answer to the big tree in the jungle.</p>
<p>The cave that runs through the canyon has the <strong>Ember Bat</strong> in it. The jungle&#039;s orange fire bat was getting lost next to Arin&#039;s gold armor, so a darker version was derived for the desert: ember red, brown shadows, yellow eyes, and a 1-pixel ink outline. If its dive gets through, it leaves half a heart of burn on top of the normal damage — but if the shield is raised, nothing burns.</p>
<p>The <strong>Metal Scorpion</strong> is met here too. It&#039;s armored: an ordinary sword hit does damage but doesn&#039;t stagger it, it just rings and throws sparks. It has a leap and a sting, and both are announced with a &quot;!&quot;; its sting poisons. After it strikes, its tail stays stuck for 0.9 seconds, and the window is there. The pack has no frame with the tail on the ground, so for that window a frame with the white swing trail erased is generated at runtime.</p>
<h2 id="38-the-buried-palace">38 · The Buried Palace</h2>
<figure class="post-figure"><img src="/uploads/2026/09/38-col-gomulu-saray-9d835e9d.webp" alt="A yellow stone palace hall buried under the sand: a carved column, a torch on the wall, goblins and sand scorpions on the floor, a flamethrower hanging from the ceiling" loading="lazy" decoding="async"><figcaption>A yellow stone palace hall buried under the sand</figcaption></figure>
<p>The fifth map is a palace left buried under the sand. The mossy temple in the jungle was made of gray dungeon stone; the palace is its yellow sandstone version — the same tile layout, derived by changing the colors one by one.</p>
<p>The desert&#039;s three traps come together here, and each one is introduced on its own first, with nobody else around:</p>
<ul><li><strong>Flamethrower</strong> — closed, then ignition (the warning), then flame. The shield doesn&#039;t stop it, the dash goes through it.</li><li><strong>Press</strong> — it hangs from the ceiling, warns by swaying, then comes down in 0.12 seconds. Staying under it costs a heart and a return to safe ground. Neither the shield nor the dash saves you; the only answer is not being there.</li><li><strong>Cannon</strong> — the fuse spark is the warning, then the cannonball. The sword can&#039;t cut it, the shield stops it.</li></ul>
<p>A bug found while the press was being made is worth noting: the press measured the distance it would fall on the first physics frame, and on a real map the tiles haven&#039;t started colliding yet at that moment, so every press fell only two tiles — it never touched Arin. Now it measures again over 30 frames.</p>
<p>There is also <strong>quicksand</strong>: you can walk on it but it slows you down, Arin sinks in up to his knees, and after two seconds he takes a heart and returns to safe ground. It never kills. A single jump gets you out.</p>
<h2 id="39-mother-ember">39 · Mother Ember</h2>
<figure class="post-figure"><img src="/uploads/2026/09/39-col-kor-ana-10a552a4.webp" alt="The nest in the Ember Foundry: the giant purple bat Mother Ember above, below it the boss health bar reading &quot;MOTHER EMBER&quot;, young and diamonds on the ground" loading="lazy" decoding="async"><figcaption>The nest in the Ember Foundry</figcaption></figure>
<p>The mini-boss at the end of the seventh map. Three times the size of the ember bat, and on load it is painted in the Veil&#039;s purples — the ember core stays.</p>
<p>It sleeps hanging from the ceiling. When it wakes up, it floats 88 pixels above the ground, that is, out of sword reach. It has three moves, and all of them come with a &quot;!&quot;:</p>
<ul><li><strong>Spear dive</strong> — it goes 80 pixels above Arin, gives the sign, and comes straight down at 250 pixels per second. If it slams into the ground, it stays exposed for 1.8 seconds, and hits there count double. The shield bounces it back but no window opens. A parry brings it down to the ground.</li><li><strong>Ember rain</strong> — it puts three marks on the ground, one of them under Arin; a second later the embers fall and leave flames that burn for three seconds. The shield doesn&#039;t stop this flame.</li><li><strong>Young</strong> — at every quarter of its health, two ember bats wake up on the ceiling.</li></ul>
<p>When its health drops to half, it turns from red to purple, speeds up, and links a dive that hits the ground into a second dive with a short &quot;!&quot;.</p>
<h2 id="40-giant-metal-scorpion">40 · Giant Metal Scorpion</h2>
<figure class="post-figure"><img src="/uploads/2026/09/40-col-dev-akrep-4f416602.webp" alt="The Scorpion&#039;s Den: the crowned giant metal scorpion facing Arin, the &quot;GIANT METAL SCORPION&quot; health bar above, shell fragments on the ground" loading="lazy" decoding="async"><figcaption>The Scorpion&#039;s Den</figcaption></figure>
<p>The chapter&#039;s boss. Three times the metal scorpion. The packs have no crowned scorpion, so a 7x6-pixel black crown — with a purple edge and stones — is stamped onto every frame above the eye pixel at runtime. There is no crown on the death frames, because it falls off there.</p>
<p>Its armor is real: when its window isn&#039;t open, a hit does <strong>no damage at all</strong>, it just rings. When the window is open, hits count double. Its four moves come in order: the tail sting (poisons, the tail sticks, a parry staggers it), the dive into the sand (the sand scorpion&#039;s move, but two hearts, and it shoves the shield aside) and the leap-and-crush.</p>
<p>When its health drops to half, its crown glows and it raises its own sandstorm — since it is inside the cave, the map&#039;s own storm isn&#039;t drawn; this storm belongs to it. After every dive, two sand waves run along the ground, and they are crossed by jumping.</p>
<p>When it dies, its shell cracks, the crown rolls off, and a black thorn drives into the sand. Its body stays there until the last dialogue is over.</p>
<hr>
<h2 id="the-storm-at-the-owners-request">The storm, at the owner&#039;s request</h2>
<p>The second map&#039;s sandstorm pushed at 45 pixels per second in its first version, and it only worked on the ground. When the owner played it he said &quot;make it harsher, and push me back when I jump too.&quot; Now it&#039;s 85 pixels per second, it lasts 1.8 seconds, and it works <strong>in the air too</strong>: Arin standing still gets dragged ten tiles by a gust, jumping in place he slides three tiles, and running into the wind he only gets five pixels ahead in half a second.</p>
<p>It also blocks your view. The storm areas are merged into a single area and blurred, then drawn over the screen with a single quad and one shader. Around Arin&#039;s chest the transparency is 0.12, and it rises to 0.62 toward the edges of the screen. Below the ground line it is zero, so caves and dark rock stay clean. In the first attempt every column was drawn separately, so rectangular panels showed up above the rock columns; now no seam is visible anywhere.</p>
<p>The audit scripts learned something too: a storm area is reported if there is a drop or spikes within ten tiles downwind, or if a jump made into the wind can&#039;t make it and would fall into a hazard.</p>
<h2 id="diamond-and-sword-scaling">Diamond and sword scaling</h2>
<p>The desert&#039;s ore is diamond. One armor piece is 4 ingots + 150 gems, and the Whetstone&#039;s fourth tier is 4 ingots + 300.</p>
<p>A small but annoying detail: in the pack&#039;s handmade atlas the diamond cell is a cut stone, that is, the game&#039;s gem currency itself. Using it as the diamond ingot would have meant showing &quot;a gem for an ingot.&quot; So the gold ingot&#039;s ramp was converted to the diamond palette and its own ingot was derived.</p>
<p>From the third chapter on, <strong>the sword scales too</strong>. In the earlier chapters sword damage was simply the material&#039;s tier. From the desert on, every step above the base tier works like a multiplier: in the desert the gold sword is 4, the diamond sword 8. At the base tier and below, the old rule applies. The forest, the jungle, and the test rooms were not affected.</p>
<h2 id="numbers">Numbers</h2>
<ul><li>Eight maps, each 640x40 tiles (the fourth is 320x72, vertical).</li><li>An average of 60 placed enemies per map, 12 of them in ambush waves.</li><li>~120 gems per map, 2-3 diamonds.</li><li>New sound events: scorpion dive/boil/sting/ring, bat burn, flamethrower, press, cannon, cannonball, quicksand, and storm gust.</li><li>The desert&#039;s music: <code>winds_roam</code> for the maps, separate tracks for 5-8, and its own track for each of the two bosses.</li></ul>
<h2 id="whats-next">What&#039;s next?</h2>
<p>The fourth chapter, the Frozen North. The owner started playing the game on his phone and the notes coming from there have piled up; they got in line too.</p>
<hr>
<h2 id="credits">Credits</h2>
<p>The same as the list in the fifth post — the desert chapter added no new packs, everything was picked from packs that are already credited. The full list: <code>docs/CREDITS.md</code> and, in the game, <strong>Settings → Credits</strong>.</p>]]></content:encoded>
  </item>
  <item>
    <title>Thornveil Devlog #5: The Poison Jungle Is Done</title>
    <link>https://syoogames.com/en/devlog/thornveil-devlog-5-the-poison-jungle-is-done</link>
    <guid isPermaLink="true">https://syoogames.com/en/devlog/thornveil-devlog-5-the-poison-jungle-is-done</guid>
    <pubDate>Sun, 20 Sep 2026 09:00:00 +0300</pubDate>
    <description>The fourth devlog closed with the Thorn Forest finished. Three jobs were next in line: the second chapter, the Poison Jungle, the missing images, and sound. With this post, the second chapter can be played from start to finish too: eight maps, a mini-boss, a chapter boss, and an end-of-chapter card. The game now has sound as well.</description>
    <enclosure url="https://syoogames.com/uploads/2026/09/21-cangil-girisi-ebe0ceb9-1024.webp" type="image/webp"/>
    <content:encoded><![CDATA[<p>The fourth devlog closed with the Thorn Forest finished. Three jobs were next in line: the second chapter, the Poison Jungle, the missing images, and sound. With this post, the second chapter can be played from start to finish too: eight maps, a mini-boss, a chapter boss, and an end-of-chapter card. The game now has sound as well.</p>
<p>This post covers the jungle&#039;s maps, the new enemies, the two bosses, Delia the archer who helps Arin at certain moments, the chapter scaling, the &quot;more enemies&quot; pass the owner asked for after playing, the sound, and the credits screen.</p>
<p>All images were captured in-game at 1920x1080. The game is drawn to a 384x216-pixel canvas and scaled up to the screen in integer multiples. In these images, each pixel appears as a 5x5 block.</p>
<hr>
<h2 id="52-the-jungle-is-open">52 · The jungle is open</h2>
<figure class="post-figure"><img src="/uploads/2026/09/20-cangil-harita-secimi-e3bef217.webp" alt="The Poison Jungle in map selection: the first three maps completed, the fourth unlocked, the last four locked; the selected Bandit Road map&#039;s time, gems, and death count are shown" loading="lazy" decoding="async"><figcaption>The Poison Jungle in map selection</figcaption></figure>
<p>The &quot;Map Selection&quot; button on the Thorn Forest&#039;s chapter card now opens map selection straight on the jungle&#039;s first map. All eight maps that read &quot;Coming soon&quot; in the previous post are playable.</p>
<p>The story picks up where the forest left off. The Slime King fell, but the mist didn&#039;t lift, so he wasn&#039;t the source. The King was only someone the Veil had crowned. The black thorn that fell from his crown still beats in Arin&#039;s palm and works like a compass: the closer he gets to the next crowned one, the faster it beats. There is no separate interface for this; the dialogue lines carry it.</p>
<h2 id="53-the-look-of-the-jungle">53 · The look of the jungle</h2>
<figure class="post-figure"><img src="/uploads/2026/09/21-cangil-girisi-ebe0ceb9.webp" alt="Jungle&#039;s Edge: leaves hanging down from the top of the screen, bushes below, dark clumps of leaves behind the path, tufts of grass, flowers, and two jungle trees; Arin in copper gear runs along the path, with a brown mushroom and a turquoise lake ahead" loading="lazy" decoding="async"><figcaption>Jungle&#039;s Edge</figcaption></figure>
<p>The jungle is drawn with the pack&#039;s own tiles: mossy grass over blue-gray rock, turquoise water, a sky lit green. A map&#039;s theme picks which biome&#039;s tiles get used. The forest maps weren&#039;t affected by this work; before and after were compared tile by tile.</p>
<p>When the first jungle map was drawn, the owner found the trees bare and pointed to the pack&#039;s own promotional images. Jungle maps are now built the way those images look:</p>
<ul><li><strong>Leaf frame:</strong> leaves hang down from the top of the screen, with bushes standing below them. Both scroll a little faster than the world.</li><li><strong>Leaf clumps:</strong> dark, mound-shaped clumps of leaves sit behind the path.</li><li><strong>Grass and flowers:</strong> the jungle&#039;s own tufts of grass and flowers on top of the ground.</li><li><strong>Dressed-up trees:</strong> knots on the trunks, short mossy branches, and vines hanging from the branches. These decorative branches only appear high up and far from anything walkable. That way a branch you can&#039;t stand on never looks like a path.</li><li><strong>Branches:</strong> a branch joined to the trunk starts with a thick bark knot and grows mossier as it goes outward.</li></ul>
<h2 id="54-jungles-edge">54 · Jungle&#039;s Edge</h2>
<p>The first map begins on the shore where the Slime King&#039;s swamp turns into jungle. The first Poison Frog is met on its own, in an open space. Then come turquoise lakes one after another. Since the water drowns you, every crossing is a short, legible jump. There is a hidden hollow behind the first waterfall.</p>
<p>This time Faber has set up his forge on the branch of a big tree. He says there is no copper in the jungle and that iron is plentiful. Further along the path there are traces of the goblins who fled the swamp: broken spears, toppled crates, and black thorns bursting out of the ground. Without their leader, the goblins have scattered. The map ends with an ambush in a clearing, a cave beneath the roots, and a misty pass.</p>
<h2 id="55-poison-lakes">55 · Poison Lakes</h2>
<figure class="post-figure"><img src="/uploads/2026/09/22-zehirli-goller-bf2a2a54.webp" alt="Poison Lakes: three mossy logs floating on turquoise poison water between two grassy banks; Arin jumping across the lake" loading="lazy" decoding="async"><figcaption>Poison Lakes</figcaption></figure>
<p>Here the jungle steps down level by level. There is a lake on each step, and each lake pours into the next as a waterfall. The Veil has poisoned the water too.</p>
<figure class="post-figure"><img src="/uploads/2026/09/35-selale-merdiveni-fe14bd58.webp" alt="Waterfall Stairs: Arin jumping over the small lake between two waterfalls, gems in the air, a chest and a mushroom on the right" loading="lazy" decoding="async"><figcaption>Waterfall Stairs</figcaption></figure>
<p>One lake is crossed on floating logs, another on loose patches of earth. Both sink a short moment after you step on them, so you have to keep jumping on top of them instead of standing still. The logs were drawn from the jungle tree&#039;s tiles, and their top faces sit level with the bank.</p>
<p>The chapter&#039;s first arrow arrives here as well. An arrow shot from far away buries itself in the ground a few steps ahead of Arin. It was loosed to warn, not to hit, and it harms no one. It only announces that the bandits hold the road and are watching Arin.</p>
<h2 id="56-bandit-road-and-tree-climbing">56 · Bandit Road and tree climbing</h2>
<figure class="post-figure"><img src="/uploads/2026/09/23-haydut-yolu-6e810d18.webp" alt="Bandit Road: Arin on a tree&#039;s low branch, a green-hooded archer drawing his bow at him from a higher branch of the next tree; two goblins on the road below" loading="lazy" decoding="async"><figcaption>Bandit Road</figcaption></figure>
<p>The third map is an old road running through the jungle. The road is held by the bandits of a red-hooded chief. The first archer is perched on the branch of a tree above the road. The road then passes through a black thorn ditch crossed on branches, a lake crossed from tree to tree, Faber&#039;s forge in a bandit storehouse, and a rocky ridge. At the ambush, goblins block the road alongside the bandits: the bandits have taken in the ones who fled the swamp.</p>
<p>After the ambush, Silvan is found in the bandits&#039; prisoner pen. The hunter from the first chapter was caught while tracking the goblins that fled the swamp. He broke the lock when the bandits ran to the ambush, but he couldn&#039;t get away on his own. He describes their chief: he used to be an ordinary bandit, and now there is a black crown on his head. Then he heads back to the village to bring word to Nestor Dede.</p>
<p>Tree climbing starts on this map. The branches come from the pack&#039;s jungle tree and work like one-way planks: you pass through them from below and stand on top of them. The rules were set together with the owner:</p>
<ul><li><strong>Sparse branches:</strong> branches are never stacked up a single trunk like a ladder.</li><li><strong>Zigzag:</strong> the climb goes back and forth between two trees. Each step is two rows up, with a three-tile gap in between.</li><li><strong>Tree to tree:</strong> a gap of three or four tiles. Every crossing is a single honest jump.</li><li><strong>Only where it&#039;s planned:</strong> tree climbing only appears on the third and fourth maps.</li></ul>
<p>The owner also wanted a dash in a few places, &quot;without overdoing it.&quot; So two branch gaps on Bandit Road and two on the Giant Tree ask for a dash. All of them are on optional routes leading to a chest or a line of gems. Nowhere does the main path require a dash.</p>
<h2 id="57-the-giant-tree">57 · The Giant Tree</h2>
<figure class="post-figure"><img src="/uploads/2026/09/24-dev-agac-8c361229.webp" alt="The Giant Tree: Arin jumping between branches high up beside the broad giant trunk made of three trunks; an archer perched on a branch at the bottom right" loading="lazy" decoding="async"><figcaption>The Giant Tree</figcaption></figure>
<p>The fourth map is different from the others: it isn&#039;t horizontal but largely vertical. After a short walk in the tree&#039;s shadow and over its roots, the map turns upward and you climb the giant tree. The giant trunk is made of three trunks standing side by side. Two jungle trees placed side by side are now drawn as a single thick trunk, with no shadow line left between them.</p>
<p>Faber waits on a branch halfway up the climb and says he got up there with his anvil on his back. On a branch off the path there is a Heart Crystal, which fills health completely. At the top, on a mossy ledge, sit the second campfire, the iron shield&#039;s chest, and a nest with gold hidden in it.</p>
<p>On one of the branches up top, a red-hooded girl appears for the first time. She holds her bow loosely, watching Arin. She says a single line and disappears with a rustle of leaves. The map climbs to a high plateau over a drowning lake, by way of rope bridges and branches.</p>
<h2 id="58-the-mossy-temple">58 · The Mossy Temple</h2>
<figure class="post-figure"><img src="/uploads/2026/09/25-yosunlu-tapinak-99bc9459.webp" alt="The Mossy Temple: in a brick hall with stone columns, torches, and red banners, Arin jumps between two swinging pendulum axes" loading="lazy" decoding="async"><figcaption>The Mossy Temple</figcaption></figure>
<p>The fifth map is a stone temple the jungle has swallowed. On this map the rocks are drawn as temple stone and the back walls as brick. The tiles come from the pack&#039;s dungeon set and follow the same layout as the jungle&#039;s. Brick left out in the open reads as a ruined wall. The halls have intact and broken stone columns, and trees and moss keep growing up between the stones.</p>
<p>The temple has three new traps:</p>
<ul><li><strong>Wooden spikes:</strong> they show their tips before they shoot up out of the ground. You cross the moment they lie flat.</li><li><strong>Pendulum axe:</strong> it always swings at the same rhythm. You pass under it the moment it swings away from Arin.</li><li><strong>Floor saw:</strong> it travels back and forth, half buried in its slot. The shield doesn&#039;t stop it; you jump over it.</li></ul>
<p>Each trap comes on its own first, with flat ground in front of it where you can wait and watch. Then they come in pairs. At the very end, in the inner temple, there is a corridor set up as saw, axe, spike, axe, saw.</p>
<p>On the story side there are two traces. A second seal inscription has been carved into a door&#039;s stone by Morvena&#039;s hand: &quot;may what sleeps deep not wake.&quot; A little further on, the black thorns have been opened up with fresh cuts. Each cut was made in a single stroke, with a sword held upright. Commander Aldric always used his sword that way.</p>
<h2 id="59-the-spore-pit">59 · The Spore Pit</h2>
<figure class="post-figure"><img src="/uploads/2026/09/26-spor-cukuru-fe34e15b.webp" alt="The Spore Pit: spores drifting through the air in an underground cave; Arin, poisoned and turned green, fights a goblin, with a pink slime beside him, a red mushroom behind him, and a purple mushroom on the ledge to the right" loading="lazy" decoding="async"><figcaption>The Spore Pit</figcaption></figure>
<p>The sixth map is underground. The leaf frame is switched off here. Spores drift through the air, and the spore sacs on the walls pulse with a purple light.</p>
<p>The chapter&#039;s three new enemies are introduced here one at a time first: the purple mushroom, the pink slime, and the red mushroom. After that they come mixed together in the spore beds.</p>
<p>Halfway along the road there is a bandit trap: a spore pit that closes, which is to say an ambush arena. Coming out of the pit, you find the trap&#039;s thorn gate opened, with a red-fletched arrow quivering among the thorns. The girl from the Giant Tree is standing on the rocks. Her name is Delia. She was the chief&#039;s right hand. Ever since the chief put on the black crown, he listens to the crown and not to his bandits. The chief had this trap set for Arin. Delia says this and disappears.</p>
<p>After the pit there is a lake crossed on rock columns beneath a waterfall pouring from the ceiling, a grove full of red mushrooms, and a sunlit rift that climbs back up into the jungle.</p>
<h2 id="60-the-bandit-camp">60 · The Bandit Camp</h2>
<figure class="post-figure"><img src="/uploads/2026/09/27-haydut-kampi-453d8934.webp" alt="The Bandit Camp: two goblins sitting on either side of the campfire, a lookout platform on wooden stilts next to it and an archer holding his bow on the platform; Arin in the middle of the camp" loading="lazy" decoding="async"><figcaption>The Bandit Camp</figcaption></figure>
<p>The seventh map is the bandits&#039; camp up on stilts. Wooden platforms sit on top of wooden posts. Over a mud lake, two watchtowers are linked by a rope bridge.</p>
<p>The camp gate is woven from the Veil&#039;s thorns and barred from the inside. Delia is behind the gate. Arin asks her whether the chief sent her. Delia says she came on her own, and that she won&#039;t take orders from a crown. She is the one who knows where the thorns should be cut, and she opens the gate from the inside.</p>
<p>Inside the camp, goblins sit by the fires. The bandits put them to work in the camp. A sitting goblin doesn&#039;t get up until it sees Arin or takes a hit. Then it stands up and fights. The path runs through the ambush in the camp square, past Faber on a platform growing out of a tree, across a lake crossed by a walkway on stilts, and through the frog pens. The map ends at Mother Frog&#039;s pit.</p>
<h2 id="61-delia-at-your-side">61 · Delia at your side</h2>
<figure class="post-figure"><img src="/uploads/2026/09/30-delia-ae329182.webp" alt="Delia in an ambush: red-hooded Delia shooting from the wooden ledge on the left at an archer on a perch, Arin fighting a goblin below, the closed thorn gate on the right" loading="lazy" decoding="async"><figcaption>Delia in an ambush</figcaption></figure>
<p>When Delia&#039;s place in the game was being planned, there were three options: a story character only, support at certain moments, or a companion who fights beside you on every map. The second was chosen: Delia helps, but she doesn&#039;t do the player&#039;s job.</p>
<p>In the ambushes in the Bandit Camp&#039;s square and the Chief&#039;s Throne courtyard, Delia stands on a fixed wooden ledge. While the ambush is running, every 2.5 seconds she shoots at the nearest enemy that is in range and has a clear line of sight. Her arrows only hurt enemies and never touch Arin. She doesn&#039;t take part in boss fights; her arrows pass straight through bosses.</p>
<h2 id="62-mother-frog">62 · Mother Frog</h2>
<figure class="post-figure"><img src="/uploads/2026/09/28-kurbaga-ana-9b550d98.webp" alt="The Mother Frog fight: the boss bar across the top of the screen; the giant purple frog flicks its long tongue at Arin, the thorn gate on the left" loading="lazy" decoding="async"><figcaption>The Mother Frog fight</figcaption></figure>
<p>The chapter&#039;s mini-boss lives in the pit behind the camp. According to Delia, the chief throws prisoners to her. Mother Frog is the purple poison frog at 2.5 times the size. Before the fight, Delia gives a warning: she always stops for a moment before she attacks, so back off then; after she attacks, she is left open.</p>
<p>The same &quot;!&quot; warning appears before each of her moves:</p>
<ul><li><strong>Crush:</strong> she leaps onto the player. The landing&#039;s shockwave hits both sides at once and knocks you back first. She stays open for a while afterward.</li><li><strong>Tongue whip:</strong> she flicks her long tongue out at chest height. Rock stops the tongue. Afterwards she is left open again.</li><li><strong>Calling the young:</strong> at every quarter of her health she calls in two green frogs. There are at most three young at a time.</li><li><strong>Poison residue:</strong> on every second landing, she leaves a poison cloud where she took off. At most two clouds remain at a time, and they go when she does.</li></ul>
<p>She doesn&#039;t stagger from ordinary hits. At half health she speeds up, her color turns red, and she leaves a cloud on every landing.</p>
<h2 id="63-the-chiefs-throne-and-the-bandit-chief">63 · The Chief&#039;s Throne and the Bandit Chief</h2>
<figure class="post-figure"><img src="/uploads/2026/09/31-haydut-reisi-c0e7d3d7.webp" alt="The Bandit Chief fight: the boss bar across the top of the screen; the chief stands on a side ledge, arrows raining down on three marked spots on the ground, Arin outside the marks" loading="lazy" decoding="async"><figcaption>The Bandit Chief fight</figcaption></figure>
<p>The last map is the bandit fort on the jungle&#039;s highest ridge. The path runs in this order:</p>
<ul><li>a slope climbed on root and terrace steps;</li><li>a thorny valley crossed on three rope bridges strung between rock columns (fall off a bridge and you land in the thorns, lose a heart, and get placed back on the bridge);</li><li>the fort&#039;s outer watchtower, and Faber at the foot of the walls;</li><li>a thorn gate piercing the wall, and an ambush in the courtyard behind it;</li><li>a path walked along the top of the walls;</li><li>the throne courtyard between two thorn gates, with a wooden ledge at each end.</li></ul>
<p>The Bandit Chief is a red-hooded archer at 1.7 times the size. He is armored: he doesn&#039;t stagger from ordinary hits, and only a shield parry opens him up. A &quot;!&quot; appears before each of his moves, and each one is followed by an open window:</p>
<ul><li><strong>Arrow shot:</strong> a straight arrow from a distance. It can be cut with the sword and blocked with the shield. Parried at exactly the right moment, the chief staggers.</li><li><strong>Arrow rain:</strong> he leaps onto one of the side ledges and marks three spots on the ground in red. Arrows rain down there. The shield doesn&#039;t stop these arrows; you have to get out of the marks.</li><li><strong>Slide:</strong> he comes sliding along the ground. You jump over him or get past with a dash. After the slide he stays open for a while, and hits deal double damage during it.</li><li><strong>Bow strike:</strong> when you get right up close, he hits you with his bow and knocks you back.</li></ul>
<p>At half health his crown lights up. His arrows become poisoned, the number of marks in the arrow rain goes up to five, and at half and a quarter health he calls archers onto the side ledges. There are at most two archers at a time.</p>
<p>When the chief collapses, a red-fletched arrow glides in through the trees and splits the crown in two. Delia says Arin won the fight and that she only broke the crown. The second black thorn falls out of the broken crown. The chief&#039;s last words are about a black knight in a horned helm who brought him the crown. Arin remembers the silhouette in the swamp and doesn&#039;t want to believe it.</p>
<h2 id="64-black-thorn-2-6">64 · Black Thorn 2/6</h2>
<figure class="post-figure"><img src="/uploads/2026/09/33-bolum-sonu-2-8280f98f.webp" alt="End-of-chapter card: the &quot;Poison Jungle&quot; banner, &quot;Chapter 2 Complete&quot;, the time, gem, and death totals, &quot;Black Thorn 2/6&quot;, and the Play Again and Map Selection buttons" loading="lazy" decoding="async"><figcaption>End-of-chapter card</figcaption></figure>
<p>At the exit of the Chief&#039;s Throne, the map card comes first and then the chapter card. The card shows the chapter&#039;s totals (the sum of the best times, gems found out of the total, and the number of deaths) and the &quot;Black Thorn 2/6&quot; line. The &quot;Map Selection&quot; button goes back to map selection. There the third chapter, the Scorching Desert, shows up as unlocked, but since its maps haven&#039;t been built yet, its first map reads &quot;Coming soon.&quot;</p>
<p>The chapter ends with this question from Arin: &quot;My commander is alive... But is he still my commander?&quot;</p>
<hr>
<h2 id="65-new-enemies">65 · New enemies</h2>
<p>The jungle&#039;s enemies follow the forest&#039;s rules too: the same &quot;!&quot; warning comes before every strike, and touching an enemy costs no health. Poison works by the same rules as the mushroom poison in the fourth post.</p>
<ul><li><strong>Poison Frog:</strong> it moves by hopping and never hops onto the edge of a ledge, a wall, thorns, or water. It shows a &quot;!&quot; and lashes out with its tongue. When it dies it swells for half a second and bursts, leaving a poison cloud where it stood. Standing inside the cloud poisons you; dashing through it doesn&#039;t. There is a green one and a purple one. The purple one&#039;s cloud is wider and lasts longer.</li><li><strong>Bandit archer:</strong> green-hooded. Red hoods belong only to the chief and Delia. Once you are in range it shows a &quot;!&quot; and shoots a straight arrow at Arin&#039;s chest, but only with a clear line of sight. The arrow can be cut with the sword, blocked with the shield, and dashed through, and it sticks into rock and stays there. If Arin comes closer the archer backs away, but slower than Arin and never toward a ledge or a hazard. Get right up close and it swings its bow. The ones perched on branches don&#039;t walk; they only turn and shoot. There are male and female archers, and the female ones shoot more often.</li><li><strong>Pink slime:</strong> faster than the green one, and its spit poisons.</li><li><strong>Purple mushroom:</strong> it launches poison spores from a distance with its own animation.</li><li><strong>Red mushroom:</strong> it bursts when it dies and leaves a poison cloud. You have to hit and back off, or dash away.</li><li><strong>Sitting goblins:</strong> they sit by the campfires and stand up when they see the player.</li></ul>
<h2 id="66-chapter-scaling">66 · Chapter scaling</h2>
<p>The owner&#039;s rule: each chapter treats the previous chapter&#039;s full upgrade as &quot;normal.&quot; For the jungle, that means leaving the forest in full copper gear. This is never told to the player anywhere.</p>
<ul><li><strong>Enemy health:</strong> in the jungle every enemy, bosses included, spawns with double health. That way a copper sword cuts down a slime here in as many hits as a wooden sword needed for a slime in the forest.</li><li><strong>Armor:</strong> only the part above copper protects you. In full copper gear, every one-heart blow takes a full heart, exactly as it did in the forest with wooden gear. In full iron, blows take one, half, one, half a heart in turn. For a player still in wood, blows go up to one and a half hearts.</li></ul>
<p>Nothing changed in the forest or in the test rooms.</p>
<h2 id="67-iron-and-gold">67 · Iron and gold</h2>
<figure class="post-figure"><img src="/uploads/2026/09/32-demirci-demir-0eb6ee6d.webp" alt="The Forge page at Faber&#039;s stall: the copper helmet, chest armor, and leg armor are each forged up to iron for 3 iron ingots and 50 gems" loading="lazy" decoding="async"><figcaption>The Forge page at Faber&#039;s stall</figcaption></figure>
<p>There is no copper in the jungle; the chapter&#039;s metals are iron and gold. Iron is spread across the first five maps, and gold from the fourth map to the end. Ingots are in hidden chests and on certain enemies. Alongside the grey goblins, bandit archers can now carry ingots too. An enemy&#039;s ingot drops once per save. The ingot sitting on Faber&#039;s workbench also shows the chapter&#039;s metal: iron in the jungle.</p>
<p>On the Forge page, the helmet, chest armor, and leg armor are each forged up one material. Going up to iron costs 3 ingots and 50 gems, and going up to gold costs 4 ingots and 100 gems. Gold&#039;s first price was 5 ingots, and it came down to 4 to fit the jungle&#039;s economy. To forge a piece to gold, the piece has to be iron first. The Whetstone follows the same path: the new material&#039;s ingots and gems.</p>
<p>There was a problem: a player who hadn&#039;t brought a piece up to copper in the forest would never be able to forge that piece in the jungle. Iron required copper first, and copper no longer drops. Now a piece that is below the chapter&#039;s level is forged straight to iron, at iron&#039;s price. Faber says so himself on the first jungle map.</p>
<p>The shield isn&#039;t forged at the Forge. The jungle&#039;s iron shield is in the chest at the top of the Giant Tree.</p>
<hr>
<h2 id="68-the-owner-played-more-enemies">68 · The owner played: more enemies</h2>
<p>The owner played the maps. His clearest comment was this: &quot;we definitely need more mobs, more monsters. The fights need to last longer.&quot; After that comment, every map in both the forest and the jungle was reworked:</p>
<ul><li><strong>More enemies:</strong> roughly 75-100% more enemies were placed on every map, in mixed groups of 2-5. The forest&#039;s enemy count went from 390 to 689, and the jungle&#039;s from 259 to 501. New maps will start out at this density.</li><li><strong>Tighter ambush arenas:</strong> every wave arena was narrowed by about a quarter. The gates were brought inward and the spawn points were rearranged. The ground waves stayed the same, and the boss arenas weren&#039;t touched.</li><li><strong>The path after the chief:</strong> so that the path after the chief in the Chief&#039;s Throne wouldn&#039;t be left empty, three groups of enemies were placed there.</li></ul>
<p>Besides these, there are two more small changes. Waterfalls are now drawn three times bigger: instead of thin streams side by side, every drop is a single large waterfall. And a poisoned hero no longer only walks slowly; he swings his sword more slowly too.</p>
<p>The fairness rules stayed the same: there is a &quot;!&quot; before every strike, and the area around campfires is clear of enemies.</p>
<h2 id="69-tree-archers">69 · Tree archers</h2>
<figure class="post-figure"><img src="/uploads/2026/09/29-agac-okculari-98ad6118.webp" alt="An ambush arena in the jungle: an archer on the upper branch of each of two thick trees, Arin swinging his sword on the ground between two goblins and an archer, the closed thorn gate on the right" loading="lazy" decoding="async"><figcaption>An ambush arena in the jungle</figcaption></figure>
<p>Another request from the owner: every ambush arena in the jungle should have two big trees, with archers standing on their upper branches. That&#039;s how it is now:</p>
<ul><li>When the fight starts, every perch on the two trees&#039; upper branches is filled.</li><li>With each new wave, only the perches whose archer died are refilled; the ones still alive stay where they are.</li><li>The archers don&#039;t hold up the end of a wave. When the last wave goes down, they go down with it.</li><li>If the player dies, the archers on the perches are removed too.</li></ul>
<p>The ground waves stayed the same, and no archer stands on a low branch. All seven jungle maps with an ambush arena have these trees.</p>
<h2 id="70-enemies-are-evolving">70 · Enemies are evolving</h2>
<p>The owner has one more rule: a new color of a known enemy has to be either stronger or tougher. In its first version the pink slime was weaker than the green one, which was wrong. From the jungle onward, the enemies are a little smarter:</p>
<ul><li><strong>Slimes</strong> spit twice in a row.</li><li><strong>Bats</strong> became orange fire bats, because the green bat got lost among the jungle&#039;s leaves. They dive to where a running hero is headed, dive once more after a missed dive, and die in two hits with the chapter&#039;s sword. The warning before a dive stayed the same, and they don&#039;t burn you.</li><li><strong>The pink slime</strong> is both faster and tougher than the green one.</li><li><strong>The purple mushroom</strong> launches two spores per shot and bursts twice when it dies.</li><li><strong>The red mushroom</strong> no longer hides. It used to duck down as soon as Arin came close. Now it launches poison spores from the longest range, and it meets anyone who comes near with spores as well.</li><li><strong>Archers</strong> also shoot straight down from branches. The owner had seen an archer perched on a branch fail to shoot at Arin standing directly beneath it.</li></ul>
<hr>
<h2 id="71-the-game-has-sound-now">71 · The game has sound now</h2>
<p>The previous three posts all ended with the same line: the game has no sound at all. Now it does.</p>
<ul><li><strong>Effects:</strong> there are 81 sound events. The hero&#039;s three sword swings, hits, blocks, parries, jumps, dashes, and footsteps that change with the ground (grass, stone, wood); the sounds of enemies and bosses; chests, gems, ingots, bear traps, saws, gates, and campfires; menus. The same sound never plays twice in a row from the same recording.</li><li><strong>Monster sounds:</strong> the goblins&#039; voices, the frogs&#039; croaking, the bosses&#039; roars and deaths, and the Captain&#039;s and Mother Frog&#039;s sounds come from the Retro Game Monster Sounds pack the owner bought.</li><li><strong>Where the sound sits:</strong> enemy sounds come from where they are on screen. They fade toward the edge of the screen and can&#039;t be heard at all far outside it. That way fights off screen don&#039;t crowd the sound. Bosses and gates can be heard from anywhere in the arena.</li><li><strong>Music:</strong> 15 tracks, from xDeviruchi&#039;s 16-Bit Fantasy &amp; Adventure pack. Each chapter has its own music, and on some maps (the caves, the temple, the chief&#039;s fort) separate tracks play. When an ambush starts it switches to combat music, at a boss to boss music, and at Faber&#039;s stall to shop music. When that&#039;s over it goes back to the map&#039;s music.</li><li><strong>Short jingles:</strong> for the end of a map, the end of a chapter, and death.</li><li><strong>Ducking during dialogue:</strong> while a dialogue is open, the music is turned down a little.</li></ul>
<p>The sound balance was set by measurement, not by ear. The game plays the same scene through by itself three times: everything on, music only, and effects only. The recordings are measured. Combat sounds sit clearly above the music, while footsteps stay below it. Overall loudness is kept between -16 and -18 LUFS. The music and effects sliders in Settings now really do change something.</p>
<h2 id="72-the-credits-screen">72 · The credits screen</h2>
<figure class="post-figure"><img src="/uploads/2026/09/34-krediler-a035b781.webp" alt="The credits screen: the Thornveil logo, &quot;Made by: Syoo Games&quot;, the Art heading below it with the credit for the Dagon packs, and two scroll arrows on the right edge" loading="lazy" decoding="async"><figcaption>The credits screen</figcaption></figure>
<p>Some of the sound packs ask for attribution inside the game, so a credits screen was added. It isn&#039;t in the title menu; it sits on a &quot;Credits&quot; button at the bottom of the Settings panel. That is how the owner wanted it.</p>
<ul><li>At the very top are the logo and &quot;Made by: Syoo Games&quot;.</li><li>Then come the Art, UI, Font, Music, Sound Effects, and Engine sections. Names, work titles, licenses, and links stay exactly as their authors wrote them, untranslated. Works under a CC BY license have the license link next to them and a note that they were trimmed and edited for the game.</li><li>The Engine section has Godot&#039;s license and the license texts of the third-party components it uses. Godot&#039;s license requires them to be shipped with the game.</li><li>The list scrolls by dragging, with the mouse wheel, and with the keys. For touchscreens there are two arrows on the right edge: tap and it scrolls one page, hold and it keeps scrolling. Two seconds after the screen opens, the list starts drifting slowly on its own, and it keeps drifting until the player touches it.</li></ul>
<hr>
<h2 id="behind-the-scenes-the-moment-mother-frog-crashed-the-game">Behind the scenes: the moment Mother Frog crashed the game</h2>
<p>While the owner was fighting Mother Frog, the game stopped in the debugger. The cause was small but sneaky. The poison clouds Mother Frog leaves behind delete themselves when their time runs out. When a deleted cloud in the list that holds them is passed to a typed function, Godot 4.7 counts this as a script error and stops the game. The list is now kept untyped, and every cloud is checked to see whether it still exists before it is used. Mother Frog&#039;s test now also checks that a cloud going out quietly drops off the list. The rule was written into the project&#039;s notes as well: an object that can be deleted is never passed to a typed variable or function.</p>
<p>Every new system in the jungle came with its own test: the frog, the archer, the mushrooms and the pink slime, the temple traps, Mother Frog, the Bandit Chief, Delia, the tree archers, the chapter scaling, and the sound. The map tests changed too. Each map&#039;s test used to expect fixed numbers, and it broke every time the map was edited. Now a single shared test compares every map against its own file: enemies, gems, the two campfires, the dialogues, and the next map. The eight jungle maps also went through the decor and reachability checks. The only places that ask for a dash are the optional chest and gem routes.</p>
<p>The jungle&#039;s second through eighth maps were built in a single night, at the owner&#039;s request. That night the dialogues of all eight maps were also read through from start to finish in one piece, and 27 lines that didn&#039;t match up were fixed.</p>
<h2 id="whats-next">What&#039;s next?</h2>
<ul><li><strong>Chapter 3, the Scorching Desert.</strong> The draft plan is ready and waiting on the owner&#039;s decisions. Nothing will start before it is approved. In map selection, the desert&#039;s first map reads &quot;Coming soon&quot; for now.</li><li><strong>Images for the older posts.</strong> The images for the second, third, and fourth posts still have to be captured. Image 06 in the first post will be re-captured too, because it shows an old character name.</li></ul>
<hr>
<h2 id="credits">Credits</h2>
<ul><li>Made by: Syoo Games</li><li>Character, enemy, tile, and item art: Eduardo Scarpato (im-dagon), Dagon&#039;s Fantasy packs: <a href="https://eduardscarpato.itch.io/" target="_blank" rel="noopener noreferrer">eduardscarpato.itch.io</a></li><li>UI and title lettering: Franuka, RPG UI Pack: <a href="https://franuka.itch.io/rpg-ui-pack" target="_blank" rel="noopener noreferrer">franuka.itch.io/rpg-ui-pack</a></li><li>Text font: Silver, Poppy Works (CC BY 4.0): <a href="https://poppyworks.itch.io/silver" target="_blank" rel="noopener noreferrer">poppyworks.itch.io/silver</a></li><li>Music: 16-Bit Fantasy &amp; Adventure Music Pack (2025), &quot;Original music by Marllon Silva (xDeviruchi)&quot;: <a href="https://xdeviruchi.itch.io/16-bit-fantasy-adventure-music-pack" target="_blank" rel="noopener noreferrer">xdeviruchi.itch.io/16-bit-fantasy-adventure-music-pack</a>, <a href="https://www.youtube.com/xdeviruchi" target="_blank" rel="noopener noreferrer">www.youtube.com/xdeviruchi</a></li><li>Music: &quot;Boneyard&quot;, Action Chiptune Music Pack, Preston Peak (PPEAK) (CC BY 4.0, <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank" rel="noopener noreferrer">creativecommons.org/licenses/by/4.0</a>, trimmed and edited for the game): <a href="https://opengameart.org/content/free-action-chiptune-music-pack" target="_blank" rel="noopener noreferrer">opengameart.org/content/free-action-chiptune-music-pack</a></li><li>Music: Music Jingles, Kenney (CC0): <a href="https://kenney.nl/assets/music-jingles" target="_blank" rel="noopener noreferrer">kenney.nl/assets/music-jingles</a></li><li>Sound effects: Pixel Combat SFX, Helton Yan (with Beto Bezerra) (CC BY 4.0, <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank" rel="noopener noreferrer">creativecommons.org/licenses/by/4.0</a>, trimmed and edited for the game): <a href="https://heltonyan.itch.io/pixelcombat" target="_blank" rel="noopener noreferrer">heltonyan.itch.io/pixelcombat</a></li><li>Sound effects: Fantasy Sound Effects Library, Little Robot Sound Factory (CC BY 3.0, <a href="https://creativecommons.org/licenses/by/3.0/" target="_blank" rel="noopener noreferrer">creativecommons.org/licenses/by/3.0</a>, trimmed and edited for the game): <a href="https://opengameart.org/content/fantasy-sound-effects-library" target="_blank" rel="noopener noreferrer">opengameart.org/content/fantasy-sound-effects-library</a>, www.littlerobotsoundfactory.com</li><li>Sound effects: Retro Game Monster Sounds, Magic Sound Effects: <a href="https://magicsoundeffects.itch.io/retro-game-monster-sounds" target="_blank" rel="noopener noreferrer">magicsoundeffects.itch.io/retro-game-monster-sounds</a></li><li>Sound effects: RPG Essentials SFX, Minifantasy Dungeon Audio Pack and Minifantasy Forgotten Plains Audio Pack, Leohpaz: <a href="https://leohpaz.itch.io/" target="_blank" rel="noopener noreferrer">leohpaz.itch.io</a></li><li>Sound effects: 80 CC0 Creature SFX, 80 CC0 Creature SFX #2 and 80 CC0 RPG SFX, rubberduck (CC0): <a href="https://opengameart.org/content/80-cc0-creature-sfx" target="_blank" rel="noopener noreferrer">opengameart.org/content/80-cc0-creature-sfx</a>, <a href="https://opengameart.org/content/80-cc0-creture-sfx-2" target="_blank" rel="noopener noreferrer">opengameart.org/content/80-cc0-creture-sfx-2</a>, <a href="https://opengameart.org/content/80-cc0-rpg-sfx" target="_blank" rel="noopener noreferrer">opengameart.org/content/80-cc0-rpg-sfx</a></li></ul>]]></content:encoded>
  </item>
  <item>
    <title>Thornveil Devlog #4: The Thorn Forest Is Done</title>
    <link>https://syoogames.com/en/devlog/thornveil-devlog-4-the-thorn-forest-is-done</link>
    <guid isPermaLink="true">https://syoogames.com/en/devlog/thornveil-devlog-4-the-thorn-forest-is-done</guid>
    <pubDate>Sat, 19 Sep 2026 09:00:00 +0300</pubDate>
    <description>The third devlog closed with the Goblin Captain, and the Thorn Forest&#039;s last three maps were still on the to-do list. With this post, those three maps are playable too: Root Cave, Goblin Camp, and the Slime King&#039;s Swamp. The first chapter now plays from start to finish; its boss and its end-of-chapter card are both in place. This post covers those maps, rebuilding the health and armor systems from scratch, cutting back the campfires, the rules for water, fire, and mushroom poison, and how the world puts itself back together after you die.</description>
    <content:encoded><![CDATA[<p>The third devlog closed with the Goblin Captain, and the Thorn Forest&#039;s last three maps were still on the to-do list. With this post, those three maps are playable too: Root Cave, Goblin Camp, and the Slime King&#039;s Swamp. The first chapter now plays from start to finish; its boss and its end-of-chapter card are both in place. This post covers those maps, rebuilding the health and armor systems from scratch, cutting back the campfires, the rules for water, fire, and mushroom poison, and how the world puts itself back together after you die.</p>
<blockquote>The images for this post haven&#039;t been captured yet.</blockquote>
<hr>
<h2 id="43-root-cave">43 · Root Cave</h2>
<p>The sixth map goes down into the roots of the great trees at the end of Misty Grove. The roots run down into the dark and then curl back upward. The only way forward is to climb them. You come down through a curtain of roots into a flooded gallery. From there you go up to the hollow where Faber has lit his fire, and then on to the vertical well itself. On the well&#039;s walls, rock ledges and root planks zigzag their way up sixteen rows.</p>
<p>At the top there is a Heart Crystal caught in the roots, and two rope bridges crossing over a bed of thorns. The cave opens onto a ridge under the night sky. From the slope below, the smoke of the goblin camp is visible.</p>
<h2 id="44-goblin-camp-and-the-thorn-pit">44 · Goblin Camp and the thorn pit</h2>
<p>The packs don&#039;t include tents or fences. The camp was built out of what was on hand: chests, the dungeon&#039;s wooden furniture, cages, wooden scaffolds, and fires burning everywhere. The path runs in this order:</p>
<ul><li>the camp&#039;s lookout hill;</li><li>a storeroom carved into a rock mound, where the goblins hide what they stole from the village;</li><li>a square where an ambush is set;</li><li>the explosives courtyard with the thorn pit in the middle;</li><li>and at the very end, the Captain&#039;s square.</li></ul>
<p>No bridge crosses the thorn pit. You get across by jumping and dashing between chunks of earth hanging in the air. Some of the chunks crumble and fall when you step on them. Some stay solid, and there is fighting on top of them. This section was deliberately designed as the chapter&#039;s only jumping and dashing test. The reachability analysis reports forward movement here as &quot;required&quot;, and this is the one exception that was accepted.</p>
<p>When the Captain is defeated, Nestor Dede is freed from his cage and the chest of stolen copper opens. That chest gives the chapter&#039;s last copper ingot.</p>
<h2 id="45-the-slime-kings-swamp">45 · The Slime King&#039;s Swamp</h2>
<p>The last map descends into the swamp, where the Veil stands like a wall of purple mist. The packs have no swamp tiles. The swamp was built out of night tiles and dark water:</p>
<ul><li>crumbling chunks of earth and rotten logs in the water;</li><li>a mushroom-shaped rock with bats roosting on top of it;</li><li>a goblin lookout camp on a mound;</li><li>Faber on an island;</li><li>a lake where the slimes boil up out of the water (the ambush is here);</li><li>a misty reed bed;</li><li>the thorns at the King&#039;s threshold.</li></ul>
<p>The Slime King was rewritten from scratch. The old version was a one-move jumper with 24 health. Now he has 90 health, and the same &quot;!&quot; warning appears before every one of his moves:</p>
<ul><li><strong>Crush:</strong> he leaps on top of the player. The shockwave of the landing pushes first and hits second, so it can&#039;t be soaked up with the shield. You get away by jumping, dashing, or leaving its range. Afterward he stays open for a while, and hits land for double damage during that time. A parry with the shield leaves him open in the same way.</li><li><strong>Spit:</strong> he throws a three-way fan at a player standing at a distance. The globs can be cut out of the air with the sword.</li><li><strong>Swamp call:</strong> at every quarter of his health, he marks two spots with smoke. A short while later slimes come out of them, never from right above the player.</li></ul>
<p>When his health drops to half, he speeds up and changes color. Touching him costs no health.</p>
<p>When the King falls, a horned silhouette appears in the mist while the closing lines are read. It arrives on the line that describes it and leaves on the line where it vanishes. This is the first sign of Aldric. So that the long walk from the King to the exit wouldn&#039;t be empty, three groups of enemies were added: the King&#039;s spawn, goblins fleeing the swamp, and a last stand before the exit.</p>
<h2 id="46-hearts-in-halves-and-armor-that-really-protects">46 · Hearts in halves, and armor that really protects</h2>
<p>The health system was rebuilt from scratch.</p>
<ul><li><strong>Half hearts:</strong> health is now counted in half-heart units. The packs have no half-heart art, so the HUD builds it itself out of the halves of a full and an empty heart.</li><li><strong>Hearts per map:</strong> every map starts with 4 hearts. The only way to go above that is the Heart Vessel Faber sells. At most 2 can be bought on a single map, and they only count for that map. There are no permanent hearts.</li><li><strong>The Heart Crystal chest:</strong> it doesn&#039;t give a new heart slot, it refills missing health.</li><li><strong>Armor:</strong> it no longer adds hearts, it softens blows. The material tiers of the helmet, chest armor, and leg armor are added up, and each tier takes a share of the blow. The remainder that doesn&#039;t divide evenly is carried over to the next blow. With a full copper set, one out of every two one-heart blows costs half a heart. A blow always costs at least half a heart.</li></ul>
<h2 id="47-two-fires-per-map">47 · Two fires per map</h2>
<p>There were too many campfires on every map, and health was constantly being refilled. Every map now has exactly two fires. Their positions were chosen to keep the longest walk between the spawn point, the fires, and the exit short. Wherever possible, there is a fire before an ambush or a boss.</p>
<ul><li><strong>A fire only works forward:</strong> going back to a fire you&#039;ve left behind doesn&#039;t refill health and doesn&#039;t move the return point back. You can&#039;t refill health by going back and forth between two fires.</li><li><strong>Hazards don&#039;t send you to the fire:</strong> falling onto thorns or off the map costs one heart and puts the player back on the last solid ground. Solid ground is the last spot where there was ground under both edges of the feet, that touched no hazard, and that wasn&#039;t a crumbling platform. Only death sends you to the fire.</li><li><strong>Burning fires burn:</strong> touching the big fires on the maps costs half a heart and knocks the player back.</li></ul>
<h2 id="48-water-drowns-you">48 · Water drowns you</h2>
<p>Falling into water is now outright death and a return to the last campfire. Health, armor, dash, and shield won&#039;t save you.</p>
<p>The same goes for enemies. A goblin that fell into the water used to sink to the bottom of the lake and wander around down there forever. The reason was that the water&#039;s hazard area was only a thin strip at the surface, and the check was made when the enemy landed on the ground. Now every walking enemy drowns with a blue splash the moment its feet enter the water, even in midair. Flying bats are the exception.</p>
<h2 id="49-mushroom-poison">49 · Mushroom poison</h2>
<p>The spores that mushrooms launch now poison you. A hero who takes a spore walks at 60% of normal speed for 3 seconds. The dash isn&#039;t affected, because that&#039;s the way out.</p>
<p>While poisoned, the hero flashes green, bubbles rise off him, and the hearts in the HUD turn green. After 1.5 seconds the poison takes one more half heart, once, but it never takes the last half heart. A spore blocked with the shield, dodged with a dash, or cut with the sword poisons no one. A campfire, a Heart Crystal, or death clears the poison.</p>
<h2 id="50-when-you-die-the-world-resets-too">50 · When you die, the world resets too</h2>
<p>After a death, the enemies were laid out again from the return point onward. The rest of the world wasn&#039;t. Now, while the death screen fades to black, these are put back as well:</p>
<ul><li>platforms that crumbled and fell;</li><li>bear traps that snapped shut;</li><li>explosive barrels that exploded ahead of the return point.</li></ul>
<p>Platforms and traps already came back on their own timers. But objects that are off screen are paused for performance, and their timers stopped with them. A player who respawned at the fire and came back would still find the platform halfway fallen.</p>
<h2 id="51-end-of-chapter-card">51 · End-of-chapter card</h2>
<p>At the exit of the last map, the map card comes first and the chapter card after it. The chapter card shows:</p>
<ul><li>the chapter&#039;s totals: the sum of the best times, gems found and gems in total, and the number of deaths;</li><li>&quot;Black Thorn 1/6&quot;: the pieces taken from the Heart of the Veil, one for each biome boss defeated.</li></ul>
<p>The &quot;Map Selection&quot; button goes back to map selection. There, the second chapter, the Poison Jungle, appears unlocked. Since its maps haven&#039;t been made yet, it reads &quot;Coming Soon&quot;.</p>
<hr>
<h2 id="behind-the-scenes-tests-no-longer-touch-the-players-save">Behind the scenes: tests no longer touch the player&#039;s save</h2>
<p>The owner plays the game on the development save between changes. The automated tests used that same file, so before every test run a copy of the save was taken and then put back afterward. One time that copy fell a run behind, a test wrote over the run the owner had played, and we had to go back to the previous copy. Now the tests write to their own save and settings files (<code>save_test.json</code>, <code>settings_test.cfg</code>). A test can be run even while the game is open.</p>
<p>Two sneaky bugs turned up around the same time. Both of them came out of refusing to answer the question &quot;is it fixed?&quot; without measuring:</p>
<ul><li><strong>Hazards hit twice:</strong> the list of who is standing inside a hazard area is refreshed by the physics engine one frame late. A hero who drowned in the water was killed by that water once more on the frame he respawned at the fire. A hero who fell onto thorns with his last heart lost another heart at the fire. Hazards now check whether the body really is inside them at that moment before they hit.</li><li><strong>The platform wasn&#039;t restored on the physics side:</strong> a platform that is paused off screen is also taken out of the physics world. Putting it back only moved its image, not its collision body. The test puts the hero on top of a restored platform and checks whether he falls through.</li></ul>
<h2 id="whats-next">What&#039;s next?</h2>
<ul><li><strong>Chapter 2, the Poison Jungle.</strong> This chapter assumes the player has made the first chapter&#039;s upgrades, and it treats a full copper set as &quot;normal&quot;. Enemies are scaled up to that level, and the player isn&#039;t told. To get ahead, you have to have iron forged and spend gems.</li><li><strong>The images for this post and for the previous two.</strong></li><li><strong>Sound.</strong> The game still has no sound at all.</li></ul>
<hr>
<h2 id="credits">Credits</h2>
<ul><li>Character, enemy, tile, and item art: Eduardo Scarpato (im-dagon), Dagon&#039;s Fantasy packs: <a href="https://eduardscarpato.itch.io/" target="_blank" rel="noopener noreferrer">eduardscarpato.itch.io</a></li><li>UI and title lettering: Franuka, RPG UI Pack: <a href="https://franuka.itch.io/rpg-ui-pack" target="_blank" rel="noopener noreferrer">franuka.itch.io/rpg-ui-pack</a></li><li>Text font: Silver, Poppy Works (CC BY 4.0): <a href="https://poppyworks.itch.io/silver" target="_blank" rel="noopener noreferrer">poppyworks.itch.io/silver</a></li></ul>]]></content:encoded>
  </item>
  <item>
    <title>Thornveil Devlog #3: Saves, Where You Left Off, and the Second Wave of Combat</title>
    <link>https://syoogames.com/en/devlog/thornveil-devlog-3-saves-where-you-left-off-and-the-second-wave-of-combat</link>
    <guid isPermaLink="true">https://syoogames.com/en/devlog/thornveil-devlog-3-saves-where-you-left-off-and-the-second-wave-of-combat</guid>
    <pubDate>Fri, 18 Sep 2026 13:00:00 +0300</pubDate>
    <description>The second devlog closed with the third and fourth maps, the look of the rocks, and the first pass over combat. This post covers making the save file safe, asking the player what should happen when they leave a map and come back, the counter that stops rewards from being paid out twice, combat becoming a two-way fight, and the Thorn Forest&#039;s mini-boss, the Goblin Captain.</description>
    <content:encoded><![CDATA[<p>The second devlog closed with the third and fourth maps, the look of the rocks, and the first pass over combat. This post covers making the save file safe, asking the player what should happen when they leave a map and come back, the counter that stops rewards from being paid out twice, combat becoming a two-way fight, and the Thorn Forest&#039;s mini-boss, the Goblin Captain.</p>
<blockquote>The images for this post haven&#039;t been captured yet.</blockquote>
<hr>
<h2 id="35-the-save-file-no-longer-gets-corrupted">35 · The save file no longer gets corrupted</h2>
<p>The save used to be written directly to a single file. If the game closed or the phone killed the app while it was writing, you were left with a half-written file. The next time the game opened, that file couldn&#039;t be read, so the progress was treated as lost.</p>
<p>Now no save is written in place. The new save is first written as <code>save.tmp.json</code>. If the existing save can still be read, it is renamed to <code>save.bak.json</code>, and only after that does the new file take over the real name. On startup, three files are tried in order: the real save, the finished temporary file, and the backup. If none of them can be read, the file is set aside as <code>save.corrupt.json</code> — it isn&#039;t overwritten and destroyed, because even a corrupted save is the only evidence there is, and something might still be recovered from it.</p>
<p>The game also saves when the app is paused, loses focus, or is closed. But it only does this if there is real progress in memory: quitting from the title screen doesn&#039;t write an empty save over a full one.</p>
<p>Development and test runs use <code>save_dev.json</code>. A test or a screenshot script has no way to touch the player&#039;s real progress.</p>
<h2 id="36-pick-up-where-you-left-off-or-start-over">36 · Pick up where you left off, or start over?</h2>
<p>Leaving a map halfway through and going back to map selection was unclear: nobody could tell what would happen when you came back.</p>
<p>Now each map carries its own <strong>return point</strong>. When you touch a campfire, the game records where you left that map, how many seconds you&#039;d played, and how many times you&#039;d died. When you enter the map again, the game asks: &quot;Pick up where you left off&quot; or &quot;Start over&quot;. Since each map keeps its own record, playing another map in between doesn&#039;t throw away the unfinished one.</p>
<p>The time and death count are stored in the return point too. Otherwise, finishing a map by continuing from the last fire would record a time as if the run had started from zero. In other words, a player who continued from where they left off would end up with a best time that was a lie.</p>
<p>The option in the pause menu also got a clearer name. What it does is take you back to the last checkpoint, so it now reads &quot;Return to Last Fire&quot;, not &quot;Restart&quot;.</p>
<h2 id="37-a-reward-isnt-paid-out-twice">37 · A reward isn&#039;t paid out twice</h2>
<p>&quot;Start over&quot; puts that map&#039;s collectibles back. This is needed so that a player replaying the map can complete the x/y counter on the end card. It is not there so you can open the same chest a second time and put the same gems in your purse a second time.</p>
<p>That&#039;s why there are two separate lists. <code>collected</code> holds what has been collected on a map, and starting that map over clears it. <code>credited</code>, on the other hand, holds <strong>which rewards have already been paid out once</strong>, and it is never cleared for as long as the save exists. A chest opened a second time still throws out its gems so they count toward the map&#039;s counter. But it puts nothing in your purse, and it doesn&#039;t show a notification promising something it isn&#039;t giving.</p>
<p>The copper ore carried by goblins is on the same counter too, keyed to the tile the goblin stands on. So neither dying and walking the same path again nor replaying the map lets you milk the same goblin for a second ingot. An enemy spawned by an arena wave doesn&#039;t have a fixed spot, so it never drops ore in the first place.</p>
<p>&quot;Play Again&quot; on the end-of-chapter card is built on top of this too. It puts back the collectibles on all of the chapter&#039;s maps and starts from the first map, without erasing any progress and without touching the save at all.</p>
<h2 id="38-hitting-has-a-cost">38 · Hitting has a cost</h2>
<p>The real problem with combat showed up once it was measured: a hit that landed moved straight on to the next one without waiting for its recovery frames. So as long as the sword kept connecting, it never stopped. You could keep up more than five hits per second, and swinging cost nothing at all. The enemy had no opening to strike back, because there was never a moment when the player wasn&#039;t swinging.</p>
<p>The fix wasn&#039;t to slow the player down, but to give the combo an ending. The sequence is now <strong>three hits</strong>: a swing, a thrust, and a <strong>finisher</strong>. The finisher can&#039;t be canceled, either into the next hit or into a jump. You&#039;re stuck in it for half a second, and <strong>that&#039;s exactly when the enemy gets its turn</strong>. In return, it deals one and a half times the damage.</p>
<p>Two things keep this rule from turning into a trap. The finisher only comes out if the hit before it landed, so swinging at thin air never pins anyone in place. And a <strong>dash</strong> can cut the finisher short. Getting pinned in the middle of a crowd isn&#039;t forced on you, but the way out isn&#039;t free either — it uses up the dash and puts it on cooldown.</p>
<p>On phones, the rhythm of tapping the button hasn&#039;t changed. Holding it down still keeps the combo going. The only thing that changed is that taking the combo all the way to the end now has a cost.</p>
<h2 id="39-parrying-with-the-shield">39 · Parrying with the shield</h2>
<p>Holding up the shield cost nothing and gained you nothing, so nobody ever used it.</p>
<p>Now a blow blocked within <strong>0.2 seconds</strong> of raising the shield counts as a parry. There&#039;s no knockback, the screen freezes for a moment, and the enemy that struck is left open for <strong>0.8 seconds</strong>. This stagger ignores the poise counter, the stun cooldown, and armor. It&#039;s the only way to take a boss&#039;s turn on purpose.</p>
<h2 id="40-enemies-now-react">40 · Enemies now react</h2>
<p>Five behaviors were added to the base enemy, all of them off by default. Keeping them off matters: the hundreds of goblins, slimes, mushrooms, and bats across the five maps stayed bit-for-bit the same.</p>
<ul><li><strong>Swing speed</strong> can be set per enemy. The gray goblin&#039;s attack strip is a one-second animation, and the hit lands at the 0.7-second mark. That&#039;s too late to ever catch a moving player.</li><li><strong>Recovery</strong>: after a swing, the enemy can&#039;t move, and the damage it takes in that window is multiplied. It&#039;s the honest answer to the question &quot;When should I hit?&quot;</li><li><strong>Retreat</strong>: when an enemy is taking a combo, it cuts the swing short and backs off. But it never runs away in the middle of its own swing. That rule is the only reason it can hit back at all.</li><li><strong>Spacing</strong>: when its swing isn&#039;t ready, the enemy steps out of the sword&#039;s range instead of standing inside it and waiting.</li><li><strong>Armor</strong>: an enemy that isn&#039;t staggered on every third hit. A boss needs this; a boss that gets interrupted by every sword strike doesn&#039;t give you much of a fight.</li></ul>
<p>A real bug turned up too. The enemies&#039; &quot;are there thorns there?&quot; check looked at the physics layer. But that layer holds not just hazards but <strong>every trigger</strong>: checkpoints, story beats, and boss rooms. So enemies were refusing perfectly safe jumps that passed over a trigger, thinking &quot;there&#039;s a hazard there&quot;. Hazards now have their own group, so enemies can tell them apart.</p>
<h2 id="41-an-exclamation-mark-before-the-attack">41 · An exclamation mark before the attack</h2>
<p>All enemies share the same wind-up animation, and on a character 20 pixels tall, that wind-up doesn&#039;t read as a threat. The player sees that they&#039;ve been hit, but not that the hit was coming.</p>
<p>Now, before it swings, an enemy stands still for <strong>0.4 seconds</strong> and shows an exclamation mark above its head. It&#039;s the same bubble the smith has, with the same white exclamation mark. Nothing hits during that moment, so that&#039;s your window to get away. The same exclamation mark also appears when the captain crouches before a leap.</p>
<p>This is off by default as well. None of the enemies on the five maps show the exclamation mark; only the captain and the goblins he summons use it.</p>
<h2 id="42-the-goblin-captain">42 · The Goblin Captain</h2>
<p>He is the Thorn Forest&#039;s mini-boss, made for the seventh map. The packs don&#039;t include a captain sprite, so he&#039;s the gray goblin at <strong>2.1 times</strong> the size, with a slightly warmer tint. He has <strong>100 health</strong> and armor: an ordinary sword strike makes him flash white, and that&#039;s it. The only way to take his turn is a parry.</p>
<p>The fight&#039;s beats, each with a warning before it and a window after it:</p>
<ul><li><strong>Combo.</strong> Two hits, 0.7 seconds apart; on the second one he lunges and deals two damage. Afterward he stays open for 0.65 seconds, and the damage he takes in that window is doubled.</li><li><strong>Back hop.</strong> If four hits pile onto him, he finishes his swing and opens up distance.</li><li><strong>Leap series.</strong> <strong>Every 25 health</strong> — that is, at 75, 50, and 25 — he crouches and jumps <strong>three times</strong> in a row. Each jump lands where the player is heading, the landing hits on both sides, and <strong>every landing drops a goblin</strong>. Like in the ambush waves, the goblins first announce themselves with a warning puff of smoke, and when they arrive they stay still for a moment. At most two of them are alive at once. After the last landing of the series, he stays open for 0.9 seconds: the reward for surviving.</li><li><strong>Second phase.</strong> When his health drops to half, he turns red, everything gets 1.2 times faster, and the series gets one jump longer.</li></ul>
<p>One thing was also removed. At first the captain carried a shield and planted it between his swings. It was a beat that blocked everything coming from the front, wore down with every blocked hit, and left him open when it broke. The mechanic worked, but the shield looked like an item icon sitting on his arm, so it was taken out entirely. A well-designed mechanic isn&#039;t guaranteed to look good on screen.</p>
<p>The captain has his own test room: a bare arena that doesn&#039;t show up in map selection and doesn&#039;t belong to any chapter. The whole fight is tested there with 41 checks. They cover him waking up and the gates closing when you enter the room, the armor holding up against an ordinary combo, the parry stunning him, and damage being multiplied during his open window. They also cover him answering a combo by backing off, starting the series at each health mark, dropping a goblin on every landing, and the phase changing. Then there&#039;s <strong>everything resetting when the player dies</strong>: the captain comes back at full health and asleep, and the goblins he summoned go with him. Finally, when he&#039;s defeated, the gate opens and the flag is saved.</p>
<h2 id="behind-the-scenes-nobody-says-its-better-now-without-measuring">Behind the scenes: nobody says &quot;it&#039;s better now&quot; without measuring</h2>
<p>The combat numbers in this post aren&#039;t guesses either. How many seconds pass between one hit and the next was counted from the animation frames and physics frames. How long an enemy can&#039;t move during a combo, how long its swing takes to arrive, and how long a fight lasts were all worked out the same way.</p>
<p>The reason is simple: a combat setting doesn&#039;t just affect the enemy you&#039;re looking at, it affects every map at once. That&#039;s why every new behavior was added switched off by default. After each change, the tests for all five maps, the save tests, the English test, the UI tests, and the reachability audit were all run again from the start.</p>
<p>Balance, though, was decided by playing, not by measuring. The captain&#039;s first version was too easy, and his second was too hard. The gaps between swings, the telegraph durations, and the goblin count were settled through hands-on play.</p>
<h2 id="whats-next">What&#039;s next?</h2>
<ul><li>The Thorn Forest&#039;s remaining three maps: Root Cave, Goblin Camp, and the Slime King&#039;s Swamp.</li><li>Moving the captain into his own map, the seventh one.</li><li>The end-of-chapter flow and a start-to-finish check of the whole chapter.</li><li>Sound. The game still has no sound at all; without hit and impact sounds, no amount of tuning makes combat feel quite right.</li></ul>
<hr>
<h2 id="credits">Credits</h2>
<ul><li>Character, enemy, tile, and item art: Eduardo Scarpato (im-dagon), Dagon&#039;s Fantasy packs: <a href="https://eduardscarpato.itch.io/" target="_blank" rel="noopener noreferrer">eduardscarpato.itch.io</a></li><li>UI and title lettering: Franuka, RPG UI Pack: <a href="https://franuka.itch.io/rpg-ui-pack" target="_blank" rel="noopener noreferrer">franuka.itch.io/rpg-ui-pack</a></li><li>Text font: Silver, Poppy Works (CC BY 4.0): <a href="https://poppyworks.itch.io/silver" target="_blank" rel="noopener noreferrer">poppyworks.itch.io/silver</a></li></ul>]]></content:encoded>
  </item>
  <item>
    <title>Thornveil Devlog #2: Two New Maps, the Seam in the Rock, and New Combat</title>
    <link>https://syoogames.com/en/devlog/thornveil-devlog-2-two-new-maps-the-seam-in-the-rock-and-new-combat</link>
    <guid isPermaLink="true">https://syoogames.com/en/devlog/thornveil-devlog-2-two-new-maps-the-seam-in-the-rock-and-new-combat</guid>
    <pubDate>Thu, 17 Sep 2026 09:00:00 +0300</pubDate>
    <description>The first devlog covered the title screen, map selection, and the Thorn Forest&#039;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.</description>
    <enclosure url="https://syoogames.com/uploads/2026/09/title-yanan-koy-ce507281-1024.webp" type="image/webp"/>
    <content:encoded><![CDATA[<p>The first devlog covered the title screen, map selection, and the Thorn Forest&#039;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.</p>
<blockquote>The images for this post haven&#039;t been captured yet; they&#039;ll be added once the map and the combat have settled.</blockquote>
<hr>
<h2 id="20-map-1-3-mushroom-hollows">20 · Map 1-3: Mushroom Hollows</h2>
<p>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.</p>
<p>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&#039;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&#039;t can keep going.</p>
<p>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&#039;s maximum health. In the flooded gallery, falling into the water costs health but doesn&#039;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.</p>
<p>The map took its current shape over four measured passes: the early passes had nine-tile water gaps, thirteen pits you couldn&#039;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.</p>
<h2 id="21-the-seam-in-the-rock">21 · The seam in the rock</h2>
<p>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.</p>
<p>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.</p>
<p>Note: the bright turquoise strip on top of the night rocks isn&#039;t part of this bug. That is a layer of ice drawn into the tile image itself.</p>
<h2 id="22-the-caves-inner-corners">22 · The cave&#039;s inner corners</h2>
<p>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 &quot;inner corner&quot; tile for this.</p>
<p>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&#039;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.</p>
<p>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.</p>
<h2 id="23-names">23 · Names</h2>
<p>The character names moved from Turkish to Latin and mythological roots. The game&#039;s text stays in Turkish; only the names changed:</p>
<ul><li><strong>Vesta</strong> (formerly Deren): the Roman goddess of the hearth and fire; we meet her at the burning village&#039;s first campfire</li><li><strong>Silvan</strong> (formerly Sarp): Silvanus, Rome&#039;s god of the forest; the runaway hunter</li><li><strong>Corin</strong> (formerly Kerem): a short name of Latin origin; the child found in a cage</li><li><strong>Nestor Dede</strong> (formerly Yaşar Dede): the aged mentor from the Iliad</li></ul>
<p>Arin, Aldric, and Morvena already fit this pattern, so they didn&#039;t change.</p>
<hr>
<h2 id="24-combat-was-rewritten">24 · Combat was rewritten</h2>
<p>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&#039;t get away during that window and just took damage.</p>
<p>Five changes were made. Each one sits behind its own setting, so they can be turned off one by one.</p>
<p><strong>Hitting on the move.</strong> 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&#039;t turn around mid-swing, but the walk isn&#039;t interrupted. Measurement: the distance covered during one swing went from 11 pixels to 26 pixels.</p>
<p><strong>Hit cancel.</strong> 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.</p>
<p><strong>Press and hold.</strong> 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&#039;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.</p>
<p><strong>Input memory.</strong> So that an early press doesn&#039;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.</p>
<p><strong>Auto-aim.</strong> 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&#039;s input wins and auto-aim doesn&#039;t kick in. If there&#039;s no enemy nearby, the facing direction doesn&#039;t change at all.</p>
<p>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.</p>
<hr>
<h2 id="25-map-1-4-watchtower-ruins">25 · Map 1-4: Watchtower Ruins</h2>
<p>The fourth map comes up from underground and climbs the border&#039;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.</p>
<p>The map&#039;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&#039;t open.</p>
<p>That chest is the chapter&#039;s first gear reward: <strong>a copper sword and shield</strong>. 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.</p>
<p>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.</p>
<p>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.</p>
<p>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 &quot;reachable and returnable&quot; state.</p>
<hr>
<h2 id="26-enemies-bat-goblin-mushroom">26 · Enemies: bat, goblin, mushroom</h2>
<p>Once combat had been reworked, it was the enemies&#039; turn. All three were handled the same way: measure first, then change, then measure again.</p>
<p><strong>Bat.</strong> It hovers 36 pixels above the player, a height the sword can&#039;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&#039;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&#039;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&#039;s shield: an attack coming from directly above is blocked no matter which way you&#039;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.</p>
<p><strong>Goblin.</strong> 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&#039;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.</p>
<p><strong>Mushroom.</strong> In the story it was described as an enemy that &quot;launches spores from a distance,&quot; 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.</p>
<hr>
<h2 id="27-map-1-5-misty-grove">27 · Map 1-5: Misty Grove</h2>
<p>The fifth map takes place east of the tower, on the Veil&#039;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: &quot;...the seal, by Morvena&#039;s hand... may it never be broken...&quot; This is the first time the name of the chapter&#039;s main villain comes up, and it is left only as a hint.</p>
<p>Ten sections: Mist&#039;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.</p>
<p>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&#039;t end the run — two steps lead back up from the bed.</p>
<p>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.</p>
<p>On the first pass, the reachability analysis flagged the water crossing as &quot;requires a double jump&quot;; 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.</p>
<h2 id="28-death-arenas-and-rewards-the-rough-edges-of-gameplay">28 · Death, arenas, and rewards: the rough edges of gameplay</h2>
<p>This round, the small rules that made the game feel &quot;unplayable&quot; were fixed one by one.</p>
<p><strong>Dying doesn&#039;t empty the map.</strong> It used to be that when you died, the enemies you had killed stayed dead, and from the checkpoint onward you&#039;d be walking through an empty map. Now every enemy <strong>ahead of</strong> 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.</p>
<p><strong>Death isn&#039;t a hard cut.</strong> After the death animation, the screen fades to black, the map is rebuilt behind the black, and then the screen fades back in.</p>
<p><strong>Arena waves don&#039;t hit without warning.</strong> Each spawn point is first marked with a cloud of dust, the enemy arrives 0.7 seconds later, and once it arrives it doesn&#039;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.</p>
<p><strong>No traps on arena floors.</strong> Traps, thorns, and barrels between the gates were moved outside; the audit tool now checks for this as a rule.</p>
<p><strong>No enemies right by the campfire.</strong> The area within six tiles of each checkpoint was cleared, and this was added to the audit too.</p>
<p><strong>You don&#039;t get hit while you&#039;re on top of a mob.</strong> From the moment you land on an enemy&#039;s back, that enemy can&#039;t deal damage, either through contact or with its sword. Jumping over it no longer costs health.</p>
<p><strong>Flying spores and slime can be cut.</strong> Swinging the sword pops ranged shots in midair.</p>
<p><strong>What comes out of the chest is what&#039;s in the chest.</strong> The chest that gives the copper sword and shield no longer sends gems flying out, but the icons of those two pieces themselves.</p>
<p><strong>When a map ends, you return to the map selection screen.</strong> After the results card, the game doesn&#039;t jump straight to the next map; the player chooses where to go.</p>
<hr>
<h2 id="29-combat-became-two-sided">29 · Combat became two-sided</h2>
<p>Two complaints came up in playtesting, and both were fair.</p>
<p><strong>&quot;Why do I take damage when I touch a creature?&quot;</strong> 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.</p>
<p><strong>&quot;When I spam attacks, they can&#039;t fight back at all.&quot;</strong> 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:</p>
<ul><li><strong>Poise:</strong> 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.</li><li><strong>Stun cooldown:</strong> once stunned, an enemy can&#039;t be stunned again for one second. So after every stun there is a guaranteed window to hit back.</li><li><strong>A started attack isn&#039;t interrupted:</strong> an enemy that has entered its attack animation finishes that swing even if it gets hit.</li></ul>
<p>Measurement — the goblin&#039;s state while the player swings the sword nonstop for 10 seconds:</p>
<ul><li>Frames spent attacking: 23 → <strong>333</strong></li><li>Frames spent stunned: 575 → <strong>244</strong></li><li>Frames where its sword actually connected: 0 → <strong>57</strong></li><li>Health lost by the player: 0 → <strong>5</strong></li></ul>
<p>In short: now the fight goes both ways.</p>
<h2 id="30-what-gear-and-gems-mean">30 · What gear and gems mean</h2>
<p>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&#039;s material is tied directly to the numbers:</p>
<ul><li><strong>Sword material → damage.</strong> Wood 1, copper 2, iron 3... One tier per chapter.</li><li><strong>Armor material → health.</strong> Extra hearts equal to the best armor tier equipped. With copper chest armor, health goes from 5 to 6.</li><li>Heart Crystals are counted separately, so changing armor never swallows a crystal you&#039;ve found.</li></ul>
<p>Also, the rewards that come out of chests are now really what&#039;s inside them: the chest that gives the copper set sends out the sword&#039;s and shield&#039;s own icons, not gems.</p>
<p>What gems will be used for, however, is still an open question — right now they&#039;re counted, saved, and shown on the end-of-map card, but there&#039;s nowhere to spend them. That&#039;s the subject of the next round.</p>
<h2 id="31-the-game-is-bilingual">31 · The game is bilingual</h2>
<p>The game has been in Turkish from the start. Now the settings screen has a <strong>Language</strong> row: Türkçe and English. The choice applies instantly, any open screens rewrite themselves, and the preference is saved in <code>settings.cfg</code>.</p>
<p>Behind the scenes, there&#039;s a small dictionary called <code>Loc</code>: 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&#039;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.</p>
<p>The arena battle cry depends on the language too: <strong>SAVAŞ!</strong> in Turkish, <strong>FIGHT!</strong> in English.</p>
<hr>
<h2 id="32-the-travelling-smith-something-to-spend-gems-on">32 · The Travelling Smith: something to spend gems on</h2>
<p>Gems can now be spent. In the middle of every map, <strong>Faber</strong> stands by a campfire: a travelling blacksmith. In your first conversation he introduces himself, and on every interaction after that he opens his stall.</p>
<p>The stall has three rows:</p>
<ul><li><strong>Whetstone</strong> (3 tiers): Raises the sword to the next metal. Price: 60 / 130 / 220 gems</li><li><strong>Heart Vessel</strong> (2 tiers): Max health +1. Price: 80 / 150 gems</li><li><strong>Nimble Boots</strong>: Dash cooldown is 30% shorter. Price: 80 gems</li></ul>
<p>Buying everything costs 720 gems; Chapter 1 has 525 gems in total. So on every run you have to <strong>make a choice</strong>: 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&#039;t wasted.</p>
<p>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&#039;t fit on the 384x216 screen. Purchases are saved instantly, and a whetstone you buy is added to the sword&#039;s damage right away; you feel the difference as soon as you close the stall.</p>
<p>The smith and the stall are in both languages: <strong>Gezgin Demirci</strong> / <strong>Travelling Smith</strong>.</p>
<hr>
<h2 id="33-a-workshop-for-the-smith-a-forge-for-gear">33 · A workshop for the smith, a forge for gear</h2>
<p>Faber no longer just stands by the roadside. On every map, he has his own wooden platform <strong>two tiles above</strong> the path: a workbench, a pile of ore next to it, and a burning forge. You can pass underneath it, so it doesn&#039;t block the path, and you get up onto it with a single jump. Looking at it from afar, you think &quot;someone works here&quot;; no sign needed.</p>
<p>Only two things sit on the workbench: <strong>a tempered sword and a copper ingot</strong>, both slowly bobbing up and down, each to a different rhythm. Faber isn&#039;t rooted to the spot either — when no one&#039;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.</p>
<p>Until you talk to him, he has an <strong>exclamation mark</strong> over his head. Once you&#039;ve talked to him, the exclamation mark goes away, replaced by a speech bubble that appears when you get close.</p>
<p>The packs don&#039;t include a blacksmith character. We made the <code>assets/npcs/smith</code> folder by recoloring the red-bearded villager&#039;s blue pants to a leather color — a single palette swap, and every animation works as is.</p>
<h3 id="the-stall-became-two-pages">The stall became two pages</h3>
<p>On the <strong>Workshop</strong> page, three rows remain: whetstone, heart vessel, nimble boots. We cut the &quot;Shield Plating&quot; row — brief invulnerability after a block, something that was hard to explain on screen and hard to notice while playing.</p>
<p>The <strong>Whetstone</strong> on the <strong>Workshop</strong> 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&#039;ve sharpened it isn&#039;t kept in a separate counter; it&#039;s stored in the sword&#039;s material — the copper sword from the chest also counts as the first sharpening.</p>
<p>The <strong>Forge</strong> page only deals with armor: helmet, chest armor, and leg armor, each one to the next material up — <strong>wood → copper → iron → gold</strong>. The sword was taken out of here (the whetstone upgrades it), and so were the shield, gloves, and boots: seven cards didn&#039;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 (&quot;1/3&quot;) moved to the price line, so a long name no longer pushes the button down.</p>
<ul><li><strong>Copper:</strong> 2 ingots + 25 gems</li><li><strong>Iron:</strong> 3 ingots + 50 gems</li><li><strong>Gold:</strong> 5 ingots + 100 gems</li></ul>
<p>Here&#039;s the important part: an upgrade requires <strong>both ingots and gems</strong>. You might have six copper ingots in your pouch, but if you don&#039;t have enough gems, the forge won&#039;t light. Each half of the price turns red separately when you don&#039;t have enough of it, and the tab bar shows the ingots you&#039;re carrying.</p>
<p>The pages are <strong>pictures</strong>, not text: each card shows the piece&#039;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 <strong>+</strong> button. The only thing to read is the piece&#039;s name.</p>
<p>Upgrades are tied directly to the game&#039;s numbers: the sword&#039;s material determines damage, and the armor&#039;s material determines health. A copper sword hits for 2 instead of 1, and copper chest armor adds a heart.</p>
<h3 id="where-do-ingots-come-from">Where do ingots come from?</h3>
<p>We spread <strong>10 copper and 9 iron</strong> ingots across Chapter 1; there&#039;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&#039;t: that&#039;s the real brake. Gold is waiting for Chapter 2&#039;s ore.</p>
<p>Most of the ingots are in <strong>hidden chests</strong> that you find by straying from the path. The rest are carried by armored <strong>gray goblins</strong>, 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&#039;t. Enemies spawned in arena waves have no such tile, so they don&#039;t drop anything.</p>
<hr>
<h2 id="34-the-main-menu-is-now-the-burning-village-itself">34 · The main menu is now the burning village itself</h2>
<p>The scenery behind the menu used to be a daytime forest; it had nothing to do with the game&#039;s opening scene. Now it&#039;s <strong>the Burning Village at night</strong>: forest_01&#039;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&#039;s houses — with its door, a torn banner, and fire burning on its roof.</p>
<p>Here&#039;s the important part: the house isn&#039;t a hand-drawn rectangle. The scene was hooked up to the <strong>real tile system</strong> 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&#039;s edges, the rock texture, and the corners are chosen by the game&#039;s own autotiler, not by us. Along the way, the back wall&#039;s inner corners are now rounded too, just like the ground&#039;s corners: the same notch tile, flipped upside down at the bottom corners.</p>
<p>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&#039;s enlargement lives on a separate node.</p>
<figure class="post-figure"><img src="/uploads/2026/09/title-yanan-koy-ce507281.webp" alt="Main menu: Burning Village" loading="lazy" decoding="async"><figcaption>Main menu: Burning Village</figcaption></figure>
<hr>
<h2 id="behind-the-scenes-every-change-gets-measured">Behind the scenes: every change gets measured</h2>
<p>Every number in this post is a measurement, not a guess. For the combat changes, the sword is swung in the game&#039;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.</p>
<p>There&#039;s a reason for this: a combat setting or a rock rule doesn&#039;t just affect the spot you&#039;re looking at; it affects every map at once. Before saying &quot;it got better,&quot; you need to know what changed and by how much.</p>
<h2 id="whats-next">What&#039;s next?</h2>
<ul><li>The Thorn Forest&#039;s remaining three maps: Root Cave, Goblin Camp, and the Slime King&#039;s Swamp.</li><li>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.</li><li>Sound. Right now the game has no sound at all; without hit and impact sounds, no amount of tuning makes combat feel quite right.</li></ul>
<hr>
<h2 id="credits">Credits</h2>
<ul><li>Character, enemy, tile, and item art: Eduardo Scarpato (im-dagon), Dagon&#039;s Fantasy packs: <a href="https://eduardscarpato.itch.io/" target="_blank" rel="noopener noreferrer">eduardscarpato.itch.io</a></li><li>UI and title lettering: Franuka, RPG UI Pack: <a href="https://franuka.itch.io/rpg-ui-pack" target="_blank" rel="noopener noreferrer">franuka.itch.io/rpg-ui-pack</a></li><li>Text font: Silver, Poppy Works (CC BY 4.0): <a href="https://poppyworks.itch.io/silver" target="_blank" rel="noopener noreferrer">poppyworks.itch.io/silver</a></li></ul>]]></content:encoded>
  </item>
  <item>
    <title>Thornveil Devlog #1: First Steps into the Thorn Forest</title>
    <link>https://syoogames.com/en/devlog/thornveil-devlog-1-first-steps-into-the-thorn-forest</link>
    <guid isPermaLink="true">https://syoogames.com/en/devlog/thornveil-devlog-1-first-steps-into-the-thorn-forest</guid>
    <pubDate>Wed, 16 Sep 2026 09:30:00 +0300</pubDate>
    <description>This first devlog covers the title screen, the new chapter and map selection, the first two maps of the first chapter, and the design decisions behind them.</description>
    <enclosure url="https://syoogames.com/uploads/2026/09/01-baslik-ekrani-eed3f977-1152.webp" type="image/webp"/>
    <content:encoded><![CDATA[<p>Thornveil is a side-view, story-driven action platformer. It also has light RPG-style gear progression. It is being developed in Godot 4.7 for landscape mobile, and the first target platform is Android. The Kingdom of Aldmere is covered by a purple mist that fell when the court mage Morvena&#039;s ritual went wrong: the Thornveil. Arin, a young knight and the only survivor of the Royal Guard, sets out with wooden gear.</p>
<p>This first devlog covers the title screen, the new chapter and map selection, the first two maps of the first chapter, and the design decisions behind them.</p>
<p>All images were captured in-game at 1920x1080. The game is drawn to a 384x216-pixel canvas and scaled up to the screen in integer multiples. In these images, each pixel appears as a 5x5 block.</p>
<hr>
<h2 id="01-title-screen">01 · Title screen</h2>
<figure class="post-figure"><img src="/uploads/2026/09/01-baslik-ekrani-eed3f977-1152.webp" alt="Thornveil title screen: gold-lettered logo, the knight by the campfire, and the menu" loading="lazy" decoding="async"><figcaption>A knight waiting by the campfire, and the Thornveil above.</figcaption></figure>
<p>On the title screen, the forest in the background scrolls slowly. Arin waits by the campfire while purple thorn mist rises from the ground. The THORNVEIL logo was created from the UI pack&#039;s gold letters, with a purple shadow. The menu has only three options: Continue (&quot;Devam Et&quot;), Settings (&quot;Ayarlar&quot;), and Quit (&quot;Çıkış&quot;). If there is no save, the first button reads &quot;Start&quot; (&quot;Başla&quot;).</p>
<h2 id="02-chapter-selection">02 · Chapter selection</h2>
<figure class="post-figure"><img src="/uploads/2026/09/02-bolum-secimi-f939d9ee-1152.webp" alt="Chapter selection screen: six numbered biome buttons, the first unlocked, the rest locked" loading="lazy" decoding="async"><figcaption>Six chapters, six biomes. For now, only the Thorn Forest is unlocked.</figcaption></figure>
<p>Pressing Start doesn&#039;t take you straight into the game; the map selection screen opens first. In the first window, the biomes are shown only by their numbers. The line below shows the selected chapter&#039;s name and how many of its maps are finished. The game will have six chapters: Thorn Forest, Poison Jungle, Scorching Desert, Frozen Pass, Silent Graveyard, and Masmorra Dungeon. A chapter unlocks when the previous chapter&#039;s boss is defeated.</p>
<h2 id="03-map-selection">03 · Map selection</h2>
<figure class="post-figure"><img src="/uploads/2026/09/03-harita-secimi-25c11d25-1152.webp" alt="The Thorn Forest&#039;s eight maps: the first completed, the second unlocked, the rest locked" loading="lazy" decoding="async"><figcaption>Eight maps per chapter. Finished maps get a checkmark, locked maps get a lock.</figcaption></figure>
<p>The second window lists the eight maps of the selected biome. Finished maps have a checkmark, and maps that aren&#039;t unlocked yet have a lock badge. Highlighting a map shows its best time, gems collected, and number of deaths. Each map is being designed to take about 8–10 minutes, and the biome&#039;s boss appears only at the end of the eighth map. The screen can be used with touch, mouse, keyboard, and gamepad.</p>
<h2 id="04-settings">04 · Settings</h2>
<figure class="post-figure"><img src="/uploads/2026/09/04-ayarlar-63996e80-1152.webp" alt="Settings panel: music and sound effect volume sliders, fullscreen, and the Reset button" loading="lazy" decoding="async"><figcaption>Volume, fullscreen, and resetting progress.</figcaption></figure>
<p>The Settings panel has separate sliders for music and sound effects volume. The fullscreen option only appears on desktop, because on phones the game already opens in fullscreen. The newly added &quot;Reset&quot; (&quot;Sıfırla&quot;) button doesn&#039;t delete the save right away; it first asks &quot;Are you sure?&quot; (&quot;Emin misin?&quot;). The entire UI was drawn with Franuka&#039;s RPG UI pack. The pack&#039;s own fonts didn&#039;t include Turkish letters such as ğ, ş, and İ. These letters were created using the pack&#039;s glyphs as a base and added to the game&#039;s bitmap fonts.</p>
<hr>
<h2 id="05-map-1-1-burning-village">05 · Map 1-1: Burning Village</h2>
<figure class="post-figure"><img src="/uploads/2026/09/05-yanan-koy-4cd4c416-1152.webp" alt="Arin running down a street in the burning village, a house with its roof on fire, and sparks" loading="lazy" decoding="async"><figcaption>It all begins in the burning border village, on the night the Veil fell.</figcaption></figure>
<p>The first map is the border village where Arin wakes up among the ruins. Roofs are on fire, sparks drift through the air, and the first thorny slimes roam the streets. This map is also the game&#039;s tutorial section. The sword combo, air attack, dash, double jump, wall jump, and blocking with the shield are all tried out here for the first time. The hero is a modular character, dressed layer by layer. The helmet, chest armor, pants, gloves, shield, and sword are each drawn separately, so every piece of gear you find also shows up on the character.</p>
<h2 id="06-first-conversation-with-vesta">06 · First conversation with Vesta</h2>
<figure class="post-figure"><img src="/uploads/2026/09/06-deren-ile-konusma-c3e02951-1152.webp" alt="Dialogue box: the villager Vesta tells Arin about the night the Veil fell" loading="lazy" decoding="async"><figcaption>&quot;Guardsman! You&#039;re alive!&quot;</figcaption></figure>
<p>The story moves forward through short dialogues. Lines are typed out with a typewriter effect, the game pauses while dialogue is running, and the touch buttons are hidden. To avoid interrupting play on mobile, each line is at most 90 characters. There is no separate mentor character: guidance comes from Arin&#039;s inner voice and short &quot;Hint&quot; (&quot;İpucu&quot;) lines. The villager Vesta is the first character to show Arin the way to the forest.</p>
<h2 id="07-mill-creek">07 · Mill Creek</h2>
<figure class="post-figure"><img src="/uploads/2026/09/07-degirmen-deresi-e954d5bd-1152.webp" alt="Arin jumping from the rope bridge over the mill creek, and a slime above the water" loading="lazy" decoding="async"><figcaption>A rope bridge, a creek below, and a secret at the end of the bridge.</figcaption></figure>
<p>Mill Creek is where you first run into rope bridges. These are one-way platforms: you can pass through them from below and jump up onto them. If you drop into the creek through the gap at the east end of the bridge, you find a hidden chest in a small cave beneath the creek. Since the touch controls have no down button, getting down to hidden spots is always done by walking off and falling, and climbing back up takes a single jump. That way, no secret ever traps the player in a pit.</p>
<h2 id="08-the-granarys-cellar">08 · The Granary&#039;s cellar</h2>
<figure class="post-figure"><img src="/uploads/2026/09/08-tahil-ambari-mahzeni-2883f966-1152.webp" alt="Arin drawing a sword on a goblin in the torchlit cellar, and explosive barrels" loading="lazy" decoding="async"><figcaption>The cellar under the burning granary is full of goblins.</figcaption></figure>
<p>While the granary&#039;s flames spread across the ceiling, the cellar below is full of goblins. Explosive barrels are small traps whose fuse lights when you hit them with your sword. The blast damages nearby enemies and you as well, and it sets off other barrels too, causing chain explosions. The cellar&#039;s colors are cooler than the street above. Every map can change its color tint and mist density based on the area the camera is currently in.</p>
<h2 id="09-the-market-square-ambush">09 · The Market Square ambush</h2>
<figure class="post-figure"><img src="/uploads/2026/09/09-pazar-meydani-pususu-b023081c-1152.webp" alt="Arin attacking in the middle of a wave of slimes in the market square" loading="lazy" decoding="async"><figcaption>The gates close, the waves come.</figcaption></figure>
<p>Market Square is the first ambush arena. When you enter, the thorny vine gates on both sides close, and enemies come in three waves: first slimes, then goblins. Once the last wave is down, the gates open and the ambush counts as completed, so you don&#039;t have to redo the same fight after dying. There is a campfire right before the arena. Campfires are checkpoints: they fully restore health and save the game.</p>
<h2 id="10-the-watchtower">10 · The Watchtower</h2>
<figure class="post-figure"><img src="/uploads/2026/09/10-gozcu-kulesi-fc34af9b-1152.webp" alt="Arin jumping between wooden steps inside the watchtower" loading="lazy" decoding="async"><figcaption>The climb up the tower.</figcaption></figure>
<p>The Watchtower is the game&#039;s first vertical section. Wooden steps zigzag their way upward. A bear trap waits on the path: step on it and you can&#039;t move for a while. There is a hidden chest in the tower&#039;s attic. From the top, a rope bridge runs over the burning roofs, and at the end of the bridge there are dirt platforms that collapse when you step on them. On the main path, climbing steps were kept to at most two tiles high, so no required climb needs a double jump.</p>
<h2 id="11-arriving-at-forests-edge">11 · Arriving at Forest&#039;s Edge</h2>
<figure class="post-figure"><img src="/uploads/2026/09/11-sisli-orman-kenari-b1b5b9f0-1152.webp" alt="Arin fighting a mushroom at the edge of the forest, where the purple mist thickens" loading="lazy" decoding="async"><figcaption>The village falls behind, and the mist thickens.</figcaption></figure>
<p>At the end of the map, the village ends and the forest begins. The mist is at its thickest here. Brown mushrooms are the new enemies: when you approach, they hide under their caps and take no damage, and when you get right up close, they open up and spray spores. After spraying, they stay exposed for a short time, and that is the right moment.</p>
<h2 id="12-end-of-map-card">12 · End-of-map card</h2>
<figure class="post-figure"><img src="/uploads/2026/09/12-harita-sonu-karti-8a10f9b7-1152.webp" alt="Map Complete (&quot;Harita Tamamlandı&quot;) card: Burning Village, time 08:32, gems 41/49, deaths 3" loading="lazy" decoding="async"><figcaption>Time, gems, deaths.</figcaption></figure>
<p>At the end of every map, a short summary card appears: time, gems collected, and number of deaths. The best result is saved and shown on the map selection screen. Gems and hidden chests are optional. Collecting them all means leaving the main path, but none of them are hidden anywhere you can&#039;t come back from.</p>
<hr>
<h2 id="13-map-1-2-forests-edge">13 · Map 1-2: Forest&#039;s Edge</h2>
<figure class="post-figure"><img src="/uploads/2026/09/13-orman-esigi-ecaa1e06-1152.webp" alt="Fireflies in the night forest, blue-leaved trees, and the Chapter 1-2 Forest&#039;s Edge title" loading="lazy" decoding="async"><figcaption>Chapter 1-2: Forest&#039;s Edge.</figcaption></figure>
<p>The second map takes place at night. The village&#039;s orange flames give way to a cold blue, fireflies, and blue-leaved trees. Each map can choose its own color theme: the sky, ground texture, grass color, drifting leaves, mist, and fireflies are each set individually. When a map first opens, its name briefly appears on a card at the top of the screen.</p>
<p><em>Note: Forest&#039;s Edge is still in development; the images in this section show the map as it currently stands.</em></p>
<h2 id="14-the-rotten-bridge">14 · The Rotten Bridge</h2>
<figure class="post-figure"><img src="/uploads/2026/09/14-curuk-kopru-69796fcb-1152.webp" alt="Arin jumping across a gap in the rotten rope bridge over the dark water" loading="lazy" decoding="async"><figcaption>The Veil has darkened even the water.</figcaption></figure>
<p>The first big obstacle in Forest&#039;s Edge is a rotten bridge that crosses water darkened by the Veil. Some of the bridge&#039;s planks are missing, and some collapse when you step on them. Falling into the water costs health but doesn&#039;t end the run: the bottom of the water is walkable, and there are two-tile steps on both banks that lead back up. It&#039;s a tough section, but its penalty isn&#039;t devastating.</p>
<h2 id="15-cave-mouth">15 · Cave mouth</h2>
<figure class="post-figure"><img src="/uploads/2026/09/15-magara-agzi-e8a84006-1152.webp" alt="Arin running toward the cave mouth beneath the cliff, and a slime at the entrance" loading="lazy" decoding="async"><figcaption>The entrance to the hollow beneath the roots.</figcaption></figure>
<p>After you come down the mossy cliffs, the path leads into a hollow beneath the roots. In the first version of the hollow, the ceiling looked like a thin slab of rock hanging in midair. In this version, the cliff has its own rock face and a cave mouth. Once you step inside, the color tint darkens and only torchlight remains.</p>
<h2 id="16-bat-hollow">16 · Bat Hollow</h2>
<figure class="post-figure"><img src="/uploads/2026/09/16-yarasa-oyugu-bc5c9827-1152.webp" alt="Arin looking at a chest on a root ledge in the dark hollow, and bats on the ceiling" loading="lazy" decoding="async"><figcaption>Root bats sleeping on the ceiling.</figcaption></figure>
<p>Root bats sleep upside down on the ceiling. When you pass beneath them, they wake up and start hovering a little above the player, diving when they get the chance. When the player moves away, they return to their roosts and go back to sleep. A chest is hidden on the hollow&#039;s root ledges. The steps up to the ledge are spaced two tiles apart.</p>
<h2 id="17-root-pit">17 · Root pit</h2>
<figure class="post-figure"><img src="/uploads/2026/09/17-kok-cukuru-3f286310-1152.webp" alt="Arin jumping over the pit inside the hollow, and the gallery below" loading="lazy" decoding="async"><figcaption>Collapsing steps and the gallery below.</figcaption></figure>
<p>The pit in the middle of the hollow is crossed using two dirt steps that shake and collapse when you step on them. The steps reappear after a while, so the way back never closes. Players who drop down into the pit find the gallery beneath the hollow waiting for them.</p>
<h2 id="18-the-thorn-rift-raft">18 · The Thorn Rift raft</h2>
<figure class="post-figure"><img src="/uploads/2026/09/18-diken-yarigi-sali-49e85d9d-1152.webp" alt="Arin on a wooden raft moving over the thorn rift" loading="lazy" decoding="async"><figcaption>Crossing the thorny rift by raft.</figcaption></figure>
<p>The bottom of Thorn Rift is thorns from end to end. One way across is a wooden raft that travels back and forth between the two sides. The raft waits briefly at each end, and you need to catch that moment to get on. It also carries along everything standing on it.</p>
<h2 id="19-dark-forest-gate">19 · Dark Forest Gate</h2>
<figure class="post-figure"><img src="/uploads/2026/09/19-kara-orman-kapisi-b9a63baf-1152.webp" alt="Arin fighting among blue trees, a chest on a wooden ledge, a mushroom, and a bat" loading="lazy" decoding="async"><figcaption>The gate into the depths of the forest.</figcaption></figure>
<p>The map&#039;s final climb opens into the depths of the forest. The mist thickens again, bats roost on low branches, and the last hidden chest sits on a wooden ledge along the path. After this comes Mushroom Hollows.</p>
<hr>
<h2 id="behind-the-scenes-every-map-gets-tested">Behind the scenes: every map gets tested</h2>
<p>Before a map counts as finished, it goes through automated tests. These tests check map loading, enemy and object counts, the arenas, and the end-of-map flow. On top of that, there is a reachability analysis: by simulating the player&#039;s movement physics frame by frame, it verifies that every platform, every gem, and every chest on the map is actually reachable, and that the player can get back from there. The analysis also checks that the main path doesn&#039;t require a double jump or a wall jump, and that there is no pit where the player could get stuck. Because the touch controls have no down button, no required passage relies on dropping down from a platform.</p>
<h2 id="whats-next">What&#039;s next?</h2>
<ul><li>The Thorn Forest&#039;s remaining six maps: Mushroom Hollows, Watchtower Ruins, Misty Grove, Root Cave, Goblin Camp, and the Slime King&#039;s Swamp.</li><li>The first copper gear, the first Heart Crystal, and the Slime King at the end of the chapter.</li></ul>
<hr>
<h2 id="credits">Credits</h2>
<ul><li>Character, enemy, tile, and item art: Eduardo Scarpato (im-dagon), Dagon&#039;s Fantasy packs: <a href="https://eduardscarpato.itch.io/" target="_blank" rel="noopener noreferrer">eduardscarpato.itch.io</a></li><li>UI and title lettering: Franuka, RPG UI Pack: <a href="https://franuka.itch.io/rpg-ui-pack" target="_blank" rel="noopener noreferrer">franuka.itch.io/rpg-ui-pack</a></li><li>Text font: Silver, Poppy Works (CC BY 4.0): <a href="https://poppyworks.itch.io/silver" target="_blank" rel="noopener noreferrer">poppyworks.itch.io/silver</a></li></ul>]]></content:encoded>
  </item>
  <item>
    <title>What&#039;s next?</title>
    <link>https://syoogames.com/en/devlog/whats-next</link>
    <guid isPermaLink="true">https://syoogames.com/en/devlog/whats-next</guid>
    <pubDate>Wed, 16 Sep 2026 09:09:00 +0300</pubDate>
    <description>The River Valley / Waterfalls biome, sound and music, daily maps and code-based online lobbies.</description>
    <content:encoded><![CDATA[<p>The next biome is River Valley / Waterfalls, and its asset packs are ready (Kenney Survival Kit and Mini Forest Kit). After that come Forest / Village, Mine / Railway, Castle Walls and Snowy Summit.</p>
<p>Also on the list: sound and music, maps that change every day, online lobbies friends can join with a code, and then a mobile version.</p>]]></content:encoded>
  </item>
  <item>
    <title>From grey blocks to the real look</title>
    <link>https://syoogames.com/en/devlog/from-grey-blocks-to-the-real-look</link>
    <guid isPermaLink="true">https://syoogames.com/en/devlog/from-grey-blocks-to-the-real-look</guid>
    <pubDate>Wed, 16 Sep 2026 09:08:00 +0300</pubDate>
    <description>Stone, wooden and dirt roads; sand, grass and rock; a sea that changes colour with depth.</description>
    <enclosure url="https://syoogames.com/uploads/2026/09/liman-once-c1665370-1024.webp" type="image/webp"/>
    <content:encoded><![CDATA[<p>Once the obstacles worked, I moved on to how the shore looks. The goal was to replace the grid surfaces with a world that actually looks like sand, stone, wood and sea.</p>
<figure class="post-figure"><img src="/uploads/2026/09/liman-once-c1665370-1024.webp" alt="Before" loading="lazy" decoding="async"><figcaption>Before</figcaption></figure>
<p>The obstacles and decor were in place, but the ground and road were still the test grid, and the sea was a flat, single-coloured surface.</p>
<figure class="post-figure"><img src="/uploads/2026/09/liman-kus-bakisi-42cb4403-1024.webp" alt="After" loading="lazy" decoding="async"><figcaption>After</figcaption></figure>
<p>I wrote my own shaders for the road surfaces: stone paving on the quays, wooden planks on the piers and a dirt road for the climb. The ground shifts between wet sand, sand, grass and rock depending on height and slope. The sea changes colour with depth and foams along the shore.</p>
<figure class="post-figure"><img src="/uploads/2026/09/oyulmus-yol-bc3e7499-1024.webp" alt="A road carved into the mountain" loading="lazy" decoding="async"><figcaption>A road carved into the mountain</figcaption></figure>
<p>The climbing road is carved into the mountain: a solid rock wall on one side and a cliff dropping to the sea on the other. The sea side is the only way to fall, so the obstacles always push you that way.</p>]]></content:encoded>
  </item>
  <item>
    <title>Biome 1: Shore / Harbour and its 7 obstacles</title>
    <link>https://syoogames.com/en/devlog/biome-1-shore-harbour-and-its-7-obstacles</link>
    <guid isPermaLink="true">https://syoogames.com/en/devlog/biome-1-shore-harbour-and-its-7-obstacles</guid>
    <pubDate>Wed, 16 Sep 2026 09:07:00 +0300</pubDate>
    <description>Waves, sinking pontoons, containers, a drawbridge, barrels, pirate cannons and trapdoor planks.</description>
    <enclosure url="https://syoogames.com/uploads/2026/09/sahil-genel-a034d417-1024.webp" type="image/webp"/>
    <content:encoded><![CDATA[<p>The first biome is a harbour town. The road starts along quays and piers with water on both sides, then turns into a road carved into the mountain and starts to climb.</p>
<p>This section has seven obstacles. They all run on timers, so in online games everyone sees the same wave and the same cannonball. I test each obstacle with a bot that starts at different moments: some runs should make it through and some should get stuck.</p>
<figure class="post-figure"><img src="/uploads/2026/09/sahil-genel-a034d417-1024.webp" alt="From the harbour to the climb" loading="lazy" decoding="async"><figcaption>From the harbour to the climb</figcaption></figure>
<p>The harbour and piers on the left, the road carved into the mountainside on the right. The decor uses Kenney&#039;s Pirate Kit and Watercraft Kit: a lighthouse, a fort, a shipwreck, a cargo ship and plenty of boats.</p>
<figure class="post-figure"><img src="/uploads/2026/09/dalga-yolu-fbc6c6b5-1024.webp" alt="1. Wave Run" loading="lazy" decoding="async"><figcaption>1. Wave Run</figcaption></figure>
<p>Waves wash over the pier road. They first shove the car towards land, then drag it towards the sea as they pull back. Either get across before the wave arrives or wait in the right spot.</p>
<figure class="post-figure"><img src="/uploads/2026/09/batan-dubalar-107476b5-1024.webp" alt="2. Sinking Pontoons" loading="lazy" decoding="async"><figcaption>2. Sinking Pontoons</figcaption></figure>
<p>Eight floating pontoons sink one after another. Bubbles rise just before each one goes down about three metres and comes back up. Linger too long on one and you end up in the water.</p>
<figure class="post-figure"><img src="/uploads/2026/09/konteyner-limani-4fd9762a-1024.webp" alt="3. Container Yard" loading="lazy" decoding="async"><figcaption>3. Container Yard</figcaption></figure>
<p>Containers slide across the road on rails. You have to watch for the right moment to slip between them.</p>
<figure class="post-figure"><img src="/uploads/2026/09/vinc-97a9cc9a-1024.webp" alt="3. The harbour crane" loading="lazy" decoding="async"><figcaption>3. The harbour crane</figcaption></figure>
<p>At the end of the container yard, a huge crane swings its container over the road like a pendulum.</p>
<figure class="post-figure"><img src="/uploads/2026/09/acilan-kopru-3bdc61a0-1024.webp" alt="4. Drawbridge" loading="lazy" decoding="async"><figcaption>4. Drawbridge</figcaption></figure>
<p>The two halves of the bridge rise into the air after the warning lamps blink. Wait it out, or race across the moment it comes down.</p>
<figure class="post-figure"><img src="/uploads/2026/09/fici-yokusu-f150eaae-1024.webp" alt="5. Barrel Slope" loading="lazy" decoding="async"><figcaption>5. Barrel Slope</figcaption></figure>
<p>At the start of the climb, barrels roll down the slope. Some come straight down, others zigzag. One side of the road is a rock wall, so a barrel that hits you pushes you over the cliff towards the sea.</p>
<figure class="post-figure"><img src="/uploads/2026/09/top-atesi-c05a5f61-1024.webp" alt="6. Cannon Barrage" loading="lazy" decoding="async"><figcaption>6. Cannon Barrage</figcaption></figure>
<p>A pirate ship offshore fires cannonballs at the road. A red ring on the road shows where each one will land. Stay inside the ring and the blast throws your car into the air and out towards the sea.</p>
<figure class="post-figure"><img src="/uploads/2026/09/kapakli-kalas-yolu-3210b0fb-1024.webp" alt="7. Trapdoor Walk" loading="lazy" decoding="async"><figcaption>7. Trapdoor Walk</figcaption></figure>
<p>A wooden walkway fixed to the edge of the cliff. The trapdoors open on the sea side, on the mountain side, or on both sides at once. You have to pick your lane to the rhythm of the doors.</p>]]></content:encoded>
  </item>
  <item>
    <title>The real map: an island mountain</title>
    <link>https://syoogames.com/en/devlog/the-real-map-an-island-mountain</link>
    <guid isPermaLink="true">https://syoogames.com/en/devlog/the-real-map-an-island-mountain</guid>
    <pubDate>Wed, 16 Sep 2026 09:06:00 +0300</pubDate>
    <description>5.1 km of road, 700 m of climbing, six biomes: grey blocks first, then biome by biome.</description>
    <enclosure url="https://syoogames.com/uploads/2026/09/rota-taslagi-3f3808ae-1024.webp" type="image/webp"/>
    <content:encoded><![CDATA[<p>With everything I learned from the test map, I moved on to the real map: a single mountain in the middle of the sea. The road spirals around it from the beach to the summit.</p>
<figure class="post-figure"><img src="/uploads/2026/09/rota-taslagi-3f3808ae-1024.webp" alt="Route sketch" loading="lazy" decoding="async"><figcaption>Route sketch</figcaption></figure>
<p>The plan: 5.1 km of road, 700 m of climbing and a clean run of about 25 minutes for a good player. The road passes through six biomes: Shore / Harbour, River Valley / Waterfalls, Forest / Village, Mine / Railway, Castle Walls and Snowy Summit. Each biome starts with a camp.</p>
<figure class="post-figure"><img src="/uploads/2026/09/yukseklik-profili-b5c912c5-1024.webp" alt="Height profile" loading="lazy" decoding="async"><figcaption>Height profile</figcaption></figure>
<p>The road climbs steadily, broken up by sudden steep ramps. Orange ones are ramps you can still control; red ones are over 45°, where you fly off unless you hit them straight. Near the summit they reach 70°.</p>
<figure class="post-figure"><img src="/uploads/2026/09/ada-once-66b40a19-1024.webp" alt="The grey-box version" loading="lazy" decoding="async"><figcaption>The grey-box version</figcaption></figure>
<p>Before any decoration, I built the whole mountain with grey grid surfaces. That let me test whether the road is drivable, and check the ramps and camp spots, without touching decor. A test bot can drive from the start to the summit without falling.</p>
<figure class="post-figure"><img src="/uploads/2026/09/ada-genel-501a20bc-1024.webp" alt="Where it stands today" loading="lazy" decoding="async"><figcaption>Where it stands today</figcaption></figure>
<p>I&#039;m finishing the biomes one at a time. The first one, Shore / Harbour, is done: it&#039;s the colourful strip along the front of the island. The rest of the mountain is still grey grid, waiting its turn.</p>]]></content:encoded>
  </item>
  <item>
    <title>Measuring what the car can do</title>
    <link>https://syoogames.com/en/devlog/measuring-what-the-car-can-do</link>
    <guid isPermaLink="true">https://syoogames.com/en/devlog/measuring-what-the-car-can-do</guid>
    <pubDate>Wed, 16 Sep 2026 09:05:00 +0300</pubDate>
    <description>Before drawing the map, I measured the car&#039;s speed, climbing and jumping limits.</description>
    <enclosure url="https://syoogames.com/uploads/2026/09/oyun-kamerasi-bf6826da-1024.webp" type="image/webp"/>
    <content:encoded><![CDATA[<p>Before drawing the real map I measured what the car can actually do. Ramps, gaps and bends are all designed around these numbers.</p>
<figure class="post-figure"><img src="/uploads/2026/09/oyun-kamerasi-bf6826da-1024.webp" alt="The game camera" loading="lazy" decoding="async"><figcaption>The game camera</figcaption></figure>
<p>Top speed is 37 km/h. The car can climb any ramp up to 75°, but above 45° the wheels lose their grip on the ground and the steering and throttle stay stuck where they were. Stop on a slope and you roll back, and a ramp jump carries you 3.4 m at most. That gives the map two kinds of ramps: from 25° to 44° you stay in control, and from 45° up you fly off unless you hit them straight. The timer at the top starts with your first key press and keeps running even when you fall.</p>]]></content:encoded>
  </item>
  <item>
    <title>With friends: split screen and online</title>
    <link>https://syoogames.com/en/devlog/with-friends-split-screen-and-online</link>
    <guid isPermaLink="true">https://syoogames.com/en/devlog/with-friends-split-screen-and-online</guid>
    <pubDate>Wed, 16 Sep 2026 09:04:00 +0300</pubDate>
    <description>Two players on one screen, or up to four online with no input lag.</description>
    <enclosure url="https://syoogames.com/uploads/2026/09/ayni-ekran-da4314b1-1024.webp" type="image/webp"/>
    <content:encoded><![CDATA[<p>Pinebound is at its best with friends: one of you falls, the other drives past laughing. I added two ways to play together.</p>
<figure class="post-figure"><img src="/uploads/2026/09/ayni-ekran-da4314b1-1024.webp" alt="Two players, one screen" loading="lazy" decoding="async"><figcaption>Two players, one screen</figcaption></figure>
<p>The screen splits in two: one player drives with WASD, the other with the arrow keys or a gamepad. The cars can bump into each other, and whichever reaches a camp first counts it for the team.</p>
<p>Online / LAN supports up to 4 players. One player hosts and the others join. Everyone drives their own car on their own machine, so there is no input lag. Obstacles move on a shared clock, so everyone sees the same moment.</p>
<p>When one player reaches a camp, it opens for the whole team, but everyone has to reach the summit on their own; that is the only way to get your time and your reward car. Later on I plan to let friends in different cities, even on their phones, join the same game with a code.</p>]]></content:encoded>
  </item>
  <item>
    <title>Menus, the garage and secret reward cars</title>
    <link>https://syoogames.com/en/devlog/menus-the-garage-and-secret-reward-cars</link>
    <guid isPermaLink="true">https://syoogames.com/en/devlog/menus-the-garage-and-secret-reward-cars</guid>
    <pubDate>Wed, 16 Sep 2026 09:03:00 +0300</pubDate>
    <description>29 cars, 3 unlocked at the start; the rest come out of gift boxes as you reach the summit.</description>
    <enclosure url="https://syoogames.com/uploads/2026/09/garaj-331f98d3-1024.webp" type="image/webp"/>
    <content:encoded><![CDATA[<p>To turn the project from a test scene into a game, I added menus, settings and a car collection. The interface is available in Turkish and English.</p>
<figure class="post-figure"><img src="/uploads/2026/09/garaj-331f98d3-1024.webp" alt="The garage" loading="lazy" decoding="async"><figcaption>The garage</figcaption></figure>
<p>Before a run you pick your car in the garage. There are 29 cars in total: sedans, pickups, a police car, a fire truck, tractors, race cars and more. Only 3 are unlocked at the start.</p>
<figure class="post-figure"><img src="/uploads/2026/09/garaj-kilitli-ea1713bd-1024.webp" alt="Locked cars" loading="lazy" decoding="async"><figcaption>Locked cars</figcaption></figure>
<p>Locked cars show up as a black silhouette with &quot;???&quot;. When each car unlocks is a secret; there is no level bar for the player to watch.</p>
<figure class="post-figure"><img src="/uploads/2026/09/yeni-arac-6c6b9424-1024.webp" alt="New car!" loading="lazy" decoding="async"><figcaption>New car!</figcaption></figure>
<p>Every time you reach the summit a gift box drops in, shakes and bursts into confetti, revealing a random new car. Cars are purely cosmetic: they all drive the same, so nobody gets an advantage.</p>]]></content:encoded>
  </item>
  <item>
    <title>The rocky pass and the snowy summit</title>
    <link>https://syoogames.com/en/devlog/the-rocky-pass-and-the-snowy-summit</link>
    <guid isPermaLink="true">https://syoogames.com/en/devlog/the-rocky-pass-and-the-snowy-summit</guid>
    <pubDate>Wed, 16 Sep 2026 09:02:00 +0300</pubDate>
    <description>The second half of the test map: rock islands over the void, then snow.</description>
    <enclosure url="https://syoogames.com/uploads/2026/09/magara-yolu-619e3af9-1024.webp" type="image/webp"/>
    <content:encoded><![CDATA[<p>The test map doesn&#039;t end with the forest. The road climbs into a rocky pass, then up to the snowy highlands and the summit plaza.</p>
<figure class="post-figure"><img src="/uploads/2026/09/magara-yolu-619e3af9-1024.webp" alt="The rocky pass" loading="lazy" decoding="async"><figcaption>The rocky pass</figcaption></figure>
<p>After the forest the road wraps around a huge rock and hops across rock islands floating over the void. One wrong turn here and you go straight down.</p>
<figure class="post-figure"><img src="/uploads/2026/09/kar-zirve-kapisi-6ee13e45-1024.webp" alt="The summit gate" loading="lazy" decoding="async"><figcaption>The summit gate</figcaption></figure>
<p>The snowy section has sleds crossing the road, collapsing floor panels, shuttling platforms, a seesaw and rolling snowballs. Whoever gets past all of them enters the summit plaza, about 191 m up, through this gate.</p>]]></content:encoded>
  </item>
  <item>
    <title>Test map: the zigzag forest road</title>
    <link>https://syoogames.com/en/devlog/test-map-the-zigzag-forest-road</link>
    <guid isPermaLink="true">https://syoogames.com/en/devlog/test-map-the-zigzag-forest-road</guid>
    <pubDate>Wed, 16 Sep 2026 09:01:00 +0300</pubDate>
    <description>From a flat track on block towers to a forest road winding along a ridge.</description>
    <enclosure url="https://syoogames.com/uploads/2026/09/orman-once-58154191-1024.webp" type="image/webp"/>
    <content:encoded><![CDATA[<p>To try out the basics I first built a test map. The first version was a track laid out in flat rows on top of tall block towers. It played fine, but it didn&#039;t feel like a mountain, so I rebuilt the road as a zigzag winding along a ridge.</p>
<figure class="post-figure"><img src="/uploads/2026/09/orman-once-58154191-1024.webp" alt="Before: block towers" loading="lazy" decoding="async"><figcaption>Before: block towers</figcaption></figure>
<p>The first version: five flat rows stacked on top of each other, everything built from square blocks.</p>
<figure class="post-figure"><img src="/uploads/2026/09/orman-genel-be11f9c9-1024.webp" alt="After: a zigzag along the ridge" loading="lazy" decoding="async"><figcaption>After: a zigzag along the ridge</figcaption></figure>
<p>The new road is 751 m long and climbs about 112 m. Its legs run diagonally, and the steepest part is a 21% grade. The obstacles, narrow passages and camp order stayed the same; only the shape of the road and the surroundings changed.</p>
<figure class="post-figure"><img src="/uploads/2026/09/orman-kamp-a0a264ac-1024.webp" alt="Forest camp" loading="lazy" decoding="async"><figcaption>Forest camp</figcaption></figure>
<p>The start camp has tents, a campfire and log piles. The forest&#039;s roughly 3,000 trees, plants and rocks are drawn in batches instead of one by one, so the game stays smooth.</p>
<figure class="post-figure"><img src="/uploads/2026/09/orman-koy-b443f5e1-1024.webp" alt="Village terrace" loading="lazy" decoding="async"><figcaption>Village terrace</figcaption></figure>
<p>Wide terraces inside the bends hold village houses, a windmill and a graveyard. These little story spots keep the calmer stretches from feeling long and empty.</p>
<figure class="post-figure"><img src="/uploads/2026/09/degirmen-carki-4a303e30-1024.webp" alt="The mill wheel obstacle" loading="lazy" decoding="async"><figcaption>The mill wheel obstacle</figcaption></figure>
<p>A giant wheel turns across the road, and you have to slip between its blades at the right moment. The other obstacles in this part are a cart crossing the road, a tilting log bridge, a collapsing bridge, graveyard gates that open and close, and rolling logs. There are deliberately no fences next to the obstacles, so a single hit can send you down.</p>]]></content:encoded>
  </item>
  <item>
    <title>What is Pinebound?</title>
    <link>https://syoogames.com/en/devlog/what-is-pinebound</link>
    <guid isPermaLink="true">https://syoogames.com/en/devlog/what-is-pinebound</guid>
    <pubDate>Wed, 16 Sep 2026 09:00:00 +0300</pubDate>
    <description>A car climbing game you play with friends, and one that makes you rage when you fall.</description>
    <enclosure url="https://syoogames.com/uploads/2026/09/ana-menu-fdf5086c-1024.webp" type="image/webp"/>
    <content:encoded><![CDATA[<p>Pinebound is a hard, patience-testing game where 2–4 friends try to drive small cars to the top of a mountain. The road is full of steep ramps, moving obstacles and cliffs. Fall off and you go back to the last camp, but the clock keeps running.</p>
<p>I&#039;m building it in Godot 4, with most of the art coming from Kenney&#039;s free low-poly packs. PC comes first, mobile after that.</p>
<figure class="post-figure"><img src="/uploads/2026/09/ana-menu-fdf5086c-1024.webp" alt="Main menu" loading="lazy" decoding="async"><figcaption>Main menu</figcaption></figure>
<p>The main menu sits on top of the real game world: the cars you picked wait at the start camp while the camera slowly circles them. From here you can play solo, two players on one screen, or online.</p>
<figure class="post-figure"><img src="/uploads/2026/09/baslangic-kampi-d60f8c9d-1024.webp" alt="Start camp" loading="lazy" decoding="async"><figcaption>Start camp</figcaption></figure>
<p>Every climb starts at a camp. The goal is simple: reach the summit. The hard part is getting there without falling off.</p>]]></content:encoded>
  </item>
</channel>
</rss>