<?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: Tse Xaiver</title>
    <description>The latest articles on DEV Community by Tse Xaiver (@momoheal).</description>
    <link>https://dev.to/momoheal</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%2F4193203%2F4900fe12-74a8-4bf6-8dee-d09aff928007.png</url>
      <title>DEV Community: Tse Xaiver</title>
      <link>https://dev.to/momoheal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/momoheal"/>
    <language>en</language>
    <item>
      <title>Duck Evac: a complete extraction-shooter game whose code and art are 100% open-weight generated</title>
      <dc:creator>Tse Xaiver</dc:creator>
      <pubDate>Mon, 19 Oct 2026 04:13:58 +0000</pubDate>
      <link>https://dev.to/momoheal/duck-evac-a-complete-extraction-shooter-game-whose-code-and-art-are-100-open-weight-generated-3b65</link>
      <guid>https://dev.to/momoheal/duck-evac-a-complete-extraction-shooter-game-whose-code-and-art-are-100-open-weight-generated-3b65</guid>
      <description>&lt;p&gt;Hacktoberfest Open-Source AI Challenge — Week 2: Side Hustle submission*&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Duck Evac&lt;/strong&gt; (鸭鸭大撤离) is a complete, playable 2D top-down extraction shooter: drop in, loot, fight enemy ducks, extract alive. Every line of its code was generated with &lt;strong&gt;DeepSeek V4.1&lt;/strong&gt; (open weights, MIT license); every sprite was generated with &lt;strong&gt;MiniMax&lt;/strong&gt; (open weights). No human drew a pixel, no human hand-wrote the engine — one person directed two open models and shipped a real game. It's now heading to TapTap (China's indie mobile store) for commercial release.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code: key systems pasted in the Code section below (a GitHub repo will follow after the deadline rush)&lt;/li&gt;
&lt;li&gt;Demo: 67 seconds of real gameplay, captured from the running web build&lt;/li&gt;
&lt;li&gt;Art: 100% original duck IP — zero copyrighted assets, zero takedown risk&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The problem: one person, a whole game
&lt;/h2&gt;

&lt;p&gt;I wanted to ship a commercial indie game solo. The math every solo dev knows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code&lt;/strong&gt;: a real game engine is thousands of lines — game loop, 8-direction sprite rendering, enemy AI, HUD, minimap, mobile touch controls. Months of work for one person.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Art&lt;/strong&gt;: 42 sprites (3 playable duck skins, 6 bosses, soldiers, guns, menu art) in one consistent flat-cartoon style. Commissioning that costs more than the game will ever earn; drawing it myself was never an option.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The trap&lt;/strong&gt;: closed models could do it, but per-token pricing turns "iterate 200 times on the boss fight" into a budget meeting. Open weights remove the meter: iterate forever, pay nothing per token.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The bet: open-weight models are now good enough that one person can direct them like a team — a coder and an art department — and ship.&lt;/p&gt;

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

&lt;p&gt;Duck Evac is a 2D top-down &lt;strong&gt;search-strike-extract&lt;/strong&gt; shooter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;搜 (Loot)&lt;/strong&gt; — scavenge buildings for weapons and supplies, backpack with 6 slots&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;打 (Fight)&lt;/strong&gt; — WASD + mouse aim on desktop; virtual joystick + fire/skill/melee/slide buttons on mobile; enemy ducks patrol and attack, bosses guard the extraction zone&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;撤离 (Extract)&lt;/strong&gt; — reach the extraction point before the timer runs out, or lose everything&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tech: Vite + React 19 + TypeScript, Canvas rendering with auto-resolution scaling, ~6,300-line game engine, 8-direction sprite system with runtime chroma-keying (AI art ships on white/green backgrounds; the engine cuts it out at load). Runs in the browser today; Android APK build in testing, TapTap submission in progress.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the open models built it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Code — DeepSeek V4.1&lt;/strong&gt; (open weights, MIT). The entire codebase: the engine, the sprite pipeline, the HUD/minimap, the mobile control layer, the build scripts. The sprite system below is a good example of what it produced unprompted — region-growing background removal with separate tolerances for JPEG noise, gradient backgrounds, and enclosed white regions, plus per-sheet frame-order correction so a mislabeled sprite sheet doesn't need regeneration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/** 抠除颜色容差平方（JPEG 压缩噪声余量） */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CUT_TOL2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;52&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cm"&gt;/** 区域生长局部色差容差平方：背景渐变相邻像素色差极小，可一路传播；轮廓线深色跳变被挡住 */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;LOCAL_TOL2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cm"&gt;/** 区域生长全局约束平方：局部传播只允许发生在与背景参考足够近的像素上，
    防止穿过轮廓断口漏进角色身体（浅色身体脱色 bug 根因） */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;GROW_BOUND2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's not boilerplate — that's a model reasoning about failure modes (light-colored bodies desaturating through contour gaps) and engineering around them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Art — MiniMax&lt;/strong&gt; (open weights). All 42 assets: 3 player duck skins (beret + backpack, steel helmet, red cap), 6 bosses (chicken, cat, dog, goose, weasel, fox — each with 8-direction sheets), soldier/ghost variants, guns, menu background. One flat-cartoon style, dark olive + beak-yellow tactical palette, held across every sheet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 美术素材：生成的角色 / Boss 立绘与主菜单背景（暗橄榄 + 鸭喙黄战术风）&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CHARACTER_ART&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;balanced&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.../aadkwds4vvmpi_ve_miaoda&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// 阿黄：贝雷帽+背包&lt;/span&gt;
  &lt;span class="na"&gt;tank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.../aadkwdtzotijo_ve_miaoda&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// 铁头：钢盔&lt;/span&gt;
  &lt;span class="na"&gt;scout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.../aadkwdu52jwci_ve_miaoda&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// 快羽：红棒球帽&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My job was art direction and integration: prompt the style once, hold it across 42 assets, wire the sheets into the engine's 8-direction system. The models did the drawing and the coding.&lt;/p&gt;

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

&lt;p&gt;🎬 Watch the 67-second gameplay demo: &lt;a href="https://youtube.com/shorts/vcrDhp-KuGg?si=RlrnwNCgE5lc5Tkz" rel="noopener noreferrer"&gt;https://youtube.com/shorts/vcrDhp-KuGg?si=RlrnwNCgE5lc5Tkz&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;67 seconds of real gameplay from the running web build: WASD movement, mouse-aim shooting, duck-vs-duck combat with +20 kill popups, "press E to loot" prompts, full HUD (health/ammo/timer/minimap). No scripted trailer — this is the game playing.&lt;/p&gt;

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

&lt;p&gt;The full repo will be public after the deadline rush. The two systems above are the heart of it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sprite pipeline&lt;/strong&gt; (&lt;code&gt;src/game/sprites.ts&lt;/code&gt;, 530 lines) — loads AI-generated 2×2 sprite sheets, chroma-keys white backgrounds and olive base discs via region growing, normalizes to 8-direction transparent sprites. Ships with per-sheet &lt;code&gt;diagOrder&lt;/code&gt; correction: if the model mislabels frame order on one sheet, you fix four numbers instead of regenerating.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engine&lt;/strong&gt; (&lt;code&gt;src/game/engine.ts&lt;/code&gt;, ~6,300 lines) — game loop, enemy AI (patrol/chase/attack states), collision, HUD, minimap, desktop + mobile input layers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Art manifest&lt;/strong&gt; (&lt;code&gt;src/game/art.ts&lt;/code&gt;, 69 lines) — every AI asset indexed by character/boss/weapon id, with commented rollback URLs for each art revision. The whole visual history of the project in one file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything above was generated by open-weight models. My commits are prompts, selections, and wiring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who would pay for this, and why
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Indie devs who can't afford artists&lt;/strong&gt;: 42 consistent sprites for $0 in marginal cost. The art department is now a prompt and a style bible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solo devs who can't afford a team&lt;/strong&gt;: a 6,300-line engine written by an open model you can self-host. The per-token meter is gone, so iteration 200 costs the same as iteration 1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The game itself&lt;/strong&gt;: Duck Evac is heading to TapTap as a commercial release. The side hustle isn't the tooling — it's the game the tooling made possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pitch: &lt;strong&gt;open weights turned a two-person studio (coder + artist) into one person with two models.&lt;/strong&gt; Duck Evac is the receipt.&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
