From 44d2b4353adf26f69767bfa16066b165fb2870d8 Mon Sep 17 00:00:00 2001 From: James Dansereau <106631954+jkdansereau@users.noreply.github.com> Date: Sun, 27 Sep 2026 15:00:01 -0400 Subject: [PATCH] options UI: anchor all file terminology on the manual's 'game file' (English review) Full-string audit of the settings UI (front options + F10 overlay): - front top-row label 'Save file' -> 'Game file' (the instruction manual's term) - per-file row tag '(profile)' -> '(game file)', both UIs - F10 unavailable value 'Select file' -> 'Select game file' - kept: 'File N' values, the '(File N)' section annotation and the '(no file)' unavailable state (short forms; the annotation's host word is the section title, which says the file number) - 'Bond file' now appears only in identifiers/config keys (Bond.* rows, watchSettings* names, ini keys), never user-visible Docs: D357 plan section 4 is now the terminology record (final string table); D358 finding notes the (profile) -> (game file) supersession. Build + headless smoke clean. --- docs/dev/D357-SETTINGS-VALUES-PLAN.md | 26 +++++++++++++++++++------- docs/dev/findings.md | 5 ++++- port/src/frontoptions.c | 11 ++++++----- port/src/optionsoverlay.c | 16 ++++++++-------- 4 files changed, 37 insertions(+), 21 deletions(-) diff --git a/docs/dev/D357-SETTINGS-VALUES-PLAN.md b/docs/dev/D357-SETTINGS-VALUES-PLAN.md index 62a2e7c7..60ff6264 100644 --- a/docs/dev/D357-SETTINGS-VALUES-PLAN.md +++ b/docs/dev/D357-SETTINGS-VALUES-PLAN.md @@ -9,7 +9,9 @@ the `Bond.*` rows only). Triggered by maintainer report: the current values are "a bit confusing". Companion change landed with this doc's review: the dim per-file row tag is -now **"(profile)"** (was "(save)"; user request, both UIs). +now **"(game file)"** (was "(save)"); the front top row reads **"Game +file"** and the F10 unavailable value reads **"Select game file"** — the +instruction manual's term (§4). ## 1. Problem @@ -111,13 +113,23 @@ ranges (2026-09-27). "Display" = what the value column shows today. | Frame rate cap | 60 · 0–1000 · 1 · `Uncapped/N FPS` | Turok: "up to 120 FPS" / uncapped | **Preset grid**: 0/30/60/120/144 (step = next preset, wraps to Uncapped); value text already `N FPS`/`Uncapped`. Decision: preset grid vs free 1-step (recommend presets; 117 FPS has no purpose). | | Show FPS | Off/On | both | Keep. | -## 4. Terminology +## 4. Terminology (instruction manual = "game file") -- Per-file row tag: **"(save)" → "(profile)"** (landed with this doc's - review; `frontoptions.c` + `optionsoverlay.c`, both draw paths + comments). -- Open question for the maintainer: the front screen's top row still reads - **"Save file: File N"** — rename to "Profile: File N" for consistency? - (Not done; the save *file* is literally what's being chosen.) +The instruction manual calls the per-player save a **"game file"**; the +settings UI anchors on that term (2026-09-27, maintainer request). Final +string set: + +| String | Where | State | +|---|---|---| +| **"Game file"** | front options top-row label (was "Save file") | changed | +| **"(game file)"** | per-file row tag, both UIs (was "(save)", briefly "(profile)") | changed | +| **"Select game file"** | F10 unavailable value (was "Select file") | changed | +| `File N` | row values + the `(File N)` section annotation | kept (value-column short form, PD "Player N" pattern) | +| `(no file)` | unavailable state, dim annotation | kept | + +"Bond file" remains in code identifiers/config keys (`Bond.*` rows, +`watchSettingsChooseFile`, ini keys) only -- never user-visible; the manual +and UI say "game file". ## 5. Gates diff --git a/docs/dev/findings.md b/docs/dev/findings.md index 3f38a9de..490f9ece 100644 --- a/docs/dev/findings.md +++ b/docs/dev/findings.md @@ -13965,4 +13965,7 @@ and are untouched. Verified by build + headless boot smoke; visual check of the screen owed (D357 plan gate 4). **Companion change (same commit):** the per-file row tag now reads -"(profile)" (was "(save)", maintainer request), both UIs. +"(profile)" (was "(save)", maintainer request), both UIs. (Later the same +day the tag and the rest of the file terminology were anchored on the +instruction manual's "game file" term: "(game file)" tag, "Game file" top +row, "Select game file" -- D357 plan §4.) diff --git a/port/src/frontoptions.c b/port/src/frontoptions.c index 6573e70e..8497ca04 100644 --- a/port/src/frontoptions.c +++ b/port/src/frontoptions.c @@ -500,9 +500,10 @@ Gfx *frontOptionsMenuDraw(Gfx *DL) DL = ink(DL, ROW_X + titleW + 8, TITLE_Y, note, INK_DIM); } - /* D356: the top save-file row (item 0, not in the row table): the + /* D356: the top game-file row (item 0, not in the row table; the + * label reads "Game file", the instruction manual's term): the * single file control of the front screen (F10 always targets the - * active file, so it has no file row). L/R (and A) cycle folders; "" + * active file, so it has no file row). L/R (and A) cycle folders; * (no file) is the unavailable state until one is created. */ { int y = rowY(0); @@ -511,7 +512,7 @@ Gfx *frontOptionsMenuDraw(Gfx *DL) DL = microcode_constructor_related_to_menus(DL, ROW_X - 2, y - 1, ROW_X + 140, y + 0xE, HILITE); } - DL = ink(DL, ROW_X, y, "Save file\n", INK); + DL = ink(DL, ROW_X, y, "Game file\n", INK); int f = watchSettingsActiveFolder(); if (f < 0) snprintf(sv, sizeof(sv), "(no file)"); else snprintf(sv, sizeof(sv), "File %d\n", f + 1); @@ -533,9 +534,9 @@ Gfx *frontOptionsMenuDraw(Gfx *DL) DL = ink(DL, ROW_X, y, label, INK); /* D357: per-file rows in the mixed-scope section carry a dim - * "(profile)" tag (the section title already says which file). */ + * "(game file)" tag (the section title already says which file). */ if (optionsRowIsSaveScoped(i)) { - DL = ink(DL, ROW_X + measureW(label) + 4, y, "(profile)\n", INK_DIM); + DL = ink(DL, ROW_X + measureW(label) + 4, y, "(game file)\n", INK_DIM); } if (optionsRowIsSlider(i)) { diff --git a/port/src/optionsoverlay.c b/port/src/optionsoverlay.c index fcfbe4e6..8132c0aa 100644 --- a/port/src/optionsoverlay.c +++ b/port/src/optionsoverlay.c @@ -146,7 +146,7 @@ struct Row { int dispDiv; /* D356: 1 = this row's value lives in the selected save file (per-file - * watch rows). Carries the dim "(profile)" tag on the only section that + * watch rows). Carries the dim "(game file)" tag on the only section that * mixes scopes (GAMEPLAY); on headers the flag is recomputed at init to * mean "this section contains per-file rows" (drives the "(File N)" * title annotation in both UIs). */ @@ -158,7 +158,7 @@ static struct Row rows[] = { * GAMEPLAY, GRAPHICS, AUDIO, VIDEO; docs/dev/D356-SETTINGS-REGROUP-PLAN.md). * The D353 "BOND FILE" section -- the one named after WHERE a value is * saved -- is gone: its surviving rows split into GAMEPLAY (the per-file - * watch toggles, dim "(profile)" tagged since the section mixes scopes) and + * watch toggles, dim "(game file)" tagged since the section mixes scopes) and * AUDIO (the per-file volume sliders, homogeneous so title annotation * only), and the "Edit file" chooser row is retired in favour of the * single top save-file row on the front options screen (frontoptions.c). @@ -198,7 +198,7 @@ static struct Row rows[] = { * Bond.AimControl collides with Input.AimMode (two rows fighting over * the same N64-vs-PC aim model). * The four surviving per-file toggles move here from the D353 BOND FILE - * section and carry .saveScoped (dim "(profile)" tag, the only mixed-scope + * section and carry .saveScoped (dim "(game file)" tag, the only mixed-scope * section). */ /* { .key="Bond.Look", .label="Look up/down (watch; stacks)", .kind=ROW_TOGGLE, .names=kReverse, .found=1, .uiMax=1, .cfgMax=1 }, */ @@ -1231,12 +1231,12 @@ static void valueText(int i, char *out, int n) double v = rowGet(r); if (r->kind == ROW_BOND_FILE) { int f = watchSettingsFolder(); - if (f < 0) snprintf(out, n, "Select file"); + if (f < 0) snprintf(out, n, "Select game file"); else snprintf(out, n, "File %d", f + 1); return; } if (watchSettingsFieldForKey(r->key) >= 0 && !watchSettingsAvailable()) { - snprintf(out, n, "Select file"); + snprintf(out, n, "Select game file"); return; } if (r->kind == ROW_RES) { @@ -1437,10 +1437,10 @@ Gfx *optionsOverlayEmit(void) gdl = drawText(gdl, OV_LABEL_X, rowY, (char *)r->label, r->found ? col : 0x808080ff); /* D357: per-file rows in the mixed-scope section carry a dim - * "(profile)" tag (the section title already says which file). */ + * "(game file)" tag (the section title already says which file). */ if (r->saveScoped && r->kind != ROW_HEADER) { gdl = drawText(gdl, OV_LABEL_X + measureText(r->label) + 5, rowY, - "(profile)", 0x909090ff); + "(game file)", 0x909090ff); } if (!r->found) { gdl = drawTextR(gdl, right, rowY, "(n/a)", 0x808080ff); @@ -1520,7 +1520,7 @@ int optionsRowIsBondChooser(int i) /* D356: content rows carry the literal per-file flag from the table; header * rows were recomputed at init to "this section contains per-file rows". - * Both drive UI decoration (the "(profile)" tag, the "(File N)" annotation). + * Both drive UI decoration (the "(game file)" tag, the "(File N)" annotation). * The F10 overlay and the front options screen are the only consumers. */ int optionsRowIsSaveScoped(int i) {