]> git.localhorst.tv Git - alttp.git/blob - resources/js/helpers/alttp-ram.js
2ae71cf58f48b857aa2b8a14fa6b1311f4d0fc37
[alttp.git] / resources / js / helpers / alttp-ram.js
1 export const isChestOpen = (data, room, chest) => {
2         if (chest < 4) {
3                 return !!(data && (data[2 * room] & Math.pow(2, chest + 4)));
4         } else {
5                 return !!(data && (data[(2 * room) + 1] & Math.pow(2, chest - 4)));
6         }
7 };
8
9 export const hasVisitedQuadrant = (data, room, quadrant) => {
10         return !!(data && (data[2 * room] & Math.pow(2, quadrant - 1)));
11 };
12
13 export const GT_BASEMENT_CHECKS = [
14         'iceM',
15         'iceL',
16         'iceR',
17         'dmUL',
18         'dmUR',
19         'dmBL',
20         'dmBR',
21         'randoUL',
22         'randoUR',
23         'randoBL',
24         'randoBR',
25         'fireSnake',
26         'mapChest',
27         'hopeL',
28         'hopeR',
29         'bobsChest',
30         'torchSeen',
31         'tileRoom',
32         'compassUL',
33         'compassUR',
34         'compassBL',
35         'compassBR',
36 ];
37
38 export const GT_BASEMENT_ALL = [
39         'iceM',
40         'iceL',
41         'iceR',
42         'dmUL',
43         'dmUR',
44         'dmBL',
45         'dmBR',
46         'randoUL',
47         'randoUR',
48         'randoBL',
49         'randoBR',
50         'fireSnake',
51         'mapChest',
52         'hopeL',
53         'hopeR',
54         'bobsChest',
55         'torch',
56         'torchSeen',
57         'tileRoom',
58         'compassUL',
59         'compassUR',
60         'compassBL',
61         'compassBR',
62 ];
63
64 export const getGTBasementState = (data) => ({
65         iceM: isChestOpen(data, 0x1C, 0),
66         iceL: isChestOpen(data, 0x1C, 1),
67         iceR: isChestOpen(data, 0x1C, 2),
68         dmUL: isChestOpen(data, 0x7B, 0),
69         dmUR: isChestOpen(data, 0x7B, 1),
70         dmBL: isChestOpen(data, 0x7B, 2),
71         dmBR: isChestOpen(data, 0x7B, 3),
72         randoUL: isChestOpen(data, 0x7C, 0),
73         randoUR: isChestOpen(data, 0x7C, 1),
74         randoBL: isChestOpen(data, 0x7C, 2),
75         randoBR: isChestOpen(data, 0x7C, 3),
76         fireSnake: isChestOpen(data, 0x7D, 0),
77         mapChest: isChestOpen(data, 0x8B, 0),
78         hopeL: isChestOpen(data, 0x8C, 1),
79         hopeR: isChestOpen(data, 0x8C, 2),
80         bobsChest: isChestOpen(data, 0x8C, 3),
81         torchSeen: hasVisitedQuadrant(data, 0x8C, 4),
82         torch: isChestOpen(data, 0x8C, 6),
83         tileRoom: isChestOpen(data, 0x8D, 0),
84         compassUL: isChestOpen(data, 0x9D, 0),
85         compassUR: isChestOpen(data, 0x9D, 1),
86         compassBL: isChestOpen(data, 0x9D, 2),
87         compassBR: isChestOpen(data, 0x9D, 3),
88 });
89
90 export const countGTBasementState = (state) =>
91         GT_BASEMENT_CHECKS.reduce((acc, cur) => state[cur] ? acc + 1 : acc, 0);
92
93 export const compareGTBasementState = (prev, cur) => {
94         for (let i = 0; i < GT_BASEMENT_ALL.length; ++i) {
95                 if (prev[GT_BASEMENT_ALL[i]] !== cur[GT_BASEMENT_ALL[i]]) {
96                         return GT_BASEMENT_ALL[i];
97                 }
98         }
99         return '';
100 };