For world admins
Authoring guide
How to build rooms in GameMaker, edit encounters and the shop, and publish to the live game. The game itself runs only in the Windows client; this website handles accounts, profiles and administration.
Start with LanternField.exe
Download and extract the Windows distribution, then run LanternField.exe. Use your existing account in the native login screen. Website recovery remains available for the same account. The title screen checks /api/client/update; choose Download Update to fetch a newer release. Progress, Cancel and Retry appear in-game. The bundled NyverisLauncher.exe is the background update helper, not a separate game.
Updates verify the release signature and SHA-256 checksum before staging and restarting the game. They do not replace the GameMaker save directory or server account data. An IDE run without the helper cannot install an arbitrary executable. World publication and client release updates are separate: new room artwork is downloaded by the existing client, while changed client code needs a new native release. Availability of storage, shop, persistent resources and PvP depends on the matching backend; the client does not fabricate missing server capabilities.
1. Build rooms in GameMaker
Download the configured Studio v4 project and open che.yyp. The included SETUP.md covers editing and exporting. The runtime starts in rm_client; rm_field and rm_cottage are authoring rooms. Do not replace the runtime shell with an editor room.
- Edit 32 x 32 native tile layers named
GroundandDecoration. Placeobj_map_barrierfor collision,obj_map_spawnfor named arrivals andobj_map_connectorfor links. Each room needs a walkable spawn namedentry. Connectortarget_roomandtarget_spawnmust identify a landing cell outside connector zones. - Add static artwork as graphics or sprite-bearing objects. Save the project, then export all authored rooms and PNG assets with the command below. Bake or remove transformed tiles; unsupported packed flip/rotation flags cause an export error rather than silently changing the map.
- Open World admin, sign in with a server-authorized administrator account and select
world-bundle.json(maximum 20 MiB). Review the local preview, then validate on the server. - Review rooms, artwork, spawns and connectors. Explicitly confirm publication. Publishing safely disconnects players; use native F5 after the reconnect cooldown to load the new revision. If another administrator publishes first, refresh and revalidate before retrying.
.\tools\Export-World.ps1 -ProjectPath .\che.yyp -DefaultRoom rm_field -OutputPath .\exports\world-bundle.json
Barriers and connectors use positive integer instance scales for rectangular cell areas. Marker icons are annotations, not artwork. Painting a tree or setting an ordinary object solid does not create server collision. Object code is never uploaded or executed by the server. Exports contain world data and artwork, never credentials or deployment secrets.
Validation is not publication. File changes invalidate prior validation. The server checks the privileged session for every request; no shared admin key or default password is used. Administration tokens stay in page memory and are not persisted by this page.
2. Edit encounter zones
Upload an export, Load published world or Load saved draft. Revision 0 has no published bundle. Select a room, then use Rectangle, Paint or Erase. Drag for continuous strokes, including holes and disconnected patches. Numeric column, row, width and height fields provide a rectangle alternative. Painted bounds are automatic; explicitly Clear selection before replacing a painted shape with a rectangle. If every tile is erased, paint another or use Delete selected zone.
The bounded preview starts as a safe grid. Successful server validation or a server draft/publication load enables optional artwork; local PNG header, dimensions and memory-budget checks precede decoding. Pink marks eligible selection, red marks ineligible selection, violet marks other zones, graphite marks walls, cyan marks portals and gold marks spawns. Use the zone register to select an existing zone. Unapplied changes block changing rooms/zones; New zone explicitly discards the current form.
Each room accepts up to 128 zones: {id,col,row,width,height,chance,minLevel,maxLevel,pool:[{speciesId,weight}]}, optionally with absolute tiles:[{col,row}]. Listed cells alone belong to a painted zone; omitted tiles means a filled rectangle. Member cells cannot overlap, though bounding rectangles can. Chance is 0-100%; levels are 1-50; choose 1-16 unique catalog species with weights 1-1000. Every zone needs a walkable non-spawn, non-portal cell.
Save zone applies the form and saves the whole draft privately to the server. Save draft saves already-applied edits; Load saved draft restores them after refresh. Strokes have no autosave. Deletion changes the local draft; use Save draft to persist it. Download draft JSON keeps a local copy. Validate the entire draft, then explicitly confirm publication. Stale revisions require review and revalidation, never automatic overwriting.
A new GameMaker export replaces web-edited zones. Keep the edited JSON or reproduce zones with GameMaker obj_map_encounter markers (zone_id, chance_percent, min_level, max_level, species_pool). There is no automatic .yyp synchronization or live change before confirmed publication. Old bundles without encounters normalize to empty arrays.
3. Manage the shop
The admin shop is independent of world drafts and publication. Load the server configuration and catalog, then set item, price, granted uses, availability and enabled state per listing. Always-available listings differ from permanent inventory items, which have no consumable use count. Configure a rotation interval of 60-604800 seconds and 1-16 rotating slots, with up to 64 unique lower_snake listing IDs. Save shop stores its own revision. Conflicts retain local edits; review them before explicitly discarding and reloading. Saving a shop never publishes a map.
Party, backpack and storage
Choose Embercub (Fire), Brookfin (Water) or Mossling (Leaf) once. Six party slots hold your active companions. Select a slot to change the lead or switch during battle. Keys 1-4 select attacks; B opens Backpack and R runs while not typing. Catching uses a Catching Card from the Catching Items pocket, not a free Catch command. The other pockets are Misc, Berries and Key Items. Oran Berry restores HP using a battle turn; permanent Field Pass ownership does not imply an active battle effect.
The server controls turn phases, HP, damage, accuracy, catches, XP and move SP. An accepted attack spends SP even on a miss. HP and SP persist after battle, logout, updates and reconnects; battle completion does not heal the party. On a map spawn, while idle and outside battle, use REST or F4 to restore party resources. Storage monsters are not restored by party REST. An interrupted server battle resumes its stored state after reconnecting.
Open Storage with its world control or P: four boxes of 30 monsters are separate from the six-member party. Transfers and swaps are allowed only outside battle and preserve identity, HP, SP, XP and capture history. At least one party companion must remain. A capture enters storage if the party is full; capture is blocked when both are full. Public profiles show caught companions, storage and PvP scores without exposing private resource data.
Open Shop with its world control or O. Prices, rotating availability, coins and item grants are server-owned. Purchases are disabled during battle; repeated purchase IDs cannot charge twice. Catching, escaping and losing do not award wild-victory coins. Neither client updates nor reconnects refill inventory or wallet resources.
Levelling and PvP
Defeating a wild monster awards 20 * wild level XP divided among surviving participating party members below level 50. Benched and fainted members earn none. Catching, running, losing and cancellation do not award defeat XP. The cumulative level threshold is 25 * L * (L - 1); the next level costs 50 * L XP. The cap is level 50 / 61,250 XP. A level-5 starter has 500 total XP and needs 250 more for level 6. Level-up increases maximum stats without refilling current HP. Fire beats Leaf, Leaf beats Water, Water beats Fire; Normal is neutral.
Native player challenges and timed duels use server-owned invitations, turn deadlines and results. The matching backend persists PvP scores shown on profiles. PvP is not a browser mode, and local animation or a client timer never authorizes damage or another turn. World publication cancels active fights safely rather than awarding a victory or restoring resources.
Protocol 3 and authentication
Log in with POST /api/login, obtain a single-use ticket with POST /api/ticket, then authenticate the same-origin WebSocket with {"type":"auth","ticket":"...","protocol":3,"features":["battles-v1"]}. Enable battle requests only when welcome advertises features:["battles-v1"], and honor advertised capabilities for additional systems. Keep bearer credentials out of URLs and exports. Website login/recovery and native accounts use the existing API, not PHP sessions.
Private party snapshots contain max,starterChosen,leadSlot,monsters,starters. Owned monsters include authoritative slots, HP, stats, four moves and xp,xpProgress,xpRequired; resource-capable servers provide move SP. A private battle snapshot contains battle:null or an object with id,turn,status,roomId,zoneId,activeSlot,wild,log,canCatch, with phase/resource metadata where supported. Terminal results include xpRewards. Request {type:"starter",speciesId}, {type:"party_lead",slot} or {type:"battle_action",battleId,turn,action:"attack",move:0} (moves 0-3). Run and switch are battle actions; item-based captures use the current inventory contract, not the obsolete free catch action.
GET /api/battle/catalog provides species, moves, typing, progression and capability metadata. /api/client/update provides native release availability; do not substitute a world export for a client update. Rewards, resources, purchases and storage placement remain server-authoritative and persistent.
A protocol 3 welcome includes player ID, world revision and current room. Transitions arrive as {"type":"room","revision":1,"world":{...}}. Clear held input, old peers and interpolation on transition. Accept room-scoped snapshots only when roomId matches world.id. Wait for required artwork before sending nonzero movement.
Published room data includes id,name,columns,rows, pixel dimensions, 32px tiles, ground/decor/collision layers, spawns, connectors, placed sprites and asset metadata. Ground and decor can use distinct atlases. Artwork URLs remain same-origin /api/world-assets/<sha256>.png. Placed sprites use exported origin, scale, rotation and depth: nonnegative depth is behind players, negative depth is in front.
tileEncoding:"native" means tile 0 is empty on both layers. Index 1 samples source grid cell 1; cell 0 is reserved and no additional offset is applied. Atlas cells are 32px. Collision describes terrain only; players do not block each other. Send integer cardinal directions or zero every 100ms: {"type":"move","seq":0,"dx":1,"dy":0}. Each authorized 32px step takes 200ms / four simulation ticks. Feet use sprite origin (16,32), with native rendered feet centered on the cell; server collision and coordinates are unchanged.
Raw native WSS
GameMaker uses raw text JSON, not packet envelopes. The engine handles TLS and RFC 6455 framing:
network_connect_raw_async(socket_id, "wss://nyveris.net/ws", 443);
// After network_type_non_blocking_connect succeeds:
buffer_write(send_buffer, buffer_string, json_stringify(message));
network_send_raw(socket_id, send_buffer,
buffer_tell(send_buffer) - 1, network_send_text);The size excludes the NUL. Do not use network_send_packet or omit the text argument. Recovery and password reset remain website services for native accounts. No credentials belong in an export or download.
Legacy reference
The legacy v3 source ZIP is a single-room protocol 2 reference, not the current game or a multi-room publishing kit. Use Studio v4 for current authoring. Native compatibility with protocol 2 applies only to untouched revision-0 bootstrap data; published worlds require protocol 3.
Protocol 3 revision-0 bootstrap data may use tileEncoding:"legacy": source cell 0 is grass, decor 0 is empty and the original kit atlases apply. Published native indices follow the different convention above. There is no browser-play fallback.