Rebases the vendored engine, content and webclient onto upstream's 289
branches (34 engine, 165 content, 9 webclient commits past our 274 base).
Each vendor-289 branch in ../repos is upstream 289 plus one squashed
"rs-sdk local mods" commit, refreshed from this tree first.
289 adaptations:
- Protocol: 289 reshuffles every opcode. Custom MESSAGE_PUBLIC (server 255)
and MARKET_SEARCH (client 243) are still free and kept.
- Lite client: CLIENT_VERSION 289, UPDATE_INV_FULL size g1->g2 and
UPDATE_INV_PARTIAL slot g1->gsmart, mirroring Client.ts.
- Content ids: upstream appended configs where ours lived. GE interface
moves 10984->11942 (through 12437), grand_exchange_booth 4671->5116,
grand_exchange_teller 1359->1596 (m49_53.jm2 updated), pvp_death_mark
varp 358->394. PlayerLoading moves a saved varp 358 value to
pvp_death_mark (289's varp 358 is temp-scoped, so only pre-289 saves
carry it).
- GE loc/npc configs use 289's renamed model debugnames.
- Engine: keep our Bun web split over upstream's new Fastify web.ts (no
fastify/tsx deps), add OnDemand.onClientClosed to our WS close handler,
keep our WSClientSocket API/batching and the 1s delayed close (TCP too).
Adopt upstream's HashTable iterator fix, IPv6 player-loop key (with our
NaN guard), chat effects 0-5, pointer-check removal.
- Razmire building store keeps our 650 sell price with upstream's 4% haggle.
- Tests: opcode assertions use ClientProt enums; hand-built inv packets
use the 289 layout.
PATCHES.md documents the new per-upgrade steps (custom id renumbering,
lite decoder parity, opcode collision check).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rebased onto LostCityRS/Content origin/274 tip 85d62c8bd. Clean rebase —
our content mods are purely additive so no conflicts. Brings quest fixes
(Eadgar's Ruse, Regicide, trolls), shop/spawn/sound corrections, Mort
Myre creepy crawlies, gamesroom challenge rooms, treasure trail fixes,
map changes, and more.
Note: map .jm2 changes may shift collision — regenerate
sdk/collision-data.json from prod after deploy if bots path oddly.
Vendor branch: ../repos/content vendor-274.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Updates all three vendored upstream repos (Engine-TS, Content, Client-TS) to the
274 game snapshot with all rs-sdk modifications re-applied via a 3-way merge
(254 base + local mods, replayed onto upstream 274).
## Engine
- Bump @2004scape/rsbuf 254.1.0 -> 274.1.0 (keep rsmod-pathfinder fork pin)
- Adapt to 274's nested WorldConfig: Environment.ts now exposes flat back-compat
aliases (WEB_PORT, NODE_ID, ...) plus the rs-sdk-only keys the bot framework
uses, and createDefaultWorldConfig carries our defaults (xpRate 25, web.port 8888)
- Collision export (web/pages/api.ts) reads 274's in-engine TS routefinder instead
of the dropped @2004scape/rsmod-pathfinder WASM, which the engine no longer feeds
- Remove dead GameMap.findLongPath (274 routefinder has no long-path variant; the
SDK does long-distance pathfinding client-side)
- Re-apply security/login mods (sdk_auth, IP login tracking, login-takeover, banned
usernames, no dev staffmodlevel on non-prod) onto 274's auth refactor
- Add MESSAGE_PUBLIC server packet at the free opcode 255 (254's 81 is now OBJ_ADD)
- NODE_WS_ONDEMAND now defaults on: the 274 web client streams on-demand assets over
the game WebSocket and otherwise stalls at ~60% on load
## Content
- Full 254->274 content update with our 4 script/config patches re-applied
- worldmap.jag regenerated for /mapview from the 274 maps (via engine build)
## Webclient
- Rebuild standard + bot + viewer bundles; CLIENT_VERSION 274
- ServerProt: keep 274 opcodes, add MESSAGE_PUBLIC=255 with -1 size table entry
- Replace removed Packet.pIsaac() calls with 274's p1Enc()
- Disable terser property mangling (274 enabled it): the bot framework accesses
client members by name from bot.ejs / the Puppeteer harness
## SDK
- Regenerate sdk/collision-data.json from 274 maps (905k -> 958k tiles)
## start.ts
- Add 274 to the version menu
Verified end-to-end: engine boots and loads 274 maps, content packs, engine
typechecks clean, webclient builds, a headless bot logs in, sdk.getState() returns
a complete snapshot, and bot.walkTo() pathfinds/moves on the regenerated collision
data. Map and hiscores sprites serve correctly.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Updates all three upstream repos (Engine-TS, Content, Client-TS) to the
September 7, 2004 game snapshot with all rs-sdk modifications re-applied.
## New Game Content (254)
- Duel Arena — full PvP dueling with configurable rule sets
- Death Plateau quest — find a safe route past trolls in Burthorpe
- Troll Stronghold quest — infiltrate the stronghold to rescue Godric
- Quest journals — proper progress tracking for all quests
- Mime random event — emote-copying theater event
- Maze random event — navigate a maze to the center
- Varbit support — engine-level variable bit support
- Combat formula fixes and improvements
- New map areas around Burthorpe/Trollheim
## SDK & Engine Changes
- Regenerated collision data (+51k new tiles for 254 map areas)
- Fixed playerpositions API (World.playerLoop.all() for 254 HashTable)
- Updated StateCollector for 254 field renames (scene→world, varps→var,
skillLevel→statEffectiveLevel, etc.)
- Re-applied all bot framework, auth, session, and hiscore modifications
- MapView: restored unified underground map, player tracking, wheel/touch
zoom, trails, and teleport markers on 254 webclient API
- MapView: tighter region packing (underground overlaps overworld edge)
- Generated worldmap.jag for mapview
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>