|
|
|
@ -1,4 +1,13 @@ |
|
|
|
|
const [EMPTY, 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, SNAKE]=Array(255).keys(); |
|
|
|
|
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(); |
|
|
|
|
|
|
|
|
|
class SnekGame { |
|
|
|
|
constructor(settings, canvas, rules) { |
|
|
|
@ -32,6 +41,9 @@ class SnekGame { |
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
})(); |
|
|
|
|
} |
|
|
|
@ -109,6 +121,13 @@ class SnekGame { |
|
|
|
|
|
|
|
|
|
// add the doors
|
|
|
|
|
if(settings.doors) settings.doors.forEach(([x, y]) => this.world[x][y]=DOOR); |
|
|
|
|
|
|
|
|
|
// add the switches
|
|
|
|
|
if(settings.switches) settings.switches.forEach(([x, y]) => this.world[x][y]=SWITCH_OFF); |
|
|
|
|
|
|
|
|
|
// add the spikes
|
|
|
|
|
if(settings.spikesOn) settings.spikesOn.forEach(([x, y]) => this.world[x][y]=SPIKES_ON); |
|
|
|
|
if(settings.spikesOff) settings.spikesOff.forEach(([x, y]) => this.world[x][y]=SPIKES_OFF); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// add the snake to the world
|
|
|
|
@ -235,6 +254,8 @@ class SnekGame { |
|
|
|
|
const portalD=assets.get('portalD'); |
|
|
|
|
const key=assets.get('key'); |
|
|
|
|
const door=assets.get('door'); |
|
|
|
|
const switchTile=assets.get('switch'); |
|
|
|
|
const spikes=assets.get('spikes'); |
|
|
|
|
const putTile=(x, y, tile) => this.ctx.drawImage( |
|
|
|
|
tile, |
|
|
|
|
offsetX+cellSize*x, |
|
|
|
@ -316,6 +337,23 @@ class SnekGame { |
|
|
|
|
case DOOR: |
|
|
|
|
putTile(x, y, door); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case SWITCH_ON: |
|
|
|
|
case SWITCH_ON_S: |
|
|
|
|
putTile(x, y, switchTile.on); |
|
|
|
|
break; |
|
|
|
|
case SWITCH_OFF: |
|
|
|
|
case SWITCH_OFF_S: |
|
|
|
|
putTile(x, y, switchTile.off); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case SPIKES_ON: |
|
|
|
|
putTile(x, y, spikes.on); |
|
|
|
|
break; |
|
|
|
|
case SPIKES_OFF: |
|
|
|
|
case SPIKES_OFF_S: |
|
|
|
|
putTile(x, y, spikes.off); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -511,6 +549,15 @@ class SnekGame { |
|
|
|
|
case PORTAL_D_S: |
|
|
|
|
this.world[tail[0]][tail[1]]=PORTAL_D; |
|
|
|
|
break; |
|
|
|
|
case SWITCH_ON_S: |
|
|
|
|
this.world[tail[0]][tail[1]]=SWITCH_ON; |
|
|
|
|
break; |
|
|
|
|
case SWITCH_OFF_S: |
|
|
|
|
this.world[tail[0]][tail[1]]=SWITCH_OFF; |
|
|
|
|
break; |
|
|
|
|
case SPIKES_OFF_S: |
|
|
|
|
this.world[tail[0]][tail[1]]=SPIKES_OFF; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
this.world[tail[0]][tail[1]]=EMPTY; |
|
|
|
|
} |
|
|
|
@ -530,6 +577,7 @@ class SnekGame { |
|
|
|
|
case WALL: return this.die("thought walls were edible", "hit a wall"); |
|
|
|
|
case FIRE: return this.die("burned to a crisp", "hit fire"); |
|
|
|
|
case DOOR: return this.die("forgot to OPEN the door", "hit a door"); |
|
|
|
|
case SPIKES_ON: return this.die("thought they were a girl's drink in a nightclub", "hit spikes"); |
|
|
|
|
|
|
|
|
|
// congratilations, you played yourself!
|
|
|
|
|
case SNAKE: |
|
|
|
@ -539,6 +587,9 @@ class SnekGame { |
|
|
|
|
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 this.die("achieved every dog's dream", "ate their own tail"); |
|
|
|
|
|
|
|
|
|
// if either 3 consecutive segments or the whole snake is on a hole, you die
|
|
|
|
@ -571,6 +622,16 @@ class SnekGame { |
|
|
|
|
this.getTilesOfType(DOOR).forEach(([x, y]) => this.world[x][y]=EMPTY); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
// you step on, you trigger
|
|
|
|
|
case SWITCH_ON: |
|
|
|
|
case SWITCH_OFF: { |
|
|
|
|
this.world[head[0]][head[1]]=this.world[head[0]][head[1]]==SWITCH_ON?SWITCH_OFF:SWITCH_ON; |
|
|
|
|
if(this.getTilesOfType(SPIKES_OFF_S).length) return this.die("spiked themselves", "activated spikes"); |
|
|
|
|
const oldSpikes=this.getTilesOfType(SPIKES_ON); |
|
|
|
|
this.getTilesOfType(SPIKES_OFF).forEach(([x, y]) => this.world[x][y]=SPIKES_ON); |
|
|
|
|
oldSpikes.forEach(([x, y]) => this.world[x][y]=SPIKES_OFF); |
|
|
|
|
} break; |
|
|
|
|
|
|
|
|
|
// you eat, you grow
|
|
|
|
|
case FOOD: |
|
|
|
|
// re-grow the snake partially (can't hit the tail, but it's there for all other intents and purposes
|
|
|
|
@ -638,6 +699,15 @@ class SnekGame { |
|
|
|
|
case PORTAL_D: |
|
|
|
|
this.world[head[0]][head[1]]=PORTAL_D_S; |
|
|
|
|
break; |
|
|
|
|
case SWITCH_ON: |
|
|
|
|
this.world[head[0]][head[1]]=SWITCH_ON_S; |
|
|
|
|
break; |
|
|
|
|
case SWITCH_OFF: |
|
|
|
|
this.world[head[0]][head[1]]=SWITCH_OFF_S; |
|
|
|
|
break; |
|
|
|
|
case SPIKES_OFF: |
|
|
|
|
this.world[head[0]][head[1]]=SPIKES_OFF_S; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
this.world[head[0]][head[1]]=SNAKE; |
|
|
|
|
} |
|
|
|
|