Files
tws-zombies-scripts/CHANGELOG.md
T

684 lines
40 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Changelog
Changes are listed newest first, with an independent version for every individual
T5/T6 script and each native plugin. Current versions are recorded in
[versions.json](versions.json); see the [version policy](README.md#versioning).
## 2026-10-15 — Player moderation runtime
- **tws_t5_moderation.gsc 1.0.0 / tws_t6_moderation.gsc 1.0.0**: new optional
paired scripts register current GUIDs and use the existing shared connection
dispatcher. Require common 1.2.0, the matching native plugin 1.3.0, and Electric
Cherry's instance-authenticated moderation endpoint/private configuration.
- **t5-plugin 1.3.0 / t6-plugin 1.3.0**: add the native moderation component and
policy/journal utilities, connection-bound synchronous actions, durable cached
bans/mutes and expiry/revocation, and an opt-in bounded HTTP response limit.
Existing HTTP callers keep their previous limit behavior. Sources are each
plugin's component/moderation.cpp, utils/moderation.*, and utils/http.*.
Both games change for matching functionality; their chat opcodes remain distinct.
- Deploy the receiver first; build and install both matching DLL/script pairs,
supply separate instance credentials, and fully restart game-server processes.
Persistent tws-moderation directories must survive restart. No deployment or
live Windows/Plutonium verification is claimed. See [runtime contract and
validation](docs/moderation.md).
- Validation: paired native moderation policy/adapter checks passed with ASan and
UBSan, including separate-process journal and session-sequence recovery. The
GSC identity and retry/disable/resume checks, native HTTP cap/error checks,
existing HTTP component, bank and telemetry checks, metadata/link validation,
and `git diff --check` passed. Native adapter tests use engine shims; no DLL
build, GSC compilation or live game validation was performed.
## 2026-10-15
### Replace the dashboard panels with unboxed HUD overlays
| Component | Version | Affected source |
| --- | --- | --- |
| `tws_t5_common.gsc` | `1.4.0` | `t5/scripts/tws_t5_common.gsc` |
| `tws_t6_common.gsc` | `1.4.0` | `t6/scripts/tws_t6_common.gsc` |
| `tws_t5_hud.gsc` | `1.4.0` | `t5/scripts/tws_t5_hud.gsc` |
| `tws_t6_hud.gsc` | `1.4.0` | `t6/scripts/tws_t6_hud.gsc` |
| `tws_t5_afk.gsc` | `1.2.0` | `t5/scripts/tws_t5_afk.gsc` |
| `tws_t6_afk.gsc` | `1.2.0` | `t6/scripts/tws_t6_afk.gsc` |
- Both games use the supplied minimal layout: unlabeled match/round timers at
upper left, combined branding at top center, zombies above a slim health bar
at bottom center, and numeric current/maximum HP to its right only while
injured. Center the AFK indicator above the zombie count. Remove dashboard
backgrounds while retaining outlined text and health colors.
- Keep `.hud` as a private visibility toggle for the entire core and AFK
indicator. Hidden data updates, frozen game-over values, connection/spawn
lifecycle, AFK protection and stock HUD behavior are unchanged.
- Move services into an unboxed upper-right area below the Plutonium tag.
Records use a compact right-aligned `Map record · Round N` header and up to
three existing bounded holder lines, with no footer or single-page counter.
Record data, cache behavior, all tied holders and 12-second paging remain
unchanged; leaderboard source and versions are unchanged.
- Show all nine installed commands, including `.hud`, in one help list with
full `.d <amount|all>` / `.w <amount|all>` syntax. Both engines use explicit
command/description rows; extra registrations use pages of nine, with a
counter only for multi-page lists. Preserve private requests, help priority,
record pause/resume, replay replacement and 12-second page timing.
- Allocate only the active service view in both engines and destroy it when
idle or before switching kinds. Core + AFK use 11 + 1 archived elements;
nine-command help uses 19 nonarchived elements (20 with a multi-page counter),
and records use four (five with a multi-page counter). Idle holds none.
These counts do not establish live Plutonium rendering capacity.
- Common adds fullscreen overlay helpers using direct normalized `640 × 480`
positions and integer shader dimensions. Retain legacy panel helpers for
compatibility. Both HUD and AFK implementations use the new helpers.
- Validation: `node tools/check_hud.mjs` passed 15 core HUD/AFK and 56 service/
static checks (71 total). Leaderboard passed 143 checks, bank 42, join 17 and
telemetry 23 through their portable check scripts. JSON uniqueness, the
16-script manifest, all six version/changelog matches, 66 local documentation
links/anchors and `git diff --check` passed. Checks use engine shims; actual
EC bank integration was not run. GSC compilation was not run because
gsc-tool/PowerShell are unavailable; live Windows/Plutonium validation remains
outstanding.
- Compatibility: HUD `1.4.0` and AFK `1.2.0` require matching common `1.4.0+`.
Both engines receive companion changes; leaderboard `1.1.0` remains
compatible. No new Plutonium, native-plugin or backend requirement.
- Deployment: copy each game's common, HUD and AFK scripts together where
installed, then restart the map. No full server-process restart or plugin
update is required. No deployment performed. Windows/Plutonium layout,
element capacity, stock HUD overlap and lifecycle validation remain required.
## 2026-10-14
### Release T5 service elements when records or help close
| Component | Version | Affected source |
| --- | --- | --- |
| `tws_t5_common.gsc` | `1.3.1` | `t5/scripts/tws_t5_common.gsc` |
- Address core HUD elements disappearing when the first record announcement
opens and remaining absent after it closes. The previous T5 service allocated
all 24 help/record elements at once and retained them while idle. That pattern
is consistent with HUD allocation pressure; the live T5 SP capacity has not
been established.
- Allocate only the active service view, with at most 12 elements for help or
11 for records. Release the elements when the service becomes idle and before
switching between help and records. Reuse them for pages within the same
view, and render the page indicator as one cached text element. The single
controller, help priority, paused record timing and request replacement remain
intact. Core elements and their visibility setting are unchanged.
- T6 needs no source change: the reported failure is on T5, whose explicit help
rows expanded its former allocation to 24 elements. T6 retains its smaller
18-element multiline renderer; validate its existing behavior separately.
- Validation: `node tools/check_hud.mjs` passed 15 core HUD/AFK and 53 service/
static checks (68 total), including active-view allocation, idle release,
repeated service cycles and core preservation. Leaderboard passed 143 checks,
bank 42, join 17 and telemetry 23 through their portable check scripts. These
use engine shims; actual EC bank integration was not run. Live Windows/
Plutonium rendering validation was not performed.
- Compatibility: HUD `1.3.0`, AFK `1.1.0` and leaderboard `1.1.0` remain
compatible. No new dependency requirement. Deployment: copy only
`tws_t5_common.gsc` and restart the map. No plugin update or full server-process
restart is required. No deployment performed; live T5 validation must confirm
core integrity during automatic records, help, view switches and dismissal.
### Add a per-player HUD visibility command
| Component | Version | Affected source |
| --- | --- | --- |
| `tws_t5_common.gsc` | `1.3.0` | `t5/scripts/tws_t5_common.gsc` |
| `tws_t6_common.gsc` | `1.3.0` | `t6/scripts/tws_t6_common.gsc` |
| `tws_t5_hud.gsc` | `1.3.0` | `t5/scripts/tws_t5_hud.gsc` |
| `tws_t6_hud.gsc` | `1.3.0` | `t6/scripts/tws_t6_hud.gsc` |
| `tws_t5_afk.gsc` | `1.1.0` | `t5/scripts/tws_t5_afk.gsc` |
| `tws_t6_afk.gsc` | `1.1.0` | `t6/scripts/tws_t6_afk.gsc` |
- Both HUD modules handle the exact, case-insensitive `.hud` chat command to
toggle that player's core branding, timers, zombie count, HP/bar and AFK
indicator. Visibility defaults on, persists across death/respawn on the
current connection/map, and resets on reconnect or map restart.
- Common tracks core elements and their intended alpha values so changing
visibility preserves each element's state. Data and timers continue updating
while hidden, and game-over values remain frozen. AFK routes only its
indicator visibility through these helpers; protection behavior is unchanged.
Help, records and stock HUD elements are unaffected.
- Register `.hud` in help only when the HUD module is installed. The full
command order is `.help`, `.hud`, `.afk`, `.back`, `.join`, `.leaders`, `.b`,
`.d`, `.w`: nine commands across pages of four, four and one. T5 retains
explicit help rows; T6 retains multiline columns.
- Compatibility: HUD `1.3.0` and AFK `1.1.0` require their matching common
`1.3.0+`. Both engines receive companion implementations. No new Plutonium,
native-plugin or backend dependency requirement.
- Deployment: update each game's common, HUD and AFK scripts together where
installed, then restart the map. No plugin update or full server-process
restart is required. No deployment performed; GSC compilation and live
T5/T6 validation remain required.
- Validation: `node tools/check_hud.mjs` passed 15 core HUD/AFK and 48 service/
static checks (63 total), covering private visibility, intended opacity,
late-created elements, hidden updates/frozen clocks, AFK transitions, service
independence, conditional help and three-page ordering. Leaderboard passed
143 checks, bank 42, join 17 and telemetry 23 through their existing portable
check scripts. These use engine shims; actual EC bank integration was not run.
GSC compiler and PowerShell were unavailable, and live Windows/Plutonium
validation was not performed.
### Render T5 help as separate rows
| Component | Version | Affected source |
| --- | --- | --- |
| `tws_t5_common.gsc` | `1.2.6` | `t5/scripts/tws_t5_common.gsc` |
- Replace T5's newline-separated help columns with four preallocated
command/description pairs, positioned on separate rows. This addresses BO1
rendering the newline text as one concatenated line. Reuse the row elements
across pages and hide unused rows on short pages.
- Preserve panel dimensions, four commands per page, 12-second timing and the
removed help footer. T5's service now uses 24 nonarchived HUD elements.
T6 needs no source change: its existing multiline renderer remains in place
with 18 service elements; the reported rendering issue was observed in T5.
- Validation: `node tools/check_hud.mjs` passed 8 core and 42 service checks
(50 total), covering both engines' pagination and T5's distinct row elements,
partial-page hiding, reuse, record transitions and disconnect cleanup.
GSC compilation and live T5 display/notification validation were not run.
- Compatibility: existing HUD `1.2.1` remains compatible; no new dependency
requirement. Deployment: copy only the updated T5 common script and restart
the map. No plugin update or full server-process restart is required.
No deployment performed; live T5 display validation remains required.
### Remove the help footer
| Component | Version | Affected source |
| --- | --- | --- |
| `tws_t5_common.gsc` | `1.2.5` | `t5/scripts/tws_t5_common.gsc` |
| `tws_t6_common.gsc` | `1.2.5` | `t6/scripts/tws_t6_common.gsc` |
- Both games remove the `Four commands per page` footer and its HUD element.
Help still displays four commands per page with its page indicator and
existing timing. The shared service now uses 18 nonarchived elements.
- Validation: `node tools/check_hud.mjs` passed 8 core and 41 service checks
(49 total), including the 18-element allocation and removed help footer.
GSC compilation and live Plutonium validation were not run.
- Compatibility: existing HUD `1.2.1` remains compatible; no new dependency
requirement. Deployment: copy only each game's updated common script and
restart the map. No plugin update or full server-process restart is required.
No deployment performed; live T5/T6 display validation remains required.
### Hide the page indicator for single-page records
| Component | Version | Affected source |
| --- | --- | --- |
| `tws_t5_common.gsc` | `1.2.4` | `t5/scripts/tws_t5_common.gsc` |
| `tws_t6_common.gsc` | `1.2.4` | `t6/scripts/tws_t6_common.gsc` |
- Both games hide `1 / 1` when the record service has only one page. Records
spanning multiple pages and all help pages retain their page indicators.
- Validation: `node tools/check_hud.mjs` passed 8 core and 41 service checks
(49 total), including empty/unavailable records, multi-page indicators,
replacement by a single-page record, resuming after help, and single-page
help indicators. GSC compilation and live Plutonium validation were not run.
- Compatibility: existing HUD `1.2.1` remains compatible; no new dependency
requirement. Deployment: copy only each game's updated common script and
restart the map. No plugin update or full server-process restart is required.
No deployment performed; live T5/T6 display validation remains required.
### Restore panel backgrounds and health bars
| Component | Version | Affected source |
| --- | --- | --- |
| `tws_t5_common.gsc` | `1.2.3` | `t5/scripts/tws_t5_common.gsc` |
| `tws_t6_common.gsc` | `1.2.3` | `t6/scripts/tws_t6_common.gsc` |
- Both engines apply the final integer conversion after `max()` in
`make_panel_width()`. Native `max()` returns a float, which `SetShader`
rejects for its integer width argument; converting before `max()` left
backgrounds and health-bar shaders missing. The corrected helper supplies
integer widths to both panel creation and health-bar updates.
- Retain panel color `(0.07, 0.10, 0.08)`, opacity `0.72`, and the corrected
text positions/font sizes. HUD source is unchanged and remains `1.2.1`.
- Validation: `node tools/check_hud.mjs` passed 8 core and 41 service checks
(49 total). The new regression models native float typing and strict integer
shader widths, and checks the existing panel color/opacity. GSC compiler and
PowerShell were unavailable; GSC compilation and live Windows/Plutonium display
validation were not performed.
- Compatibility: use matching common `1.2.3+` with HUD `1.2.1`; no new
Plutonium, native-plugin or backend dependency requirement. Deployment: if
HUD `1.2.1` is already installed, copy only each game's updated common script
and restart the map. No plugin update or full server-process restart is
required. No deployment performed; verify restored shaders in T5 and T6.
### Correct footer font size and screen-edge panel placement
| Component | Version | Affected source |
| --- | --- | --- |
| `tws_t5_common.gsc` | `1.2.2` | `t5/scripts/tws_t5_common.gsc` |
| `tws_t6_common.gsc` | `1.2.2` | `t6/scripts/tws_t6_common.gsc` |
| `tws_t5_hud.gsc` | `1.2.1` | `t5/scripts/tws_t5_hud.gsc` |
| `tws_t6_hud.gsc` | `1.2.1` | `t6/scripts/tws_t6_hud.gsc` |
- Both engines enforce a minimum text font scale of `1.0`, with both service
footers explicitly at `1.0`, addressing the oversized `.leaders` footer.
- Use fullscreen horizontal and vertical anchors so panels follow the actual
upper-right screen edge instead of safe-area insets. Convert horizontal
design offsets and shader widths by `0.75` into the normalized 640-wide
viewport; use a top offset of 20. The 1920×1080 reference yields a 495-pixel
panel, 22.5-pixel right margin and 45-pixel top margin, leaving space for the
Plutonium tag. Other aspect ratios retain normalized horizontal geometry,
so physical proportions vary; live font fit and tag clearance need validation.
- Both HUD scripts use common's new `make_panel_width(width)` for health-bar
updates so the fill uses the same width conversion as its track. T5 and T6
receive the same fix with their matching namespaces.
- Compatibility: HUD `1.2.1` requires matching common `1.2.2+`; upgrade common
and HUD together. No new Plutonium, native-plugin or backend dependency is
required.
- Deployment: copy each game's updated common and HUD scripts and restart the
map. No full server-process restart is required. No deployment performed;
GSC compilation and live Windows/Plutonium display validation remain required.
- Validation: `node tools/check_hud.mjs` passed 8 core and 39 service/static
geometry checks (47 total); `node tools/check_leaderboard.mjs` passed 143
checks. The geometry shims cover 4:3, 16:9 and ultrawide bounds in a normalized
640×480 frame, not live glyph fit or tag clearance. GSC compiler and PowerShell
were unavailable; no GSC compilation or live display validation was performed.
### Shorter map-record footer
| Component | Version | Affected source |
| --- | --- | --- |
| `tws_t5_common.gsc` | `1.2.1` | `t5/scripts/tws_t5_common.gsc` |
| `tws_t6_common.gsc` | `1.2.1` | `t6/scripts/tws_t6_common.gsc` |
- Both games remove `Briefly shown` and its separator from the map-record
footer, retaining `.leaders to view again`. Record timing and replay behavior
are unchanged.
- Validation: `node tools/check_hud.mjs` passed 8 core and 35 service checks
using engine shims. GSC compilation and live Plutonium display validation
were not run.
- Compatibility: no new dependency requirement. Deployment: copy each game's
updated common script and restart the map. No plugin update or full
server-process restart is required. No deployment performed; GSC compilation
and live T5/T6 display validation remain required.
### Fixed upper-right core HUD and shared service window
| Component | Version | Affected source |
| --- | --- | --- |
| `tws_t5_common.gsc` | `1.2.0` | `t5/scripts/tws_t5_common.gsc` |
| `tws_t6_common.gsc` | `1.2.0` | `t6/scripts/tws_t6_common.gsc` |
| `tws_t5_hud.gsc` | `1.2.0` | `t5/scripts/tws_t5_hud.gsc` |
| `tws_t6_hud.gsc` | `1.2.0` | `t6/scripts/tws_t6_hud.gsc` |
| `tws_t5_leaderboard.gsc` | `1.1.0` | `t5/scripts/tws_t5_leaderboard.gsc` |
| `tws_t6_leaderboard.gsc` | `1.1.0` | `t6/scripts/tws_t6_leaderboard.gsc` |
| `tws_t5_afk.gsc` | `1.0.1` | `t5/scripts/tws_t5_afk.gsc` |
| `tws_t6_afk.gsc` | `1.0.1` | `t6/scripts/tws_t6_afk.gsc` |
- Both engines use a fixed upper-right core panel below the top edge, with
`TWS ZOMBIES`, `discord.tws.lol`, side-by-side match/round timers, zombie count,
current/maximum HP even at full health, and a full-width health bar. Replace
the co-op name row with reserved footer space for the AFK indicator. Core
creation on connection supports spectator placeholders without seeding the
match clock early. Preserve each engine's timer behavior and frozen clocks at
game end; health and zombie-count workers now freeze on both engines as well.
Missing max-health values use a display fallback without modifying gameplay health.
- Common owns one fixed-height service window below the core. Help shows four
commands per page for 12 seconds each, in stable order and filtered by loaded
modules. `.help` / `.commands` restart at page one. The final page dismisses
automatically; opening a service never shifts or resizes the core.
- Render help with two fixed multiline text columns and a muted command-column
backdrop. The service uses 19 nonarchived HUD elements regardless of command
or page count; the core and AFK use 15 + 1 archived elements. Reuse text and
numeric displays instead of allocating elements for every command/page.
- Records use the same window, with a prominent round, page count, replay hint,
and up to three holder lines per page. Abbreviate overlong individual names
without splitting UTF-8 characters; retain every tied holder across bounded
lines and pages. Help pauses records and resumes their remaining page time;
`.leaders` during help replaces the pending record from page one. Unavailable
records are distinct from an empty recorded history. Help and records remain
private and work without the HUD module. Reused elements and request state
protect newer displays from stale timers and clean up on disconnect/game end.
- Compatibility: HUD `1.2.0`, leaderboard `1.1.0`, and AFK `1.0.1` require the
matching game's common `1.2.0+`. Existing common helper signatures remain
available for unchanged consumers. No new native-plugin, backend or external
dependency requirement; existing leaderboard HTTP/JSON requirements still apply.
Both T5 and T6 receive companion implementations adapted to their engines.
- Deployment: copy each game's matching common, HUD, leaderboard and AFK scripts
that are installed, then restart the map. No plugin update or full server-process
restart is required for this change. No deployment performed.
- Validation: `node tools/check_hud.mjs` passed 8 core and 35 service checks;
`node tools/check_leaderboard.mjs` passed 143 checks, `node tools/check_bank.mjs`
passed 42 fixture groups, `node tools/check_join.mjs` passed 17 checks, and
`node tools/check_telemetry.mjs` passed 23 checks. These use engine shims.
No local GSC compiler or PowerShell was available; GSC compilation and live
Windows/Plutonium validation remain required. Follow the
[HUD validation guide](README.md#hud-validation) before rollout.
## 2026-10-13
### Shorter Discord URL
| Component | Version | Affected source |
| --- | --- | --- |
| `tws_t5_hud.gsc` | `1.1.2` | `t5/scripts/tws_t5_hud.gsc` |
| `tws_t6_hud.gsc` | `1.1.2` | `t6/scripts/tws_t6_hud.gsc` |
- Both games replace the displayed Discord URL with `https://discord.tws.lol`.
Keep the smaller font and muted gray introduced in the already-uploaded
`1.1.1` release.
- Compatibility: no new dependency requirement; matching common `1.1.0+`
remains required. Deployment: copy each updated HUD script and restart the
map. No plugin update or full server-process restart is required. No
deployment of `1.1.2` performed here; GSC compilation and live T5/T6 display
verification remain required.
### More subtle Discord label
| Component | Version | Affected source |
| --- | --- | --- |
| `tws_t5_hud.gsc` | `1.1.1` | `t5/scripts/tws_t5_hud.gsc` |
| `tws_t6_hud.gsc` | `1.1.1` | `t6/scripts/tws_t6_hud.gsc` |
- Both games reduce the top-left Discord URL font scale from `1.4` to `1.2`
and darken its neutral gray from `(0.85, 0.85, 0.85)` to `(0.65, 0.65, 0.65)`.
The label keeps its position and connection lifetime; other HUD text is
unaffected.
- Compatibility: no new dependency requirement; matching common `1.1.0+`
remains required. Deployment: copy each updated HUD script and restart the
map. No plugin update or full server-process restart is required. The user
reports `1.1.1` has been uploaded; GSC compilation and live T5/T6 appearance
verification have not been performed here.
### Simplified bank balance message
| Component | Version | Affected source |
| --- | --- | --- |
| `tws_t5_bank.gsc` | `2.0.3` | `t5/scripts/tws_t5_bank.gsc` |
| `tws_t6_bank.gsc` | `2.0.3` | `t6/scripts/tws_t6_bank.gsc` |
- Both games now display `.b` as `Bank: {balance} points`, retaining the
existing colors and omitting the available amount. Update startup version
reporting and the existing balance-message fixtures. API data and point
accounting are unchanged.
- Validation: all 42 portable bank script fixture groups passed with
`node tools/check_bank.mjs`, including exact balance text for both games.
- Compatibility: no new dependency requirement; matching TWS plugins `1.2.0+`
remain required. Deployment: copy each updated bank script and restart the
map. No plugin update or full server-process restart is required for this
change. No deployment performed; GSC compilation and live T5/T6 display
verification remain required.
### Bank failure diagnostics — TWS #14
| Component | Version | Affected source |
| --- | --- | --- |
| `tws_t5_bank.gsc` | `2.0.2` | `t5/scripts/tws_t5_bank.gsc` |
| `tws_t6_bank.gsc` | `2.0.2` | `t6/scripts/tws_t6_bank.gsc` |
| `t5-plugin` | `1.2.0` | `t5/plugins/tws-t5-gsc-utils/src/component/bank.cpp`, `src/utils/bank.cpp`, `src/utils/bank.hpp` |
| `t6-plugin` | `1.2.0` | `t6/plugins/tws-t6-gsc-utils/src/component/bank.cpp`, `src/utils/bank.cpp`, `src/utils/bank.hpp` |
- Both engines log startup script/loaded TWS plugin versions, effective endpoint,
safe server identity, credential format validation and pending journal count.
Add diagnostic correlation for every HTTP attempt without changing API IDs;
balance requests keep their empty acknowledgment ID contract.
- Distinguish creation, transport, HTTP, missing diagnostics, JSON/schema,
response-ID and application failures, with safe HTTP/curl/timing fields.
Native acknowledgment parsing adds fixed failure reasons without changing
existing validity rules. Only known bounded response codes reach logs; never
log credentials, headers, bodies or native exception contents.
- Log journal load/write/removal failures and settlement decision, attempts,
pending duration, next retry delay and resolution. Suppress identical failures
for 30 seconds, report suppression counts, and log reason changes and recovery
immediately. Recovered pending duration starts at this map's journal load.
Preserve points, durable decisions, retry behavior and player-facing messages.
- Compatibility: both scripts require matching plugin `1.2.0+` for the additive
`bankVersion()` native and parser reason field. No new EC/agent or third-party
dependency requirement; existing common/telemetry and migration requirements
remain. Upstream pins and native loader `plugin_version()` are unchanged.
- Deployment: build/install both DLLs and **restart the full server processes**;
install matching scripts, restarting the map if copied after process startup.
Verify installed DLL/GSC hashes against the release artifacts and startup
version logs, particularly Ascension's reported stale GSC artifact. No deployment
performed. Windows DLL builds, GSC compilation and live T5/T6 checks remain
required; see [bank diagnostics](README.md#bank-diagnostics--tws-14).
- Validation: 44 portable script fixture groups passed, including actual EC
bank service/SQLite integration at checkout `d614707`. Fixtures assert safe
startup/outcome logs, missing diagnostics, HTTP 401, timeout, malformed/schema
acknowledgments, ID mismatch, storage failures, rate limiting and recovery,
alongside existing accounting/replay tests. Native parser/storage/process-restart
and registration-adapter checks run with address/undefined-behavior sanitizers.
## 2026-10-12
### String bank identities — TWS #15
| Component | Version | Affected source |
| --- | --- | --- |
| `tws_t5_bank.gsc` | `2.0.1` | `t5/scripts/tws_t5_bank.gsc` |
| `tws_t6_bank.gsc` | `2.0.1` | `t6/scripts/tws_t6_bank.gsc` |
- Normalize T5's `player getGuid()` and T6's persistent `player.guid` to
strings before balance/prepare requests or durable cancel/commit decisions.
Preserve large and zero-prefixed string GUIDs without numeric conversion.
Reject missing, unsupported or invalid identities privately before HTTP,
journaling or score changes, using EC's 1–64 character token contract.
- Both engines receive the fix. T6 uses the same field as telemetry, populated
by stock connection initialization; fixtures no longer give T6 a getter shim.
Other scripts and native plugins are unchanged.
- Checks: `node tools/check_bank.mjs` covers numeric/string/missing identities,
balance, prepare, both decisions and exact-body replay after restart.
Its optional `--ec-root` mode executes the actual EC bank service and bank
migrations against isolated SQLite, covering the original numeric rejection,
deposits, withdrawals, zero-balance `.w all`, cancellation and idempotent
commit recovery. All 34 fixture groups passed with EC checkout `d614707`;
`python3 tools/test_plugin_bank.py` also passed both engines' native
storage/response, process-restart and component checks with sanitizers.
- Compatibility: no new dependency requirement or EC source change. Existing
plugins `1.1.0`, common/telemetry `1.0.0+`, and EC agent `1.9.1+` remain
sufficient. Deployment: copy each updated bank script to its game's script
directory and restart the map; no full server-process restart is required
for this fix. Continue following the endpoint migration procedure if also
upgrading from a legacy URL.
- This fix prevents new invalid journals; it does not rewrite old pending
decisions. No production recovery or deployment was performed as part of
this change.
GSC compilation, deployed-artifact verification and live T5/T6 command checks
remain required; see [bank identity validation](README.md#bank-identity-validation).
### Public game-bank endpoint — TWS #13
| Component | Version | Affected source |
| --- | --- | --- |
| `tws_t5_bank.gsc` | `2.0.0` | `t5/scripts/tws_t5_bank.gsc` |
| `tws_t6_bank.gsc` | `2.0.0` | `t6/scripts/tws_t6_bank.gsc` |
- Use `https://ec.thewrightserver.net/api/bank` for all balance, transfer and
settlement requests on both engines. Remove the `tws_bank_url` override;
stale settings are ignored. This configuration removal requires a major bump.
Keep EC's `tws_server_id` and private per-instance `tws_bank_token` authentication.
- Both T5 and T6 receive the same behavior with their existing namespaces and
startup guards. Native plugins and other scripts need no source changes.
- Compatibility: requires companion EC agent `1.9.1+` to recognize public and
legacy controller-derived journals during authenticated teardown settlement.
Existing plugin `1.1.0`, common `1.0.0+` and telemetry `1.0.0+` remain sufficient;
no new native API or third-party dependency requirement.
- Deployment: update agents first. When changing endpoints, **rebuild through
EC** so the old process stops and its pending decisions settle before a new
process starts. Do not switch scripts with just a map restart in that case;
journals are endpoint-scoped. If the old URL already matches exactly, copy the
scripts and restart the map; no full server-process restart is required.
See [endpoint upgrade and recovery](README.md#upgrading-the-bank-endpoint).
No deployment was performed; agent release signing, Windows/GSC compilation
and live T5/T6 validation remain required.
- Checks: portable script fixtures exercise real initialization with stale
overrides, every request type, authentication, empty balances and retries.
Native fixtures cover zero-balance and insufficient-balance replies alongside
existing durable storage and process-restart checks.
### Persistent cross-game player bank — TWS #3 / Electric Cherry #146
| Component | Version | Affected source |
| --- | --- | --- |
| `tws_t5_bank.gsc` | `1.0.0` | New `t5/scripts/tws_t5_bank.gsc` |
| `tws_t6_bank.gsc` | `1.0.0` | New `t6/scripts/tws_t6_bank.gsc` |
| `t5-plugin` | `1.1.0` | `t5/plugins/tws-t5-gsc-utils/src/component/bank.cpp`, `src/utils/bank.cpp`, `src/utils/bank.hpp` |
| `t6-plugin` | `1.1.0` | `t6/plugins/tws-t6-gsc-utils/src/component/bank.cpp`, `src/utils/bank.cpp`, `src/utils/bank.hpp` |
- Add `.b`, `.d <amount|all>` and `.w <amount|all>` plus help registration on
both engines. Store shared GUID balances and ledger history through Electric
Cherry's authenticated bank API. EC generates and injects a private token per
immutable server instance, preserving it on rebuild/move and revoking it on
retirement. No manual token map is required;
the shared telemetry token does not authorize bank operations.
- Add native `bankLoad`, `bankStore`, `bankRemove` and `bankResponse` helpers.
Save cancellation before preparing a transfer, replace it with a commit
decision before applying points without yielding, and replay settlement
after map/process restarts. Invalid replies, insufficient funds, changed
player state, and failed journal writes leave spendable points unchanged.
Preserve earned `score_total`; applied withdrawals belong to the current match.
- T5 and T6 receive equivalent behavior with their own namespaces, last-stand
APIs, entry points and journal directories. Other scripts are unchanged;
existing common help registration and telemetry match keys already suffice.
- Compatibility: deploy Electric Cherry #146 first, then each game's plugin
`1.1.0` and bank script `1.0.0`, with common and telemetry `1.0.0` or newer.
EC host agents `1.9.0+` settle pending journals before destructive teardown.
No new third-party dependency, upstream pin, or loader version requirement.
Keep `tws-bank/<game>/` on persistent writable storage; preserve pending
journals when rotating credentials or restarting servers.
- Deployment: build/install both Windows x86 DLLs and **restart the full server
processes**, then install the new bank scripts and create/rebuild through EC
to inject private credentials. Restart maps after script changes. See
[bank setup and recovery](README.md#player-bank-t5-and-t6).
No deployment was performed. Windows DLL linking, GSC compilation and live
Plutonium checks remain required.
- Checks: `node tools/check_bank.mjs` exercises the actual transfer functions;
`python3 tools/test_plugin_bank.py` checks native journals, response validation,
failed writes and process recovery with sanitizers. The T6 compiler check
now includes all eight modules.
### T6 newcomer join eligibility — `tws_t6_join.gsc` `1.0.1`
- Fix `t6/scripts/tws_t6_join.gsc` treating the initial T6 setup spawn as
gameplay, which rejected a new spectator's `.join` on Farm Survival round 3.
Wait for the stock delayed spectator transition, then record actual play.
Continue observing later spawns so waiting for the next round cannot grant
an extra life after death. Reject requests while a spawn is settling; a real
death during that window also permanently closes eligibility.
- T5 is unchanged: its separate SP spawn flow and `self.initialized` guard
do not use T6's delayed game-mode spectator transition.
- Compatibility: existing T6 common `1.0.0` or later; no new dependency
requirement. Deploy the updated join script to `storage/t6/scripts/zm/`
and restart the map. No full server-process restart is required.
- Portable regression fixtures: `node tools/check_join.mjs`. Compilation and
live Plutonium validation remain required; no deployment was performed.
### Persistent top-left Discord URL
| Script | Version | Affected source |
| --- | --- | --- |
| `tws_t5_hud.gsc` | `1.1.0` | `t5/scripts/tws_t5_hud.gsc` |
| `tws_t5_common.gsc` | `1.1.0` | `t5/scripts/tws_t5_common.gsc` |
| `tws_t6_hud.gsc` | `1.1.0` | `t6/scripts/tws_t6_hud.gsc` |
| `tws_t6_common.gsc` | `1.1.0` | `t6/scripts/tws_t6_common.gsc` |
- Add `https://discord.thewrightserver.net` as a small, light-gray top-left
HUD label, created once per connection, including spectator newcomers.
It has no expiry or death/respawn reset and is cleaned up on disconnect.
Move the gameplay stack down 20 HUD units to leave room above the timers;
help and record positioning follow the shared layout automatically.
- Both engines receive the feature using their existing HUD anchors: T5
left/top safe-area alignment and T6 fullscreen alignment.
- Compatibility: deploy each game's HUD and common `1.1.0` together for the
reserved top line. No new native plugin or external dependency requirement.
Other scripts and both plugins retain their existing versions.
- Deployment: copy the updated HUD and common scripts to `storage/t5/scripts/sp/`
or `storage/t6/scripts/zm/`, respectively, and restart the map. No full
server-process restart is required. No deployment has been performed here.
- Live validation remains required on both Plutonium games: check placement
and readability, join as a spectator, die/respawn, reconnect, and open help
and records to verify spacing and that only one URL label appears.
### Initial versioning baseline
Established independent version `1.0.0` entries for each of the 14 scripts and
both plugins from source commit
`b508b6739b185d5048e8a8f96ccb16e429f1d37a`. This records the existing source state;
earlier changes remain in Git history without retroactively assigned versions.
The baseline introduces `versions.json`, this changelog, the README links and
version policy, and the maintenance rules in `AGENTS.md`. It changes no game
script or plugin behavior and requires no deployment by itself.
The component entries below summarize the existing functionality and deployment
requirements for servers adopting this baseline. Version assignment does not
indicate that a Windows build, live-game validation, or deployment was performed.
### T5 script baselines
Each row is a separately versioned script under `t5/scripts/`.
| Script | Version | Existing functionality |
| --- | --- | --- |
| `tws_t5_afk.gsc` | `1.0.0` | AFK toggle, protection, and indicator |
| `tws_t5_common.gsc` | `1.0.0` | Shared configuration, helpers, commands, and player dispatchers |
| `tws_t5_hud.gsc` | `1.0.0` | Timers, zombie count, and health display |
| `tws_t5_join.gsc` | `1.0.0` | Immediate join for newcomers |
| `tws_t5_leaderboard.gsc` | `1.0.0` | Map record announcements and `.leaders` command |
| `tws_t5_lock.gsc` | `1.0.0` | Lobby lock at the configured round milestone |
| `tws_t5_telemetry.gsc` | `1.0.0` | Game reports, durable boundary retries, balance and cumulative score |
- Compatibility: these initial script versions use `tws_t5_common.gsc` `1.0.0`;
lobby lock also needs `tws_t5_hud.gsc` `1.0.0`. Telemetry and leaderboard use
TWS T5 plugin `1.0.0`. Telemetry additionally requires
Electric Cherry's match/sequence deduplication and `score_total` support;
follow the [receiver and plugin rollout order](README.md#telemetry-delivery-and-rollout-t5-and-t6).
Disabling telemetry by dvar does not remove its native linking requirements.
- Deployment: follow the [T5 installation/upgrade instructions](t5/scripts/README.md#install--upgrade),
copy the desired scripts and their required dependencies to
`storage/t5/scripts/sp/`, and restart the map.
Installing or updating the required plugin needs a full server-process restart.
### T6 script baselines
Each row is a separately versioned script under `t6/scripts/`, adapted to T6 APIs
and map variants.
| Script | Version | Existing functionality |
| --- | --- | --- |
| `tws_t6_afk.gsc` | `1.0.0` | AFK toggle, protection, and indicator |
| `tws_t6_common.gsc` | `1.0.0` | Shared configuration, helpers, commands, and player dispatchers |
| `tws_t6_hud.gsc` | `1.0.0` | Timers, zombie count, and health display |
| `tws_t6_join.gsc` | `1.0.0` | Immediate join for newcomers |
| `tws_t6_leaderboard.gsc` | `1.0.0` | Map record announcements and `.leaders` command |
| `tws_t6_lock.gsc` | `1.0.0` | Lobby lock at the configured round milestone |
| `tws_t6_telemetry.gsc` | `1.0.0` | Game reports, durable boundary retries, balance and cumulative score |
- Compatibility: these initial script versions use `tws_t6_common.gsc` `1.0.0`;
lobby lock also needs `tws_t6_hud.gsc` `1.0.0`. Telemetry and leaderboard use
TWS T6 plugin `1.0.0`. Telemetry additionally requires
Electric Cherry's match/sequence deduplication and `score_total` support;
follow the [receiver and plugin rollout order](README.md#telemetry-delivery-and-rollout-t5-and-t6).
Disabling telemetry by dvar does not remove its native linking requirements.
- Deployment: follow the [T6 installation instructions](t6/scripts/README.md#install),
copy the desired scripts and their required dependencies to
`storage/t6/scripts/zm/`, and restart the map.
Installing or updating the required plugin needs a full server-process restart.
### T5 plugin — 1.0.0
- Baseline: the TWS-maintained plugin, including configurable HTTP deadlines,
status/timing diagnostics, and durable telemetry storage and response helpers.
- Source covered: `t5/plugins/tws-t5-gsc-utils/` and the existing shared plugin
build/dependency tooling under `tools/`.
- Compatibility: provides the native functions used by `tws_t5_telemetry.gsc`
`1.0.0` and `tws_t5_leaderboard.gsc` `1.0.0`.
Upstream source and dependency pins remain in the plugin's `upstream.json`.
Upstream binary downloads do not include these TWS changes.
- Deployment: [build the x86 DLL on Windows](README.md#building-plugins), install
`tws-t5-gsc-utils.dll` in `Plutonium/plugins/`, remove the old upstream DLL if
present, and restart the full server process before loading dependent scripts.
### T6 plugin — 1.0.0
- Baseline: the matching TWS T6 plugin with configurable HTTP deadlines,
status/timing diagnostics, and durable telemetry storage and response helpers.
- Source covered: `t6/plugins/tws-t6-gsc-utils/` and the existing shared plugin
build/dependency tooling under `tools/`.
- Compatibility: provides the native functions used by `tws_t6_telemetry.gsc`
`1.0.0` and `tws_t6_leaderboard.gsc` `1.0.0`.
Upstream source and dependency pins remain in the plugin's `upstream.json`.
Upstream binary downloads do not include these TWS changes.
- Deployment: [build the x86 DLL on Windows](README.md#building-plugins), install
`tws-t6-gsc-utils.dll` in `Plutonium/plugins/`, remove the old upstream DLL if
present, and restart the full server process before loading dependent scripts.