A Typescript server emulator for Box Critters, a defunct virtual world.
1export type CritterId = "hamster" | "snail" | "lizard" | "beaver" | "raccoon" | "penguin" | "huggable"; 2 3export type Trigger = { 4 hex: string, 5 world?: { joinRoom: string }, 6 room?: { hide: Array<string> }, 7 server?: { 8 grantItem?: string | Array<string>, 9 hasItems?: Array<string>, 10 joinGame?: string, 11 addEgg?: string 12 } 13} 14 15export type Room = { 16 roomId: string, 17 name: string, 18 width: number, 19 height: number, 20 startX: number, 21 startY: number, 22 startR: number, 23 media: { 24 background: string, 25 foreground?: string, 26 treasure?: string, 27 navMesh: string, 28 music?: string, 29 video?: string, 30 }, 31 layout: string, 32 triggers: Array<Trigger>, 33 spriteSheet: string, 34 extra: null, 35 partyExclusive?: Array<string> 36} 37 38export type LocalPlayer = { 39 playerId: string, 40 nickname: string, 41 critterId: CritterId, 42 ignore: Array<string>, 43 friends: Array<string>, 44 inventory: Array<string>, 45 gear: Array<string>, 46 /** Eggs is the term used to describe any object used in a scavenger hunt. Any prop name found in that list will be hidden and replaced with it's "_found" suffix prop counterpart */ 47 eggs: Array<string>, 48 coins: number, 49 isMember: boolean | false, 50 isGuest: boolean | false, 51 isTeam: boolean | false, 52 x: number | 440, 53 y: number | 210, 54 rotation: number | 180, 55 mutes: Array<unknown>, 56 57 _partyId: string, 58 _mods: Array<string>, 59 60 // deno-lint-ignore no-explicit-any 61 [key: string]: any 62} 63 64export type PlayerCrumb = { 65 /** Player ID */ 66 i: string, 67 /** Player Nickname */ 68 n: string, 69 /** Critter (Hamster, Beaver, Lizard, Snail, etc) */ 70 c: CritterId, 71 x: number, 72 y: number, 73 r: number, 74 /** Gear (equipped items) */ 75 g: Array<string>, 76 77 /** Message */ 78 m: string, 79 /** Emote */ 80 e: string, 81 82 _roomId: string 83} 84 85export type ShopData = { 86 lastItem: { itemId: string, cost: number }, 87 freeItem: { itemId: string, cost: number }, 88 nextItem: { itemId: string, cost: number }, 89 collection: Array<{ itemId: string, cost: number }> 90} 91 92/* 93 Socket.io 94*/ 95export interface ServerToClientEvents { 96 login: () => {player: LocalPlayer}; 97 updateGear: () => { i: number, g: Array<string> }; 98 updateCoins: () => { balance: number }; 99 addItem: () => { itemId: string }; 100 addEgg: () => string; 101 A: () => PlayerCrumb; 102 R: () => PlayerCrumb; 103 X: () => { i: number, x: number, y: number }; 104 M: () => { i: number, m: string }; 105 E: () => { i: number, e: string }; 106 G: () => { i: number, g: Array<string> }; 107} 108 109export interface ClientToServerEvents { 110 login: (ticket: string) => void; 111 joinLobby: () => unknown; // Unsure what this is for, I don't think the game had several servers 112 joinRoom: (roomId: string) => { name: string, roomId: string, playerCrumbs: Array<PlayerCrumb> }; 113 message: (text: string) => void; 114 emote: (emote: string) => void; 115 code: (code: string, options?: string) => void; 116 addIgnore: (id: number) => void; 117 addFriend: (id: number) => void; 118 moveTo: (x: number, y: number) => void; 119 updateCritter: () => unknown; // Unsure of what this is, maybe settings? 120 updateGear: (gear: Array<string>) => void; 121 getShop: () => ShopData; 122 buyItem: (itemId: string) => void; 123 trigger: () => void; 124}