738 lines
44 KiB
Markdown
738 lines
44 KiB
Markdown
# 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-17
|
||
|
||
### Center the complete zombie count above the health bar
|
||
|
||
| Component | Version | Affected source |
|
||
| --- | --- | --- |
|
||
| `tws_t5_hud.gsc` | `1.4.2` | `t5/scripts/tws_t5_hud.gsc` |
|
||
| `tws_t6_hud.gsc` | `1.4.2` | `t6/scripts/tws_t6_hud.gsc` |
|
||
|
||
- Replace the separately positioned number and label with one center-aligned
|
||
`N ZOMBIES` readout at the health track's midpoint in both engines. Use a
|
||
uniform font scale of `1.25` and the existing count color; digit changes and
|
||
the initial `-- ZOMBIES` placeholder share the same center.
|
||
- Update text only when the count changes using `SetTextUnlimited`, avoiding
|
||
a new config string for each distinct count. Keep counting, `.hud` visibility,
|
||
game-over termination and disconnect cleanup behavior. Core HUD allocation
|
||
decreases from 11 to 10 archived elements; AFK still adds one.
|
||
- Compatibility: HUD `1.4.2` requires matching common `1.4.0+` and
|
||
[Plutonium r5334+](https://plutonium.pw/docs/changelog/#r5334), which provides
|
||
`SetTextUnlimited` for T5 and T6. No new plugin or backend requirement.
|
||
Common and AFK need no source change for this fix; both HUD scripts change.
|
||
- Validation: 73 HUD checks passed, including digit transitions, a non-default
|
||
track midpoint, unchanged-count polling, hidden updates and service cleanup.
|
||
Leaderboard (143), bank (42), join (17) and telemetry (23) portable checks
|
||
passed. These use engine shims; actual EC integration and live Plutonium
|
||
validation were not run. GSC compilation was unavailable because gsc-tool
|
||
and PowerShell are not installed. Verify rendering on Windows/Plutonium.
|
||
- Deployment: copy each updated HUD script and restart the map on r5334+.
|
||
Older installations must first update Plutonium on clients and servers and
|
||
fully restart those processes. No full server-process restart is required
|
||
for the script update alone. No deployment performed.
|
||
|
||
### Use ASCII separators in HUD branding and map records
|
||
|
||
| Component | Version | Affected source |
|
||
| --- | --- | --- |
|
||
| `tws_t5_common.gsc` | `1.4.1` | `t5/scripts/tws_t5_common.gsc` |
|
||
| `tws_t6_common.gsc` | `1.4.1` | `t6/scripts/tws_t6_common.gsc` |
|
||
| `tws_t5_hud.gsc` | `1.4.1` | `t5/scripts/tws_t5_hud.gsc` |
|
||
| `tws_t6_hud.gsc` | `1.4.1` | `t6/scripts/tws_t6_hud.gsc` |
|
||
|
||
- Replace the middle dot with an ASCII vertical bar in the top-center branding
|
||
and map-record heading after the separator displayed as two dots on T5.
|
||
Apply the same text change to T6 for a consistent appearance. Keep existing
|
||
spacing, positioning and HUD/service behavior.
|
||
- Compatibility: no new dependency requirement. No native-plugin, backend or
|
||
other script changes are required.
|
||
- Validation: 71 HUD, 143 leaderboard, 42 bank, 17 join and 23 telemetry portable
|
||
checks passed. These use engine shims; actual EC bank integration, GSC
|
||
compilation and live Windows/Plutonium validation were not performed.
|
||
- Deployment: copy the updated common and HUD scripts for each installed game,
|
||
then restart the map. No full server-process restart is required. No deployment
|
||
performed; live Windows/Plutonium rendering validation remains outstanding.
|
||
|
||
## 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.
|