尚未检测到更新。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.