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}