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