1 export const isChestOpen = (data, room, chest) => {
3 return !!(data && (data[2 * room] & Math.pow(2, chest + 4)));
5 return !!(data && (data[(2 * room) + 1] & Math.pow(2, chest - 4)));
9 export const hasVisitedQuadrant = (data, room, quadrant) => {
10 return !!(data && (data[2 * room] & Math.pow(2, quadrant - 1)));
13 export const GT_BASEMENT_CHECKS = [
38 export const GT_BASEMENT_ALL = [
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),
90 export const countGTBasementState = (state) =>
91 GT_BASEMENT_CHECKS.reduce((acc, cur) => state[cur] ? acc + 1 : acc, 0);
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];