<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Zlormack</title>
    <description>The latest articles on DEV Community by Zlormack (@zlormack).</description>
    <link>https://dev.to/zlormack</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3964454%2F113fc9f7-5a75-4679-baeb-1a1887816681.jpg</url>
      <title>DEV Community: Zlormack</title>
      <link>https://dev.to/zlormack</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zlormack"/>
    <language>en</language>
    <item>
      <title>ZlormaEngine: Building an Adaptive Game Engine with AI Directors</title>
      <dc:creator>Zlormack</dc:creator>
      <pubDate>Wed, 12 Aug 2026 15:30:31 +0000</pubDate>
      <link>https://dev.to/zlormack/zlormaengine-building-an-adaptive-game-engine-with-ai-directors-5f8a</link>
      <guid>https://dev.to/zlormack/zlormaengine-building-an-adaptive-game-engine-with-ai-directors-5f8a</guid>
      <description>&lt;p&gt;What if a game engine didn't simply execute a game?&lt;/p&gt;

&lt;p&gt;What if it could &lt;strong&gt;observe how you play, analyze your run, and coordinate multiple systems to decide what should happen next?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the idea behind &lt;strong&gt;ZlormaEngine&lt;/strong&gt;, an experimental game engine I'm building for &lt;strong&gt;Linux and Windows&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It started with something much smaller: a prototype called &lt;strong&gt;GameFall Arena&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A player. An arena. Geometric enemies. Projectiles. Waves.&lt;/p&gt;

&lt;p&gt;Nothing revolutionary.&lt;/p&gt;

&lt;p&gt;But while developing the prototype, I started asking a different question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Instead of scripting every encounter in advance, could the engine dynamically direct the experience around the player?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question changed the entire project.&lt;/p&gt;

&lt;p&gt;It led to the central architecture of ZlormaEngine:&lt;/p&gt;

&lt;h2&gt;
  
  
  The Director System
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Director&lt;/strong&gt; is a specialized subsystem responsible for observing, analyzing or controlling one aspect of a run.&lt;/p&gt;

&lt;p&gt;The basic loop is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PLAYER
  ↓
OBSERVE
  ↓
ANALYZE
  ↓
DIRECTORS
  ↓
DECIDE
  ↓
GAMEPLAY
  ↓
PLAYER REACTS
  ↺
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But there's an important difference between ZlormaEngine's current direction and simply having several independent systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Directors are designed to communicate with each other.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A Level Director shouldn't generate an arena without considering enemies.&lt;/p&gt;

&lt;p&gt;An Enemy Director shouldn't choose a strategy without understanding the arena.&lt;/p&gt;

&lt;p&gt;A difficulty system shouldn't increase numbers blindly without understanding the player's performance.&lt;/p&gt;

&lt;p&gt;The goal is to create a network of Directors that collectively shape the run.&lt;/p&gt;




&lt;h2&gt;
  
  
  Level Director: Procedural Arenas with Meaning
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Level Director&lt;/strong&gt; controls arena generation.&lt;/p&gt;

&lt;p&gt;Instead of thinking only about random obstacle placement, it describes each generated arena using what I call &lt;strong&gt;Arena DNA&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SPACE       0.64
COVER       0.42
LANES       0.78
PRESSURE    0.57
ASYMMETRY   0.31
STYLE       ASCENDANT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These values describe the gameplay properties of the arena.&lt;/p&gt;

&lt;p&gt;And that's where Arena DNA becomes particularly useful.&lt;/p&gt;

&lt;p&gt;It isn't only metadata.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It becomes a language that other Directors can understand.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If an arena has a high &lt;code&gt;LANES&lt;/code&gt; value, the AI Enemy Director knows that corridor-based strategies may work.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;COVER&lt;/code&gt; is high, another Director can favor enemies or behaviors capable of forcing the player out of defensive positions.&lt;/p&gt;

&lt;p&gt;Procedural generation therefore becomes more than:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;generate_random_level()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;generate_level()
      ↓
understand_level()
      ↓
share_level_properties()
      ↓
adapt_other_systems()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  AI Enemy Director
&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;AI Enemy Director&lt;/strong&gt; studies how the current run is being played.&lt;/p&gt;

&lt;p&gt;It can use information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;accuracy;&lt;/li&gt;
&lt;li&gt;movement;&lt;/li&gt;
&lt;li&gt;damage received;&lt;/li&gt;
&lt;li&gt;firing frequency;&lt;/li&gt;
&lt;li&gt;combat distance;&lt;/li&gt;
&lt;li&gt;combos;&lt;/li&gt;
&lt;li&gt;positioning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Player is good → enemies get +200% HP.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's technically adaptive difficulty, but it isn't particularly interesting.&lt;/p&gt;

&lt;p&gt;Instead, I want the engine to ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What kind of problem would challenge this player's current strategy?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The demo uses deliberately limited behaviors such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CHASE
INTERCEPT
FLANK
PRESSURE_LIGHT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the player constantly keeps their distance, enemies may gradually become better at interception.&lt;/p&gt;

&lt;p&gt;If they remain in predictable areas, another strategy may become more common.&lt;/p&gt;

&lt;p&gt;The important rule is that adaptation should remain understandable and fair.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The player should feel challenged, not cheated.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Enemy Shape Director
&lt;/h1&gt;

&lt;p&gt;GameFall Arena originally used simple geometric enemies because it was a prototype.&lt;/p&gt;

&lt;p&gt;Instead of hiding that limitation, I decided to turn it into gameplay.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Enemy Shape Director&lt;/strong&gt; gives shapes actual meaning.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;○ Circle    → Standard
□ Square    → Tank
△ Triangle  → Fast / Aggressive
◇ Diamond   → Tactical / Ranged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates immediate visual readability.&lt;/p&gt;

&lt;p&gt;A player seeing a triangle doesn't need to inspect a stat panel to understand:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;That thing is probably going to rush me.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The full version of ZlormaEngine is planned to expand this system with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hexagons
Stars
Elites
Hybrid shapes
Mutations
Different sizes
Rare procedural forms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And because Enemy Shape Director communicates with Level Director and AI Enemy Director, enemy composition can be influenced by the arena itself.&lt;/p&gt;




&lt;h1&gt;
  
  
  Directors Become More Interesting Together
&lt;/h1&gt;

&lt;p&gt;Imagine this run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PLAYER
│
├─ fights mostly at long range
├─ has high accuracy
└─ uses predictable movement
        ↓
COMBAT ANALYSIS
        ↓
AI ENEMY DIRECTOR
        ↕
LEVEL DIRECTOR
        ↕
ARENA DNA
        ↕
ENEMY SHAPE DIRECTOR
        ↓
New encounter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Level Director generates an arena containing several lanes.&lt;/p&gt;

&lt;p&gt;Arena DNA exposes that information.&lt;/p&gt;

&lt;p&gt;The AI Director knows the player prefers long-range combat.&lt;/p&gt;

&lt;p&gt;Enemy Shape Director introduces enemies suited to interception and pressure.&lt;/p&gt;

&lt;p&gt;The result isn't necessarily a harder level because enemies have larger health bars.&lt;/p&gt;

&lt;p&gt;It becomes harder because:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;the situation itself changed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That distinction is extremely important to what I want ZlormaEngine to become.&lt;/p&gt;




&lt;h1&gt;
  
  
  Gem Forge: Let the Player Adapt Too
&lt;/h1&gt;

&lt;p&gt;An adaptive engine shouldn't be the only side capable of evolving.&lt;/p&gt;

&lt;p&gt;The player needs tools to respond.&lt;/p&gt;

&lt;p&gt;That's why GameFall Arena includes &lt;strong&gt;Gem Forge&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Enemies can reward gems, which can be spent on upgrades such as damage, movement, projectiles, protection and recovery.&lt;/p&gt;

&lt;p&gt;This creates another feedback loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;COMBAT
   ↓
GEMS
   ↓
GEM FORGE
   ↓
PLAYER BUILD
   ↓
NEW PLAYSTYLE
   ↓
DIRECTORS OBSERVE
   ↓
NEW CHALLENGES
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The engine adapts to the player.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The player adapts back.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's where runs can start becoming genuinely different.&lt;/p&gt;




&lt;h1&gt;
  
  
  Turning a Bug into a Feature: Projectile Ricochets
&lt;/h1&gt;

&lt;p&gt;One of my favorite parts of development came from a bug.&lt;/p&gt;

&lt;p&gt;Projectiles could travel through walls.&lt;/p&gt;

&lt;p&gt;The obvious solution was simply to fix collision detection.&lt;/p&gt;

&lt;p&gt;But I liked another possibility:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if hitting a wall caused the projectile to ricochet instead?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The bug became a mechanic.&lt;/p&gt;

&lt;p&gt;And the mechanic eventually contributed to another Director.&lt;/p&gt;




&lt;h1&gt;
  
  
  Malus Director
&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;Malus Director&lt;/strong&gt; can introduce temporary constraints based on what's happening during the run.&lt;/p&gt;

&lt;p&gt;The demo version is intentionally limited.&lt;/p&gt;

&lt;p&gt;The full version could eventually react to things such as excessive ricochets, extremely dominant builds, repetitive strategies or specific combinations of player behavior and Arena DNA.&lt;/p&gt;

&lt;p&gt;But there's an important design principle:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Malus should create an interesting problem, not randomly punish the player.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If a Director changes the rules, the player should have a meaningful way to respond.&lt;/p&gt;




&lt;h1&gt;
  
  
  Phoenix Director: The Engine Can Help You Too
&lt;/h1&gt;

&lt;p&gt;Not every Director exists to make the game harder.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Phoenix Director&lt;/strong&gt; watches for critical moments.&lt;/p&gt;

&lt;p&gt;Under specific conditions, it can offer a last chance through recovery, temporary upgrades or another special event.&lt;/p&gt;

&lt;p&gt;Imagine surviving a brutal encounter with almost no health left.&lt;/p&gt;

&lt;p&gt;The run appears finished.&lt;/p&gt;

&lt;p&gt;Then Phoenix activates.&lt;/p&gt;

&lt;p&gt;Suddenly, the player has one final opportunity to recover.&lt;/p&gt;

&lt;p&gt;That's not just difficulty management.&lt;/p&gt;

&lt;p&gt;It's &lt;strong&gt;dynamic storytelling through gameplay systems&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Pulse Director: Difficulty Needs Rhythm
&lt;/h1&gt;

&lt;p&gt;Constantly increasing difficulty becomes exhausting.&lt;/p&gt;

&lt;p&gt;So another Director manages something less obvious:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;rhythm.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HARD
HARDER
HARDER
HARDER
IMPOSSIBLE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the run can breathe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CALM
  ↓
PRESSURE
  ↓
PEAK
  ↓
RECOVERY
  ↓
PRESSURE
  ↓
MAJOR PEAK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the role of the &lt;strong&gt;Pulse Director&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It helps transform twenty waves into an experience with pacing rather than twenty increasingly large enemy groups.&lt;/p&gt;




&lt;h1&gt;
  
  
  ZlormaStyle Director: Giving the Engine an Identity
&lt;/h1&gt;

&lt;p&gt;Early GameFall Arena builds looked exactly like what they were:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;a prototype.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Flat backgrounds, basic shapes and functional UI.&lt;/p&gt;

&lt;p&gt;The next step became creating a visual identity.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;ZlormaStyle Director&lt;/strong&gt; is designed around futuristic arenas, metallic structures, luminous circuits, energy surfaces and a cyan / violet / magenta visual language.&lt;/p&gt;

&lt;p&gt;Different arena identities can include concepts such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;REACTOR DECK
CIRCUIT VAULT
VOID GRID
NEON FOUNDRY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the interesting part is making the visual style react to gameplay.&lt;/p&gt;

&lt;p&gt;A run may transition through states such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FLOW
PULSE
FRACTURE
ASCENDANT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The arena can therefore visually communicate what the engine is doing.&lt;/p&gt;




&lt;h1&gt;
  
  
  Wave Music Director
&lt;/h1&gt;

&lt;p&gt;Sound follows the same philosophy.&lt;/p&gt;

&lt;p&gt;Instead of looping one background track for an entire run, the &lt;strong&gt;Wave Music Director&lt;/strong&gt; can change the musical atmosphere as the run evolves.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AWAKENING
MOTION
PRESSURE
PULSE
FRACTURE
HUNTER
ASCENDANT
OVERDRIVE
APEX GATE
ZLORMA FINALE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gameplay, visual effects and music can therefore work together.&lt;/p&gt;

&lt;p&gt;And this leads to another goal:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GameFall Arena should be interesting to watch, not only to play.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That matters for trailers, gameplay videos and streaming.&lt;/p&gt;




&lt;h1&gt;
  
  
  Run Scars: Giving a Run Memory
&lt;/h1&gt;

&lt;p&gt;Another experimental ZlormaEngine concept is &lt;strong&gt;Run Scars&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Important events can leave information behind.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Phoenix activated
Major damage event
Unusual combat strategy
Special arena event
Director intervention
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other Directors can potentially use those scars later.&lt;/p&gt;

&lt;p&gt;The run therefore develops something resembling a short-term memory.&lt;/p&gt;




&lt;h1&gt;
  
  
  ZLORMA SEED and the Run Signature
&lt;/h1&gt;

&lt;p&gt;Each run can also receive a &lt;strong&gt;ZLORMA SEED&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But I want the concept to eventually represent more than procedural generation.&lt;/p&gt;

&lt;p&gt;A complete run signature could combine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZLORMA SEED
+
ARENA DNA
+
PLAYER BUILD
+
COMBAT STYLE
+
DIRECTOR DECISIONS
+
RUN SCARS
+
SPECIAL EVENTS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Every run should have an identity.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  The Player's Double
&lt;/h1&gt;

&lt;p&gt;This idea eventually led to one of the strangest systems planned for ZlormaEngine.&lt;/p&gt;

&lt;p&gt;Under special conditions, the engine can generate a &lt;strong&gt;Double&lt;/strong&gt; based on the player's run.&lt;/p&gt;

&lt;p&gt;Not merely a visual clone.&lt;/p&gt;

&lt;p&gt;The enemy is intended to represent an enhanced interpretation of how the player has been playing.&lt;/p&gt;

&lt;p&gt;The challenge becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Can you defeat a stronger version of your own playstyle?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Zlorma: When the Engine Becomes the Opponent
&lt;/h1&gt;

&lt;p&gt;And then there is &lt;strong&gt;Zlorma&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Zlorma is intended as an exceptional enemy for highly skilled players.&lt;/p&gt;

&lt;p&gt;If the Directors determine that someone is consistently dominating the normal systems, Zlorma can become the ultimate challenge.&lt;/p&gt;

&lt;p&gt;Conceptually, it's the engine saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;You've learned my rules. Now fight me.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This system is primarily intended for the complete version.&lt;/p&gt;




&lt;h1&gt;
  
  
  Demo vs Full Version
&lt;/h1&gt;

&lt;p&gt;The current &lt;strong&gt;Zlorma Signature Demo&lt;/strong&gt; is designed around approximately &lt;strong&gt;20 waves&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's intentional.&lt;/p&gt;

&lt;p&gt;Ten waves proved too short to properly demonstrate adaptation and progression.&lt;/p&gt;

&lt;p&gt;But the demo still doesn't expose everything.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;Demo&lt;/th&gt;
&lt;th&gt;Full&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Level Director&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Advanced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arena DNA&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Combat Analysis&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;Advanced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Enemy Director&lt;/td&gt;
&lt;td&gt;Capped adaptation&lt;/td&gt;
&lt;td&gt;Continuous adaptation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enemy Shapes&lt;/td&gt;
&lt;td&gt;Main families&lt;/td&gt;
&lt;td&gt;Hybrids + mutations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gem Forge&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Expanded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Malus Director&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Contextual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phoenix&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;Advanced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ZlormaStyle&lt;/td&gt;
&lt;td&gt;Selected styles&lt;/td&gt;
&lt;td&gt;Full system&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wave Music&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;Dynamic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Run Scars&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Advanced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Player Double&lt;/td&gt;
&lt;td&gt;Teaser / limited&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zlorma&lt;/td&gt;
&lt;td&gt;Rare / teaser&lt;/td&gt;
&lt;td&gt;Advanced challenge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Generation&lt;/td&gt;
&lt;td&gt;~20 waves&lt;/td&gt;
&lt;td&gt;Extended / potentially endless&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The demo's purpose isn't to expose every feature.&lt;/p&gt;

&lt;p&gt;It's to demonstrate the central idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The game reacts to your run.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  What Makes ZlormaEngine Different?
&lt;/h1&gt;

&lt;p&gt;ZlormaEngine isn't defined by geometric enemies.&lt;/p&gt;

&lt;p&gt;It isn't defined by Python.&lt;/p&gt;

&lt;p&gt;And it isn't defined by procedural generation alone.&lt;/p&gt;

&lt;p&gt;The core idea is the &lt;strong&gt;Director Network&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    PLAYER
                      │
                RUN ANALYSIS
                      │
        ┌─────────────┼─────────────┐
        ▼             ▼             ▼
     COMBAT          LEVEL         PULSE
    DIRECTOR        DIRECTOR      DIRECTOR
        │             │
        │         ARENA DNA
        │             │
        ▼             ▼
    AI ENEMY ◄────► ENEMY SHAPE
        │             │
        └──────┬──────┘
               ▼
             MALUS
               │
       ┌───────┴────────┐
       ▼                ▼
 ZLORMASTYLE          MUSIC
       │                │
       └───────┬────────┘
               ▼
            GAMEPLAY
               │
               ▼
             PLAYER
               │
               └──────────► NEXT ANALYSIS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every Director has a specific responsibility.&lt;/p&gt;

&lt;p&gt;But their ability to exchange information is where things become interesting.&lt;/p&gt;




&lt;h1&gt;
  
  
  From Prototype to Adaptive Game Engine
&lt;/h1&gt;

&lt;p&gt;ZlormaEngine started with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Can I build my own game engine?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Can it generate arenas and waves?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Can it react to the player?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And now:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Can multiple Directors collaborate to dynamically direct an entire run?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the question I'm exploring today.&lt;/p&gt;

&lt;p&gt;My goal isn't to compete feature-for-feature with massive general-purpose engines.&lt;/p&gt;

&lt;p&gt;ZlormaEngine is an experiment around a more specific idea:&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;A game engine that doesn't just run the game — it directs the run.&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;GameFall Arena is the first playground for that idea.&lt;/p&gt;

&lt;p&gt;And this is only the beginning.&lt;/p&gt;




&lt;h1&gt;
  
  
  🇫🇷 ZlormaEngine : construire un moteur de jeu adaptatif avec des Directors IA
&lt;/h1&gt;

&lt;p&gt;Et si un moteur de jeu ne se contentait plus d'exécuter le jeu ?&lt;/p&gt;

&lt;p&gt;Et s'il pouvait &lt;strong&gt;observer votre manière de jouer, analyser votre run et coordonner plusieurs systèmes afin de décider de ce qui devrait arriver ensuite ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;C'est l'idée derrière &lt;strong&gt;ZlormaEngine&lt;/strong&gt;, le moteur de jeu expérimental que je développe pour &lt;strong&gt;Linux et Windows&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Tout a commencé beaucoup plus simplement avec &lt;strong&gt;GameFall Arena&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Un joueur.&lt;/p&gt;

&lt;p&gt;Une arène.&lt;/p&gt;

&lt;p&gt;Des ennemis géométriques.&lt;/p&gt;

&lt;p&gt;Des projectiles.&lt;/p&gt;

&lt;p&gt;Des vagues.&lt;/p&gt;

&lt;p&gt;Puis une question a changé la direction du projet :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Au lieu de programmer chaque rencontre à l'avance, est-ce que le moteur pourrait diriger dynamiquement l'expérience autour du joueur ?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;C'est ainsi qu'est née l'architecture des &lt;strong&gt;Directors de ZlormaEngine&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qu'est-ce qu'un Director ?
&lt;/h2&gt;

&lt;p&gt;Un Director est un système spécialisé chargé d'observer, d'analyser ou de contrôler une partie particulière de la run.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JOUEUR
  ↓
OBSERVATION
  ↓
ANALYSE
  ↓
DIRECTORS
  ↓
DÉCISION
  ↓
GAMEPLAY
  ↓
RÉACTION DU JOUEUR
  ↺
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La particularité de ZlormaEngine est que ces Directors sont destinés à &lt;strong&gt;communiquer entre eux&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Le Level Director peut comprendre l'organisation d'une arène.&lt;/p&gt;

&lt;p&gt;L'AI Enemy Director peut analyser le comportement du joueur.&lt;/p&gt;

&lt;p&gt;Enemy Shape Director peut sélectionner les familles d'adversaires.&lt;/p&gt;

&lt;p&gt;Pulse Director peut contrôler le rythme.&lt;/p&gt;

&lt;p&gt;ZlormaStyle et Wave Music Director peuvent accompagner visuellement et musicalement cette évolution.&lt;/p&gt;

&lt;p&gt;Le moteur devient progressivement un &lt;strong&gt;réseau de systèmes coopératifs&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Level Director et Arena DNA
&lt;/h1&gt;

&lt;p&gt;Le &lt;strong&gt;Level Director&lt;/strong&gt; s'occupe de la génération des arènes.&lt;/p&gt;

&lt;p&gt;Mais générer aléatoirement des obstacles ne suffisait pas.&lt;/p&gt;

&lt;p&gt;J'ai donc commencé à développer &lt;strong&gt;Arena DNA&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SPACE       0.64
COVER       0.42
LANES       0.78
PRESSURE    0.57
ASYMMETRY   0.31
STYLE       ASCENDANT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Arena DNA décrit les propriétés d'une arène.&lt;/p&gt;

&lt;p&gt;Les autres Directors peuvent ensuite les utiliser.&lt;/p&gt;

&lt;p&gt;Une valeur &lt;code&gt;LANES&lt;/code&gt; importante peut favoriser certaines stratégies ennemies.&lt;/p&gt;

&lt;p&gt;Une forte quantité de &lt;code&gt;COVER&lt;/code&gt; peut influencer le choix des adversaires.&lt;/p&gt;

&lt;p&gt;Arena DNA devient donc &lt;strong&gt;un langage commun entre les Directors&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  AI Enemy Director : analyser la manière de jouer
&lt;/h1&gt;

&lt;p&gt;L'&lt;strong&gt;AI Enemy Director&lt;/strong&gt; peut observer la précision, les déplacements, les dégâts reçus, les combos, la cadence de tir, la distance de combat et le positionnement.&lt;/p&gt;

&lt;p&gt;Mais son objectif n'est pas simplement :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bon joueur = ennemis avec beaucoup plus de vie.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Je veux plutôt qu'il se demande :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Quel problème pourrait remettre en question la stratégie actuelle de ce joueur ?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dans la démo, plusieurs comportements restent volontairement limités :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CHASE
INTERCEPT
FLANK
PRESSURE_LIGHT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La version complète pourra aller beaucoup plus loin.&lt;/p&gt;

&lt;p&gt;L'objectif reste cependant le même :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;adapter le défi sans donner l'impression que le moteur triche.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Enemy Shape Director : quand la géométrie devient du gameplay
&lt;/h1&gt;

&lt;p&gt;Les formes simples de GameFall Arena étaient initialement celles d'un prototype.&lt;/p&gt;

&lt;p&gt;Elles sont progressivement devenues une mécanique.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;○ Cercle   → Standard
□ Carré    → Tank
△ Triangle → Rapide / agressif
◇ Losange  → Tactique / distance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La silhouette permet immédiatement au joueur d'identifier le danger.&lt;/p&gt;

&lt;p&gt;À terme, hexagones, étoiles, élites, hybrides, mutations et formes procédurales rares pourront enrichir le système.&lt;/p&gt;

&lt;p&gt;Et Enemy Shape Director peut communiquer avec Level Director et AI Enemy Director.&lt;/p&gt;

&lt;p&gt;Ainsi, &lt;strong&gt;l'arène et ses ennemis peuvent être conçus ensemble autour de la run actuelle.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Gem Forge : le joueur doit pouvoir répondre
&lt;/h1&gt;

&lt;p&gt;Le moteur s'adapte.&lt;/p&gt;

&lt;p&gt;Le joueur doit pouvoir faire la même chose.&lt;/p&gt;

&lt;p&gt;Les combats permettent donc d'obtenir des gemmes utilisées dans la &lt;strong&gt;Gem Forge&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;COMBAT
 ↓
GEMMES
 ↓
GEM FORGE
 ↓
BUILD
 ↓
NOUVELLE STRATÉGIE
 ↓
ANALYSE DES DIRECTORS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chaque amélioration peut modifier la manière de jouer.&lt;/p&gt;

&lt;p&gt;Le moteur doit ensuite comprendre cette évolution.&lt;/p&gt;




&lt;h1&gt;
  
  
  Transformer un bug en mécanique
&lt;/h1&gt;

&lt;p&gt;À un moment du développement, les projectiles traversaient les murs.&lt;/p&gt;

&lt;p&gt;Il fallait évidemment corriger le problème.&lt;/p&gt;

&lt;p&gt;Mais plutôt que de simplement supprimer ce comportement, une idée est apparue :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;faire ricocher les projectiles.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cette correction est ainsi devenue une mécanique.&lt;/p&gt;

&lt;p&gt;Elle a également participé à la réflexion autour du &lt;strong&gt;Malus Director&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Malus Director
&lt;/h1&gt;

&lt;p&gt;Le Malus Director peut introduire certaines contraintes en fonction de la run.&lt;/p&gt;

&lt;p&gt;L'idée n'est pas de punir arbitrairement.&lt;/p&gt;

&lt;p&gt;Un malus doit créer &lt;strong&gt;une décision supplémentaire&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dans la version complète, ce Director pourra devenir beaucoup plus contextuel et communiquer avec Arena DNA, Combat Director et les autres systèmes.&lt;/p&gt;




&lt;h1&gt;
  
  
  Phoenix Director : une dernière chance
&lt;/h1&gt;

&lt;p&gt;Tous les Directors ne sont pas contre le joueur.&lt;/p&gt;

&lt;p&gt;Le &lt;strong&gt;Phoenix Director&lt;/strong&gt; peut détecter certaines situations critiques et offrir une dernière chance.&lt;/p&gt;

&lt;p&gt;Une run pratiquement perdue peut alors devenir un moment mémorable.&lt;/p&gt;

&lt;p&gt;ZlormaEngine commence ici à se comporter moins comme un simple générateur et davantage comme un &lt;strong&gt;metteur en scène du gameplay&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Pulse Director : créer un rythme
&lt;/h1&gt;

&lt;p&gt;Une difficulté constamment ascendante devient rapidement fatigante.&lt;/p&gt;

&lt;p&gt;Pulse Director permet plutôt :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CALME
 ↓
PRESSION
 ↓
PIC
 ↓
RÉCUPÉRATION
 ↓
PRESSION
 ↓
PIC MAJEUR
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Les 20 vagues de la démo peuvent ainsi former une progression plutôt qu'une simple succession d'ennemis toujours plus nombreux.&lt;/p&gt;




&lt;h1&gt;
  
  
  ZlormaStyle et Wave Music Director
&lt;/h1&gt;

&lt;p&gt;L'identité graphique de ZlormaEngine repose progressivement sur des environnements technologiques sombres, structures métalliques, circuits lumineux et énergies cyan, violet et magenta.&lt;/p&gt;

&lt;p&gt;ZlormaStyle peut utiliser différents états :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FLOW
PULSE
FRACTURE
ASCENDANT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le &lt;strong&gt;Wave Music Director&lt;/strong&gt; applique une philosophie similaire au son.&lt;/p&gt;

&lt;p&gt;La musique peut changer avec la progression de la run et renforcer les événements importants.&lt;/p&gt;

&lt;p&gt;Le but est que GameFall Arena soit intéressant à jouer &lt;strong&gt;et à regarder&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Run Scars et ZLORMA SEED
&lt;/h1&gt;

&lt;p&gt;Certains événements peuvent devenir des &lt;strong&gt;Run Scars&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Phoenix, événement majeur, stratégie inhabituelle ou intervention spéciale peuvent laisser une trace exploitable plus tard.&lt;/p&gt;

&lt;p&gt;Chaque partie possède également une &lt;strong&gt;ZLORMA SEED&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;À terme, une signature de run pourrait combiner :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ZLORMA SEED
+
ARENA DNA
+
BUILD
+
STYLE DE COMBAT
+
DÉCISIONS DES DIRECTORS
+
RUN SCARS
+
ÉVÉNEMENTS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chaque run pourrait ainsi posséder sa propre identité.&lt;/p&gt;




&lt;h1&gt;
  
  
  Le Double et Zlorma
&lt;/h1&gt;

&lt;p&gt;Parmi les systèmes les plus expérimentaux se trouve le &lt;strong&gt;Double du joueur&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Le moteur pourrait utiliser les informations accumulées pendant la run pour générer un adversaire inspiré du style du joueur, mais volontairement plus puissant.&lt;/p&gt;

&lt;p&gt;Le défi devient :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pouvez-vous battre une version améliorée de votre propre manière de jouer ?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Puis vient &lt;strong&gt;Zlorma&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Zlorma représente un adversaire exceptionnel destiné aux joueurs capables de dominer les systèmes classiques.&lt;/p&gt;

&lt;p&gt;Le moteur semble alors dire :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;« Tu connais mes règles. Maintenant, affronte-moi. »&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Une démo volontairement limitée
&lt;/h1&gt;

&lt;p&gt;La &lt;strong&gt;Zlorma Signature Demo&lt;/strong&gt; vise environ &lt;strong&gt;20 vagues&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;C'est suffisamment long pour commencer à percevoir les interactions entre Directors, tout en gardant certains systèmes volontairement bridés.&lt;/p&gt;

&lt;p&gt;La version complète pourra libérer l'adaptation de l'IA, davantage de formes, les mutations, des interactions plus profondes entre Directors, le Double, Zlorma et une génération beaucoup plus étendue.&lt;/p&gt;

&lt;p&gt;La démo doit avant tout faire comprendre une chose :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Votre manière de jouer influence la run.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Ce qui définit vraiment ZlormaEngine
&lt;/h1&gt;

&lt;p&gt;Ce ne sont ni Python, ni les formes géométriques, ni les vagues qui définissent réellement le moteur.&lt;/p&gt;

&lt;p&gt;C'est son &lt;strong&gt;Director Network&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Plus les Directors apprennent à communiquer, plus le moteur peut construire des situations cohérentes autour de la partie en cours.&lt;/p&gt;

&lt;p&gt;ZlormaEngine est parti d'une question :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Puis-je créer mon propre moteur de jeu ?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Elle est devenue :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Puis-je créer un moteur qui réagit au joueur ?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Aujourd'hui, la question est devenue :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Plusieurs Directors peuvent-ils collaborer pour diriger dynamiquement une run entière ?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;C'est désormais le cœur du projet.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;ZlormaEngine ne cherche pas seulement à exécuter le jeu. Il cherche à diriger la run.&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GameFall Arena n'est que le commencement.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>indiedev</category>
      <category>linux</category>
      <category>python</category>
    </item>
    <item>
      <title>Publishing My Procedural Rust Game on Game Jolt</title>
      <dc:creator>Zlormack</dc:creator>
      <pubDate>Sat, 18 Jul 2026 15:45:25 +0000</pubDate>
      <link>https://dev.to/zlormack/publishing-my-procedural-rust-game-on-game-jolt-2bm9</link>
      <guid>https://dev.to/zlormack/publishing-my-procedural-rust-game-on-game-jolt-2bm9</guid>
      <description>&lt;p&gt;I brought Zlorma Core: Signal Lost to Game Jolt, published a new gameplay trailer and applied for Creator access for ZlormaStudio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7zawuf2am890jppkmxpx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7zawuf2am890jppkmxpx.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;title: "Bringing Zlorma Core: Signal Lost to Game Jolt"&lt;br&gt;
published: false&lt;br&gt;
description: "I published the new Signal Lost gameplay trailer on Game Jolt and applied for Creator access for ZlormaStudio."&lt;/p&gt;

&lt;h2&gt;
  
  
  tags: gamedev, rust, indiegame, devlog
&lt;/h2&gt;

&lt;h1&gt;
  
  
  Bringing Zlorma Core: Signal Lost to Game Jolt
&lt;/h1&gt;

&lt;p&gt;Today marks another step forward for &lt;strong&gt;Zlorma Core: Signal Lost&lt;/strong&gt; and &lt;strong&gt;ZlormaStudio&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After publishing the prototype on itch.io and sharing its development through this blog, I have now started bringing the project to &lt;strong&gt;Game Jolt&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I uploaded the new gameplay trailer, prepared the game presentation and submitted an application for Game Jolt Creator access.&lt;/p&gt;

&lt;p&gt;The application is currently waiting for review.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Signal Lost?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Zlorma Core: Signal Lost&lt;/strong&gt; is a procedural science-fiction top-down shooter developed in Rust with my custom lightweight 2D game engine, &lt;strong&gt;ZlormaEngine&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The player wakes up inside a damaged digital station being consumed by corruption.&lt;/p&gt;

&lt;p&gt;The main objectives are to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;explore procedurally generated rooms and corridors;&lt;/li&gt;
&lt;li&gt;repair three damaged terminals;&lt;/li&gt;
&lt;li&gt;collect data fragments;&lt;/li&gt;
&lt;li&gt;fight corrupted programs;&lt;/li&gt;
&lt;li&gt;build barriers and automated turrets;&lt;/li&gt;
&lt;li&gt;use the Zlorma Data Forge;&lt;/li&gt;
&lt;li&gt;escape before the system collapses.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The current release is &lt;strong&gt;Prototype v0.2.1 — Demo Polish Update&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A More Polished Gameplay Trailer
&lt;/h2&gt;

&lt;p&gt;For this release, I created several versions of the gameplay trailer.&lt;/p&gt;

&lt;p&gt;The main trailer includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an animated introduction;&lt;/li&gt;
&lt;li&gt;faster gameplay cuts;&lt;/li&gt;
&lt;li&gt;cinematic titles;&lt;/li&gt;
&lt;li&gt;visual impact flashes;&lt;/li&gt;
&lt;li&gt;dynamic zoom and camera movement;&lt;/li&gt;
&lt;li&gt;a custom synthwave and chiptune soundtrack;&lt;/li&gt;
&lt;li&gt;a final screen linking to the playable prototype.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also created shorter versions for social networks such as Mastodon, Bluesky, Discord, Facebook and Game Jolt.&lt;/p&gt;

&lt;p&gt;Preparing several trailer formats helped me understand how differently a game needs to be presented depending on the platform.&lt;/p&gt;

&lt;p&gt;A full trailer can explain the mechanics, while a shorter version must immediately show action, visual effects and the main gameplay loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Zlorma Data Forge
&lt;/h2&gt;

&lt;p&gt;One of the most important additions in Signal Lost v0.2 is the &lt;strong&gt;Zlorma Data Forge&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After repairing a terminal, the player receives three randomly selected upgrades.&lt;/p&gt;

&lt;p&gt;Each upgrade provides an advantage, but most of them also introduce a disadvantage.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;faster shooting can reduce weapon damage;&lt;/li&gt;
&lt;li&gt;additional maximum health can reduce movement speed;&lt;/li&gt;
&lt;li&gt;stronger turrets can become more expensive to build;&lt;/li&gt;
&lt;li&gt;additional data rewards can accelerate corruption.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is to make each run different and force the player to balance power, survival and risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo Polish Update
&lt;/h2&gt;

&lt;p&gt;Version 0.2.1 improves the presentation of the prototype with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;screen shake during impacts;&lt;/li&gt;
&lt;li&gt;projectile trails;&lt;/li&gt;
&lt;li&gt;procedural shockwaves;&lt;/li&gt;
&lt;li&gt;glowing enemies and terminals;&lt;/li&gt;
&lt;li&gt;floating score and data indicators;&lt;/li&gt;
&lt;li&gt;clearer objective messages;&lt;/li&gt;
&lt;li&gt;corruption warnings;&lt;/li&gt;
&lt;li&gt;animated system banners;&lt;/li&gt;
&lt;li&gt;improved victory and defeat screens;&lt;/li&gt;
&lt;li&gt;a more animated Data Forge interface.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All visual effects are generated directly through code.&lt;/p&gt;

&lt;p&gt;Signal Lost does not depend on external level files or large graphical asset packs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built with ZlormaEngine
&lt;/h2&gt;

&lt;p&gt;Signal Lost is powered by &lt;strong&gt;ZlormaEngine&lt;/strong&gt;, my custom 2D game engine written in Rust.&lt;/p&gt;

&lt;p&gt;The engine currently provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;software-rendered 2D graphics;&lt;/li&gt;
&lt;li&gt;procedural environments;&lt;/li&gt;
&lt;li&gt;procedural effects and sprites;&lt;/li&gt;
&lt;li&gt;a custom bitmap font;&lt;/li&gt;
&lt;li&gt;native Linux and Windows builds;&lt;/li&gt;
&lt;li&gt;very small executable sizes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The current approximate executable sizes are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux: 476 KB;&lt;/li&gt;
&lt;li&gt;Windows: 312 KB.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keeping the engine and games lightweight remains one of the main technical goals of the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Game Jolt?
&lt;/h2&gt;

&lt;p&gt;Game Jolt gives independent developers another place to present their work, publish trailers, share development updates and interact with players.&lt;/p&gt;

&lt;p&gt;My goal is not to replace the itch.io version.&lt;/p&gt;

&lt;p&gt;Instead, I want to use both platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;itch.io for distributing the prototype;&lt;/li&gt;
&lt;li&gt;Game Jolt for sharing videos, updates and building a community around ZlormaStudio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have configured the Game Jolt marketplace account and submitted a request for Creator access.&lt;/p&gt;

&lt;p&gt;I am now waiting for the Game Jolt team to review the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Play Signal Lost
&lt;/h2&gt;

&lt;p&gt;The prototype is currently available for Windows and Linux:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://zlorma-studio.itch.io/zlorma-core-signal-lost-prototype-v01" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback about the controls, procedural generation, visual effects, difficulty and Data Forge system is welcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Comes Next?
&lt;/h2&gt;

&lt;p&gt;The next steps for Signal Lost include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;improving combat feedback;&lt;/li&gt;
&lt;li&gt;expanding procedural room generation;&lt;/li&gt;
&lt;li&gt;adding more enemy behaviors;&lt;/li&gt;
&lt;li&gt;improving the Kernel Error boss encounter;&lt;/li&gt;
&lt;li&gt;balancing the Data Forge upgrades;&lt;/li&gt;
&lt;li&gt;adding more sound effects;&lt;/li&gt;
&lt;li&gt;preparing the next public release.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also plan to continue improving ZlormaEngine through the development of Signal Lost and Gemfall Arena.&lt;/p&gt;

&lt;p&gt;Every new game helps test a different part of the engine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repair the system.&lt;br&gt;&lt;br&gt;
Contain the corruption.&lt;br&gt;&lt;br&gt;
Find the exit.&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building a Procedural Top-Down Shooter in Rust with My Custom Game Engine</title>
      <dc:creator>Zlormack</dc:creator>
      <pubDate>Thu, 16 Jul 2026 18:31:57 +0000</pubDate>
      <link>https://dev.to/zlormack/building-a-procedural-top-down-shooter-in-rust-with-my-custom-game-engine-2gf5</link>
      <guid>https://dev.to/zlormack/building-a-procedural-top-down-shooter-in-rust-with-my-custom-game-engine-2gf5</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fitwdl0mxi4u3nwmmm1hg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fitwdl0mxi4u3nwmmm1hg.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;# Building a Procedural Top-Down Shooter in Rust with My Custom Game Engine&lt;/p&gt;

&lt;p&gt;After developing &lt;strong&gt;Gemfall Arena&lt;/strong&gt;, I wanted to answer a new question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Could my custom Rust game engine support something more complex than a wave-based arena shooter?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That experiment became &lt;strong&gt;Zlorma Core: Signal Lost — Prototype v0.1&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Signal Lost is a procedural top-down sci-fi shooter featuring exploration, damaged terminals, collectible resources, defensive structures, corrupted enemies, and a final escape objective.&lt;/p&gt;

&lt;p&gt;It is also the second playable game built with my custom engine, &lt;strong&gt;ZlormaEngine&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The prototype is available for Windows and #Linux:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://zlorma-studio.itch.io/zlorma-core-signal-lost-prototype-v01" rel="noopener noreferrer"&gt;https://zlorma-studio.itch.io/zlorma-core-signal-lost-prototype-v01&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Moving beyond an arena shooter
&lt;/h2&gt;

&lt;p&gt;Gemfall Arena helped me build and test the first important parts of ZlormaEngine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Software rendering&lt;/li&gt;
&lt;li&gt;Keyboard and mouse input&lt;/li&gt;
&lt;li&gt;Player movement&lt;/li&gt;
&lt;li&gt;Projectiles&lt;/li&gt;
&lt;li&gt;Enemy spawning&lt;/li&gt;
&lt;li&gt;Collisions&lt;/li&gt;
&lt;li&gt;Particle effects&lt;/li&gt;
&lt;li&gt;Bitmap text&lt;/li&gt;
&lt;li&gt;Wave progression&lt;/li&gt;
&lt;li&gt;#Linux and Windows builds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, its gameplay takes place inside a combat arena.&lt;/p&gt;

&lt;p&gt;For my second project, I wanted the engine to support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exploration&lt;/li&gt;
&lt;li&gt;Multiple connected rooms&lt;/li&gt;
&lt;li&gt;Procedural level generation&lt;/li&gt;
&lt;li&gt;Interactive objectives&lt;/li&gt;
&lt;li&gt;Collectible resources&lt;/li&gt;
&lt;li&gt;Player-built defenses&lt;/li&gt;
&lt;li&gt;Different enemy behaviours&lt;/li&gt;
&lt;li&gt;A final exit condition&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Signal Lost became the project used to implement and test those systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  The game concept
&lt;/h2&gt;

&lt;p&gt;A digital corruption is spreading through an abandoned station.&lt;/p&gt;

&lt;p&gt;The player controls the last maintenance program still online.&lt;/p&gt;

&lt;p&gt;Three critical terminals have stopped responding. The station cannot activate its emergency exit until the terminals are restored.&lt;/p&gt;

&lt;p&gt;The main gameplay loop is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Explore the generated station&lt;/li&gt;
&lt;li&gt;Locate a damaged terminal&lt;/li&gt;
&lt;li&gt;Restore and defend it&lt;/li&gt;
&lt;li&gt;Collect data fragments&lt;/li&gt;
&lt;li&gt;Build barriers or deploy turrets&lt;/li&gt;
&lt;li&gt;Restore all three terminals&lt;/li&gt;
&lt;li&gt;Defeat Kernel Error&lt;/li&gt;
&lt;li&gt;Reach the emergency exit&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The objective was to combine fast top-down combat with light exploration and construction mechanics.&lt;/p&gt;




&lt;h2&gt;
  
  
  Procedural station generation
&lt;/h2&gt;

&lt;p&gt;The biggest new system is the procedural map generator.&lt;/p&gt;

&lt;p&gt;Each run creates a station containing connected rooms and corridors.&lt;/p&gt;

&lt;p&gt;The generator must produce a layout that is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigable&lt;/li&gt;
&lt;li&gt;Large enough for combat&lt;/li&gt;
&lt;li&gt;Small enough to avoid empty exploration&lt;/li&gt;
&lt;li&gt;Suitable for terminal-defense encounters&lt;/li&gt;
&lt;li&gt;Compatible with enemy movement&lt;/li&gt;
&lt;li&gt;Different on each new run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The generated station contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Floor tiles&lt;/li&gt;
&lt;li&gt;Solid walls&lt;/li&gt;
&lt;li&gt;Connected rooms&lt;/li&gt;
&lt;li&gt;Corridors&lt;/li&gt;
&lt;li&gt;Three damaged terminals&lt;/li&gt;
&lt;li&gt;Data fragments&lt;/li&gt;
&lt;li&gt;Enemy spawn locations&lt;/li&gt;
&lt;li&gt;Construction areas&lt;/li&gt;
&lt;li&gt;A boss encounter&lt;/li&gt;
&lt;li&gt;An emergency exit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This system can later be reused for dungeon crawlers, roguelikes, survival games, and other ZlormaEngine projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  Terminal restoration
&lt;/h2&gt;

&lt;p&gt;The three terminals provide the main objectives.&lt;/p&gt;

&lt;p&gt;The player must explore the map, locate each terminal, and move close enough to begin restoring it.&lt;/p&gt;

&lt;p&gt;While the system is being repaired, corrupted programs continue attacking.&lt;/p&gt;

&lt;p&gt;This changes the rhythm of the game.&lt;/p&gt;

&lt;p&gt;The player is not simply eliminating enemies. They must also decide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which terminal to restore first&lt;/li&gt;
&lt;li&gt;Where to stand during a defense&lt;/li&gt;
&lt;li&gt;Which passage should be blocked&lt;/li&gt;
&lt;li&gt;When to spend collected fragments&lt;/li&gt;
&lt;li&gt;Where a turret will be most effective&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After all three terminals are restored, the final phase of the run begins.&lt;/p&gt;




&lt;h2&gt;
  
  
  Data fragments and construction
&lt;/h2&gt;

&lt;p&gt;Signal Lost introduces a simple resource system.&lt;/p&gt;

&lt;p&gt;The player collects &lt;strong&gt;data fragments&lt;/strong&gt; while exploring and fighting corrupted programs.&lt;/p&gt;

&lt;p&gt;These fragments can be spent on two defensive structures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Barriers
&lt;/h3&gt;

&lt;p&gt;Barriers can block passages and slow enemy movement.&lt;/p&gt;

&lt;p&gt;They are useful for protecting terminals and controlling the direction from which enemies can approach.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automated turrets
&lt;/h3&gt;

&lt;p&gt;Turrets automatically fire at nearby enemies.&lt;/p&gt;

&lt;p&gt;They cost more fragments than barriers but provide additional damage during terminal defense and the final battle.&lt;/p&gt;

&lt;p&gt;The construction system is intentionally small in Prototype v0.1.&lt;/p&gt;

&lt;p&gt;The goal is to test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resource costs&lt;/li&gt;
&lt;li&gt;Object placement&lt;/li&gt;
&lt;li&gt;Collision updates&lt;/li&gt;
&lt;li&gt;Automated targeting&lt;/li&gt;
&lt;li&gt;Structure health&lt;/li&gt;
&lt;li&gt;Interaction with enemies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More structures can be added after the foundation has been tested.&lt;/p&gt;




&lt;h2&gt;
  
  
  Corrupted enemy programs
&lt;/h2&gt;

&lt;p&gt;The prototype currently includes several enemy behaviours.&lt;/p&gt;

&lt;h3&gt;
  
  
  Glitch
&lt;/h3&gt;

&lt;p&gt;Glitch is a small and fast enemy that directly pursues the player.&lt;/p&gt;

&lt;p&gt;Its purpose is to apply constant movement pressure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Corruptor
&lt;/h3&gt;

&lt;p&gt;Corruptor is slower but more dangerous around objectives and defensive structures.&lt;/p&gt;

&lt;p&gt;It forces the player to protect more than their own health.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sentinel
&lt;/h3&gt;

&lt;p&gt;Sentinel attacks from a distance using corrupted projectiles.&lt;/p&gt;

&lt;p&gt;This prevents the player from remaining safely behind a single barrier.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kernel Error
&lt;/h3&gt;

&lt;p&gt;Kernel Error is the final enemy of Prototype v0.1.&lt;/p&gt;

&lt;p&gt;It appears during the final stage after the terminal network has been restored.&lt;/p&gt;

&lt;p&gt;Defeating Kernel Error unlocks the emergency exit and allows the player to complete the run.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reorganizing ZlormaEngine
&lt;/h2&gt;

&lt;p&gt;While creating Signal Lost, I also reorganized the engine into a cleaner Rust workspace.&lt;/p&gt;

&lt;p&gt;The current structure looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;``text
ZlormaEngine/
├── Cargo.toml
├── crates/
│   └── zlorma_engine/
│       ├── Cargo.toml
│       └── src/
├── games/
│   ├── gemfall_arena/
│   │   ├── Cargo.toml
│   │   └── src/
│   └── signal_lost/
│       ├── Cargo.toml
│       └── src/
├── scripts/
├── docs/
└── dist/
``
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The shared &lt;code&gt;zlorma_engine&lt;/code&gt; crate contains reusable systems.&lt;/p&gt;

&lt;p&gt;Each game remains an independent executable while sharing the same engine foundation.&lt;/p&gt;

&lt;p&gt;This organization makes it easier to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reuse rendering and input code&lt;/li&gt;
&lt;li&gt;Maintain several games&lt;/li&gt;
&lt;li&gt;Build the entire workspace&lt;/li&gt;
&lt;li&gt;Target Linux and Windows&lt;/li&gt;
&lt;li&gt;Produce release archives&lt;/li&gt;
&lt;li&gt;Track executable sizes&lt;/li&gt;
&lt;li&gt;Add future ZlormaStudio projects&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Cross-compiling from Linux to Windows
&lt;/h2&gt;

&lt;p&gt;The Linux builds worked correctly, but the first Windows cross-build failed while compiling &lt;code&gt;minifb&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The error was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;``text
At least one of the x11 or wayland features must be enabled
``
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The problem came from the dependency features defined in the engine crate.&lt;/p&gt;

&lt;p&gt;After correcting the &lt;code&gt;minifb&lt;/code&gt; configuration, Cargo correctly detected the required feature:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
text&lt;br&gt;
minifb feature "x11"&lt;br&gt;
└── zlorma_engine&lt;br&gt;
    ├── gemfall_arena&lt;br&gt;
    └── signal_lost&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
plaintext&lt;/p&gt;

&lt;p&gt;The complete workspace now compiles successfully for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
text&lt;br&gt;
x86_64 Linux&lt;br&gt;
x86_64 Windows GNU&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
toml&lt;/p&gt;

&lt;p&gt;A single build script creates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux executables&lt;/li&gt;
&lt;li&gt;Windows executables&lt;/li&gt;
&lt;li&gt;Linux &lt;code&gt;.tar.gz&lt;/code&gt; archives&lt;/li&gt;
&lt;li&gt;Windows &lt;code&gt;.zip&lt;/code&gt; archives&lt;/li&gt;
&lt;li&gt;SHA-256 checksums&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Keeping the executables small
&lt;/h2&gt;

&lt;p&gt;One of the original goals of ZlormaEngine was to keep each game executable below &lt;strong&gt;3 MiB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The release profile uses size-focused settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
toml&lt;br&gt;
[profile.release]&lt;br&gt;
opt-level = "z"&lt;br&gt;
lto = true&lt;br&gt;
codegen-units = 1&lt;br&gt;
panic = "abort"&lt;br&gt;
strip = "symbols"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
plaintext&lt;/p&gt;

&lt;p&gt;Current optimized executable sizes are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;| Game | Linux | Windows |
|---|---:|---:|
| Signal Lost Prototype v0.1 | 460 KiB | 296 KiB |
| Gemfall Arena Demo v0.2 | 464 KiB | 312 KiB |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both games remain comfortably below the original target.&lt;/p&gt;

&lt;p&gt;The small size is especially satisfying because the same workspace now supports two different game structures.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Signal Lost adds to the engine
&lt;/h2&gt;

&lt;p&gt;Signal Lost expands ZlormaEngine with several reusable systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Procedural map generation&lt;/li&gt;
&lt;li&gt;Tile-based rooms and corridors&lt;/li&gt;
&lt;li&gt;Interactive terminals&lt;/li&gt;
&lt;li&gt;Objective progression&lt;/li&gt;
&lt;li&gt;Resource collection&lt;/li&gt;
&lt;li&gt;Construction placement&lt;/li&gt;
&lt;li&gt;Automated turrets&lt;/li&gt;
&lt;li&gt;Destructible barriers&lt;/li&gt;
&lt;li&gt;Multiple enemy behaviours&lt;/li&gt;
&lt;li&gt;Boss progression&lt;/li&gt;
&lt;li&gt;Exit activation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gemfall Arena demonstrates arcade wave combat.&lt;/p&gt;

&lt;p&gt;Signal Lost demonstrates exploration, objectives, resource management, and construction inside a generated environment.&lt;/p&gt;

&lt;p&gt;Together, the two games provide a much better test of the engine than a single project could.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;The most important lesson was that a second game quickly reveals which systems are truly reusable.&lt;/p&gt;

&lt;p&gt;Code that appears generic inside one project may still contain assumptions about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Map dimensions&lt;/li&gt;
&lt;li&gt;Enemy spawning&lt;/li&gt;
&lt;li&gt;Camera behaviour&lt;/li&gt;
&lt;li&gt;Game states&lt;/li&gt;
&lt;li&gt;Interface layout&lt;/li&gt;
&lt;li&gt;Objective progression&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building Signal Lost forced me to separate engine systems from game-specific logic more carefully.&lt;/p&gt;

&lt;p&gt;It also showed the value of maintaining a shared workspace early, before creating too many separate projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  What comes next?
&lt;/h2&gt;

&lt;p&gt;Prototype v0.1 is a technical and playable foundation.&lt;/p&gt;

&lt;p&gt;Future versions may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More station layouts&lt;/li&gt;
&lt;li&gt;Larger sectors&lt;/li&gt;
&lt;li&gt;Better enemy navigation&lt;/li&gt;
&lt;li&gt;Additional corrupted programs&lt;/li&gt;
&lt;li&gt;New bosses&lt;/li&gt;
&lt;li&gt;More defensive structures&lt;/li&gt;
&lt;li&gt;Player upgrades&lt;/li&gt;
&lt;li&gt;Environmental hazards&lt;/li&gt;
&lt;li&gt;Difficulty settings&lt;/li&gt;
&lt;li&gt;Improved visual effects&lt;/li&gt;
&lt;li&gt;Music and sound effects&lt;/li&gt;
&lt;li&gt;Saved settings and progression&lt;/li&gt;
&lt;li&gt;A clearer tutorial&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My next priority is to test the core gameplay loop and improve it based on player feedback.&lt;/p&gt;




&lt;h2&gt;
  
  
  Play Signal Lost
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Zlorma Core: Signal Lost — Prototype v0.1&lt;/strong&gt; is available for Windows and Linux.&lt;/p&gt;

&lt;p&gt;Download it on itch.io:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://zlorma-studio.itch.io/zlorma-core-signal-lost-prototype-v01" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback about the controls, procedural generation, difficulty, enemy behaviour, and construction mechanics is welcome.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Repair the system. Contain the corruption. Escape.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Developed by &lt;strong&gt;ZlormaStudio&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Powered by &lt;strong&gt;ZlormaEngine&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Built with &lt;strong&gt;Rust&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>gamedev</category>
      <category>gameengine</category>
      <category>procedural</category>
    </item>
    <item>
      <title>Pourquoi j’ai créé ZlormaEngine au lieu d’utiliser un moteur existant</title>
      <dc:creator>Zlormack</dc:creator>
      <pubDate>Thu, 16 Jul 2026 18:19:48 +0000</pubDate>
      <link>https://dev.to/zlormack/pourquoi-jai-cree-zlormaengine-au-lieu-dutiliser-un-moteur-existant-3cj4</link>
      <guid>https://dev.to/zlormack/pourquoi-jai-cree-zlormaengine-au-lieu-dutiliser-un-moteur-existant-3cj4</guid>
      <description>&lt;p&gt;Pourquoi j’ai créé ZlormaEngine au lieu d’utiliser un moteur existant&lt;/p&gt;

&lt;p&gt;Développement d’un moteur de jeu léger en Rust pour créer Gemfall Arena&lt;/p&gt;

&lt;p&gt;Je travaille actuellement sur ZlormaEngine, un petit moteur de jeu développé en Rust pour faire fonctionner mon premier jeu vitrine : Gemfall Arena.&lt;/p&gt;

&lt;p&gt;Je ne cherche pas à créer un concurrent de Unity, Unreal Engine ou Godot. Ces moteurs sont beaucoup plus complets et sont développés par des équipes expérimentées.&lt;/p&gt;

&lt;p&gt;Mon objectif est différent : je veux construire un moteur simple, léger et spécialisé dans les jeux de tir en vue du dessus. Cela me permet de comprendre ce qui se passe réellement derrière une fenêtre de jeu, un déplacement, un tir ou une collision.&lt;/p&gt;

&lt;p&gt;ZlormaEngine est donc à la fois un projet de moteur et un projet d’apprentissage.&lt;br&gt;
Pourquoi créer mon propre moteur ?&lt;/p&gt;

&lt;p&gt;J’aurais pu utiliser un moteur déjà existant pour développer Gemfall Arena plus rapidement.&lt;/p&gt;

&lt;p&gt;Cependant, je voulais répondre à plusieurs objectifs personnels :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apprendre Rust avec un projet concret ;

comprendre la boucle principale d’un jeu ;

contrôler directement le rendu et le gameplay ;

limiter le nombre de dépendances ;

produire un exécutable très compact ;

générer une grande partie du contenu sans assets externes ;

créer une technologie adaptée précisément à Gemfall Arena.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Utiliser mon propre moteur demande plus de travail. Par exemple, une fonctionnalité simple dans un moteur existant peut demander plusieurs fichiers et de nombreux tests dans ZlormaEngine.&lt;/p&gt;

&lt;p&gt;Mais chaque problème résolu m’aide à mieux comprendre la programmation d’un jeu.&lt;br&gt;
Une architecture Rust volontairement simple&lt;/p&gt;

&lt;p&gt;L’architecture de ZlormaEngine reste volontairement légère.&lt;/p&gt;

&lt;p&gt;Le projet peut être séparé en plusieurs parties principales :&lt;br&gt;
Plain Text&lt;br&gt;
Copy&lt;/p&gt;

&lt;p&gt;ZlormaEngine&lt;br&gt;
├── platform&lt;br&gt;
│   ├── linux_x11&lt;br&gt;
│   └── windows_win32&lt;br&gt;
├── renderer&lt;br&gt;
├── input&lt;br&gt;
├── game&lt;br&gt;
├── entities&lt;br&gt;
├── procedural&lt;br&gt;
├── waves&lt;br&gt;
├── difficulty&lt;br&gt;
└── shop&lt;/p&gt;

&lt;p&gt;La partie platform gère les différences entre Linux et Windows.&lt;/p&gt;

&lt;p&gt;Le renderer dessine les formes, les projectiles, les ennemis, les gems et les effets.&lt;/p&gt;

&lt;p&gt;La partie game contient la boucle principale et les règles de Gemfall Arena.&lt;/p&gt;

&lt;p&gt;Les autres modules s’occupent des systèmes plus précis comme les vagues, la boutique ou la génération procédurale.&lt;/p&gt;

&lt;p&gt;Je préfère pour le moment une architecture claire et compréhensible plutôt qu’un système très abstrait. Mon niveau évolue en même temps que le projet, donc je garde du code que je peux relire et modifier facilement.&lt;br&gt;
La boucle principale du moteur&lt;/p&gt;

&lt;p&gt;Comme beaucoup de jeux, Gemfall Arena utilise une boucle principale.&lt;/p&gt;

&lt;p&gt;De manière simplifiée, elle fonctionne comme ceci :&lt;br&gt;
Plain Text&lt;br&gt;
Copy&lt;/p&gt;

&lt;p&gt;while game.is_running() {&lt;br&gt;
    platform.process_events();&lt;br&gt;
    game.update();&lt;br&gt;
    renderer.clear();&lt;br&gt;
    game.render(&amp;amp;mut renderer);&lt;br&gt;
    platform.present(renderer.framebuffer());&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;À chaque image, le moteur :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;récupère les actions du clavier et de la souris ;

met à jour le joueur et les ennemis ;

vérifie les collisions ;

met à jour les projectiles et les particules ;

dessine la nouvelle image ;

affiche le framebuffer dans la fenêtre.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Cette boucle paraît simple, mais beaucoup de systèmes sont exécutés à l’intérieur.&lt;br&gt;
L’objectif des 3 Mio&lt;/p&gt;

&lt;p&gt;L’un des objectifs de ZlormaEngine est de garder le moteur et le jeu final sous une limite d’environ 3 Mio.&lt;/p&gt;

&lt;p&gt;Cette limite est surtout un défi technique personnel. Elle m’oblige à réfléchir à ce qui est réellement nécessaire.&lt;/p&gt;

&lt;p&gt;Pour réduire la taille, j’utilise notamment un profil Rust orienté vers la taille :&lt;br&gt;
Plain Text&lt;br&gt;
Copy&lt;/p&gt;

&lt;p&gt;[profile.release]&lt;br&gt;
opt-level = "z"&lt;br&gt;
lto = true&lt;br&gt;
codegen-units = 1&lt;br&gt;
panic = "abort"&lt;br&gt;
strip = true&lt;/p&gt;

&lt;p&gt;Ces options permettent de demander au compilateur de privilégier un exécutable plus petit.&lt;/p&gt;

&lt;p&gt;J’essaie également de :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;limiter les dépendances externes ;

éviter d’intégrer des textures volumineuses ;

générer les éléments graphiques directement ;

utiliser des structures de données simples ;

ne compiler que les fonctions réellement nécessaires ;

séparer le code Linux et Windows avec la compilation conditionnelle.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;La limite de 3 Mio reste un objectif. Elle doit encore être vérifiée après chaque nouvelle version, car chaque fonctionnalité peut augmenter la taille du programme.&lt;br&gt;
Un rendu logiciel&lt;/p&gt;

&lt;p&gt;ZlormaEngine utilise un rendu logiciel.&lt;/p&gt;

&lt;p&gt;Cela signifie que le moteur dessine directement les pixels dans une zone mémoire appelée framebuffer.&lt;/p&gt;

&lt;p&gt;Par exemple, pour dessiner un pixel :&lt;br&gt;
Plain Text&lt;br&gt;
Copy&lt;/p&gt;

&lt;p&gt;fn put_pixel(buffer: &amp;amp;mut [u32], x: i32, y: i32, color: u32) {&lt;br&gt;
    if x &amp;lt; 0 || y &amp;lt; 0 {&lt;br&gt;
        return;&lt;br&gt;
    }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let x = x as usize;
let y = y as usize;

if x &amp;gt;= WIDTH || y &amp;gt;= HEIGHT {
    return;
}

buffer[y * WIDTH + x] = color;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;À partir de cette fonction, il est possible de construire :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;des rectangles ;

des cercles ;

des lignes ;

des projectiles ;

des particules ;

des barres de vie ;

des ennemis ;

des gems.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Ce système reste moins puissant qu’un rendu moderne utilisant directement le GPU, mais il est suffisant pour mon jeu actuel.&lt;/p&gt;

&lt;p&gt;Il me permet aussi de comprendre précisément comment l’image est créée.&lt;br&gt;
Windows avec Win32&lt;/p&gt;

&lt;p&gt;La première architecture était uniquement compatible avec X11. Elle pouvait fonctionner sous Linux, mais elle ne pouvait pas produire directement une version Windows fonctionnelle.&lt;/p&gt;

&lt;p&gt;J’ai donc prévu un second backend basé sur Win32 et GDI.&lt;/p&gt;

&lt;p&gt;Le gameplay reste identique. Seule la couche liée au système change.&lt;/p&gt;

&lt;p&gt;Rust permet de séparer les plateformes avec des conditions de compilation :&lt;br&gt;
Plain Text&lt;br&gt;
Copy&lt;/p&gt;

&lt;h1&gt;
  
  
  [cfg(target_os = "linux")]
&lt;/h1&gt;

&lt;p&gt;mod linux_x11;&lt;/p&gt;

&lt;h1&gt;
  
  
  [cfg(target_os = "windows")]
&lt;/h1&gt;

&lt;p&gt;mod windows_win32;&lt;/p&gt;

&lt;p&gt;Cela permet d’utiliser X11 uniquement sous Linux et Win32 uniquement sous Windows.&lt;/p&gt;

&lt;p&gt;C’est une étape importante pour ZlormaEngine, car je souhaite proposer Gemfall Arena sur les deux systèmes.&lt;br&gt;
La génération procédurale&lt;/p&gt;

&lt;p&gt;La génération procédurale est une partie importante de l’identité du moteur.&lt;/p&gt;

&lt;p&gt;Au lieu de charger de nombreux fichiers externes, ZlormaEngine peut générer directement certains éléments à partir de nombres et de règles.&lt;/p&gt;

&lt;p&gt;Cela concerne notamment :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;les positions des obstacles ;

les variations de couleurs ;

les formes des ennemis ;

les particules ;

les explosions ;

les trajectoires ;

les vagues ;

certaines variations de difficulté.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Un générateur pseudo-aléatoire simple peut être utilisé pour obtenir des résultats différents :&lt;br&gt;
Plain Text&lt;br&gt;
Copy&lt;/p&gt;

&lt;p&gt;struct Random {&lt;br&gt;
    state: u32,&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;impl Random {&lt;br&gt;
    fn next(&amp;amp;mut self) -&amp;gt; u32 {&lt;br&gt;
        self.state ^= self.state &amp;lt;&amp;lt; 13;&lt;br&gt;
        self.state ^= self.state &amp;gt;&amp;gt; 17;&lt;br&gt;
        self.state ^= self.state &amp;lt;&amp;lt; 5;&lt;br&gt;
        self.state&lt;br&gt;
    }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;L’utilisation d’une graine permet également de recréer une même génération.&lt;/p&gt;

&lt;p&gt;Ce système est pratique pour produire du contenu sans augmenter fortement la taille du jeu.&lt;/p&gt;

&lt;p&gt;Le système de vagues&lt;/p&gt;

&lt;p&gt;La démo de Gemfall Arena contient actuellement 10 vagues.&lt;/p&gt;

&lt;p&gt;Chaque vague détermine :&lt;/p&gt;

&lt;p&gt;le nombre d’ennemis ; leurs points de vie ; leur vitesse ; les types d’ennemis disponibles ; la quantité potentielle de gems ; la pression exercée sur le joueur.&lt;/p&gt;

&lt;p&gt;Une formule simple peut servir de base :&lt;/p&gt;

&lt;p&gt;let enemy_count = 4 + wave * 2; let enemy_health = 1.0 + wave as f32 * 0.15; let enemy_speed = 0.8 + wave as f32 * 0.04;&lt;/p&gt;

&lt;p&gt;Je dois toutefois faire attention à ne pas augmenter uniquement les nombres.&lt;/p&gt;

&lt;p&gt;Ajouter trop de points de vie peut rendre les ennemis longs à éliminer sans rendre le combat réellement plus intéressant.&lt;/p&gt;

&lt;p&gt;Je préfère donc mélanger plusieurs changements : vitesse, quantité, position et types d’ennemis.&lt;br&gt;
Une difficulté adaptative&lt;/p&gt;

&lt;p&gt;Le numéro de la vague ne suffit pas toujours à déterminer une bonne difficulté.&lt;/p&gt;

&lt;p&gt;Deux joueurs peuvent atteindre la même vague avec des performances très différentes.&lt;/p&gt;

&lt;p&gt;ZlormaEngine peut donc analyser plusieurs éléments :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;le temps nécessaire pour terminer une vague ;

les dégâts reçus ;

la précision des tirs ;

la quantité de vie restante ;

le score ;

les améliorations déjà achetées.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Le moteur produit ensuite une valeur de difficulté.&lt;br&gt;
Plain Text&lt;br&gt;
Copy&lt;/p&gt;

&lt;p&gt;let mut difficulty = wave as f32;&lt;/p&gt;

&lt;p&gt;if accuracy &amp;gt; 0.70 {&lt;br&gt;
    difficulty += 0.4;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;if damage_received == 0 {&lt;br&gt;
    difficulty += 0.3;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;if clear_time &amp;gt; expected_time {&lt;br&gt;
    difficulty -= 0.2;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Ce système est encore en cours d’équilibrage.&lt;/p&gt;

&lt;p&gt;Le but n’est pas de punir un bon joueur, mais de conserver une tension intéressante pendant toute la partie.&lt;br&gt;
La Zlorma Gem Forge&lt;/p&gt;

&lt;p&gt;La Zlorma Gem Forge est la boutique de Gemfall Arena et l’une des signatures que je souhaite conserver dans les jeux créés avec ZlormaEngine.&lt;/p&gt;

&lt;p&gt;Les ennemis peuvent laisser tomber des gems lorsqu’ils sont éliminés.&lt;/p&gt;

&lt;p&gt;Le joueur les récupère dans l’arène, puis peut les dépenser entre les vagues.&lt;/p&gt;

&lt;p&gt;La particularité est que chaque amélioration possède un avantage et un inconvénient.&lt;/p&gt;

&lt;p&gt;Par exemple :&lt;/p&gt;

&lt;p&gt;Amélioration&lt;/p&gt;

&lt;p&gt;Bonus&lt;/p&gt;

&lt;p&gt;Malus&lt;/p&gt;

&lt;p&gt;Rapid Core&lt;/p&gt;

&lt;p&gt;cadence de tir augmentée&lt;/p&gt;

&lt;p&gt;ennemis plus rapides&lt;/p&gt;

&lt;p&gt;Power Shard&lt;/p&gt;

&lt;p&gt;dégâts augmentés&lt;/p&gt;

&lt;p&gt;santé maximale réduite&lt;/p&gt;

&lt;p&gt;Vital Shell&lt;/p&gt;

&lt;p&gt;santé maximale augmentée&lt;/p&gt;

&lt;p&gt;déplacement plus lent&lt;/p&gt;

&lt;p&gt;Phase Boots&lt;/p&gt;

&lt;p&gt;vitesse augmentée&lt;/p&gt;

&lt;p&gt;prix plus élevés&lt;/p&gt;

&lt;p&gt;Gem Magnet&lt;/p&gt;

&lt;p&gt;attraction des gems améliorée&lt;/p&gt;

&lt;p&gt;ennemis plus résistants&lt;/p&gt;

&lt;p&gt;Je trouve ce système plus intéressant qu’une boutique où chaque achat rend simplement le joueur plus puissant.&lt;/p&gt;

&lt;p&gt;Le joueur doit réfléchir aux conséquences de son build.&lt;/p&gt;

&lt;p&gt;Des prix liés au score&lt;/p&gt;

&lt;p&gt;Le prix des améliorations peut évoluer selon la vague et le score.&lt;/p&gt;

&lt;p&gt;Une formule simple peut ressembler à ceci :&lt;/p&gt;

&lt;p&gt;fn calculate_price(base_price: u32, wave: u32, score: u32) -&amp;gt; u32 { base_price + wave * 3 + score / 500 }&lt;/p&gt;

&lt;p&gt;Un joueur performant gagne davantage de gems, mais les améliorations peuvent également devenir plus coûteuses.&lt;/p&gt;

&lt;p&gt;Ce système doit rester lisible. Si la formule est trop complexe ou trop punitive, le joueur ne comprend plus pourquoi les prix changent.&lt;/p&gt;

&lt;p&gt;L’équilibrage de la boutique sera donc amélioré progressivement grâce aux retours des joueurs.&lt;br&gt;
Les erreurs rencontrées&lt;/p&gt;

&lt;p&gt;Créer un moteur apporte forcément des erreurs.&lt;br&gt;
Le projet ne trouvait pas le script Bash&lt;/p&gt;

&lt;p&gt;Lors des premières versions, le script de génération se trouvait dans le dossier de téléchargement, mais il était lancé depuis un autre dossier.&lt;/p&gt;

&lt;p&gt;Linux indiquait alors :&lt;br&gt;
Plain Text&lt;br&gt;
Copy&lt;/p&gt;

&lt;p&gt;Aucun fichier ou dossier de ce nom&lt;/p&gt;

&lt;p&gt;La solution était simplement de se placer dans le bon dossier ou d’utiliser le chemin complet.&lt;/p&gt;

&lt;p&gt;Cette erreur m’a rappelé qu’un script destiné aux utilisateurs doit afficher clairement où il se trouve et où il crée les fichiers.&lt;br&gt;
Le moteur était uniquement compatible #Linux&lt;/p&gt;

&lt;p&gt;La première version utilisait directement X11.&lt;/p&gt;

&lt;p&gt;Le code ne pouvait donc pas être compilé tel quel pour Windows.&lt;/p&gt;

&lt;p&gt;La solution a été de séparer le moteur en une partie commune et plusieurs backends de plateforme.&lt;br&gt;
L’image du jeu était trop petite&lt;/p&gt;

&lt;p&gt;La résolution interne était affichée directement sans agrandissement adapté.&lt;/p&gt;

&lt;p&gt;Le jeu apparaissait dans un coin avec beaucoup d’espace noir.&lt;/p&gt;

&lt;p&gt;La solution a été de conserver la petite résolution pour les calculs, mais de l’agrandir proprement lors de l’affichage.&lt;br&gt;
Les ennemis se superposaient&lt;/p&gt;

&lt;p&gt;Lorsque plusieurs ennemis poursuivaient le joueur, ils pouvaient se placer exactement au même endroit.&lt;/p&gt;

&lt;p&gt;J’ai ajouté une petite force de séparation entre les ennemis proches.&lt;/p&gt;

&lt;p&gt;Cela donne des déplacements plus naturels et rend les groupes plus lisibles.&lt;br&gt;
Les fonctionnalités augmentent la complexité&lt;/p&gt;

&lt;p&gt;Chaque nouvelle fonction peut créer des effets secondaires.&lt;/p&gt;

&lt;p&gt;Une amélioration de vitesse peut modifier l’équilibrage. Une nouvelle particule peut affecter les performances. Une nouvelle plateforme peut ajouter des erreurs de compilation.&lt;/p&gt;

&lt;p&gt;Je dois donc avancer étape par étape et tester régulièrement.&lt;br&gt;
Ce que j’ai appris jusqu’à présent&lt;/p&gt;

&lt;p&gt;Le développement de ZlormaEngine m’a déjà appris plusieurs choses importantes.&lt;/p&gt;

&lt;p&gt;Un moteur n’est pas seulement un système de rendu. Il doit relier la plateforme, les entrées, les règles de jeu, les collisions, l’affichage et la gestion des ressources.&lt;/p&gt;

&lt;p&gt;J’ai également compris que l’optimisation ne consiste pas uniquement à rendre le code plus rapide.&lt;/p&gt;

&lt;p&gt;Elle concerne aussi :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;la taille de l’exécutable ;

la consommation de mémoire ;

la lisibilité du code ;

la facilité de compilation ;

la compatibilité entre systèmes ;

l’expérience du joueur.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Je suis encore en apprentissage, mais Gemfall Arena me donne un projet concret pour progresser.&lt;br&gt;
Les prochaines étapes&lt;/p&gt;

&lt;p&gt;Mes prochains objectifs pour ZlormaEngine sont :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stabiliser les versions Linux et Windows ;

améliorer les effets sonores procéduraux ;

mieux équilibrer les 10 vagues ;

rendre la difficulté adaptative plus naturelle ;

améliorer la Zlorma Gem Forge ;

ajouter de nouveaux comportements ennemis ;

vérifier régulièrement la limite de 3 Mio ;

publier davantage de DevLogs techniques ;

recueillir les retours des joueurs et développeurs.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;ZlormaEngine reste un moteur jeune, mais il fait déjà fonctionner une démonstration complète.&lt;/p&gt;

&lt;p&gt;Je souhaite continuer à l’améliorer progressivement, sans perdre son objectif principal : rester petit, compréhensible et spécialisé.&lt;br&gt;
Conclusion&lt;/p&gt;

&lt;p&gt;J’ai créé ZlormaEngine parce que je voulais apprendre en construisant réellement les différentes parties d’un jeu.&lt;/p&gt;

&lt;p&gt;Cette méthode est plus longue que l’utilisation d’un moteur existant, mais elle me permet de comprendre mes erreurs, de tester mes idées et de développer une technologie adaptée à Gemfall Arena.&lt;/p&gt;

&lt;p&gt;Je ne cherche pas à prétendre que mon moteur est meilleur que les solutions existantes.&lt;/p&gt;

&lt;p&gt;Je veux simplement créer un moteur qui correspond à mon projet, à mon niveau actuel et à ma manière d’apprendre.&lt;/p&gt;

&lt;p&gt;Chaque nouvelle version de Gemfall Arena représente aussi une nouvelle étape dans le développement de #ZlormaEngine.&lt;/p&gt;

&lt;p&gt;Zlormack&lt;br&gt;
Développeur indépendant de ZlormaEngine et Gemfall Arena&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Construire petit, comprendre mieux, progresser à chaque build.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;🎮 Gemfall Arena : &lt;a href="https://zlorma-studio.itch.io/gemfall-arena" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;br&gt;
🎬 Trailer : &lt;a href="https://youtu.be/326Y6vlaWhY" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>learning</category>
      <category>rust</category>
      <category>showdev</category>
    </item>
    <item>
      <title>VectHorde: Surviving the Swarm (Custom Rust Engine) 🦀</title>
      <dc:creator>Zlormack</dc:creator>
      <pubDate>Thu, 04 Jun 2026 11:38:02 +0000</pubDate>
      <link>https://dev.to/zlormack/vecthorde-surviving-the-swarm-custom-rust-engine-2d55</link>
      <guid>https://dev.to/zlormack/vecthorde-surviving-the-swarm-custom-rust-engine-2d55</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/june-game-jam-2026-06-03"&gt;June Solstice Game Jam&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Video Demo
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Prize Category
&lt;/h2&gt;

</description>
      <category>devchallenge</category>
      <category>gamechallenge</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Building a Custom 2D Game Engine in Rust: Lessons from VectHorde</title>
      <dc:creator>Zlormack</dc:creator>
      <pubDate>Tue, 02 Jun 2026 11:05:55 +0000</pubDate>
      <link>https://dev.to/zlormack/building-a-custom-2d-game-engine-in-rust-lessons-from-vecthorde-25c8</link>
      <guid>https://dev.to/zlormack/building-a-custom-2d-game-engine-in-rust-lessons-from-vecthorde-25c8</guid>
      <description>&lt;p&gt;Building a game engine from scratch is a massive undertaking, but it’s one of the most rewarding challenges a developer can face. I’ve recently decided to take on this journey by building the #ZlormaEngine, a 2D engine written entirely in #Rust.&lt;/p&gt;

&lt;p&gt;My goal was to create a lightweight, high-performance engine capable of handling hundreds of entities on screen without frame drops. To test its capabilities, I developed a Twin-Stick Shooter called VectHorde: Swarm Survival.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Rust for a Game Engine?&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Memory Safety**: Rust’s borrow checker helps prevent common memory-related bugs, which is crucial when managing large numbers of game entities.

**Performance**: The control over memory layout and zero-cost abstractions allows for the kind of arcade fluidity I wanted to achieve.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Challenges &amp;amp; Takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Entity Management**: Handling the swarm survival mechanic required efficient data structures to ensure the game remains stable even when the screen is crowded.

**The "Game Feel"**: Beyond the technical performance, fine-tuning the inputs and the "Terminal Nexus" upgrade system was key to making the game fun to play.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;**&lt;br&gt;
Check out the project**&lt;/p&gt;

&lt;p&gt;I’ve just released the demo for VectHorde on itch.io. If you're interested in game dev, Rust, or just want to challenge your reflexes, feel free to give it a try!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.tourl"&gt;&lt;br&gt;
👉 https://zlormack-studio.itch.io/vecthorde-swarm-survival&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m currently gathering feedback to decide how to approach the full version of the game. If you have any insights on engine architecture or game design, I'd love to discuss them in the comments!&lt;/p&gt;

&lt;h1&gt;
  
  
  rust, #gamedev, #programming  #showdev
&lt;/h1&gt;

&lt;p&gt;Happy coding!&lt;br&gt;
&lt;strong&gt;Zlormack&lt;/strong&gt;&lt;br&gt;
Building the ZlormaEngine in Rust.&lt;br&gt;
Follow my journey on Itch.io&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>performance</category>
      <category>rust</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
