3 Commits

7 changed files with 66 additions and 6 deletions

View File

@@ -114,6 +114,66 @@ phases M2.0-M2.7).
game icon on the .exe (rcedit), Linux, and the update check below. game icon on the .exe (rcedit), Linux, and the update check below.
- **Updates**: the game (and a dedicated server) needs to notice when a new - **Updates**: the game (and a dedicated server) needs to notice when a new
version is out, download what's needed and install it. See below. version is out, download what's needed and install it. See below.
- **A single-player web version** (Paul, Nov 2026: after the playtest):
play straight from the download page, with "Download for the full game
and multiplayer" beside it. Godot's web export, single-threaded, on the
Compatibility renderer (WebGL 2). What we found (0.6.1):
- *The look:* rendered with that renderer (`build/web_look/`, from
`tools/site/shots.gd` run with `--rendering-method gl_compatibility`),
it's still clearly the game, but harsher: no volumetric fog or haze,
no SSAO/SSIL (darker, sharper shadows), deeper greens. Night and fire
light hold up. **The sea renders flat white**: `shaders/water.gdshader`
needs a Compatibility path. Ordinary distance fog would bring some
atmosphere back; grass density and tree counts likely need a lower
setting for browsers (speed not measured yet).
- *Single-player only:* browsers can't use ENet (UDP), and can't start
the Host Game or per-land server processes. Joining from a browser
would mean a WebSocket transport on the server, served over wss://
(a certificate per server): a separate, bigger job, if ever.
- *Saves* go in the browser's storage (IndexedDB): kept, but per browser
and lost if site data is cleared. Maybe an export/import button.
- *Input:* the pointer lock needs a click, and Esc releases it in the
browser, so the pause menu needs another key too (P).
- *Size and hosting:* the engine (godot.wasm, 39.5 MB) plus the game data
(about 22 MB) download first, then cache. Cloudflare Pages refuses files
over 25 MiB, so the .wasm has to live elsewhere (the Gitea release, or
another host) or be split.
- *Size of the job:* one step to build it and see how it runs, another to
fix the water, tune the graphics and controls, and put it on the page.
- **Cloud saves** (Paul, Nov 2026: with the web version, and useful before
it, desktop to desktop): carry a single-player world between the desktop
game and the browser, **both ways**.
- *In the game:* pause menu **Save to cloud** (a cloud name and a password
the first time; after that it can upload on each save: autosave, sleep,
quit); title screen **Load from cloud** (name and password, pick a
world, it downloads and you carry on). What travels: the world folder
(`meta.json`, `world.json`), its explored map (`maps/`), and which of
Old Tam's tips you've seen. Not online worlds (they live on their server).
- *Size:* a world is 8-32 KB on disk, a few KB compressed: uploads are
instant and storage is next to free.
- *Where:* a Cloudflare Worker beside the site (`/api/...`), saves in R2
(or D1). Free tier is plenty. (Paul's own server would do, but is one
more service to keep running.)
- *Safety:* passwords never stored, only a salted hash (PBKDF2, WebCrypto
in the Worker); HTTPS only; wrong guesses lock a name out for a while;
a size cap and a world count per name. Option: encrypt the save with
the password in the game before upload, so the server holds only
ciphertext (but a forgotten password loses the cloud copy; the local
copy is unaffected).
- *Playing in two places:* each upload carries a counter. If the cloud's
copy is newer than the one you last downloaded, the game asks ("The
cloud has a newer save (from the web, 20 minutes ago): use that, or
keep this one?") instead of overwriting it.
- *Versions:* the same save format on desktop and web; a save from a
newer version than the game says so rather than loading it badly.
- *Size of the job:* one step for the Worker and storage (with tests), one
for the game side (name and password, the buttons, the newer-copy
question). Paul creates the Worker and its storage in his Cloudflare
account; the code and setup steps come with it.
- **Later, maybe:** Android tablets (Nov 2026: left for now). Most input is
already named actions, so a touch layer (stick, look, contextual buttons)
is possible; the Mobile renderer has the same lost effects as the web, and
a tablet can join but not host (no server processes).
### Updates (to design with the packaged builds) ### Updates (to design with the packaged builds)
Needed because every network change bumps the protocol (12 as of P5), and Needed because every network change bumps the protocol (12 as of P5), and

View File

@@ -95,7 +95,7 @@ weather_wind={
[cinderwild] [cinderwild]
updates/feed="https://git.psbailey.uk/api/v1/repos/Admin/Emberwild/releases/latest" updates/feed="https://git.psbailey.uk/api/v1/repos/Admin/Cinderwild/releases/latest"
[rendering] [rendering]

View File

@@ -10,7 +10,7 @@ extends RefCounted
## crash or an error: the pause menu shows where it is and opens its folder, ## crash or an error: the pause menu shows where it is and opens its folder,
## to attach the file to the issue. ## to attach the file to the issue.
const REPO := "https://git.psbailey.uk/Admin/Emberwild" const REPO := "https://git.psbailey.uk/Admin/Cinderwild"
## An autoload (Net, Updates), looked up at run time: this script is also ## An autoload (Net, Updates), looked up at run time: this script is also
## loaded by tests that start before the autoloads are compiled in. ## loaded by tests that start before the autoloads are compiled in.

View File

@@ -43,7 +43,7 @@ func _body() -> void:
print("the link") print("the link")
var url: String = BugReport.issue_url(w) var url: String = BugReport.issue_url(w)
check(url.begins_with("https://git.psbailey.uk/Admin/Emberwild/issues/new?title=Bug%3A%20&body="), "a new issue on the Cinderwild repo") check(url.begins_with("https://git.psbailey.uk/Admin/Cinderwild/issues/new?title=Bug%3A%20&body="), "a new issue on the Cinderwild repo")
check(url.length() < 4000, "short enough for any browser (%d characters)" % url.length()) check(url.length() < 4000, "short enough for any browser (%d characters)" % url.length())
var body := url.get_slice("&body=", 1).uri_decode() var body := url.get_slice("&body=", 1).uri_decode()
var ver: String = String(ProjectSettings.get_setting("application/config/version")) var ver: String = String(ProjectSettings.get_setting("application/config/version"))

View File

@@ -10,7 +10,7 @@
# Applications). It's read from the environment, never from the command line. # Applications). It's read from the environment, never from the command line.
cd "$(dirname "$0")/.." || exit 1 cd "$(dirname "$0")/.." || exit 1
API=${API:-https://git.psbailey.uk/api/v1/repos/Admin/Emberwild} API=${API:-https://git.psbailey.uk/api/v1/repos/Admin/Cinderwild}
[ -n "$GITEA_TOKEN" ] || { echo "set GITEA_TOKEN first: read -s GITEA_TOKEN && export GITEA_TOKEN"; exit 1; } [ -n "$GITEA_TOKEN" ] || { echo "set GITEA_TOKEN first: read -s GITEA_TOKEN && export GITEA_TOKEN"; exit 1; }
[ -f build/version.json ] || { echo "no build/version.json: run tools/export.sh first"; exit 1; } [ -f build/version.json ] || { echo "no build/version.json: run tools/export.sh first"; exit 1; }
VERSION=$(python3 -c "import json; print(json.load(open('build/version.json'))['version'])") VERSION=$(python3 -c "import json; print(json.load(open('build/version.json'))['version'])")

View File

@@ -430,7 +430,7 @@ The music follows what's happening: calm by day, a night theme after dark, a sto
### Reporting a bug ### Reporting a bug
**Report a bug** in the pause menu opens a new issue on Cinderwild's [Gitea page](https://git.psbailey.uk/Admin/Emberwild/issues) in your browser, already filled in with your version, computer, mode, land, the in-game time and where you are. Say what happened and how to make it happen again, then press **Create Issue** (you'll need to be signed in there). Nothing is sent from the game itself. **Copy the details** puts the same details on your clipboard instead, and **Show the log file** opens the folder with `godot.log`: attach it for a crash or an error. **Report a bug** in the pause menu opens a new issue on Cinderwild's [Gitea page](https://git.psbailey.uk/Admin/Cinderwild/issues) in your browser, already filled in with your version, computer, mode, land, the in-game time and where you are. Say what happened and how to make it happen again, then press **Create Issue** (you'll need to be signed in there). Nothing is sent from the game itself. **Copy the details** puts the same details on your clipboard instead, and **Show the log file** opens the folder with `godot.log`: attach it for a crash or an error.
### Updates ### Updates

View File

@@ -14,7 +14,7 @@
# Rebuild it after each release (the links name the version). # Rebuild it after each release (the links name the version).
cd "$(dirname "$0")/../.." || exit 1 cd "$(dirname "$0")/../.." || exit 1
REPO=${REPO:-https://git.psbailey.uk/Admin/Emberwild} REPO=${REPO:-https://git.psbailey.uk/Admin/Cinderwild}
SITE=${SITE:-https://cinderwild.psbailey.uk} # (where the page is served: for link previews) SITE=${SITE:-https://cinderwild.psbailey.uk} # (where the page is served: for link previews)
SHOTS="meadow hut wolves winter cove treasure crabs" SHOTS="meadow hut wolves winter cove treasure crabs"
[ -f build/version.json ] || { echo "no build/version.json: run tools/export.sh first"; exit 1; } [ -f build/version.json ] || { echo "no build/version.json: run tools/export.sh first"; exit 1; }