尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗A turn-based monster-battle game in the style of the classic handhelds, where every creature is one of your friends. Battle mode: pick 6 of the 21 lads (or London's own, basic or evolved), your rival gets 6 of the rest, and you fight 6v6 until one side has no creatures left. Story mode walks you from Co. Clare to Trinity College Dublin.
The full V1 plan (rules, stats, types, moves, Creature Studio, tech stack and milestones) is the Ranemon V1 Game Plan doc in the project.
src/lib/battle/): pure TypeScript with no I/O. Given a seed and the list of actions it always produces the same result.
/ranedex/<id>, src/components/DexEntry.tsx): a big picture you can flip through its looks and shiny on (solid in the 3D look), its types and matchups, entry, base stats, evolution line and how each form is reached, its battle and story moves with what each is super effective on, and, in story mode, where it's found. The battle screen has info boxes, a text box, FIGHT, RANEMON and RUN, a 45-second turn timer, text that types out and can be tapped past, an animation for every move in its type's style, a scene of its own for each special move, and hit, send-out and faint animations.roster.ts), each with a pixel sprite cut from their photo and their own special move. The rival's 6 are drawn at random from the 15 you didn’t pick, and Oismon and Olliemon are kept together when both are left. The sheet gives no types or stats, so those are a first pass tuned with the simulator.src/lib/ui/battle-mode.ts, src/components/TeamSelect.tsx): a ROSTER switch picks from the 21 lads (the default), London's own Ranemon (LONDON_LINES) or everyone (London's own and the drawn UK look stay locked until a Story mode save in the browser has a UK Ranedex, britainUnlocked, so they're still a surprise), and the rival draws from the rest of the same roster. FORMS is BASIC (each line's last form inside the usual 400 budget, so London's three-stage lines come in at their middle form and Aerodactivist sits out) or EVOLVED (every form a line can end as: Killemon picks Killigatr or Cholokill, and Wickmon one of its five branches). Tap a pick on YOUR TEAM for its form, its look (the drawn UK look included), a held item it gets something from (Xanax, the Friendship Bracelet, the Vegan Stone on Conemon's line, with the same effects as in story mode) and its moves on the shared moves cards (MoveCard.tsx), with spares from what it learns by Lv50 in story mode, second special moves left out. The rival holds nothing./story (STORY MODE on the title screen) is a top-down adventure from Co. Clare to Trinity College Dublin, following docs/story-mode.md.
src/content/story/interiors.ts): the barman heals you across the bar, the shopkeeper sells across the counter, gym leaders wait at the end of a red carpet between two All-Ireland cups, and your house has Mam, a turf fire and a lovely Ocean Linen couch. Every building has a door, and every room has someone in it to talk to (tests/unit/buildings.test.ts): each landmark has a keeper by its display (src/content/story/keepers.ts), and the GPO, Supermac's and The Temple Bar in Dublin, Athlone Castle and Brighton Station have rooms of their own (src/content/story/buildings.ts), 2D only (flat on the room). Dublin's old houses moved along in reading order, so schema 5 moves saves inside them to the same room.src/content/story/road.ts): a short 2D stretch between each pair of counties, from the bridge at Killaloe to the Red Cow and a Luas into Dublin, each with one thing to see and one thing to do, the rival on the Bog of Allen and at an Applegreen on the M4, Dublin's cast on their way home, and the Lads on Tour mission to find the stag's lost groom. Exp Share is on from the start, and Michael D's calls tease what's waiting in Dublin.src/content/story/legends.ts): every county is bigger: Clare to Kildare are 40 tiles wide, Dublin 56, and the towns the trains reach grow too, grown east and south of the old towns with the county's landmarks (Bunratty, the Burren, the Cliffs of Moher, the Treaty Stone, Adare, Lough Gur, the Hayes Hotel, Cahir Castle, St Canice's, Dunamase, Birr Castle, Belvedere, Trim Castle, Knowth, Castletown, Croke Park, Kilmainham, Howth, Glendalough and more), local legends told by the people there, new route trainers and one-off gifts. 2D only (flat). The old ground and doors haven't moved, so saves carry on as before.src/lib/battle/evolutions.ts): every Ranemon evolves once at Lv30, into a pun on a Gen 1 or 2 Pokémon (Conemon into Conix). The evolved form keeps its types and moves with a bigger stat budget (460 against 400). Wild and trainer Ranemon from Lv30 are already evolved, and evolved ones are harder to befriend. Killemon has a second branch (): give him a Flannel Shirt from the shop (from Kilkenny on, €3000) before he reaches Killigatr and he evolves into Cholokill, drawn from his own photo, whose special move Whabam takes the place of This One's for Africa./sesh (QUICK SESH on the title screen, with LONG SESH under it, greyed out for now) is a standalone roguelike themed as a night out, following docs/sesh.md. Quick Sesh deals a random party of 6 photo Ranemon at Lv50 and plays three stages, The Pub, The Nightclub and The Afterparty, each a short branching map of fights, Bouncers, the Offie and the Smoking Area, then a random boss. Foe levels are fixed by stage (Lv46 to 65), a Ranemon still fainted after a battle goes home in a taxi, and the score is bosses beaten, then Ranemon standing, then turns. Every screen is 2D only, whatever look is picked, and it plays at a speed of its own, 2× to start (ownSpeed in src/lib/speed.ts). Its saves are its own (ranemon.sesh.v1:<name> in this browser, src/lib/sesh/save.ts), and a run replays exactly from its seed and choices (src/lib/sesh/run.ts).
/friends (FRIEND BATTLE on the title screen) is a live battle against a friend with your Story mode party, through the save server (docs/online-saves.md). You sign in with your trainer name and PIN, open a room and share its code (like BOKA-42, or a link that fills it in), and both press READY. The challenger picks the levels: everyone at 50 (the default), a cap at 50, or as caught.
src/lib/online/server.ts, served by save-api/api/battle.ts): it takes each team from the player's online save, checks it could have come from the game (validateTeam in src/lib/online/rules.ts), keeps the seed, and plays each turn once both have chosen. Phones only send their choice and play back what happened, with their own team at the front and the foe's unseen Ranemon hidden. A game on a different version (RULES_VERSION, a hash of the battle data) is asked to reload.skin on a player, read from their save by skinOf; an older server leaves it out and a phone that can't draw it shows the usual look). Tap one of your Ranemon in the lobby for its moves, with types and power, and its held item.crowned in src/lib/online/server.ts): one trainer at a time holds the crown, kept on the save server, never in a save. Ollie holds it first (FIRST_CHAMPION), as long as the server has a save under his name; otherwise it goes to whoever wins the first friend battle. Beat the Champion (or have them forfeit, or leave) and the crown passes to you, and they lose it; a Champion who wins has defended it. The Champion wears the Online Champion's skin, a jewelled crown, a crimson cape edged in ermine with a gold crown worked on the back, a royal purple coat, a gold sash with medals and a crystal sceptre (champion in people.ts), on the map, the Trainer Card and in the room, with ONLINE CHAMPION under their name and their title in battle. The skin comes off the moment they lose. FRIEND BATTLE shows who holds the crown, and the result screen says when it changes hands. 2D only.The GitHub Pages build plays with no connection once it has been opened (scripts/offline/, src/lib/offline.ts), and can be added to a phone's home screen to open full screen like an app (src/app/manifest.ts).
scripts/offline/sw.js): pnpm build with PAGES_BASE_PATH set runs scripts/offline/precache.mjs, which writes out/sw.js with every file of the build and a hash of each (about 875 files, 11 MB). It comes in two steps so a patchy connection can't leave a phone with nothing: on the first visit it downloads the game itself (pages, code, page data, font and icons, about 4 MB) and takes over, so the game already opens offline; then it fills in the pictures (about 7 MB) in the background, a few at a time with retries, and any page that opens carries on a fill that was cut short. The title screen shows GETTING READY FOR OFFLINE… with a percentage, then ✓ READY TO PLAY OFFLINE once every file is on the phone. Files are served from the build's cache, query strings ignored (Next.js's _rsc, a room link). Calls to the save server go to another site and are never touched. pnpm dev and pnpm start have no service worker.src/lib/story/cloud.ts): the save in the browser is the one you play, as before. With no connection, CONTINUE plays it straight away, and NEW GAME asks for a second tap, since it can't check the name's online save. A save made offline goes up by itself once the connection is back (the browser's online event, the tab being hidden, or the next CONTINUE): the first time a PIN opens a name online, the save server hands the phone a device token (devices table, only a hash kept) that stands in for the PIN from then on. The server counts each name's writes (rev), and the phone remembers the count its save follows on from (base), so it never relies on phone clocks: if another device has saved since, the server sends its save back instead of writing (409 conflict), and the title screen shows TWO SAVES, with what's in each, to pick one. The other is kept in BACKUPS AND SAVE CODES. The title also says when a save has progress that isn't online yet. A save carries the newest schema it has been through, so an older cached build never stamps a newer save as older, and the save server turns such a save away ({error: 'update'}).Switched off for now. THREE_D in src/lib/view.ts is false, so the 2D / 3D button is hidden and every map, battle and Ranedex page draws in 2D, even in a browser that had 3D picked before. The code below is all kept: set THREE_D to true to bring it back, with each browser's old choice.
The 2D / 3D button beside the speed button (on the map and in battles) switches to a 2.5D look, kept per browser. 2D stays the default. Only the drawing changes: maps, walking, scripts, battles and saves are the same code, and you can switch mid-game.
src/components/story/Overworld3D.tsx, scene3d.ts): the map's own 2D ground art on a plane under a tilted camera, with buildings lifted into walls and pitched roofs (slate on gyms), low-poly trees that sway, tall grass standing up in blades, walls, hedges, fences and furniture as blocks wearing their tile art, the Campanile in stone, sunlight with real shadows, and the clock's dawn, evening and night. People are solid figures (figure3d.ts) built from their own 2D art: a head, body, arms and legs as blocks wearing the matching piece of the sprite from the front, back and sides, so they turn round, swing their arms and legs as they walk, and cast real shadows. Your follower gets a solid body in its colour under its photo head, which faces the camera as in 2D. Walking lives in walk.ts, shared by both looks.src/components/Backdrop3D.tsx): a 3D stage per scene (fields with hills and drifting clouds, a Georgian terrace, a sports hall with spotlights, Trinity at night under the stars) behind the same sprites, info boxes and move effects, with the platforms placed under the sprites. The second looks (below) stand in it as solid figures (src/components/Solid.tsx): the sprite blown up into a rounded body, thickest where the art is widest, with a dark rim for the outline, lit like the stage and turned toward the foe. A Ranemon or look opts in with solid: true.Some Ranemon have a second look from another photo (src/lib/battle/variants.ts): Olliemon (Tricolour), Oismon (Orange Cap), Endamon (Red Wine), Carlmon (Moustache), Conemon (Curls), Boydemon (Rugby), Steadmon (Wedding Suit), Gibbsmon (Races), Jammon (Shades), Killemon (Thumbs Up), Owemon (Dance Floor), Robinmon (Long Coat), Simomon (Linen Suit), Lorcamon (Tuxedo) and Thilomon (Big Catch), and their evolutions. It's the same Ranemon, with the same name, types, stats and moves; only the picture changes. The new photos are cut at 192 pixels and 64 colours, twice the detail of the others (HD in scripts/sprites.py), with their own follower heads, shiny versions and evolved costumes.
All the music and effects are made in the browser as the game plays (src/lib/sound/), on a chip like the old handhelds': two pulse waves, a triangle bass and noise drums, through Web Audio. There are no sound files, so nothing to download and nothing copied.
songs.ts): original tunes, written tracker style, note by note with chords bar by bar (music.ts). The title; a jig on the road; Dublin and Trinity; a reel in McGrattans; home and the shop; inside a gym; the bike (hold B); battles against wild Ranemon, trainers, gym leaders, and B&S, the legend and Poseidon; and victory. Short jingles play over them for a level up, an item, the pub's heal, befriending, evolving and losing.sfx.ts): menus, doors, the encounter, a sound for each type's moves and for special moves, hits (super effective, not very, critical), misses, stat changes, statuses, faints, pints and sips, running away, shiny sparkles, Norm's bark and the bike bell. Every Ranemon has its own cry, made from its id.cues.ts): battle events, story lines ("You got…", "grew to Lv…") and the map you're on. Tested in tests/unit/sound.test.ts.scripts/playlink/ builds the whole game as one HTML page, sprites inlined, for sharing as a claude.ai artifact (saves go to the artifact's own storage there): run pnpm build (for the CSS), then node scripts/playlink/build.mjs ranemon.html.
The game asks for the word once per browser (src/components/Gate.tsx). Only a SHA-256 hash of it is in the code, but the site is static, so this keeps out casual visitors rather than anyone determined.
The 5th-generation handhelds (Black and White): full-colour pixel sprites that breathe, dark info panels with bright HP bars, white text boxes with a soft double border, glossy colour-coded FIGHT, BAG, RANEMON and RUN buttons, move buttons in their type's colour, and a battlefield whose clouds drift past (fields, Dublin's streets, a gym floor, or Trinity at night for B&S). Story mode's overworld (src/components/story/tiles.ts) is drawn in code at twice the world's resolution, like the later 2D games: shaded, textured tiles that join up with their neighbours (paths fray into the grass, water foams at the shore, roofs get ridges and eaves, gyms have slate roofs), trees that rise above their tile, animated water, tall grass and flowers, tall grass that hides your feet, shaded people, a follower that hops along behind you, and drifting cloud shadows with a soft vignette. scripts/sprites.py builds the sprites from the photo cut-outs: 96-pixel, 32-colour versions in public/sprites/bw/, 28-pixel heads for the Ranemon that follows you, and the evolved forms in public/sprites/evo/, each with a type-coloured aura and a costume piece from its Pokémon.
These come next, as their own pull requests: Creature Studio (photo upload, cut-out, the creature card, the friend's approval), accounts and invite-only groups, and friend battles in the play link.
Requires Node ≥ 22 (.nvmrc pins 24) and pnpm 10.
pnpm install
pnpm dev # http://localhost:3000
| Command | What it does |
|---|---|
pnpm test | Unit tests (Vitest) |
pnpm simulate | 5,000 CPU-vs-CPU battles; fails if any type wins over 60% of them (6v6) |
pnpm test:e2e | Builds the app and plays a whole battle in a phone-sized browser |
pnpm lint | ESLint |
pnpm typecheck | TypeScript |
SIM_BATTLES=20000 pnpm simulate runs a bigger balance check. scripts/make_sprite.py turns a photo into a sprite; its header lists the Python packages it needs. On a machine with Chromium already installed, set PW_CHROMIUM_PATH to skip playwright install.
Sprites are made from the friends' own photos, so keep the repo and any shared links private. All other art, names and fonts are original or openly licensed. The pixel font is Pixelify Sans, under the SIL Open Font Licence. The game uses no Pokémon logos, sprites or music (all its music is original and made in code); the evolved forms' names are parodies of Pokémon names.
ITEM_EVOLUTIONSsrc/lib/battle/second-specials.ts): most lines learn a second special move of their own at Lv36 in story mode (Carlmon's Fossil Record, Steadmon's Bed by 8:30, ...). Battle mode keeps to one special move each. Crampemon evolves into CrampsB2BThilomon at Lv30 or later only with a Thilomon or Thilotrode in the party (partner on his evolution).src/lib/story/): levels 5 to 100 by the main-series stat formula (level 50 gives battle mode's numbers), EXP on an L³ curve, every Ranemon knows its special move from the start, with its other moves learnt weakest first, pints of Guinness to befriend wild Ranemon (the glass drains a quarter with each sip, and one that joins you knocks back the rest in one, src/components/PintDrink.tsx), Blue Ghosts for +1 level, a party of 6 with the rest in the Group Chat, and a save in this browser.src/content/story/station.ts): one door in Dublin for every train out of the city. The clerk at the ticket desk opens a departures board, and the staff on each platform will take you onto their own train. The lines are a list (DEPARTURES): today the DART to Greystones, the Intercity to Bundoran, the Sail & Rail to Brighton (locked until Enda asks you) and the Eurostar to Ghent (locked until Cramps asks you) and the Intercity to Galway (locked until you're Champion), with the Enterprise to Belfast on the board as coming soon. A new destination is a map plus one entry, and a line can stay locked until a flag is set.src/content/story/enda.ts, src/content/story/brighton.ts): Enda, a very small man who makes best friends with everyone, stands in the road out of Kildare until you've met him, and asks you to Brighton with Ollie and Kill. Saying yes opens the Sail & Rail at Connolly Station: a match at the Amex, then the arcade, with fans and gamers to battle and the Arcade King as the boss. Beating him gets you Enda's Friendship Bracelet, a held item for any Ranemon.src/content/story/cramps.ts, src/content/story/techno.ts): once you're Champion, Cramps runs up to you the first time you're back out in Dublin (Dublin's arrive, which runs whenever you come onto it) and says that to celebrate the win the crew are going to I Love Techno in Belgium. Saying yes opens the Eurostar to Ghent on platform 4 at Connolly, where he waits if you said no. At Flanders Expo security won't let anyone in: three guards in the queue lane, stage security inside, then DJ Vandenbass. Beating him gets you 10 Blue Ghosts from his rider and the hall turns into the festival. Ghent is 2D only for now (flat on the map).src/content/story/galway.ts): once B&S are beaten, the Intercity from Connolly (platform 6) runs to Galway. The Hall of Champions on Eyre Square is five rooms in a row, each one themed for whoever waits in the middle of it: Rob Lipsett's gym, Blindboy Boatclub's study, The 2 Johnnies' farmhouse kitchen, Bono's stage and the Champion's hall. The door at the top of each room opens once its battler is beaten, into the next. Beat all four in a row with no healing (any full heal, at McGrattans, at home or after a blackout, wipes the run and you start again from the first; food from the BAG is allowed) and the secret Champion, Michael Collins, is waiting behind Bono's door. Beat him to become Champion of Ireland (a Perfect Pour, the title, and his skin). Their teams always scale to your best Ranemon, Champion or not (above on a trainer), 3 levels under it for the first two up to 1 under for Collins, so it stays a fight all the way to Lv100. In the simulator a random party wins each of the four 70% to 90% of the time and Collins about half the time, but a whole run with a bag of food only about 1 in 20 (tests/sim/galway.test.ts). Galway and the Hall are 2D only (flat).src/content/story/silicon.ts): through a gap in the trees along the bottom of Dublin, eight glass HQs round Grand Canal Dock, each in its company's own look (brands.ts): the glass tinted in its colours, a band of them along the roof, its logo up on the front and its sign over the door, for Google, Meta, Microsoft, Apple, Amazon, TikTok, X and Stripe. Inside, the room is washed in the brand's colour with its logo laid into the floor. Inside each one there's a receptionist behind the front desk, someone on staff who battles you on the way up, someone else working, and the CEO at the top (Sundar Pichai, Mark Zuckerberg, Satya Nadella, Tim Cook, Jeff Bezos, Shou Chew and Elon Musk), each with a gift for beating them and a skin. Beat those seven, in any order, and Stripe opens: Patrick and John Collison, two lads from Tipperary, with six Ranemon. They go from Lv46 to Lv57 aces, and in the simulator a party at each one's ace level wins 9 in 10 against Pichai down to about 1 in 2 against Musk (tests/sim/silicon.test.ts). The HQs are Dublin's landmark doors 7 to 14, after every door Dublin had, so saves inside Dublin's rooms don't move. 2D only, like the rest of Dublin.src/content/story/premier.ts, docs/london-expansion.md): twelve club legends, smallest club to biggest, each at a ground in its own part of town with its own train from King's Cross (twelve platforms, in the order you play them): Falmer, South Norwood, Aston, Bramley-Moore Dock, Beeston, Gallowgate, Tottenham, Eastlands, Fulham, Highbury, Anfield and Old Trafford. Each ground is drawn as its real stadium from the street, with the landmarks round it (src/components/story/england.ts), 2D only. Saves from when grounds shared maps move with them (schema 7)./london, newLondonGame in src/lib/story/state.ts, LONDON_INTRO in src/content/story/london.ts): SKIP TO RANEMON LONDON on the home screen, under STORY MODE, is a new game of its own for players who haven't played Ranemon Dublin. You land at Stansted with no Ranemon and a new job in London, Próvaí sends a voice note (your cousin gave him your number), and from W.B Yates on the story is the one a Dublin save plays after the border: the UK starter at Lv5, Thatcher, the twelve clubs, the Sidemen, Liam Neeson and the palace. Its saves carry LONDON_ONLY (london:only), and every line that assumes Dublin is gated on it, so a Dublin save sees exactly what it did: Próvaí explains Ranemon from scratch, Thatcher has never met you, Donal adds 5 Chicken Fillet Rolls, 2 Cups of Tea, The Round and a High Nelly to the 5 pints, your mam texts after each jersey instead of Ollie's parents' postcards, Enda at Falmer meets you for the first time, the palace has no Irish party to bring back, and Ryanair won't fly you to Dublin (that's Story mode). It has no level cap, as a Champion of Ireland in London has none, MISSIONS shows Free the Lads only, the Ranedex and Trainer Card show the UK alone, money on the card is in pounds, and there's no Town Map of Ireland. Its saves are kept apart: ranemon.london.v1:<name> and ranemon.london.backups:<name> in the browser, and online under ln__<name> (onlineName in cloud.ts), with a PIN of its own set by its first save. A save code only loads into the game it came from. tests/unit/london-only.test.ts covers both paths, and tests/sim/london-only.test.ts checks the start can win its way to Brighton.src/content/story/sidemen.ts): once you've won the Newcastle jersey, Jamie Elliott, who runs the Sidemen, is at King's Cross. The Charity Match at Wembley is a man short, and the spot goes to whoever beats all six of the lads and then him. The Metropolitan line (the guard at the end of King's Cross) runs to Wembley Park, where KSI (the OVO Arena), TBJ (Sides), Zerkaa (Sidemen Clothing), Behzinga (the gym), Miniminter (the Sidemen FC clubhouse) and Vikkstar123 (the Gaming House) each wait behind a door with a sign over it, with one of their crew to beat on the way up and a Ranemon of their own: Ksimon, Tobimon, Zerkmon, Behzmon, Minimon and Vikkmon, drawn like London's own, each with its own special move and evolving at Lv30 (Primape, Tobitic, Zerkazam, Behzchamp, Mintair, Vikstarmie). They come after London's own in the UK Ranedex, and are never wild. Beat the six in any order and Wembley Stadium opens: Jamie is on the pitch with all six evolved, Lv32 to 34. Beat him to be the eighth Sideman: you pick one of the six's Ranemon at Lv30 and get 5 Blue Ghosts, and each of the seven is a skin. In the simulator a party at their level wins against each of the six 7 to 9 times in 10, and against Jamie about half the time (tests/sim/sidemen.test.ts). Wembley Park, its rooms and its battles are 2D only (flat).src/content/story/neeson.ts): Florence Pugh is behind the bar of every W.B Yates, healing your party as Dua Lipa does in McGrattans. Liam Neeson had the job before her. Once you've won the Leeds jersey, Florence asks you to go after him: he's at the top of the Elizabeth Tower (Big Ben, on the London map), looking for whoever took his bar. Beat his stunt double on the way up (Lv22 to 23), then Liam (hard, Lv24 to 27) for 3 Well-Settled Pints, a Blue Ghost and his skin. In the simulator a party at his level wins about 8 times in 10 (tests/sim/neeson.test.ts). The tower room is 2D only, like the rest of London.src/content/story/missions.ts): START → MISSIONS lists every mission you've started and not finished, the main story included, each with a line on what it's about, what to do next and where to go (with a count, such as clues found, where there is one). Nothing open shows a friendly empty screen. A mission is one entry in MISSIONS, made from the flags its story already sets: a start flag, a done flag and steps, each shown until its until flag is set.src/lib/story/ukdex.ts): over the Irish Sea every Ranemon is drawn in pixel art (uk.ts, public/sprites/drawn/), and Britain has a Ranedex of its own, a UK tab beside Ireland's once you've met a Ranemon there. It has the 21 lads, each base form followed by its drawn evolution (Carlizard's wings grow from his back, Conix is Conemon in rock), Cholokill, then London's own Ranemon, each with a UK entry. UK Ranemon evolve at Lv30 like the lads at home, and stay drawn. It only counts what you've seen and befriended in Britain (ukSeen, ukCaught), and lists only British places under where it's found. Ireland's Ranedex is as it was.src/content/story/rave.ts): Dublin is a city twice the size of a county town, with the Liffey, three bridges, pavements, tarmac and Georgian terraces (terraces on the map, drawn by src/components/story/facades.ts, 'georgian' here and in Galway, 'english' in London, Shoreditch, Brighton and the Premier League cities): each building is a row of brick or painted houses with their own coloured front doors, railings and a parapet over an upper storey, McGrattans has a painted pub front, a church has granite and round-headed windows, and lamp posts line the kerbs and light up at night. Only the drawing changes, so the map and saves are as they were. The Rave Cave, a door on its south side, has nine trainers dancing under the lights, easiest by the door and hardest by the DJ, and anyone you've beaten there will battle you again whenever you ask, for training.src/content/story/): the maps as one character per tile, trainers, gyms and wild tables. tests/unit/story-maps.test.ts checks every door, person and exit can be reached, and pnpm simulate also plays each gym with a typical party and checks it is winnable but not a walkover.src/lib/story/save.ts): you enter a trainer name on the title screen, and the save is filed under it (any case), so friends can share a browser. Every save carries a schema number, and each update converts older saves step by step, copying the old one aside first, so nobody loses their place. A Ranemon, move or map the game no longer has is set aside or swapped for your last pub instead of making the save unreadable, and saves written by this build still load in older ones. The game keeps a copy every 10 minutes of play (the last 5), and BACKUPS AND SAVE CODES on the title screen restores one, or turns the save into a code or file to load on another device. Online saves follow a name and a 4 to 8 number PIN on the save server in save-api/ (Vercel and Neon) once it is set up (docs/online-saves.md); the claude.ai play link keeps them in the page's own database, which only the owner can write.src/lib/story/shiny.ts): 1 wild Ranemon in 256 (SHINY_ODDS) is a shiny, in a golden palette made by scripts/sprites.py (public/sprites/shiny/). It comes in with a gold flash and a burst of sparkles, the text says “A shiny X appeared!”, its name has a gold ★ in battle, the party, the Group Chat and the Ranedex, and befriending one sets off a celebration. It stays shiny in saves and when it evolves; saves from before shinies load as before.src/content/story/skins.ts): SKINS on the START menu. Beat a boss or named trainer, or finish a character's side quest, and you can walk around dressed as them, on the 2D map and the Trainer Card. Locked ones are silhouettes with a hint. A new character gets a skin with one entry (docs/story-mode.md, Skins).src/lib/speed.ts)./guide, on the title screen): the game, the six types and the full type chart, battles, statuses and story mode, for new players.src/app/fonts/tests/e2e/offline.spec.ts builds the Pages version, serves it as GitHub Pages does (scripts/offline/serve.mjs), loads it, cuts the connection and plays, and checks an update waits for its tap.