// Xyvera — Nakama server-side TypeScript runtime entry point // All game logic that touches currency, pulls, or inventory must execute // server-side only. The client is never trusted for economy-critical decisions. import * as auth from "./auth"; import * as gacha from "./gacha"; import * as inventory from "./inventory"; import * as progression from "./progression"; import * as village from "./village"; // InitModule is called once by Nakama at startup. // Register all RPCs and hooks here. function InitModule( ctx: nkruntime.Context, logger: nkruntime.Logger, nk: nkruntime.Nakama, initializer: nkruntime.Initializer ): Error | void { logger.info("Xyvera module initialising"); // ── Auth ────────────────────────────────────────────────────────────────── // Called after a new account is created. Seeds the player's starting state. initializer.registerAfterAuthenticateDevice(auth.afterAuthenticateDevice); // ── Gacha ───────────────────────────────────────────────────────────────── // Authoritative pull execution. Client never resolves pull outcomes. initializer.registerRpc("gacha/pull", gacha.rpcGachaPull); initializer.registerRpc("gacha/banners", gacha.rpcListBanners); initializer.registerRpc("gacha/pity", gacha.rpcGetPity); initializer.registerRpc("gacha/history", gacha.rpcGetPullHistory); // ── Inventory ───────────────────────────────────────────────────────────── initializer.registerRpc("inventory/get", inventory.rpcGetInventory); initializer.registerRpc("inventory/resources", inventory.rpcGetResources); // ── Progression ─────────────────────────────────────────────────────────── initializer.registerRpc("progression/level_up", progression.rpcLevelUp); initializer.registerRpc("progression/ascend", progression.rpcAscend); initializer.registerRpc("progression/upgrade_skill", progression.rpcUpgradeSkill); // ── Village and assignment ───────────────────────────────────────────────── // Passive resource accumulation is calculated server-side at claim time. initializer.registerRpc("village/state", village.rpcGetVillageState); initializer.registerRpc("village/assign", village.rpcAssignCharacter); initializer.registerRpc("village/unassign", village.rpcUnassignCharacter); initializer.registerRpc("village/collect", village.rpcCollectPassiveResources); // Manual micro-management endpoint — the core differentiating mechanic. // Server enforces diminishing returns and daily caps. initializer.registerRpc("village/manual_work", village.rpcManualWork); logger.info("Xyvera module initialised successfully"); }