var canvas ;
const WAITING = 0 ;
const RUNNING = 1 ;
const REVIEWING = 2 ;
const UP = 0 ;
const RIGHT = 1 ;
const DOWN = 2 ;
const LEFT = 3 ;
const RED = 0 ;
const BLUE = 1 ;
const GREEN = 2 ;
const YELLOW = 3 ;
const PURPLE = 4 ;
const PINK = 5 ;
const BLACK = 6 ;
const GRAY = 7 ;
const ALIVE = 0 ;
const DEAD = 1 ;
var BOT _X = - 1
var BOT _Y = - 1
var BOT _DIR = RIGHT
var BOT _STATE = ALIVE
var BOT _TAPE = [ { color : RED } , { color : BLUE } ]
var BELTDOWN = { type : "BELT" , direction : DOWN /*,direction2 - defines a secondary direction. For two belts at once.*/ }
var BELTRIGHT = { type : "BELT" , direction : RIGHT }
var BELTUP = { type : "BELT" , direction : UP }
var BELTLEFT = { type : "BELT" , direction : LEFT }
var BRANCHDOWN = { type : "BRANCH" , direction : DOWN , color1 : RED , color2 : BLUE } //color 1 points left, color 2 points right
var BRANCHLEFT = { type : "BRANCH" , direction : LEFT , color1 : RED , color2 : BLUE }
var BRANCHRIGHT = { type : "BRANCH" , direction : RIGHT , color1 : RED , color2 : BLUE }
var BRANCHUP = { type : "BRANCH" , direction : UP , color1 : RED , color2 : BLUE }
var WRITERDOWN = { type : "WRITER" , direction : DOWN , color : RED /*overwrite - if turned on, the writer overwrites the current tape position instead of appending.*/ }
var WRITERLEFT = { type : "WRITER" , direction : LEFT , color : RED }
var WRITERRIGHT = { type : "WRITER" , direction : RIGHT , color : RED }
var WRITERUP = { type : "WRITER" , direction : UP , color : RED }
var lastGameUpdate = 0 ;
var gameSpeed = 1000 / 1 ;
var gameState = RUNNING ;
var LEVEL0 = [
[ { } , { } , { } , { } , { } , ] ,
[ { } , { } , { } , { } , { } , ] ,
[ { } , { } , { } , { } , { } , ] ,
[ { } , { } , { } , { } , { } , ] ,
[ { } , { } , { } , { } , { } , ] , ]
var LEVEL1 = [
[ { } , { } , { ... BELTDOWN } , { ... BELTLEFT } , { ... BELTLEFT } , ] ,
[ { } , { } , { } , { } , { ... BELTUP } , ] ,
[ { } , { ... BELTDOWN } , { } , { } , { ... BELTUP } , ] ,
[ { } , { ... BELTRIGHT } , { ... BELTRIGHT } , { ... BELTRIGHT } , { ... BELTUP } , ] ,
[ { } , { } , { } , { } , { } , ] , ]
var LEVEL2 = [
[ { } , { } , { } , { } , { } , ] ,
[ { } , { ... BELTRIGHT } , { } , { } , { } , ] , //BLUE
[ { } , { ... BRANCHRIGHT } , { } , { } , { } , ] ,
[ { } , { ... BELTRIGHT } , { } , { } , { } , ] , //RED
[ { } , { } , { } , { } , { } , ] , ]
var LEVEL3 = [
[ { } , { } , { } , { } , { } , ] ,
[ { } , { ... WRITERUP , overwrite : true } , { } , { } , { } , ] ,
[ { } , { ... WRITERDOWN } , { } , { } , { } , ] ,
[ { } , { ... BELTRIGHT } , { } , { } , { } , ] ,
[ { } , { } , { } , { } , { } , ] , ]
var LEVEL4 = [
[ { } , { } , { } , { } , { } , ] ,
[ { } , { } , { } , { } , { } , ] ,
[ { } , { ... BELTRIGHT , direction2 : DOWN } , { } , { } , { } , ] ,
[ { } , { } , { ... BELTUP , direction2 : LEFT } , { } , { } , ] ,
[ { } , { } , { } , { } , { } , ] , ]
var gameGrid = [ ]
function createGrid ( width , height ) {
var grid = [ ]
for ( var i = 0 ; i < width ; i ++ ) {
var row = [ ]
for ( var j = 0 ; j < height ; j ++ ) {
row . push ( { } )
}
grid . push ( row )
}
return grid
}
function runBot ( testing ) {
//console.log(new Date().getTime())
if ( lastGameUpdate < new Date ( ) . getTime ( ) || testing ) {
lastGameUpdate = new Date ( ) . getTime ( ) + gameSpeed
//console.log("Update")
var nextSquare = { }
switch ( BOT _DIR ) {
case UP : {
nextSquare = gameGrid [ -- BOT _Y ] [ BOT _X ] ;
BOT _DIR = ( nextSquare . direction2 &&
( nextSquare . direction2 === UP || nextSquare . direction2 === DOWN ) ) ? nextSquare . direction2 : nextSquare . direction
} break ;
case LEFT : {
nextSquare = gameGrid [ BOT _Y ] [ -- BOT _X ] ;
BOT _DIR = ( nextSquare . direction2 &&
( nextSquare . direction2 === RIGHT || nextSquare . direction2 === LEFT ) ) ? nextSquare . direction2 : nextSquare . direction
} break ;
case RIGHT : {
nextSquare = gameGrid [ BOT _Y ] [ ++ BOT _X ] ;
BOT _DIR = ( nextSquare . direction2 &&
( nextSquare . direction2 === RIGHT || nextSquare . direction2 === LEFT ) ) ? nextSquare . direction2 : nextSquare . direction
} break ;
case DOWN : {
nextSquare = gameGrid [ ++ BOT _Y ] [ BOT _X ] ;
BOT _DIR = ( nextSquare . direction2 &&
( nextSquare . direction2 === UP || nextSquare . direction2 === DOWN ) ) ? nextSquare . direction2 : nextSquare . direction
} break ;
}
if ( nextSquare . direction !== undefined ) {
switch ( nextSquare . type ) {
case "BRANCH" : {
//console.log("Branch found")
if ( BOT _TAPE [ 0 ] . color === nextSquare . color1 ) {
//console.log("Matches color1")
//Move towards left side of the branch.
BOT _DIR = LeftOf ( nextSquare . direction )
ConsumeTape ( )
} else
if ( BOT _TAPE [ 0 ] . color === nextSquare . color2 ) {
//console.log("Matches color2")
//Move towards left side of the branch.
BOT _DIR = RightOf ( nextSquare . direction )
ConsumeTape ( )
}
} break ;
case "WRITER" : {
if ( nextSquare . overwrite ) {
OverwriteTape ( nextSquare . color )
} else {
AppendTape ( nextSquare . color )
}
BOT _DIR = nextSquare . direction
} break ;
}
//console.log("Direction is now "+BOT_DIR)
} else {
gameState = REVIEWING
BOT _STATE = DEAD
}
if ( ! testing ) { renderGame ( ) }
}
}
function placeBot ( x , y ) {
BOT _X = x
BOT _Y = y
}
function setupGame ( ) {
canvas = document . createElement ( "CANVAS" ) ;
canvas . style . width = "100%"
canvas . style . height = "100%"
document . getElementById ( "game" ) . appendChild ( canvas )
//gameGrid = [...createGrid(5,5)]
}
function loadLevel ( level , botx , boty ) {
placeBot ( botx , boty )
gameGrid = deepCopy ( level )
}
function deepCopy ( arr ) {
var newarr = [ ]
for ( var i = 0 ; i < arr . length ; i ++ ) {
newarr [ i ] = [ ]
for ( var j = 0 ; j < arr [ i ] . length ; j ++ ) {
newarr [ i ] [ j ] = { ... arr [ i ] [ j ] }
}
}
return newarr
}
function step ( ) {
if ( gameState === RUNNING ) {
runBot ( )
}
}
function renderGame ( ) {
var displayGrid = [ ]
displayGrid = deepCopy ( gameGrid )
if ( BOT _X !== - 1 && BOT _Y !== - 1 ) {
displayGrid [ BOT _Y ] [ BOT _X ] [ "BOT" ] = true
}
console . log ( displayGrid )
}
function draw ( ) {
var ctx = canvas . getContext ( "2d" )
ctx . fillStyle = "#FFF"
ctx . fillRect ( 0 , 0 , canvas . width , canvas . height )
ctx . beginPath ( ) ;
ctx . stroke ( ) ;
}
function ConsumeTape ( ) {
BOT _TAPE . shift ( )
}
function AppendTape ( col ) {
BOT _TAPE . push ( { color : col } )
}
function OverwriteTape ( col ) {
BOT _TAPE [ 0 ] = { color : col }
}
function LeftOf ( dir ) {
return ( dir + 1 ) % 4
}
function RightOf ( dir ) {
if ( dir === 0 ) { dir = 4 }
return ( dir - 1 ) % 4
}