FLOOR = 0 GOAL = 1 BOX = 2 PLAYER = 4 WALL = 7 function init() mode(2) level=1 player={} menu.init() end -- ==================================================================================================== -- MENU (game state) -- ==================================================================================================== blink=0 menu={ init = function() update=menu.update end, update = function() color(15,0) cls() ink(1) print("\x20\x20\x20\x87\x81\x87\x85\x85\x85\x87\x85\x87\x85\x87\x85\x87\x84\x20\x20\x20",0,2) ink(9) print("\x20\x20\x20\x83\x85\x85\x85\x8D\x81\x85\x85\x87\x84\x8D\x85\x85\x85\x20\x20\x20",0,3) ink(11) print("\x20\x20\x20\x83\x81\x83\x81\x81\x81\x83\x81\x83\x81\x81\x81\x81\x81\x20\x20\x20",0,4) ink(15*flr((blink%60)/30)) print("PRESS SPACE TO PLAY",1,9) blink=blink+1 if btnp(KEY_SPACE) then level=1 game.init() end end } -- ==================================================================================================== -- GAME (game state) -- ==================================================================================================== game={ init = function() update=game.update level.load_from_string("####|# .#|# ###|#*@ #|# $ #|# ###|####") end, update = function() border(0) color(1,0) cls() level.draw() if btnp(KEY_UP) then level.try_move(0,-1) elseif btnp(KEY_DOWN) then level.try_move(0,1) elseif btnp(KEY_LEFT) then level.try_move(-1,0) elseif btnp(KEY_RIGHT) then level.try_move(1,0) end end } -- ==================================================================================================== -- LOADING (game state) -- ==================================================================================================== loading = { init = function() border(15) update=loading.update wait=120 end function inbetween_update() color(15,0) cls() print("LEVEL "..level,6,6) print("GOOD JOB!",4,8) wait=wait-1 if wait==0 then level=level+1 game_init() end end } function level_load_from_string(str) map={} local pos=0 local y,x=1,1 local maxx=0 map[y] = {} while pos<#str do local chr = ascii(str,pos) if chr == 35 then map[y][x] = WALL end if chr == 64 then player.x,player.y=x,y map[y][x] = FLOOR end if chr == 43 then player.x,player.y=x,y map[y][x] = GOAL end if chr == 36 then map[y][x] = BOX end if chr == 42 then map[y][x] = GOAL+BOX end if chr == 46 then map[y][x] = GOAL end if chr == 32 then map[y][x] = FLOOR end if chr == 124 then y=y+1 map[y] = {} if maxx < x then maxx=x end x=0 end pos=pos+1 x=x+1 end ox = flr((20-maxx)/2) oy = flr((15-y)/2) end function level_draw() for y=1,#map do for x=1,#map[y] do if map[y][x] == WALL then color(4,15) print("\127",ox+x-1,oy+y-1) elseif map[y][x] == BOX then color(0,6) print("\016",ox+x-1,oy+y-1) elseif map[y][x] == BOX+GOAL then color(0,4) print("\016",ox+x-1,oy+y-1) elseif map[y][x] == GOAL then color(4,0) print("\144",ox+x-1,oy+y-1) end end end color(15,0) print("\248",ox+player.x-1,oy+player.y-1) end function try_move(x,y) if is_empty(x,y) then move_player(x,y) elseif is_box(x,y) and is_empty(x*2,y*2) then move_box(x,y) end end function is_empty(x,y) return map[player.y+y][player.x+x] < 2 end function is_box(x,y) return map[player.y+y][player.x+x] < 4 end function move_player(x,y) player.x=player.x+x player.y=player.y+y end function move_box(x,y) map[player.y+y*2][player.x+x*2] = map[player.y+y*2][player.x+x*2] + BOX map[player.y+y][player.x+x] = map[player.y+y][player.x+x] - BOX move_player(x,y) check_finished() end function check_finished() for y=1,#map do for x=1,#map[y] do if map[y][x] == GOAL then return end end end inbetween_init() end