222 lines
4.7 KiB
JavaScript
222 lines
4.7 KiB
JavaScript
const [
|
|
EMPTY, SNAKE,
|
|
FOOD, SUPER_FOOD, DECAY_FOOD,
|
|
WALL,
|
|
FIRE, FLAMMABLE, FLAMMABLE_S,
|
|
HOLE, HOLE_S,
|
|
PORTAL_A, PORTAL_A_S, PORTAL_B, PORTAL_B_S, PORTAL_C, PORTAL_C_S, PORTAL_D, PORTAL_D_S,
|
|
KEY, DOOR,
|
|
SWITCH_ON, SWITCH_ON_S, SWITCH_OFF, SWITCH_OFF_S, SPIKES_OFF, SPIKES_OFF_S, SPIKES_ON
|
|
]=Array(255).keys();
|
|
|
|
const tiles={
|
|
EMPTY, SNAKE,
|
|
FOOD, SUPER_FOOD, DECAY_FOOD,
|
|
WALL,
|
|
FIRE, FLAMMABLE, FLAMMABLE_S,
|
|
HOLE, HOLE_S,
|
|
PORTAL_A, PORTAL_A_S, PORTAL_B, PORTAL_B_S, PORTAL_C, PORTAL_C_S, PORTAL_D, PORTAL_D_S,
|
|
KEY, DOOR,
|
|
SWITCH_ON, SWITCH_ON_S, SWITCH_OFF, SWITCH_OFF_S, SPIKES_OFF, SPIKES_OFF_S, SPIKES_ON
|
|
};
|
|
|
|
const tileNames=(() => {
|
|
let tileNames=[];
|
|
Object.keys(tiles).forEach(key => tileNames[tiles[key]]=key);
|
|
return tileNames;
|
|
})();
|
|
|
|
const getName=t =>
|
|
tileNames[t] || `Unknown tile ${t}`;
|
|
|
|
const forChar=c => {
|
|
switch(c) {
|
|
case ' ': return EMPTY;
|
|
case 'f': return FOOD;
|
|
case 'F': return SUPER_FOOD;
|
|
case 'd': return DECAY_FOOD;
|
|
case 'w': return WALL;
|
|
case 'o': return HOLE;
|
|
case 'i': return FIRE;
|
|
case 'I': return FLAMMABLE;
|
|
case 'A': return PORTAL_A;
|
|
case 'B': return PORTAL_B;
|
|
case 'C': return PORTAL_C;
|
|
case 'D': return PORTAL_D;
|
|
case 'k': return KEY;
|
|
case 'K': return DOOR;
|
|
case 's': return SWITCH_OFF;
|
|
case 'S': return SPIKES_ON;
|
|
case 't': return SPIKES_OFF;
|
|
}
|
|
throw TypeError(`'${c}' doesn't correspond to any tile`);
|
|
};
|
|
|
|
const charFor=t => {
|
|
switch(t) {
|
|
case EMPTY: return ' ';
|
|
case FOOD: return 'f';
|
|
case SUPER_FOOD: return 'F';
|
|
case DECAY_FOOD: return 'd';
|
|
case WALL: return 'w';
|
|
case HOLE: return 'o';
|
|
case FIRE: return 'i';
|
|
case FLAMMABLE: return 'I';
|
|
case PORTAL_A: return 'A';
|
|
case PORTAL_B: return 'B';
|
|
case PORTAL_C: return 'C';
|
|
case PORTAL_D: return 'D';
|
|
case KEY: return 'k';
|
|
case DOOR: return 'K';
|
|
case SWITCH_OFF: return 's';
|
|
case SPIKES_ON: return 'S';
|
|
case SPIKES_OFF: return 't';
|
|
}
|
|
throw TypeError(`'${getName(t)}' doesn't have a corresponding character'`);
|
|
};
|
|
|
|
const snakeVersion=t => {
|
|
switch(t) {
|
|
case EMPTY: return SNAKE;
|
|
case HOLE: return HOLE_S;
|
|
case FLAMMABLE: return FLAMMABLE_S;
|
|
case PORTAL_A: return PORTAL_A_S;
|
|
case PORTAL_B: return PORTAL_B_S;
|
|
case PORTAL_C: return PORTAL_C_S;
|
|
case PORTAL_D: return PORTAL_D_S;
|
|
case SWITCH_OFF: return SWITCH_OFF_S;
|
|
case SWITCH_ON: return SWITCH_ON_S;
|
|
case SPIKES_OFF: return SPIKES_OFF_S;
|
|
}
|
|
throw TypeError(`'${getName(t)}' doesn't have a snake version'`);
|
|
};
|
|
|
|
const nonSnakeVersion=t => {
|
|
switch(t) {
|
|
case SNAKE: return EMPTY;
|
|
case HOLE_S: return HOLE;
|
|
case FLAMMABLE_S: return FLAMMABLE;
|
|
case PORTAL_A_S: return PORTAL_A;
|
|
case PORTAL_B_S: return PORTAL_B;
|
|
case PORTAL_C_S: return PORTAL_C;
|
|
case PORTAL_D_S: return PORTAL_D;
|
|
case SWITCH_OFF_S: return SWITCH_OFF;
|
|
case SWITCH_ON_S: return SWITCH_ON;
|
|
case SPIKES_OFF_S: return SPIKES_OFF;
|
|
}
|
|
throw TypeError(`'${getName(t)}' doesn't have a non-snake version'`);
|
|
};
|
|
|
|
const isSnakeVersion=t => {
|
|
switch(t) {
|
|
case SNAKE:
|
|
case HOLE_S:
|
|
case FLAMMABLE_S:
|
|
case PORTAL_A_S: case PORTAL_B_S: case PORTAL_C_S: case PORTAL_D_S:
|
|
case SWITCH_OFF_S: case SWITCH_ON_S:
|
|
case SPIKES_OFF_S:
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
const isNonSnakeVersion=t => {
|
|
switch(t) {
|
|
case EMPTY:
|
|
case HOLE:
|
|
case FLAMMABLE:
|
|
case PORTAL_A: case PORTAL_B: case PORTAL_C: case PORTAL_D:
|
|
case SWITCH_OFF: case SWITCH_ON:
|
|
case SPIKES_OFF:
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
const isSafe=t => {
|
|
switch(t) {
|
|
case EMPTY:
|
|
case HOLE:
|
|
case FLAMMABLE:
|
|
case PORTAL_A: case PORTAL_B: case PORTAL_C: case PORTAL_D:
|
|
case SWITCH_OFF: case SWITCH_ON:
|
|
case SPIKES_OFF:
|
|
case FOOD: case SUPER_FOOD: case DECAY_FOOD:
|
|
case KEY:
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
const isWall=t => {
|
|
switch(t) {
|
|
case WALL:
|
|
case FIRE:
|
|
case DOOR:
|
|
case SPIKES_ON:
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
const getType=t => {
|
|
if(isSnakeVersion(t)) return 'snake';
|
|
if(isWall(t)) return 'wall';
|
|
|
|
switch(t) {
|
|
case EMPTY:
|
|
case FLAMMABLE:
|
|
case SPIKES_OFF:
|
|
return 'empty';
|
|
|
|
case FOOD:
|
|
return 'food';
|
|
|
|
case SUPER_FOOD:
|
|
case DECAY_FOOD:
|
|
return 'bonus';
|
|
|
|
case HOLE:
|
|
return 'hole';
|
|
|
|
case PORTAL_A:
|
|
case PORTAL_B:
|
|
case PORTAL_C:
|
|
case PORTAL_D:
|
|
return 'portal';
|
|
|
|
case KEY:
|
|
return 'key';
|
|
|
|
case SWITCH_ON:
|
|
case SWITCH_OFF:
|
|
return 'switch';
|
|
}
|
|
|
|
throw TypeError(`'${getName(t)}' isn't a valid tile`);
|
|
};
|
|
|
|
const isPortal=t => {
|
|
switch(t) {
|
|
case PORTAL_A:
|
|
case PORTAL_B:
|
|
case PORTAL_C:
|
|
case PORTAL_D:
|
|
case PORTAL_A_S:
|
|
case PORTAL_B_S:
|
|
case PORTAL_C_S:
|
|
case PORTAL_D_S:
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
return module.exports={
|
|
tiles,
|
|
tileNames, getName,
|
|
forChar, charFor,
|
|
snakeVersion, nonSnakeVersion, isSnakeVersion, isNonSnakeVersion,
|
|
isSafe, isWall, isPortal,
|
|
getType
|
|
};
|