尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Emberblood: a top-down open-world action game in the browser. Relight the Wards and face your great x13 grandfather.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A top-down, open-world action game you play in the browser. No install, no downloads.
Play it: https://playemberblood.com
Every summer, on the shortest night of the year, the valley of Embermere hangs out paper lanterns, and nobody remembers why. In Emberhollow they are lit by Ash, who was born with horns, a tail and real fire. All he wants this year is to light three lanterns without setting anything else alight.
Then, in the middle of the festival, the North Gate swings open, and the old puppet show about the dragon on the mountain turns out to be more than a puppet show.
It is the start of a long way from home: over the rooftops of a city where every clock has stopped, into a winter that came in June, across the sea, and up a mountain that was not there the day before. And the whole time, back home, his mom keeps a light on.
| Keyboard and mouse | |
|---|---|
| WASD / arrows | Move (Ash faces the way he walks) |
| Shift | Sprint |
| Left click / J / Enter | Attack with the current weapon (it locks onto a foe in front of you). With no foe near, it talks, opens and uses instead |
| Right click / K | Fire breath (also lights lanterns) |
| Space | Dodge roll |
| C | Jump (once Ash learns how) |
| X / Z / 1 to 6 | Next weapon / previous weapon / pick a weapon |
| G | Call your companion (twice: wait here) |
| U | Skills |
| Q | Dragon Roar |
| R | Healing draught |
| E | Talk, open, rest |
| M / Tab | Map and fast travel |
| I | Quest journal |
| T | Switch which tracked quest the compass follows |
| N | Mute or unmute |
| Esc / P | Pause and settings |
| L | In a conversation: open the Log |
Mouse aiming (Ash faces the pointer) is an option in Settings: Aim with the mouse. Settings also has Handed: Left, which mirrors the touch buttons, switches the controller to southpaw, and shows a keyboard set for a mouse in the left hand (arrow keys move; Enter attacks or talks, Right Shift sprints, Right Ctrl rolls, / jumps, ' breathes fire, . drinks, ; roars, [ and ] switch weapons). Tips can be closed with their X or turned off in Settings.
| Controller (PlayStation, Xbox or Nintendo) | |
|---|---|
| Left stick | Move (push all the way to sprint, click to toggle sprint) |
| Right stick | Aim |
| Bottom button (A, ✕, B) | Jump (once Ash learns how) |
| Right button (B, ○, A) | Roll |
| Left button (X, □, Y) | Attack |
| Top button (Y, △, X) | Talk, open, use |
| RT / R2 and LT / L2 | Attack and fire breath |
| RB / R1 and LB / L1 | Next and previous weapon (both together: Roar) |
| D-pad | Up: drink. Down: call your companion. Left and right: switch the followed quest |
| Start / Menu | Pause (hold: Skills) |
| View / Select | Map (hold: Journal) |
Menus, dialogue and the skill tree all work with a controller too. On an Xbox the game runs in the Edge browser.
Touch controls appear automatically on phones and tablets. In Settings you can pick a two-thumb layout (stick on the left, a thumb arc of buttons on the right) or a one-handed layout for either hand, turn on auto-attack, and resize the buttons.
Saves always live in your browser. If you make an account, your story also syncs to the cloud so you can pick it up on another device, and your Arena best goes on the leaderboard.
The backend is a tiny Cloudflare Worker with a D1 (SQLite) database. It fits in Cloudflare's free tier and, unlike some free databases, it doesn't pause or get deleted when nobody plays for a while. Passwords are hashed with PBKDF2-SHA256, sessions are random tokens stored only as hashes, and there's no email or personal info.
game/src/ game code, split into modules (concatenated in order by build.mjs)
game/story/ the story as data: chapters, side quests, talk, clues and the world registry, act by act
game/*.html page markup and styles
tools/ the story checker, the story map, the world check and the old-text extractor
build.mjs builds docs/index.html (and runs the story checker first)
docs/ the published site (GitHub Pages serves this folder)
worker/ Cloudflare Worker API + D1 schema
node build.mjs # uses game/config.json for the API address
API_BASE=http://127.0.0.1:8787 node build.mjs # point at a local worker
Then open docs/index.html, or serve the folder (npx serve docs).
The story lives in game/story/ as plain data that one engine (game/src/e10_story.js) runs. Every build checks it first and stops if the story and the world disagree: a place the story mentions that isn't on the map, a key that opens nothing, a step that can't be reached with the powers you have by then, a scene that runs too long. The report goes to dist/check.md.
node tools/check.mjs # the story check on its own (--act 2 for one act)
node tools/storymap.mjs # dist/storymap.html: every act as a graph of chapters, clues and choices
python3 tools/worldcheck.py # boots the game headless and checks every place and gate is really there
cd worker
npm install
npx wrangler login
npx wrangler d1 create emberblood # copy the database_id into wrangler.toml
npx wrangler d1 execute emberblood --remote --file=schema.sql
npx wrangler deploy
A database made from an older schema.sql needs the migrations in worker/migrations/ once, in order (npx wrangler d1 execute emberblood --remote --file=migrations/0001_admin.sql).
Put the *.workers.dev URL it prints into game/config.json, rebuild, and push.
docs/admin.html (on the live site at /emberblood/admin.html) is for the accounts named in ADMIN_USERS in wrangler.toml. It lists every account with its journeys, last save and Arena scores, and lets an admin view, download or replace a save (the old one is kept as a backup, and backups can be restored), set a new password, pause or turn an account back on, delete an account, and "view as" any account. A view session is look-only: the server accepts its saves and scores but never writes them, it never renews, and it ends after 12 hours. Use it in a private window, because the game in that window loads the viewed account's journeys. The live game uses https://emberblood-api.muellercodes.workers.dev. Allowed browser origins are set by ALLOWED_ORIGINS in wrangler.toml (localhost is always allowed for testing).
The story and the art of Emberblood (the world, characters, writing, and every visual design, including the code that draws it) are © 2026 Andrew Mueller, all rights reserved. The rest of the code (the engine, build script, tools and backend) is MIT licensed. See LICENSE for the details.