Skip to content

Commit 2bd3ef5

Browse files
Merge pull request #3 from NeverEndingCode/v1.4-live-events
v1.4.0: Live Events - config overlays, ladders, seasonal scheduler
2 parents 0354b93 + efdb257 commit 2bd3ef5

39 files changed

Lines changed: 7061 additions & 52 deletions

CHANGELOG.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,38 @@
11
# Changelog
22

3+
## v1.4.0
4+
5+
Live Events: config-overlay events with goal ladders, running one at a time
6+
on top of the existing balancing config.
7+
8+
- Config-overlay events: a coordinator-authored set of tunable modifiers
9+
(the same `production`/`heat`/`minigames`/`offline`/`batchQueue` tunables
10+
the Balancing tab edits) applied read-time on top of the admin baseline
11+
while an event is active - the stored config itself is never touched.
12+
- Goal ladders: per-event reward tiers keyed to a player's own progress
13+
since joining (FLOPS/wafers/tapes earned, minigames won, blocks claimed),
14+
each claimable once its target is met, paying out wafers/tapes/FLOPS.
15+
- Four seeded seasonal events - Summer Surge, Spooky Packets, Black Frame
16+
Friday, and Frost Uptime - each with its own theme, modifiers, and ladder,
17+
brought in and out on an hourly scheduler that also runs at boot.
18+
- Personal event windows: a player's own run starts at their first login
19+
during an active event and lasts the event's full duration, capped at 24h
20+
past the event's global end, with a 48h grace period afterward to still
21+
claim any rung already earned before the window closed.
22+
- Event leaderboard (ranked by rungs claimed) with a per-user opt-out that
23+
removes them immediately, not just on their next join.
24+
- Admin/coordinator Events tab: authoring with a TUNABLES-driven modifier
25+
builder and ladder builder, schedule/activate/end/delete controls, and a
26+
per-event participation view.
27+
- New `event_coordinator` role (granted/revoked by an admin, implied by
28+
`admin` itself) scoped to the Events tab only - it does not carry
29+
Balancing/Roles/Users access.
30+
31+
Fixes:
32+
- A rejected action with a bad/expired target (e.g. an already-claimed
33+
event rung) no longer surfaces the generic "Event unavailable" toast for
34+
every action type - the message is now specific to what actually failed.
35+
336
## v1.3.0
437

538
Cold Storage: a new tab, unlocked at the Server Room tier, built around a

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ ENV DB_PATH=/app/data/rackstack.db
3838
LABEL org.opencontainers.image.source="https://github.com/NeverEndingCode/rackstack-server"
3939
LABEL org.opencontainers.image.description="RackStack self-hosted server"
4040
LABEL org.opencontainers.image.licenses="MIT"
41-
LABEL org.opencontainers.image.version="1.3.0"
41+
LABEL org.opencontainers.image.version="1.4.0"
4242

4343
VOLUME ["/app/data"]
4444
EXPOSE 3000

README.md

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@ passive reward track that refills on a timer, one offline-only archival job
1010
Tapes tree paid for with the tab's own currency - all of it, including
1111
progress and purchased upgrades, survives Migrate and Singularity resets.
1212

13+
As of v1.4, Live Events layer time-boxed config overlays and goal ladders on
14+
top of the regular economy - only one runs at a time. Four seasonal events
15+
(Summer Surge, Spooky Packets, Black Frame Friday, Frost Uptime) come and go
16+
automatically on their own annual windows via an hourly scheduler, and a
17+
coordinator can author, schedule, and run additional ones from the admin
18+
dashboard's Events tab. See [Live Events](#live-events) below for details.
19+
1320
## Architecture
1421

1522
- `shared/` - a package used by both server and client (via a `@shared` Vite
@@ -69,7 +76,10 @@ shown in Discord's own "Copy User ID" (enable Developer Mode) or visible in
6976
the server's `users` table after your first login. DB-stored `admin` /
7077
`event_coordinator` roles (grantable from the dashboard once you're in) are
7178
for everyone else - `SUPER_ADMIN_IDS` is only for the owner(s) who should
72-
always have full access no matter what's in the database.
79+
always have full access no matter what's in the database. `event_coordinator`
80+
only unlocks the Events tab (author/schedule/activate/end Live Events, see
81+
below); `admin` implies it and additionally unlocks Balancing, Roles, and
82+
Users.
7383

7484
## 3. Run with Docker Compose
7585

@@ -159,6 +169,39 @@ npm run dev
159169

160170
Visit the client dev server's printed URL (usually `http://localhost:5173`).
161171

172+
## Live Events
173+
174+
At most one event is active globally at a time. Each is a set of tunable
175+
modifiers (the same `production`/`heat`/`minigames`/`offline`/`batchQueue`
176+
tunables the Balancing tab edits) applied read-time on top of the admin
177+
baseline config, plus a goal ladder of rungs a player claims for wafers/
178+
tapes/FLOPS as they clear metric targets.
179+
180+
- **Seasonal events ship pre-seeded** (`server/data/seasonalEvents.js`):
181+
Summer Surge (July), Spooky Packets (late October), Black Frame Friday
182+
(late November), Frost Uptime (December-January). Each starts as a
183+
windowless draft and gets its concrete `starts_at`/`ends_at` materialized
184+
automatically, every year, by the scheduler below - no admin action
185+
needed for them to run on schedule.
186+
- **Hourly scheduler** (`server/eventService.js`'s `runScheduler`, invoked
187+
once at boot and every hour after): materializes seasonal recurrences into
188+
a scheduled window, ends any active event whose window has closed, and
189+
activates any scheduled event whose window has opened.
190+
- **Personal per-player windows**: a player's own run starts at their first
191+
login while an event is active and lasts the event's full duration, capped
192+
at 24h past the event's global end - two players who join at different
193+
times see different countdowns. A 48h grace period afterward still lets
194+
them claim any rung they'd already earned before their window closed.
195+
- **Leaderboard + opt-out**: ranked by rungs claimed, visible from the
196+
in-game Event tab. Opting out (a per-user toggle, not per-event) removes
197+
you from it immediately, not just on your next join.
198+
- **Coordinator authoring** (Profile > Settings > Events, `event_coordinator`
199+
role or `admin`): create/edit a draft with a TUNABLES-driven modifier
200+
builder and ladder builder, schedule a window, activate/end it, delete
201+
unscheduled drafts, and view per-event participation. Activating a second
202+
event while one is already active is rejected outright (409) - end the
203+
running one first.
204+
162205
## Notes / things worth knowing
163206

164207
- **SQLite, not Postgres**: chosen for zero-config, single-file persistence

client/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "rackstack-client",
33
"private": true,
4-
"version": "1.3.0",
4+
"version": "1.4.0",
55
"type": "module",
66
"scripts": {
77
"dev": "vite",

0 commit comments

Comments
 (0)