[Game] AHKBAN a Boxxle (Sokoban) clone

Post gaming related scripts
User avatar
SpeedMaster
Posts: 494
Joined: 12 Nov 2016, 16:09

[Game] AHKBAN a Boxxle (Sokoban) clone

21 May 2018, 17:11

Inspired by the awesome Project 2D (by TheDewd) https://autohotkey.com/boards/viewtopic.php?t=7348
I decided to make a Sokoban game. 8-)
I did not use the same programming architecture but the fundamentals
for creating a tile-based 2D game remain the same. ;)

Enjoy the game and feel free to comment.

If you can not solve a puzzle do not blame me. :crazy:
I can assure you that all levels are soluble. :thumbup:

Here is the script:

Code: Select all

; ======================================================================================================================
; Name:           AHKBAN 
; Description:    a Boxxle (Sokoban) clone 
; Topic:          https://autohotkey.com/boards/viewtopic.php?f=19&t=49383
; Sript version:  1.6
; AHK Version:    1.1.24.03 (A32/U32/U64)
; Tested on:      Win 7 (x64)
; Author::        SpeedMaster
; Tileset:        from Project 2D by TheDewd 

; How to play:    The goal of the game is to push all of the barrels onto the goals. 
;                 The player can only push one barrel at a time and is not able to pull them. 
;                 A level is solved when each barrel is on a goal.
; ======================================================================================================================

#SingleInstance force
SetBatchLines, -1
SetWorkingDir, %A_ScriptDir%

gosub, boxxlelevels
gosub, extract_tiles

tooltip, Loading Game... Please wait

BoardCols:=30
BoardROWS:=22

MOVES:=0
PUSH:=0

record:=[]
forward:=[]

MAP_WIDTH:=BoardCols
MAP_HEIGHT:=BoardROWS

TILE_TYPE:=[]
TILE_TYPE[0]:= [ ""                          , true  , false, "empty"       ] 
TILE_TYPE[1]:= [ "boxxeltiles\01.png"        , true  , false, "Rock_floor"  ] 
TILE_TYPE[2]:= [ "boxxeltiles\02.png"        , false , false, "Wall"        ] 
TILE_TYPE[3]:= [ "boxxeltiles\goal.png"      , true  , false, "Goal"        ] 
TILE_TYPE[4]:= [ "boxxeltiles\03.png"        , true  , false, "stair"       ]
TILE_TYPE[6]:= [ "boxxeltiles\06.png"        , true  , false, "player_up"   ]
TILE_TYPE[7]:= [ "boxxeltiles\07.png"        , true  , false, "player_down" ]
TILE_TYPE[8]:= [ "boxxeltiles\08.png"        , true  , false, "player_left" ]
TILE_TYPE[9]:= [ "boxxeltiles\09.png"        , true  , false, "player_right"]
TILE_TYPE[12]:=[ "boxxeltiles\barrel.png"    , false , true , "barrel"      ] 
TILE_TYPE[13]:=[ "boxxeltiles\barrel_red.png", false , true , "red barrel"  ] 
TILE_TYPE[14]:=[ "boxxeltiles\14.png"        , true  , false , "blue_floor" ]

emptytile:=0
rock_floor:=1
wall:=2
goal:=3
stair:=4
closed_door:=5
open_door:=6
barrel:=12
redbarrel:=13
currentlevel:=1
playerpicup:=TILE_TYPE[6].1
playerpicdown:=TILE_TYPE[7].1
playerpicleft:=TILE_TYPE[8].1
playerpicright:=TILE_TYPE[9].1



lvselect:=new layergrid(ctr:="radio",clln:="5_",cmj:="true", gpx:=10, gpy:=10, cols:=10, rows:=11, wsp:="50", hsp:="20", opt:="gselectlv", fill:="aindex", "Mselect")

Layer_background :=new layergrid(ctr:="pic",clln:="1_",cmj:="true", gpx:=10, gpy:=10, cols:=BoardCOLS, rows:=BoardROWS, wsp:="32", hsp:="32", opt:="gclickcell BackGroundTrans disabled", fill:=TILE_TYPE[14].1, "1")
Layer_items      :=new layergrid(ctr:="pic",clln:="2_",cmj:="true", gpx:=10, gpy:=10, cols:=BoardCOLS, rows:=BoardROWS, wsp:="32", hsp:="32", opt:="gclickcell BackGroundTrans disabled", fill:=TILE_TYPE[0].1, "1")
Layer_characters :=new layergrid(ctr:="pic",clln:="3_",cmj:="true", gpx:=10, gpy:=10, cols:=BoardCOLS, rows:=BoardROWS, wsp:="32", hsp:="32", opt:="gclickcell BackGroundTrans disabled", fill:=TILE_TYPE[0].1, "1")
Layer_debug :=new layergrid(ctr:="text",clln:="4_",cmj:="true", gpx:=10, gpy:=10, cols:=BoardCOLS, rows:=BoardROWS, wsp:="32", hsp:="32", opt:=" w32 h32 0x201 -border BackGroundTrans ", fill:=" ", "1")


gui, font, s26 bold, consolas
gui, add, picture, x310 y200 vtitle backgroundtrans, boxxeltiles\Project_2D.png
gui, add, picture, xp+30  y+10 vstart backgroundtrans, boxxeltiles\PRESS_ENTER_TO_START.png
gui, add, picture, xp+60  yp vcongratulation hidden backgroundtrans, boxxeltiles\congratulation.png

gui, font, s12 italic, consolas
gui, add, text, x825 y685 cred backgroundtrans, by SpeedMaster

gui, font
gui, font, s14 bold, consolas


Gui, Add, text, x20 y25 w400 h50 hidden vcLV backgroundtrans cwhite,  % "Level:" currentlevel

gui, add, button, x20 yp+30 w30 h30 hidden vlevel_down10 glevel_down10, <<
gui, add, button, x+2 yp w30 h30 hidden vlevel_down glevel_down, <
gui, add, button, x+2 yp w30 h30 hidden vnextlevel gnextlevel, >
gui, add, button, x+2 yp w30 h30 hidden vlevel_up10 glevel_up10, >>


Gui, Add, text, x20 yp+45 w400 h50 hidden backgroundtrans vundo cwhite, Undo / Redo

gui, add, button, x20 yp+30 w30 h30 hidden vgoback10 ggoback10, <<
gui, add, button, x+2 yp w30 h30 hidden vgoback ggoback, <
gui, add, button, x+2 yp w30 h30 hidden vgoforth ggoforth, >
gui, add, button, x+2 yp w30 h30 hidden vgoforth10 ggoforth10, >>

gui 1: add, button, x+2 yp w30 h30 hidden vf_1_1 , focus


gui, add, text, x20 y+30 w124 h30 cyellow hidden vmoves -border backgroundtrans , % "Moves:" 0
gui, add, text, xp yp+30 w124 h30 cyellow hidden vpush -border backgroundtrans , % "Pushes:" 0


tooltip,

;---------------------------------------CHECK IF INI EXIST IF NOT CREATE IT--------------------------------------------------------

iniFile := SubStr( A_ScriptName, 1, -3 ) . "ini"
Ini_File=%A_WorkingDir%\%iniFile%      
ifnotexist,%Ini_File%
 {
  iniContent =
  (
  [Game]
  lastplayed=1
  )

  replaceFile(iniFile, iniContent)
 }

; call replace file function
replaceFile(File, Content)
{
	FileDelete, %File%
	FileAppend, %Content%, %File%
}

;------------------------------------Read the ini file and store its content to variables----------------------------------------------
;Read ini file 
IniRead, currentlevel, % iniFile, game, lastplayed

if !(currentlevel) || (currentlevel>108)
  currentlevel:=1

;----------------------------------------------------------------------------------------


	Gui, Mselect: +LastFound -Resize ;+OwnDialogs
	Gui, Mselect: Margin, 10, 10
	Gui, Mselect: Show, Hide AutoSize, Level Select


Menu, GameMenu, Add, &Retry`tR, Retry
Menu, GameMenu, Add, &Level Select`tF2, selectlevel
Menu, GameMenu, Add, &Exit`tESC, exit

Menu, HelpMenu, Add, &How to play, howtoplay
Menu, HelpMenu, Add, &Shortcuts, help
Menu, HelpMenu, Add, &About, about

Menu, MyMenuBar, Add, &Game, :GameMenu

; Create the menu bar by attaching the sub-menus to it:
Menu, MyMenuBar, Add, &Help, :HelpMenu

; Attach the menu bar to the window:
Gui 1: Menu, MyMenuBar

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Gui, show, AutoSize, AHKBAN v1.6 - by Speedmaster
return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

retry:
retry()
return

selectlv:
gotolv:=( agmove(a_guicontrol, "EY")*10 ) - ( 10 - agmove(a_guicontrol, "EX"))
currentlevel:=gotolv
Gui, submit
Gui 1:Default
solved:=0
if !(play){
  hidecell("title")
  hidecell("start")
  showcell("cLV")
  showcell("moves")
  showcell("push")
  showcell("goback")
  showcell("goback10")
  showcell("goforth")
  showcell("goforth10")
  showcell("nextlevel")
  showcell("level_up10")
  showcell("level_down")
  showcell("level_down10")
  showcell("undo")

}
levelclear()
loadlevelb(currentlevel)
drawchar("cLV","Level:" currentlevel)
Gui, 1: Show,, AHKBAN v1.5 - Level %CurrentLevel%
return

about:
vabout=
(
AHKBAN v1.5

by SpeedMaster
)

msgbox, % vabout
return

selectlevel:
Gui, Mselect: Show
GuiControl, Mselect: , % "5_" (currentlevel - ((currentlevel//10)*10)) "_" (currentlevel//10)+1 , 1
guicontrol, Mselect: hide1, 5_9_11
guicontrol, Mselect: hide1, 5_10_11
return

howtoplay:
msgbox, How to play:`n`nThe goal of the game is to push all of the barrels onto the goals.`nThe player can only push one barrel at a time and is not able to pull them.`nA level is solved when each barrel is on a goal.

~enter::
start:
if !(play)
{
  hidecell("title")
  hidecell("start")

  showcell("cLV")
  showcell("moves")
  showcell("push")

  showcell("goback")
  showcell("goback10")
  showcell("goforth")
  showcell("goforth10")

  showcell("nextlevel")
  showcell("level_up10")
  showcell("level_down")
  showcell("level_down10")

  showcell("undo")

  loadlevelb(currentlevel)
  drawpic(player, playerpicdown)
  drawchar("cLV","Level:" currentlevel)
  
  play:=1

}
  Gui, 1: Show,, AHKBAN v1.5 - Level %CurrentLevel%
return


z::
w::
up::
player:=AGMove(player,"y",-1)
dirprev:=dir
dir=up
deltax:=0
deltay:=-1
gosub, check_if_passable

return

s::
down::
player:=AGMove(player,"y",1)
dirprev:=dir
dir=down
deltax:=0
deltay:=1
gosub, check_if_passable
return

a::
q::
left::
player:=AGMove(player,"x",-1)
dirprev:=dir
dir=left
deltax:=-1
deltay:=0
gosub, check_if_passable

return

d::
right::
player:=AGMove(player,"x",1)
dirprev:=dir
dir=right
deltax:=1
deltay:=0
gosub, check_if_passable
return


pgup::
nextlevel:
if (currentlevel>107)
return

level_up:
currentlevel++
drawchar("cLV","Level:" currentlevel)
solved:=0
levelclear()
loadlevelb(currentlevel)

if (currentlevel>108)
showcell("congratulation")

Gui, 1: Show,, AHKBAN v1.5 - Level %CurrentLevel%
return

^pgup::
level_up10:
if (currentlevel=108) || (currentlevel=109)
return

currentlevel +=10
if (currentlevel>108) 
currentlevel:=108
drawchar("cLV","Level:" currentlevel)
levelclear()
loadlevelb(currentlevel)

Gui, 1: Show,, AHKBAN v1.5 - Level %CurrentLevel%
return


pgdn::
level_down:
if (currentlevel<=109)
hidecell("congratulation")

if (currentlevel=1)
return 
currentlevel--
drawchar("cLV","Level:" currentlevel)
levelclear()
loadlevelb(currentlevel)
Gui, 1: Show,, AHKBAN v1.5 - Level %CurrentLevel%
return

^pgdn::
level_down10:

if (currentlevel<=109)
hidecell("congratulation")

currentlevel -=10

if (currentlevel<1)
currentlevel:=1

drawchar("cLV","Level:" currentlevel)
levelclear()
loadlevelb(currentlevel)
Gui, 1: Show,, AHKBAN v1.5 - Level %CurrentLevel%
return

help:
  msgbox,  Shortcuts: `n`n Backspace = Rewind`n Right Control = Forward `n R = Retry `n==============`n PgUp = Next Level `n PgDn = Previous Level `n Ctr PgUp = Next level +10 `n Ctr PgDn = Previous Level -10  `n==============`n F2 = Select Level `n F3 = Debug layer1 `n F4 = Debug layer2
return


clickcell:
msgbox, % a_guicontrol
return

exit:
guiclose:
esc:: 
IniWrite, % currentlevel, % iniFile, game, lastplayed
exitapp 
return

check_if_passable:

forward:=[]

if ispassable(nx, ny)  ; nx= new pos x  ; ny= new pos y 
{

  if !(solved)
  record.push(player ":" dir ":" previous ":" dirprev)

  if (mvo) {
    push++
    record[record.length()] .= ":" free ":" obstacle
    drawchar("push", "Pushes:" push)
    mvo:="" 
  }



  ;// Draw the player to the new position
  drawpic(player, playerpic%dir%)

  ;clear previous position of player
  clear_previous_playerpos()
 

  ; report wat there is at current player position
  lookdata() 

  if checkwin() 
     drawchar( "moves"  , "Moves:" . record.length())

  ongoal()


  if !checkwin() {
     for i, r in datagrid1
       for j, c in r {
          datagrid2[i][j]:=0
          solved:=1
        }
      Drawtile(exitlevel, stair)
  }

; if player go to stair
  if (Datagrid1[nX][ny]=stair) {
     gosub, level_up
   }
}
else {
  ;// Don't move the player >> restore previous player postition
  player:=previous
  if !(dir=dirprev)
    drawpic(player, playerpic%dir%)
}
return


IsPassable(npX, npy)   ; npx =new pos x , npy =new pos y
{
global
    ;// Store the value of the tile specified 
    tilevalue1:= Datagrid1[npX][npy]        ;npx = new pos x   npy = new pos y
    tilevalue2:= Datagrid2[npX][npy]

    ;// Before we do anything, make sure that the coordinates are valid
    if % (npX < 1 || npX > MAP_WIDTH || npy < 1 || npy > MAP_HEIGHT)
        return false

    ;if there is an obstacle that player can move 
    if ismovable(npX, npy)
    {
    MoveObstacle()
    return true
    }
    ;// Return true if it's passable
     if Tile_type[TileValue1].2 ;check if there is an obstacle at grid 1 (layer1) background
     if Tile_type[TileValue2].2 ;check if there is an obstacle at grid 2 (layer2) items
        return true

     ;// If execution get's here, it's not passable
        return False
}


IsMovable(npX, npy)   ; npx =new pos x , npy =new pos y
{
 global
  tilevalue2:= Datagrid2[npX][npy]
  tilevalue1:= Datagrid1[npX][npy]
  ;// check if there is a movable item a current location
   if Tile_type[TileValue2].3 
    {
      ;// if true check if there is an obstacle at next postition
      next1:= Datagrid1[npx+deltax][npy+deltay] 
      next2:= Datagrid2[npx+deltax][npy+deltay]
      if Tile_type[next1].2
      if Tile_type[next2].2
        return true
        else 
        return false
    }
}


moveobstacle()
{
 global 
 obstacle:="2_" . nx . "_" . ny
 free:="2_" . (nx+deltax) . "_" . (ny+deltay)
 drawtile(free, barrel)
 drawtile(obstacle, emptytile)
 mvo:=1
}

lookdata()  ; report wat there is at current player position in data grids 
{
 global
 savedprevious:=previous
 currenttilevalue:= Datagrid2[nX][nY]  
 previous:=savedprevious  
}

Drawtile(cellname, value)
{
 global
 stringsplit, drp, cellname, _
 Datagrid%drp1%[drp2][drp3]:=value
 GuiControl, , %cellname%, % TILE_TYPE[value].1
}

clear_previous_playerpos(){
global
  for i, r in datagrid2
    for j, c in r {
if (("3_" i "_" j) != player)
      drawpic("3_" i "_" j, "")
}
}



;--------------------------------------------------------------------------------

~r::
retry()

retry(){
 global 
 solved:=push:=0
 record:=[]
 forward:=[]
 drawchar("push","Pushes:" push)
 drawchar("moves","Moves:" moves)

 drawpic(player, empty)
 for i, r in datagrid1
   for j, c in r {
         datagrid2[i][j]:=0
         drawpic("2_" i "_" j, empty)

    }

 player:=startpos
 DrawDataMap(maplayer2,2,"drawtile")
 drawpic(player, playerpicdown)
 dir:="down"
 solved:=0
 Drawtile(exitlevel, rock_floor)


 if (currentlevel>108) {
    hidecell("congratulation")
    currentlevel:=108
    loadlevelb(108)
    drawchar("cLV","Level:" currentlevel)
  }
}

return


bs::
goback:
if (solved)
return
back:=record.pop()
if !(back)
return

forward.push(back)

bk:=strsplit(back, ":")
previous:=bk.1
player:=bk.3
clear_previous_playerpos()
dir:=bk.4
drawpic(player, playerpic%dir%)


if (bk.5) {
  push--
  drawchar( "push"  , "Pushes:" . push)

  drawpic(bk.5, empty)
  bpx:=strsplit(bk.5, "_").2
  bpy:=strsplit(bk.5, "_").3
  Datagrid2[bpx][bpy]:=0
  bpx:=[]
  bpy:=[]

  drawpic(bk.6, TILE_TYPE[barrel].1) ;draw barrel at is previous position
  bpx:=strsplit(bk.6, "_").2
  bpy:=strsplit(bk.6, "_").3
  Datagrid2[bpx][bpy]:=barrel
  bpx:=[]
  bpy:=[]
}

ongoal() ; draw a red barrel if barrel is on target

drawchar( "moves"  , "Moves:" . record.length())
GuiControl, Focus, f_1_1

return

goback10:
loop, 10 {
gosub, goback
sleep, 10
GuiControl, Focus, f_1_1

}
return

~RCtrl::
goforth:
forth:=forward.pop()
if !(forth)
return
record.push(forth)

ft:=strsplit(forth, ":")
previous:=ft.3
player:=ft.1
clear_previous_playerpos()
dir:=ft.2
drawpic(player, playerpic%dir%)

if (ft.5) {
  push++
  drawchar( "push"  , "Pushes:" . push)

  drawpic(ft.6, empty)
  bpx:=strsplit(ft.6, "_").2
  bpy:=strsplit(ft.6, "_").3
  Datagrid2[bpx][bpy]:=0
  bpx:=[]
  bpy:=[]

  drawpic(ft.5, TILE_TYPE[barrel].1) ;draw barrel at is previous position
  bpx:=strsplit(ft.5, "_").2
  bpy:=strsplit(ft.5, "_").3
  Datagrid2[bpx][bpy]:=barrel
  bpx:=[]
  bpy:=[]
}

ongoal() ; draw a red barrel if barrel is on target

drawchar( "moves"  , "Moves:" . record.length())

GuiControl, Focus, f_1_1
return

goforth10:
loop, 10 {
gosub, goforth
sleep, 10
}
GuiControl, Focus, f_1_1
return

f3::
debuglayer1:=!debuglayer1

if (debuglayer1) {
  
 for i, r in datagrid1
  for j, c in r {
         drawpic("1_" i "_" j, TILE_TYPE.14.1)
         drawchar("4_" i "_" j, c, "red")
    } 
}
else
  for i, r in datagrid1
    for j, c in r {
      drawtile("1_" i "_" j, c)
      drawchar("4_" i "_" j, " ")
    }


return

f4::
debuglayer2:=!debuglayer2

if (debuglayer2) {
  
 for i, r in datagrid2
  for j, c in r {
         drawpic("2_" i "_" j, empty)
         drawchar("4_" i "_" j, c, "fuchsia")
    } 
}
else
  for i, r in datagrid2
    for j, c in r {
      drawtile("2_" i "_" j, c)
      drawchar("4_" i "_" j, " ")
    }
return



return
;-------------------------------------------------------------------------


class layergrid
{
	__New(ctr:="pic", clln:="", cmj:="true", gpx:=10, gpy:=10, cols=30, rows:=20, wsp:="32", hsp:="32", opt:="BackGroundTrans  -disabled", fill:=".\boxxeltiles\14.png", guiname:="1" )
  {
  global
    this.guiname:=guiname, this.clln:=clln, this.cmj:=cmj, this.gpx:=gpx, this.cols:=cols, this.rows:=rows, this.wsp:=wsp, this.opt:=opt, this.fill:=fill
    
    r:=0,  c:=0, ai:=0
     While r++ < rows {
      ++ai
        while c++ < cols{

             gui  %guiname%: add, % ctr, % opt " v" ((cmj) ? clln c "_" r : clln r "_" c) " Hwnd" clln  r "_" c ((c=1 && r=1) ? " x"gpx " y"gpy " section"
                  : (c!=1 && r=1) ? " xp+"wsp " yp" : (c=1 && r!=1) ? " xs" " yp+"hsp : " xp+"wsp " yp"), % (fill="aindex") ? ai : fill 
             ai++
          } c:=0
             ai--
     } r:=c:=ai:=0,      
  }
}

ObjFullyClone(obj)
{
	nobj := obj.Clone()
	for k,v in nobj
		if IsObject(v)
			nobj[k] := A_ThisFunc.(v)
	return nobj
}

loadlevelb(number) {
 global

 map:=[]

 loop, parse, level_%number%, !
 map.push(strsplit(a_loopfield ))
 mpc:= map.1.length()
 mpr:= map.length()
  exitlevel:=""
  maplayer1:=[]
  maplayer2:=[]
  record:=[]
  forward:=[]
  push:=0

  for i, r in map
    for j, c in r {

     if (c="@")
      player:="3_" (cols-mpc)//2+j "_" (rows-mpr)//2+i
     if (c="e")
      exitlevel:="1_" (cols-mpc)//2+j "_" (rows-mpr)//2+i    
          
     if !(c="#") &&  !(c=".") &&  !(c="*")    
      maplayer1[(cols-mpc)//2+j,(rows-mpr)//2+i]:=1
     if (c="#")    
      maplayer1[(cols-mpc)//2+j,(rows-mpr)//2+i]:=2 
     if (c="X")    
      maplayer1[(cols-mpc)//2+j,(rows-mpr)//2+i]:=14
     if (c=".") ||  (c="*")  
      maplayer1[(cols-mpc)//2+j,(rows-mpr)//2+i]:=goal
     if !(c="$") &&  !(c="*")  
      maplayer2[(cols-mpc)//2+j,(rows-mpr)//2+i]:=0
     if (c="$")    
      maplayer2[(cols-mpc)//2+j,(rows-mpr)//2+i]:=barrel
     if (c="*")    
      maplayer2[(cols-mpc)//2+j,(rows-mpr)//2+i]:=13
    } 
  startpos:=player 
  datagrid1:=maplayer1
  datagrid2:=ObjFullyClone(maplayer2)
  DrawDataMap(datagrid1,1,"drawtile")
  DrawDataMap(datagrid2,2,"drawtile")
  drawpic(player, playerpicdown)
  dir:="down"

  if !(exitlevel)
   exitlevel:=agmove(player, "z", -2)

  drawchar("moves", "Moves:" . record.length())
  drawchar("push",  "Pushes:" . record.length())
}


levelclear(){
global    
drawpic(player, empty)
for i, r in datagrid1
  for j, c in r {
        drawpic("1_" i "_" j, TILE_TYPE.14.1)
        drawpic("2_" i "_" j, empty)
    }
}


DrawDataMap(datagrid, gridnumber:=1, function_name:="", Bypass_Values_List:="")
{

global
  For i, r In datagrid
   For j, c In r
    {
     cell_to_draw=%gridnumber%_%i%_%j%
     %function_name%(cell_to_draw, c)
    }
}

HideCell(cell_to_hide)
{
guicontrol, hide1, %cell_to_hide%
}

ShowCell(cell_to_show)
{
guicontrol, hide0, %cell_to_show%
}

disablecell(cell)
{
global
guicontrol, disable, %cell%
GuiControl, MoveDraw, % cell
}

DrawPic(cellname, object)
{
global
GuiControl, , %cellname%, %object%
}

drawchar(varname, chartodraw:="@", color:="")
{
 global
guicontrol,, %varname%, %chartodraw%
if (color)
colorcell(varname, color)
}

ColorCell(cell_to_paint, color:="red")
{
 GuiControl, +c%color%  , %cell_to_paint%
 GuiControl, MoveDraw, % cell_to_paint
}


AGMove(Varname,axes,value1:=1,value2:=1,value3:=1)
{
global
AGM(varname,value1,value2,value3)
StringSplit, ar, varname , _
if axes = z
  {
  nz:=value1+ar1
  ny:=ar3
  nx:=ar2
  }
if axes = x
  {
  nz:=ar1
  nx:=value1+ar2
  ny:=ar3
  }
if axes = y
  {
  nz:=ar1
  nx:=ar2
  ny:=value1+ar3
  }
if axes = xy
  {
  nz:=ar1
  nx:=value1+ar2
  ny:=value2+ar3
  }
if axes = zxy
  {
  nz:=value1+ar1
  nx:=value2+ar2
  ny:=value3+ar3
  }
if axes = EZ
return ar1
if axes = EX
return ar2
if axes = EY
return ar3
if axes = SX
{
nz:=ar1
nx:=value1
ny:=ar3
return % nz . "_" . nX . "_" . nY
}
if axes = SY
{
nz:=ar1
nx:=ar2
ny:=value1
return % nz . "_" . nX . "_" . nY
}

if axes = SZ
{
nz:=value1
nx:=ar2
ny:=ar3
return % nz . "_" . nX . "_" . nY
}

return % nz . "_" . nX . "_" . nY

}

;AGM is ASCII GAMING MAIN FUNCTION
AGM(varname,NewZ:="1",NewX:="0", NewY:="0")
{
global Previous, nx, ny, nz
nx:=0
ny:=0
nz:=NewZ
previous:=varname
StringSplit, ar, varname , _
nx:=newX+ar2
ny:=newY+ar3
return % nz . "_" . nX . "_" . nY
}

;f8::
;Drawtile(exitlevel, stair)
;return

checkwin(){
global
for i, r in datagrid1
   for  j, c in r 
    if (c=Goal) {
       if (datagrid2[i,j]=redbarrel){
         continue
         }
         else {
            return true
            break, 1
        }         
    }
}
return

ongoal(){
global
for i, r in datagrid1
   for  j, c in r 
    if (c=3) {
       if (datagrid2[i,j]=barrel){
             Drawtile("2_" i "_" j, 13)
         }  
     }
}


boxxlelevels:

level_1:="x#####xxx!x#   ####!x#   #  #!x##    .#!### ###.#!# $ #x#.#!# $$#x###!#@  #xxxx!#####xxxx!"
level_2:="xx#######x!xx#     #x!xx# $ @ #x!##### # #x!# $     #x!#  #$## ##!#..$  #  #!#..      #!##########!"
level_3:="######!#..*.#!#.$  #!## $ #!##$ ##!#@$ #x!##  #x!x####x!"
level_4:="########!#.   $ #!#.$  # #!#.# #  #!### # ##!x# $  #x!x#@ ###x!x#####xx!"
level_5:="x########x!##..#   #x!# ..# $ ##!# @ $  $ #!##$###   #!x#     ###!x#######xx!"
level_6:="x#######xxx!x#     ####!x# ###.   #!##    # # #!# .#$ $ # #!# #  *  # #!# # $ $#. #!# # #    ##!#   .### ##!####      #!xxx#####  #!xxxxxxx#@ #!xxxxxxx####!"
level_7:="#########x!#.....  #x!### $ # ##!xx# $##  #!xx#$ $ $ #!xx#   #  #!xx##  # @#!xxx#######!"
level_8:="xxxx#####x!#####   #x!#.. $ $ ##!#..$ $  @#!##. $## ##!x###    #x!xxx######x!"
level_9:="###########!#     # @ #!# $  $  $ #!## #...# ##!x# #...# #x!x#$ ### $#x!x#   $   #x!x#  ##   #x!x#########x!"
level_10:="xxx####x!####  #x!# $...##!#@ $.. #!###$$$ #!xx#    #!xx######!"
level_11:="x##########x!##    # @ ##!#  $.... $ #!# $ ####$  #!##  #xx#   #!x####xx#####!"
level_12:="xxxx########xxxxxxxx!xxxx#      #########!##### #### #@##  ..#!# $  $           ..#!#   # ### #####  ..#!### # ### #xxx######!xx#  $  $ #xxxxxxxxx!xx###  $###xxxxxxxxx!xxxx#$  #xxxxxxxxxxx!xxxx#   #xxxxxxxxxxx!xxxx#####xxxxxxxxxxx!"
level_13:="xx#####x!xx#   ##!### *$ #!#  .$. #!#  $. ##!###  @#x!xx#####x!"
level_14:="xx########xxxxxxxxxx!xx#      #xxx######x!xx#$ $ $ #xxx#  ..#x!###  $  $#####  ..##!#  $$$   $      ...#!# #  $ ####@##  ..##!# #  $ #xx####  ..#x!#    ###xxxxx######x!######xxxxxxxxxxxxxx!"
level_15:="########!#  @   #!#  #$$ #!## $  ##!x#  $.#x!x## .##x!xx#..#xx!xx####xx!"
level_16:="#########xxxxxxxxxxx!#   #   ##xxxxxxxxxx!# $$#$$ @#xxxxxxxxxx!#    $  ##xxxxxxxxxx!#   # ##############!####  $ #     #....#!xxx# $$ #$ $ $#....#!xxx#  $     $ #....#!xxx# $$$#$  $ #  ..#!xxx#    #  $ $   ..#!xxx############  ..#!xxxxxxxxxxxxxx#  ..#!xxxxxxxxxxxxxx######!"
level_17:="xxx#######!xxx#  @  #!#### # $ #!#...$#$ ##!#... $   #!### $ ## #!xx# $    #!xx#    ###!xx######xx!"
level_18:="xxxxxx####!#######@ #!#   #    #!#   $  $ #!## ##$# ##!x#  $ #*.#!x##  $...#!xx#   #. #!xx########!"
level_19:="x########!x# @    #!##  ..$ #!#  #..###!# $$$##xx!#    #xxx!######xxx!"
level_20:="########!#  #   #!# $..$ #!#@$.* ##!# $..$ #!#  #   #!########!"
level_21:="xxx#####xx!#### @ ###!#    #   #!# $$  #$ #!#  $#$ $ #!###...$###!x#.... #xx!x#######xx!"
level_22:="x###xx####xxxxxx!##.####  ##xxxxx!#...  #  @###xxx!##..     $  #xxx!#...  # $ $ #xxx!##.###### ######!x###xxxx# $ $  #!xxxxxxx## $ $# #!xxxxxxx#   $   #!xxxxxxx#  $ $# #!xxxxxxx# # # # #!xxxxxxx#       #!xxxxxxx#########!"
level_23:="#######!#  #@ #!# $$$ #!#  $  #!# $$$ #!#..#..#!#..$..#!#######!"
level_24:="########xxxxxxxx!#  ##  #xxxxxxxx!#  ##$ #xxxxxxxx!#  $   ##xxxxxxx!## #    ##xxxxxx!x# ## #  #xxxxxx!x# $ $## #xx####!## ##    ####..#!# $ #$ #$##  ..#!#      $     ..#!########@##  ..#!xxxxxxx#########!"
level_25:="xx######!xx#  @ #!xx# $  #!#### $ #!# .#$ ##!#..# $#x!#..$  ##!#.. $  #!####$  #!xxx#   #!xxx#####!"
level_26:="xxxxxxx#####xxxxx!xxxxxx##   #xxxxx!xxxxxx#  $ #####x!xxxxxx# $ $    #x!xxxxxx### #### ##!x######## $    @#!##...  ## $$## ##!#....       ## #x!##...  #### ## #x!x######## $ $  #x!xxxxxxxx#  $ $ #x!xxxxxxxx#      #x!xxxxxxxx########x!"
level_27:="x########!x#  #  @#!x#$  $  #!x# ## $ #!##...$ ##!# ...# #x!# #$$  #x!#      #x!########x!"
level_28:="xx######xx!xx#....#xx!xx#  ..#xx!###$$#####!# $   $ @#!#   $ $  #!###   ####!xx#####xxx!"
level_29:="x#######xx!x#     ##x!x# $  $ #x!x## # #@#x!xx#.# $ #x!###..$ ##x!#  ..# #xx!# #.*# ###!#  #.$$$ #!##   # # #!x###     #!xxx#######!"
level_30:="xx####xxxxxxxxxxxxx!xx#  ####xxx####xxx!xx#     #####  #xxx!xx#  $$$       #xxx!xx## #  #  # # #xxx!xxx#$ $ ####$# #xxx!xxx# $####     #xxx!####  #  #  ## ####!# @$$    ## # ....#!# #  $$ ### # ....#!# $ $  $    # ....#!# ## $  ##  # ....#!#    $  ###########!######  #xxxxxxxxxx!xxxxx####xxxxxxxxxx!"
level_31:="xx############!xx#    #     #!xx# $  $ $ $ #!###### ##$ $ #!#..  # #  $ ##!#..    @ ##  #!#..  #$####  #!#..  # $  $  #!#..  #     ###!############xx!"
level_32:="xxxxxx#######x!xxxxx##@#   #x!xxxx##  # $ #x!x####  # $  #x!x#    # $ # ##!x#   # $  #  #!x#  # $  #   #!x# # $  #    #!##  $  ### # #!#  $  ##...# #!#   ##.....  #!########  ####!xxxxxxx####xxx!"
level_33:="########xxxxxxxxx!#....  ##########!##...    $  $   #!#....  ## $  $  #!######### $ # ###!xxxxxxxx##$ $ #xx!xxxxxxxx# $  $#xx!xxxxxxxx# $#$ ##x!xxxxxxxx#     @#x!xxxxxxxx########x!"
level_34:="############xxx!#...#  @#  ##xx!#...#$$  $  #xx!#...   ##  $#xx!#   # ##    ###!#####  $ #$$  #!xx# $ $       #!xx#   #########!xx#####xxxxxxxx!"
level_35:="xxx#########!xxx#  ##   #!xxx# $  $  #!xxx#  $# $ #!#### $ #$  #!#..### # $ #!#..  # # $ #!#..     $$ #!#..  ###   #!#..  #x##@##!######xx###x!"
level_36:="xxxxxxxxxx#########!########x##   #   #!#...#  ###  $  $  #!#...#    @ # ### ##!#...    # ##  #   #!#  ### $#$  $  $  #!##      # #  ## ###!x#### #$$ ## ##  #x!xxxx#   #   $    #x!xxxx#####  #  ####x!xxxxxxxx#######xxxx!"
level_37:="xxxxxxxxxxx#####!x###########   #!x#     $    ...#!x#$$#  #####...#!##  #$ #   #...#!#  $   #   #...#!#@#$$ ##   #...#!# $    #   #...#!##  $$ ######.##!x# $ $ #   #   #!x#$ $ $ $ $    #!x#  ## #  $$# ##!x#     ###    #x!x#######x######x!"
level_38:="############!###..##    #!##....#  $ #!#.....# $# #!####.. $ #@#!#   ..# ####!# $# $#    #!#  #  #  $ #!#   # # $ ##!# $$$ # ####!#   $ #    #!#### ## $$ #!##   $   $ #!##     ##  #!############!"
level_39:="xxxxxxxx####xxxxx!xxxxxxxx#  #xxxxx!xxxxxxxx#  #xxxxx!xxxxxxxx#  #xxxxx!xxxxx#### ###xxxx!xxxxx# $    #xxxx!###### $$ $ #####!#@ $  $    $  $ #!##   #$ $   #   #!x#####  $ $ #####!xxxxx# $$$ ##xxxx!xxxxx### ########!xxxxxx## ##  ...#!xxxxxx#  ##  ...#!xxxxxx#      ...#!xxxxxx#####  ...#!xxxxxxxxxx#  ...#!xxxxxxxxxx#######!"
level_40:="####xxxxxx####!#..########..#!#.*.*.....*.*#!#$ $ $ $ $ $ #!# $ $ $ $ $ $#!#$ $ $@$ $ $ #!# $ $ $ $ $ $#!#*.*.....*.*.#!#..########..#!####xxxxxx####!"
level_41:="xxx####xxxxxxx!xxx#  #####xxx!x###$ $   ###x!x#  $ #  $  #x!x#    ## ## ##!x#  ###  ##  #!x# #  $ $ ## #!x#$  $ $ $#  #!## ###  $    #!#     #$ ##$ #!# ....#  #  ##!##....# # @##x!x#.#.#  $ ##xx!x#....   ##xxx!x#########xxxx!"
level_42:="xxxx######xxxxx!xxxx#....####xx!xxxx#....#  #xx!xxxx#...  $ #xx!#####   #   #xx!#   #####$####x!#   #      # #x!## $  $#     #x!x#$ ## # $ $ #x!x#  $   ####$##!x# # #  ####  #!## $       $  #!#@  ########  #!#####xxxxxx####!"
level_43:="######xxxxxxxxxxxxx!#    ######xx####xx!# $  $ #  ####  ##x!#  $   # $$      #x!##   $$#  ### #  #x!x# $#  ## ##  #  #x!x#$ $  $@$ # ##  ##!x#  #  #   # #....#!x# $ $ ##$## #....#!x##   #x#  # #....#!xx#####x#  $ #....#!xxxxxxxx#  # ######!xxxxxxxx######xxxxx!"
level_44:="xxxxxx####xxx!xxxxxx#  #xxx!xxxxxx#$ ###x!xxxxxx#   ###!x######$ $  #!x#... # $   #!x#....  $$ ##!x#....#   $#x!x#....#$ $ #x!#### ##   $#x!#@$ $ # $  #x!## $  ## ###x!x##     $#xxx!xx#####  #xxx!xxxxxx####xxx!"
level_45:="xxxx#########xxxx!xxxx#.......#xxxx!xxxx#.......#xxxx!xxxx#.......#xxxx!xxxx#### $###xxxx!xxxxx#  $  ##xxxx!xxxxx# $ $  #xxxx!x###### # # ###xx!x#  ## $ $ $  #xx!## $$         #xx!#   #####$##$##xx!#   $     $ $ ###!######## $#     #!xxxxx#  $ #  #  #!xxxxx#   @#$  $ #!xxxxx## $ $   $ #!xxxxxx########  #!xxxxxxxxxxxxx####!"
level_46:="######xxxxxxxxxxx!#....#xxxxxxxxxxx!#....#xxxxxxxxxxx!##   ############!x#   #  #   #   #!x## ## $ $ $$   #!xx#    @# # #####!xx#  ##$# $  #xxx!xx####   $   #xxx!xx#  $   #####xxx!xx#      #xxxxxxx!xx########xxxxxxx!"
level_47:="xxxxxxx#######xxx!########.....#xxx!# $   $ .....####!#  $ $ #.....   #!##  ## #.....#  #!x#  $  ###$### ##!x# $  $  $   $ #x!x#$####  $   $ #x!x#   #  $# #####x!x###   $$ $ $  #x!xxx#### $  $   #x!xxxxx#@  #######x!xxxxx#####xxxxxxx!"
level_48:="xxx#####xxxxxxxxxx!xxx#...#xxxxxxxxxx!xxx#...##xxxxxxxxx!xxx#....####xxxxxx!x####......####xxx!x#  #....     #xxx!##  ###  ###$ #xxx!# $ $ #$#  #  #xxx!# $    $  $## ####!#  #  # #   $$$  #!##  $## #$ $     #!x#$  $  # $ $#  ##!x#  $# $ $   ####x!x##  ## @#   #xxxx!xx#  #########xxxx!xx####xxxxxxxxxxxx!"
level_49:="xxx#####x!xxx#   ##!xxx# #  #!x### $  #!##   # ##!# .#.#  #!# ..*$$ #!# *#.#  #!##  ##$##!x#$ @  #x!x#  ####x!x####xxxx!"
level_50:="xxxxxx########x!xxxxxx#      ##!x######  ##$$@#!##  #  $$ #   #!##$       $ $ #!#   # $########!#  $#  #... .#x!# $ #$$ ...  #x!#  $#  #...  #x!##  #  #...###x!x#  #  #####xxx!x#######xxxxxxx!"
level_51:="xxxxxxxxxxxx#####!xxxxx########   #!######@#   ## # #!#   ##   $      #!#...   ## ### ###!#..## ##    # #xx!#..#  ##$#### ##x!#..# $$     #  #x!#..#  ## $  $  #x!#####  #  $ #  #x!xxxx#$$ $$# ####x!xxxx#       #xxxx!xxxx#########xxxx!"
level_52:="########xxxxxxxxxxxx!#      ######xxxxxxx!# ####      #xxxxxxx!# #  ### ## #xxxxxxx!#     $   # #xxxxxxx!# #  #    # #xxxxxxx!# #$ ### #  #x######!# # #### # #### ...#!# #   # $$ #  #  ..#!# #   #   ##$    ..#!#  $$ #     $ #  ..#!###   #   ##$ ######!xx##########@ #xxxxx!xxxxxxxxxxx####xxxxx!"
level_53:="#####xxxxxx!#@  #######!# #$#  #  #!# $    $$ #!### ##$#  #!x#  # .# ##!x#  $..   #!x#  #..## #!x#####.   #!xxxxx######!"
level_54:="xxxxxx#####xxxx!xxxxx##   #####!x##### $  #...#!x#   # # ##...#!x# #   # #.. .#!x#   ##   ....#!####  $$$ $#  #!#  # ##  $ ####!#  # ## $  #xxx!# $$$ $  $$#xxx!## #@##    #xxx!## #### #  #xxx!#       ####xxx!#       #xxxxxx!#########xxxxxx!"
level_55:="xxxxxxxxxxxx########!xxxxxxxx#####   #  #!xxxxxx###   #$ $ $ #!xxxxx## #     $ $  #!x#####    # #$ # $ #!x#  #  # ## #   #  #!x#    ##### ### #$ #!x# $## ...# ##  $  #!x## ## ...#  #    ##!x#  ###...   ######x!x#  $ ....####xxxxxx!x#  #######xxxxxxxxx!### $ #xxxxxxxxxxxxx!#@$   #xxxxxxxxxxxxx!##  ###xxxxxxxxxxxxx!x####xxxxxxxxxxxxxxx!"
level_56:="xxx######xxxxxxxxxxx!x###    ###xxxxxxxxx!x#        ####xxxxxx!x# #$$$## #  #xxxxxx!x# #    # #  #######!x# #    # # $   ...#!x# #$#$## #$    ...#!##         $$###...#!#  #$$$## #$   #...#!# #     # #    #...#!# #  $  # # ## #...#!#  #$#$##  #   #...#!##       $   $ #...#!x# #$$$# ####$##.###!x# # @ #  #  $   #xx!x#  ###   # $$ ###xx!x##     ###    #xxxx!xx#######x######xxxx!"
level_57:="####xxxxxxxxxxxxxx!# @#xxxxxxxxxxxxxx!# $#####xxxxxxxxxx!#  $   ##xxxx#####!#   $#  #xxxx#   #!##   $  #xxxx# $ #!x##$# $ #######  #!xx#   #$    #  ..#!xx# # # $## # #..#!xx#      $     ..#!xx###########  ..#!xxxxxx#     #$#..#!xxxxxx# $      ..#!xxxxxx#     #   ##!xxxxxx###########x!"
level_58:="xxxxxx#####xxxxxxx!xx#####   #######x!xx#@$    $   $  #x!x#### #$#  ##$  #x!x#  #  $  $ #   #x!x#  ### ##  # ####!x#  $ # $  #  $  #!x#        ### $  #!#######$ ##  $ ###!#.....#  #  $  #xx!#.....## $ #$  #xx!#....     $   ##xx!#...   ########xxx!########xxxxxxxxxx!"
level_59:="#######xxxxxxxxx!#     #xxxxxxxxx!# ### ###xxxxxxx!# #  $  #xxxxxxx!# # $ $ ##xxxxxx!# #@ #$  #######!# # $# $$#  ...#!# #$ #   #  ...#!# #  #$     ...#!# #$ #  $#  ...#!#   $ $  #  ...#!###  $  $#######!xx### ## #xxxxxx!xxxx#    #xxxxxx!xxxx######xxxxxx!"
level_60:="xxxx###########!x####.........#!x#   .*******.#!x# ###.......##!## # #.$$$$$.#x!#@ ####     ##x!# $  ## $$$ #xx!# $ $  #   ##xx!# $ $ $    #xxx!# $ $ $  ###xxx!# $ $  ###xxxxx!# $  ###xxxxxxx!#  ###xxxxxxxxx!####xxxxxxxxxxx!"
level_61:="x###xxxxxxxxxxxx!##@#########xxxx!# $#   ##  #xxxx!#      $   #xxxx!# $##$###  ##xxx!#  ## ### ###xxx!#####.###   #xxx!xxxx#....#  #xxx!xxxx#....#  #xxx!xxxx#....## ##xx!xxx### ####  #xx!xxx#         #xx!xxx#   #### ####!xxx#####  $ $  #!xxxxxxx# $ $   #!xxxxxxx# $$$$$ #!xxxxxxx#       #!xxxxxxx#########!"
level_62:="####xx####!#  ####  #!#   @    #!# $$$$$$ #!##      ##!# $$$$$$ #!#        #!#  $$$$  #!###    ###!x# $$$$ #x!x#      #x!x#  $$  #x!x###..###x!x#..**..#x!x#......#x!x#..##..#x!x#......#x!x########x!"
level_63:="xx###########xx!xx#....   ..#xx!xx# .......##xx!### .#....#####!#  #$##..##   #!#     #### $  #!# $$  #  #  $ #!##  $$#   $$ ##!x#$  $   #$  #x!x# $$ #  #  $#x!x# $ $#### $ #x!x#       #  ##x!x#### $  # ##xx!xxxx### ## #xxx!xxxxx# $   #xxx!xxxxx#@ #  #xxx!xxxxx#######xxx!"
level_64:="xxx######xxxxxxx!xxx#    #xxxxxxx!#### ## #######x!# @$  $   #   ##!# # $  $  # $  #!#  $  ##### #  #!#### ##  #### ##!xx#  #  ##  #  #!xx#            #!xx#######  #  ##!xxx#..  #  ####x!xxx#..      #xxx!xxx#..  #   #xxx!xxx##########xxx!"
level_65:="#######xxxxxxxxxxxx!#.....#xxxxxxxxxxxx!#...#.#xxxxxxxxxxxx!#.. ..#x####xxxxxxx!#.    ###  ########!#### ## $         #!####    #  $$ #   #!x#   $ #  # $ #####!x# # $ $$ # ###xxxx!x#  #$##     #xxxxx!x##  $ $$## ##xxxxx!xx##   @  $  #xxxxx!xxx###  ###$ #xxxxx!xxxxx####x#  #xxxxx!xxxxxxxxxx####xxxxx!"
level_66:="xxxxxxx#########!xxxxxxx#  ##   #!xxxxx### $     #!xx#### @$  ##$##!###  #### ### #x!#  $ # #.*..# #x!# #   $ ....# #x!#    # #....$ #x!###  # #####  #x!xx####    $   #x!xxxxx###$  $ ##x!xxxxxxx# $$ ##xx!xxxxxxx#   ##xxx!xxxxxxx#  ##xxxx!xxxxxxx####xxxxx!"
level_67:="##################!#   ##       $...#!# $ $ $#$ ####  .#!# $$#$       @...#!# $   #$##$$ #...#!# $ $$#    $ #...#!#         ## #...#!##################!"
level_68:="x#######xxxxxxxxx!x#     #xxxxxxxxx!x# $ $ #xxxxxxxxx!x# $ ####xxxxxxxx!## $##  #########!#   #  $  ......#!# *##  #$ #  $  #!#.....*.  ## $  #!#.###   ##  ##$ #!###x######      #!xxxxxx#@$  $ $$ #!xxxxxx###   #   #!xxxxxxxx#########!"
level_69:="xxxxxxxxxxxxxx####xx!xxxxxxxxxxxxx##  ###!##############  $  #!#........... #   $ #!#.# #######. #$ $###!#.# ####### ##   ##x!#..           $$$@#x!#  ######## ##    #x!####xxx#   $$ #####x!xxxxxxx# $    $ #xxx!xxxxxxx## $$  $ #xxx!xxxxxxxx##  $$  #xxx!xxxxxxxxx##     #xxx!xxxxxxxxxx##   ##xxx!xxxxxxxxxxx#####xxxx!"
level_70:="xxxxxx#######x!xx#####     #x!###   # ##$ ##!# $   #      #!# $# ##$# #$ #!#@ # # $  #  #!# $# # $###$ #!# $  $    # ##!## # $# #    #!# $#  ..##. .#!#  ### ..#.# #!#   ## ......#!##############!"
level_71:="xxxxxxxx#######xx!xxxxxxxx#     #xx!xxxx#####     ###!#####   ## ##...#!#     # ## ##...#!# ###$$$ $ ##...#!# #   $ $  ##...#!# # #$ $ $###...#!# #   $@$   ## ##!# #  $ $ $ $#  #x!# # ######     #x!#              #x!################x!"
level_72:="xxxxxxxxxxxxx####x!xxxxxx########  #x!xxxxxx#     #   #x!xxxx### ###   # #x!#####     $   # #x!#   $ $ ###$$ # #x!#  $ $$$  # $## #x!#  #$   #  $  # #x!##   #### ### #$##!x# ###......     #!x#   $......## # #!x# ###......##   #!x#$$ #   #########!x#     # $@$ #xxxx!x#######     #xxxx!xxxxxxx#######xxxx!"
level_73:="xxxx####xxxxx####xxx!xx###  #######  ##xx!xx#  ........... #xx!xx# $ ##### ### $##x!x####  $ $ #   $  #x!x#  #  # # #$# @# ##!x#         #   $ $ #!x#   ##   # $$$#   #!##  #     #      ###!#    # ##  #  ####xx!#         #   #xxxxx!########  #####xxxxx!xxxxxxx####xxxxxxxxx!"
level_74:="xx#####xxxx!xx#   #xxxx!###$# ###xx!# $...  ###!# #.#*#   #!# $.#.$   #!#  ## ## ##!## @ $ $ #x!x###   ###x!xxx#####xxx!"
level_75:="xxxxxxxxxx####x####!xxxxxxxxxx#  ###  #!xxxxxxxxxx#  $    #!xxxxxxxxxx# # $ $ #!xxxxxx##### # #  ##!xxxxxx#.....# $$$#x!xxxxxx#....* $   #x!xxxxxx#*..*.# #$##x!#######....*# $  #x!#     $*.*..#    #x!#  $$ # ##$###$$ #x!#    $   #      ##x!#####$ $ ####  ##xx!x#@# $        ##xxx!x#    ######  #xxxx!x######xxxx####xxxx!"
level_76:="xxxxxx#####xxxxxxxx!xxxxx##   ##xxxxxxx!xxxx##  *  ##xxxxxx!xxx##  * *  ##xxxxx!xx##  * * *  ##xxxx!x##  * * * *  ####x!##  * * * * *  # ##!#  * * * * * *    #!# * * * . * * *@$ #!#  * * * * * *    #!##  * * * * *  # ##!x##  * * * *  ####x!xx##  * * *  ##xxxx!xxx##  * *  ##xxxxx!xxxx##  *  ##xxxxxx!xxxxx##   ##xxxxxxx!xxxxxx#####xxxxxxxx!"
level_77:="xx########!x##..    #!x#...$ $ #!###.## ###!#   ##$ #x!#  $@$  #x!##$ ##  #x!x#  #####x!x####xxxxx!"
level_78:="xx####xxxxxxxx!xx#  #xxxxxxxx!xx#  #########!xx# $$ #.....#!xx#    #.*...#!x###   $..##.#!x#  #$##$  #.#!x# $  ## ## .#!x#  ##  $ $ ##!###@ #$    ##x!#  $$ $   $#xx!# $  ####  #xx!#    #xx####xx!#   ##xxxxxxxx!#####xxxxxxxxx!"
level_79:="###xxxxxxxxxxxxx!# ##xxxx####xxxx!#  ######  ###xx!#   # $ $$ $ ###!#  $ @ $    $  #!# $ # #$  $    #!#  ## # ### ####!# ##    #  $  #x!###... ## $ $ #x!##....##   $  #x!#....## $  $###x!#...###  $  #xxx!#...#x#  ####xxx!#####x####xxxxxx!"
level_80:="xxxxxxxxxxx####x!xxxxxx######  #x!xxxxxx#   $   #x!xxxxxx# $$ $  #x!xxxxxx## # $  #x!x######   $ # #x!x#      $ $ $ ##!x# ## #######  #!x# $  ##...##$ #!##   ##...#.#  #!# $ $ #.....$$ #!#    $$.....#  #!##$   #..#..#$##!x# $#$####### #x!x#    #       #x!x#### # # #####x!xxxx#   #@#xxxxx!xxxx#######xxxxx!"
level_81:="xxxx######xxx!xxxx#    #xxx!x#### ##$###x!x#         #x!x# #....#  #x!## #....#$$#x!#   ....#  #x!# ##....   ##!# ##....#$$ #!#  $....#   #!# $#### #   #!#  $  $$$$$##!##$    $   #x!x# $$# #   #x!x#  $ $ $$$#x!x# $   $   #x!x#@##   ####x!x########xxxx!"
level_82:="x####xxxxxx!x#  #######!x#$  $    #!x#   # #$ #!x# #. .# ##!x# $...  #x!##$#...# #x!#   $## $#x!#     $  #x!####### @#x!xxxxxx####x!"
level_83:="x#####xxxxxxxxxxxxxx!x#   #xxxx##########!x#$  ######    ##  #!## $$  $   $  $... #!# $ ##   #  #$#.#. #!#    ##  ##$ $ ... #!# $#    $ # # #.#. #!#  ## #$  #    ... #!# #  $#@$## # #.#. #!#  $$ #$ #  #  ... #!###      #  #   ####!xx###   ##  #####xxx!xxxx#########xxxxxxx!"
level_84:="xxx#####x!xxx#   #x!xxx# #$#x!####   #x!#  #.# ##!#  *.* @#!#  #.#  #!## # #$##!#  # #  #!#    $  #!#  ###  #!####x####!"
level_85:="xxxxx#####xxxxxxx!######   #xxxxxxx!#  #     #xxxxxxx!# $$  #  #xxxxxxx!#   ### #######xx!##  #.....#   #xx!x#  $...*. $# ###!x# $#.....# #   #!x## ####$##     #!x#  #      $ ####!x#  # @ $ # $#xxx!x#  $  ##$   #xxx!x### #$   ####xxx!xxx#  $ $ #xxxxxx!xxx##  #  #xxxxxx!xxxx####  #xxxxxx!xxxxxxx####xxxxxx!"
level_86:="xxx####xxxxx!xxx#  #####x!x###$     #x!x#     .# #x!x# ## #.  #x!x# $  #*####!## ####.   #!#  #  @.#  #!# $  #$.#$##!###    . $ #!xx######   #!xxxxxxx#####!"
level_87:="xxxxxxxxxx#########!xxxxxxxxxx#       #!xxxxxxxxxx# ### # #!xxxxx####x# #...# #!######  ###  ...  #!#         # #...# #!#  $#  $  # ## ## #!##  #### ##$      #!x# ##### #  #$ ####!x# #### $    $ #xxx!x# $ ##$ ###   #xxx!x#      $@######xxx!x# # ######xxxxxxxx!x#   #xxxxxxxxxxxxx!x#####xxxxxxxxxxxxx!"
level_88:="####xxxxxxxxx!# @#xxx####xx!#  #####..###!#  # $  $...#!##   #  ... #!x#$$  ###$# #!##  # ### $ #!# $   $   # #!#    ####   #!######xx#####!"
level_89:="xxxx########xxxxxxxx!x####  ....#xxxxxxxx!x# #  $....######xxx!x# $  #....## ..####!x#  $$## #### ....##!####    $ @## .....#!#    $ $$ #### #####!# #$$$$# $$ $  #xxxx!#       # $ ## #xxxx!###  ## $  $  $#xxxx!xx# $   $      #xxxx!xx####  $ ### $#xxxx!xxxxx###  #x#  #xxxx!xxxxxxx####x####xxxx!"
level_90:="xxxxx#####!######   #!#   ## # #!#        #!##$###*###!## #.@.##x!#  *.#  #x!# # $ $ #x!#   ##  #x!#########x!"
level_91:="xxxxx#####xx!xx####   #xx!xx#    #@#xx!xx# ###  #xx!xx# #  $ ###!xx# # # $$ #!xx# # $$   #!### #   #$ #!#   # $$ $ #!# $ $      #!##$#########!# ....#xxxxx!# ....#xxxxx!# ....#xxxxx!#######xxxxx!"
level_92:="#########xxxxx#####x!#       #######   #x!# # # # #         #x!#   $ $ # ###### ##x!#####$#$# #  ..  ###!xx#  @$  $   ..# $ #!xx# #$#$# ###... $ #!xx#       ##...#   #!xx##################!"
level_93:="x####xxxx!x#  #xxxx!x#  ###xx!x# $  ###!## ##.  #!# $$..# #!#  #*.$ #!## #. ###!x#   @#xx!x#$ ###xx!x#  #xxxx!x####xxxx!"
level_94:="xxxxxxx#####xxxxxx!####xx##   #######!#  #xx#  $   $   #!#  #### $ $ $ #  #!#... $ $  #$#$## #!#...# $ $        #!#..# $ $ $########!#...$ $ $@##xxxxxx!###### $ $ ###xxxx!xxxxx# ##  ..#xxxx!xxxxx# #  ...#xxxx!xxxxx#    ...#xxxx!xxxxx#########xxxx!"
level_95:="xxxx#####xx!xxxx#   #xx!##### # #xx!#   $   #xx!#   #$#####!##$## $ $ #!x# ...#   #!x# #..*   #!x# @ ######!x#####xxxxx!"
level_96:="xxxx#######xxx!xxx##     ##xx!xxx#  ###  #xx!x###$##. # ###!##    #..$   #!#  $$ #..#   #!# $$@ #.*# ###!#  $#$#*.# #xx!##     ..# #xx!x###$##  # #xx!xxx#   ##  #xx!xxx###    ##xx!xxxxx######xxx!"
level_97:="x######x######xxxxxx!x#    #x#    #xxxxxx!## ## ### $  #xxxxxx!# $$     $$  #xxxxxx!#  $ ## ## # #xxxxxx!# # $ $    # #xxxxxx!# $  $  # ## #######!#  # #$   ## ##    #!#### #  #### ## ## #!x#  $ $##  #       #!x# $ $     # ## ####!## ## ###  #   ....#!#   # ###   ## ....#!#   $$#       .....#!#   #    #@####....#!############xx######!"
level_98:="xx#########xxx!xx#.......#xxx!xx#.......###x!xx#         #x!xx##  ##### #x!xxx# ##   # #x!xxx# #   $  #x!xxx#  $ $ ###x!xx##$#   $ @#x!xx#  ## # $##x!###$  $$#  ###!#       #$   #!# # $ $ $  $ #!# ###### #  ##!#        ####x!##########xxxx!"
level_99:="#########xxxxxxxx!#....   #xxxxxxxx!#....   #xxxxxxxx!#.#... ##xxxxxxxx!#....#  ########x!######$$   #   #x!xxx#    ## $$# #x!xxx#  #  ##  $ #x!xxx## $ $   ## #x!xxx#   # $   # #x!xxx#   $ #$  # #x!xxx## ## # $ # ##!xxxx#$ #$#  ## @#!xxxx#  # #$$ $  #!xxxx#          ##!xxxx############x!"
level_100:="xx####xxxxxxxxxxxx!xx#  #######xxxxxx!###$       #######!# $  $$  $ ##....#!#  $# ###$$   ...#!# #    @  #   ...#!# #$$ $ $$#$##...#!#   ## ##   ##...#!##  $      $ #####!x#########  ##xxxx!xxxxxxxxx####xxxxx!"
level_101:="#############!#@$ $ $ *...#!#  $ $ $.*..#!# $ $ $ *...#!#  $ $ $.*..#!# $ $ $ *...#!#  $ $ $.*..#!# $ $ $ *...#!#  $ $ $.*..#!# $ $ $ *...#!#  $ $ $.*..#!#############!"
level_102:="xxxxx#####xxxx#####x!######   ######...##!#   ## $ #  ##.... #!# $$   $ #   #.. . #!#   ### ## $ #....##!### #     $  #....#x!x## #   ### #####$#x!x## ###   # ##    #x!x# $  @$$ # ##$$$ #x!x# $ ##   # ## $  #x!x#   ##### $## # ##x!x#####xx#     $ $ #x!xxxxxxxx#   #     #x!xxxxxxxx###########x!"
level_103:="xx####xxxxxx######x!xx#  #xxxxxx#    ##!xx#  ###xxx##     #!xx#$   #xxx#   #  #!xx# $# #####      #!xx#   $   # # #####!###$$   # # # # #xx!# $   $   # #   #xx!# @$ $ ###  # # ##x!#  ## #          #x!####...#  #    # #x!xxx#..*.# # # $  #x!xxx##..*.# # #$ ##x!xxxx##..* $    $ #x!xxxxx##..    #   #x!xxxxxx############x!"
level_104:="###################!#  #   #   #   #  #!#  $   $  $    $  #!# $########## ##$ #!## ## *.*..*.* # ##!#  ## ..*..... # ##!#  ### ######### ##!#  #      $ #   $ #!## #   $#$#@  #   #!## # #       ######!# $  #########xxxxx!#   ##xxxxxxxxxxxxx!#####xxxxxxxxxxxxxx!"
level_105:="xxxxxx####xx!#######  #xx!#  #     #xx!# $$ $#  #xx!#  ##.# ####!## ##.#  $ #!## # . $ # #!#   *..#   #!#  # . # ###!## ##.##$#xx!x#     $@#xx!x#  ######xx!x####xxxxxxx!"
level_106:="x##########!##  ..... #!#  #..... #!# $ #### ##!# $  @   #x!## $ $ $ #x!x# $$$$$ #x!x#   #   #x!x#########x!"
level_107:="##############!#     #      #!# $$$    $$$ #!##   $$$$   ##!x#$ $    $ $#x!x#   $$$$   #x!x#$$$    $$$#x!x# $ $$$$ $ #x!x#          #x!######..######!#..*.****.*..#!#..*......*..#!##.********.##!x#..........#x!x######@#####x!xxxxxx###xxxxx!"
level_108:="xxxxx#####!######   #!# $ .. $ #!#@$$.. $##!# $ ..  #x!#########x!"
return

extract_tiles:

01 :="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgAgMAAAAOFJJnAAAACVBMVEV3fnlqcWyBiIOsuk0QAAAAJklEQVQY02MIhQIEI2oVGCxFYixgAAIuZAYDGAwtBrovMH2KGRoAC+Y5HfX3uBIAAAAASUVORK5CYII="
02 :="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAaVBMVEWhoaFtbW3CwsKUlJSpqalGRkZpaWnExMTn5+esrKykpKRlZWVdXV2RkZG6urpLS0vJycm9vb2ZmZmWlpa0tLRwcHC/v7+cnJzi4uKLi4t/f391dXXW1taPj49ZWVk9PT3Q0NCFhYVSUlJG8PdqAAAAyElEQVQ4y7WS2Q6DIBBFB1QsUAFZ3Je2//+R9ckMNtQ0puftkpMZYAZuMd3U4WQsTIZGNDgoS8D4PE07aqAc0mSkgDq/KjRnLSi/XOH/QvlFEDYU4NssiZu3CsNIMCHgxJYVCMPIjSi/oMRQ3juFD3wPNJ7/4B94QfgAh/mTJlqQTIKI382o4eid8/34MbKmWKg+BZUQUIszocx/bHH9kuKsghAou1gQ+SZYh+bfM6ZUW+3ZPhcgGHaXIgtsz0FqKDBaayI1zusbvUAPDjfZlaMAAAAASUVORK5CYII="
03 :="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAGFBMVEWAjoVjdGsjLiswPTg3R0JMX1VXbGNAT0hiWm0fAAAATElEQVQoz2MgAigpKRkDgQsYGGMXAPLggGwBiIgxCGAVAIqAQSgI4BBQAvMFQQCXgFJ5eTl+gfK0tDTKBIyN0QScnVEFgG4eDAKEAABvSVUhkHq4BgAAAABJRU5ErkJggg=="
06 :="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAHlBMVEUAAABwAABUAAIAAACMAAKoAADEAAD//wD/AAD+//8MEF22AAAAAXRSTlMAQObYZgAAALJJREFUKM+NksENwyAMRZEi9f4DC+As4JSoPSOcDTJLzx2j49alkDqn5h2IeHoOEsI1UnIHBhE+iGXdyuVpghxyuL9MABGUhw1EcriZAOsGlF3MGmji9wkAIrqwEYARcxf+vCCKwEj0K9To3o6Qso8MoAa4Cc1Tmig2saDjSw0EQSqA8CfI+Brot9QAIrkvrJcDQ2A344D/KyZ3RUO6iP1/UEYVBAPpsRTNvgpLqg/BwO4NnCcsqnHHktMAAAAASUVORK5CYII="
07 :="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAPFBMVEUAAAAAAABwAABUAAKMAAKQkJD/qFT/gADEZAC0tLT/xIzg4OCoVACoAACMSAD/4MTEAAD/AAD//wD+//9DRHj9AAAAAXRSTlMAQObYZgAAASBJREFUOMt10o2SgjAMBGA3oY0UQfTe/11vk9xNB213tDjuN/yk3K4BcxvndXq/MBj3P+/T+32fiPNtOxaRxb8Ygdd9j34qdu8zYwGI6F+G4gH2XXwB3MFiLhIg4/QTQAhQyrptaymIU3wBFH7WlSuF6AdQApihFF8noB61AY2HGUCtZrViCjYcZsc2ABCCagesNQOMQgUXwKcwXqC2Vv2I63NiAQEMwPPJhf1lx+Bb/IhBFcSiARb0PsFaIivYp+h9ApRtKwjQBdgHEP0fNfuMA+RPBFD4DSTIgCAkQ0HDln1eN4EG4ACCqrfAwnTAwLdA8s+YhWTUgQYwIxAv0Ig7oGDACBMgR814kSBfw0yeTZnomWg7oPB0QJHRS+Bh/wtxFAmIq2JcwQAAAABJRU5ErkJggg=="
08 :="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAKlBMVEUAAABwAAAAAABUAAKMAAL/qFSQkJD/gAD/xIy0tLTg4OD/4MSoAACMSAA3i+TNAAAAAXRSTlMAQObYZgAAAONJREFUKM9V0LEOAUEQBmDZNxg8gJ1lHaK42ydw2VJ1yYVGs4VEK7moNBKhViiUColWq1V6KCNYM3+3X/7J7mztE4VYE2l7L0SNnw/fEoURQM4K3oMADe8044xyFAGIaFI2o07XeXAcFke0VIkzyoZyJWCTzErDZtSkKiR012cJyW5YFQT1H0y3VblMoZH9YHBLJhpyF28JNiwB8iwuZ+cHDcA+pH85AEEeoXekAq/YoOWHoCagRGhrEKBGVKdzg4Oms4lAWyA93DHAu8nMH1JI9hvjOHTKwqUu+0MdDV/fffOGFwpEMehnU7P3AAAAAElFTkSuQmCC"
09 :="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAPFBMVEUAAABwAAAAAABUAAKMAAL/qFSQkJDEZAD/xIz/gAC0tLSoAACoVADg4ODEAAD/4MT/AAD//wD+//+MSADOJxWtAAAAAXRSTlMAQObYZgAAANdJREFUOMt90tGugyAQhOHuICsLVdtz3v9dO2tqmhaW/8aL+QyRePsO3i0MWLxQ+NwYRbCLtzDMwGN3Mdn/njsfCMH+tJYYgj3tj7WBBYBvtqZ12yqiXQForRoCuyNDyYY7QV6RC1CmIJvlGcC/GX6BeL47sFI6kNIpYASWS+ERnTiPga0AjmNwUQ4Y1vMjFaO/QbwVVXW8f8C2IXqf4LzqAZAPgGoP5OoOCDAFIlh6kN77QsA6gXSREFA4AYHXAwpXB4AIOCnMQUK/i4vMAiCMgskQ/HaBF8TGBvfnTrgxAAAAAElFTkSuQmCC"
14 :="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgAgMAAAAOFJJnAAAACVBMVEUyTGg1UW4sQ1xHLJp8AAAAMklEQVQY02NYBQUIxtJQMIhCYgQwAAErMoMBDEhnsAagMwJY8TIwdZFpO6YvMH2KGRoAgEI9GTLd3iEAAAAASUVORK5CYII="
barrel:="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABSlBMVEUAAABTUFAjHRwuKikiHh1kZGQfGhkhGhktJSNpaWkxMDAkHBp4eHhgYGBycnEsJSRRUVEhHx9NTEwzLi1+f358fHxHRkZRUFBoZ2cyLCspIR9NTExpaGg4NzeOjYxeXV2KiopQT0+RkZCYl5ZCPz8cHBydnZxoaGhgYGAuLS14eHg3LSorIyFMPzolJCMuKyp4YFZyWlEcHBxCPz6bemqNcGNYRkA9My9KSEhBNjIxKCWCgH9dS0SRc2ZuWE8sJyUnIR6WdmiEaV6AZluJbGAzMC+JiIdVRD9IPTg8NzY3MzIiHx5GOTSenp2Tk5JlY2JiVE9pVExYT0tlUUghHBsXFxdxb22ffWxqaWgTEBB9fX12dnVfXl5cWllVVFNOTUxhTkdHREOOjo19ZVpNREJSRD5GOziZmZd6eXhvamhkX11sY2AICAd+cm6BgtSGAAAAK3RSTlMACekXN7Hrn+vYtYVYWDYwJ93c2tCxsa+QiWMz5+fW08m7rZN1dWNjQEAqHypdNQAAAqRJREFUOMuNk1dzm0AUhaXYktztuJf0nuwCC0ggOgIhqnqxrN5d8/9fswpS7GT8kG+YHWbOuZezl93IU35sbW1tb2/vRZ4junN09CaXy0mSdBiL7UT/1b+8y900u33Xojy22CgUDr/+ZYl+zN+wLiBsbg7BDzsF6TT6RP+Q73g8lmW5SmNUWXAbo5NHx06hzRMDVaVpZGZTWfwYyM61Lv4Y1vOTKW1kFSWVSSaTmfmiZO/yb5f6yvqIJWSaNo1UyjDGuA9CdLlyvb6yMGz2ChNVSSoZXHt5icsv5ysaDTcXERPutSSbWFeyarlcRTiEkho3WlYijLlaA8X8PY37mzJSMopaxa+oJPVhbTU0kLxwe32DW5gohZCZonGUhtSnxIUh4buOUCwUpJ8lA4dIKnTpvtnsaxAyid+GFzU8pGqlOMrncxgJ0+hRIoT+Qzw0+BRrj02nUum2W61Wu5NmLSgCSNavXoQGoHmdEhqYaOAQRCCIgBCAONfh0hBQ6eatjcYqR5dtjhcIACmsAyo0xDWBnw27zbvSwCkPpgSwKBLLdR1ooWGNcUHZZtP9NIZlLc33rx6udJySjC8MFqhmOZlgPYqiSKZe93UA5ymYsMM53kUFyYapEhgeAF2Y8RBgvXYeTlIkrU6JMA0kq3SVswPgBADqJOMvJrm7Bqh0sVlSq5yqljlOADyAGq6H8d3wd57xwGO7xW5lYsuy4/DAwjIDob65PDAHwCHcYRozZN15TobxNVF/uRJZ8MkT5KkwYy0qVElN00Wd+RxZsrLPBkTAyTMgCPj7IgCirpNhg5CL/bQLCG4aOAEhiFDEe7AOwoTLHu9fFScVFvB4DJpGkt7rjbD+kW+n7bbUuL3r9dI91jv7/tz13YvFYifHxxsbe9HI//MLLqOoHBWFZtMAAAAASUVORK5CYII="
barrel_red:="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABnlBMVEUAAAAtFxFhYV8yHxthYV8tFxFJR0c6KyhFQkJ5eXcdHRx5eXcdHRxpaWcwGRQbGBYwLSxDHRaVk5FtbWswFg+ioqBtbWtTUlE7ODeRj41+fXtKIRYtFxFYV1VFQkKUlJJ6enhmZmQ0MTC1cE+mXT+YSi8jIiFYKBVkLRhSJhQ4NjV8Nh90Mh03GhC4dFOfUzdEIhI9HRGKiYaEOiEdHRwxHhYtFw+DgoCwakyKRS2QRCkqKCc1JSFlOSmdnZuWl5VoaGatZUhuMRxpMBo0IBkWFhV8e3lubWxQTkyZUTiJQig8LCZcMyRQLyQnHRo+IxaJcWdHRENQQj6iWDyTSS88Jx04IBZMJhONd2xyYltbU09YTEdBPj5CNDJCLypILiZ5OyWPPiQuJCJ2OCBeKxZLIRWRj413dXNZWFZVVFJyV01jUkyIVkJ+SDNePC1/Pyg4KiU+JSBNKh1HJx0jGhckEgsOCQiioqCQioZ/dG98bWhkYF2AZlxrWlWbZ1KWXERmS0J8UEGcWT1UPDZzRjUwLi1RNSsZDQqFdW6LW0reKr2QAAAAI3RSTlMAVVU5qqpVVTmqqlVVOePGqqo5HBzj4+PjxsbGxqqqjo6OjqddB5cAAAK6SURBVDjLbZN1dxpBFMUpSSAuTeredZbNKgu7LO7uEkESIO7u3rT91h2yAdI2d8/ZP+b+3sy778xonmp8YGBAq9WOa55XX987juPMZvP77u7/3ZdfOPPi6XQpopTTAb+d+zr0j/9qYbm0HXUbgdzR7Rm//fVfxNAhV951kyTPhxGgLLlTcgR6nx5vT+PGcFiSs6EMDHQTklYdnzq+ljvGwjTscrksEARZoMlJyLLGmXUdwLFar8kIDTdFI01J1SmHtg1EFlZJGGqWT4Ji9e9a4ZQ24PUf3WWay5aQJEkwZAHo5XHA1PJ7qFt7kkdgOFuVXBZ4c5OGM+EVsyL2PAL9Oez88OwSglxZ0AGdQSDo4swfTFD9qj8xsuXBVuxc8WLtBoJAAOn3eWAxZWKUkYkH4IVojeHGq4DdfpRMFovFZNLvX4okqITv4IUKUKjBJtPuq6lfCw6Hg1s8TUcogjGhB9QjwOas0+vwZkgyRjc2Nu63mTrBECbU95N9BLz1RMp5XQXdkfKc0UjgHizhRX37TF4FBlGcuE85p9bkOTctkySBEbn5Zn3BOqjuIGzlSVs6uLw0E7XZojuKFfX5DkSGUgR1B33cqtToatQwO2swGH6gqODbF0WCEdE9FegaBilCchYJV8qVSs4r7mN1ggVdCsNd6qTGTCAFH6JpcGFIjwdjjDhB5VFhrzXqMcabct6tIwgvIzJP4gW8mUIwUS2gq4EpIMU1aeTnQEysgYEUwKfACao+4ETsIYXNZovt7M5bUSHuZcSPmpb0uwTpjnVSCIKJZdi9QU1bn2M4ifO18lYkosTjJqLAslS8X9NRbzCGEzXejeFgzGyhwLBi3Kp20CLeTN9iICEOPpbKi1bDW9XvEN+cJyczlUaDzc+XQCvf235H3d3g4QaczmBwdFTzvMDT1+l0ev3TtT/trapAD1uiwQAAAABJRU5ErkJggg=="
goal:=" iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAV1BMVEVhTTxYRDRmUkGdAAA+BSf+AgHfAADAAAD/W1j/Ly14BSdvBSf5AADzAADlAACwAACUAABYAABSAAD/xsb/Pz/CISL/Ih/XAACmAACTAACFAAB4AABkAACMPgk4AAAAa0lEQVQ4y9XTRw6AMAwEQINTIJ3Qy//fyQdwCOQCex7JsuyF6iY5oE4kH8BFngAg8legEHUKjM3A3UYD1fYNt5KRAHk7ceE7EqzWGCGRBlq4WWKgR8C+eAxHak0WI4Ov3+IFKP/q8maVt/sEcfYFF7Qkxh8AAAAASUVORK5CYII="
PRESS_ENTER_TO_START :="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"
Project_2D :="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"

congratulation:="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"

FileCreateDir, boxxeltiles

tileset=01,02,03,06,07,08,09,14,barrel,barrel_red,goal,PRESS_ENTER_TO_START,Project_2D,congratulation

loop, parse, tileset, "`,"
{
 if !fileexist(a_scriptdir . "\boxxeltiles\" . a_loopfield . ".png")
 extract_tile(%a_loopfield%, a_scriptdir . "\boxxeltiles\" . a_loopfield . ".png")
}

extract_tile(var,filename)
{
nBytes := Base64Dec(var, Bin )
File := FileOpen(filename, "w")
File.RawWrite(Bin, nBytes)
File.Close()
}

Base64Dec( ByRef B64, ByRef Bin ) {  ; By SKAN / 18-Aug-2017
Local Rqd := 0, BLen := StrLen(B64)                 ; CRYPT_STRING_BASE64 := 0x1
  DllCall( "Crypt32.dll\CryptStringToBinary", "Str",B64, "UInt",BLen, "UInt",0x1
         , "UInt",0, "UIntP",Rqd, "Int",0, "Int",0 )
  VarSetCapacity( Bin, 128 ), VarSetCapacity( Bin, 0 ),  VarSetCapacity( Bin, Rqd, 0 )
  DllCall( "Crypt32.dll\CryptStringToBinary", "Str",B64, "UInt",BLen, "UInt",0x1
         , "Ptr",&Bin, "UIntP",Rqd, "Int",0, "Int",0 )
Return Rqd
}

return

Attachments
AHKBAN.png
AHKBAN.png (107.71 KiB) Viewed 7653 times
Last edited by SpeedMaster on 18 Jul 2018, 12:47, edited 4 times in total.
User avatar
TheDewd
Posts: 1503
Joined: 19 Dec 2013, 11:16
Location: USA

Re: [Game] AHKBAN a Boxxle (Sokoban) clone

22 May 2018, 14:59

Excellent! I'm very impressed! Thanks for sharing!
User avatar
SpeedMaster
Posts: 494
Joined: 12 Nov 2016, 16:09

Re: [Game] AHKBAN a Boxxle (Sokoban) clone

22 May 2018, 18:21

Thanks for your feedback. :thumbup:
Good to know that it works on other PCs too. :)
User avatar
FanaticGuru
Posts: 1905
Joined: 30 Sep 2013, 22:25

Re: [Game] AHKBAN a Boxxle (Sokoban) clone

22 May 2018, 21:07

I played the first 7 levels and I like it. I have not seen this puzzle before. When I have more time, I will definitely see how far I can go.

Nice job implementing it also. It plays fine without any problems that I noticed. Responsive movement. Good job.

FG
Hotkey Help - Help Dialog for Currently Running AHK Scripts
AHK Startup - Consolidate Multiply AHK Scripts with one Tray Icon
Hotstring Manager - Create and Manage Hotstrings
[Class] WinHook - Create Window Shell Hooks and Window Event Hooks
User avatar
SpeedMaster
Posts: 494
Joined: 12 Nov 2016, 16:09

Re: [Game] AHKBAN a Boxxle Sokoban clone

24 May 2018, 12:09

New version 1.3

I corrected the double drawing of the player when 2 keys were pressed at the same time. :roll:
User avatar
SpeedMaster
Posts: 494
Joined: 12 Nov 2016, 16:09

Re: [Game] AHKBAN a Boxxle (Sokoban) clone

25 May 2018, 18:19

New version 1.4

I added new hotkey (Forward)
Press Right Control key to Forward.

Now you can Rewind and Forward. :thumbup:
User avatar
SpeedMaster
Posts: 494
Joined: 12 Nov 2016, 16:09

Re: [Game] AHKBAN a Boxxle (Sokoban) clone

13 Jun 2018, 17:36

New version 1.5

- Added a menu
- Slightly modified graphic design.
- Left-handed keyboard controls
- Undo / Redo buttons

Cheers :thumbup:
User avatar
TheDewd
Posts: 1503
Joined: 19 Dec 2013, 11:16
Location: USA

Re: [Game] AHKBAN a Boxxle (Sokoban) clone

19 Jun 2018, 09:35

Great work!

Just for fun, I modified your script to use levels from Bulldozer 1, Bulldozer 2, and Bulldozer 3. :D

Code: Select all

; ======================================================================================================================
; Name:           AHKBAN
; Description:    a Boxxle (Sokoban) clone
; Topic:          https://autohotkey.com/boards/viewtopic.php?f=19&t=49383
; Sript version:  1.5
; AHK Version:    1.1.24.03 (A32/U32/U64)
; Tested on:      Win 7 (x64)
; Author::        SpeedMaster
; Tileset:        from Project 2D by TheDewd

; How to play:    The goal of the game is to push all of the barrels onto the goals.
;                 The player can only push one barrel at a time and is not able to pull them.
;                 A level is solved when each barrel is on a goal.
; ======================================================================================================================

; ======================================================================================================================
; LEVEL MOD (2018-06-19)
;
; Modded by TheDewd <https://autohotkey.com/boards/memberlist.php?mode=viewprofile&u=56166>
;
; Replaced all levels with the levels from Bulldozer 1, Bulldozer 2, and Bulldozer 3
;
; Bulldozer <https://autohotkey.com/boards/viewtopic.php?f=6&t=50139>
; ======================================================================================================================

#SingleInstance force
SetBatchLines, -1
SetWorkingDir, %A_ScriptDir%

gosub, boxxlelevels
gosub, extract_tiles

tooltip, Loading Game... Please wait

BoardCols:=30
BoardROWS:=22

MOVES:=0
PUSH:=0

record:=[]
forward:=[]

MAP_WIDTH:=BoardCols
MAP_HEIGHT:=BoardROWS

TILE_TYPE:=[]
TILE_TYPE[0]:= [ ""                          , true  , false, "empty"       ]
TILE_TYPE[1]:= [ "boxxeltiles\01.png"        , true  , false, "Rock_floor"  ]
TILE_TYPE[2]:= [ "boxxeltiles\02.png"        , false , false, "Wall"        ]
TILE_TYPE[3]:= [ "boxxeltiles\goal.png"      , true  , false, "Goal"        ]
TILE_TYPE[4]:= [ "boxxeltiles\03.png"        , true  , false, "stair"       ]
TILE_TYPE[6]:= [ "boxxeltiles\06.png"        , true  , false, "player_up"   ]
TILE_TYPE[7]:= [ "boxxeltiles\07.png"        , true  , false, "player_down" ]
TILE_TYPE[8]:= [ "boxxeltiles\08.png"        , true  , false, "player_left" ]
TILE_TYPE[9]:= [ "boxxeltiles\09.png"        , true  , false, "player_right"]
TILE_TYPE[12]:=[ "boxxeltiles\barrel.png"    , false , true , "barrel"      ]
TILE_TYPE[13]:=[ "boxxeltiles\barrel_red.png", false , true , "red barrel"  ]
TILE_TYPE[14]:=[ "boxxeltiles\14.png"        , true  , false , "blue_floor" ]

emptytile:=0
rock_floor:=1
wall:=2
goal:=3
stair:=4
closed_door:=5
open_door:=6
barrel:=12
redbarrel:=13
currentlevel:=1
playerpicup:=TILE_TYPE[6].1
playerpicdown:=TILE_TYPE[7].1
playerpicleft:=TILE_TYPE[8].1
playerpicright:=TILE_TYPE[9].1



lvselect:=new layergrid(ctr:="radio",clln:="5_",cmj:="true", gpx:=10, gpy:=10, cols:=10, rows:=18, wsp:="50", hsp:="20", opt:="gselectlv", fill:="aindex", "Mselect")

Layer_background :=new layergrid(ctr:="pic",clln:="1_",cmj:="true", gpx:=10, gpy:=10, cols:=BoardCOLS, rows:=BoardROWS, wsp:="32", hsp:="32", opt:="gclickcell BackGroundTrans disabled", fill:=TILE_TYPE[14].1, "1")
Layer_items      :=new layergrid(ctr:="pic",clln:="2_",cmj:="true", gpx:=10, gpy:=10, cols:=BoardCOLS, rows:=BoardROWS, wsp:="32", hsp:="32", opt:="gclickcell BackGroundTrans disabled", fill:=TILE_TYPE[0].1, "1")
Layer_characters :=new layergrid(ctr:="pic",clln:="3_",cmj:="true", gpx:=10, gpy:=10, cols:=BoardCOLS, rows:=BoardROWS, wsp:="32", hsp:="32", opt:="gclickcell BackGroundTrans disabled", fill:=TILE_TYPE[0].1, "1")
Layer_debug :=new layergrid(ctr:="text",clln:="4_",cmj:="true", gpx:=10, gpy:=10, cols:=BoardCOLS, rows:=BoardROWS, wsp:="32", hsp:="32", opt:=" w32 h32 0x201 -border BackGroundTrans ", fill:=" ", "1")


gui, font, s26 bold, consolas
gui, add, picture, x310 y200 vtitle backgroundtrans, boxxeltiles\Project_2D.png
gui, add, picture, xp+30  y+10 vstart backgroundtrans, boxxeltiles\PRESS_ENTER_TO_START.png
gui, add, picture, xp+60  yp vcongratulation hidden backgroundtrans, boxxeltiles\congratulation.png

gui, font, s12 italic, consolas
gui, add, text, x825 y685 cred backgroundtrans, by SpeedMaster

gui, font
gui, font, s14 bold, consolas


Gui, Add, text, x20 y25 w400 h50 hidden vcLV backgroundtrans cwhite,  % "Level:" currentlevel

gui, add, button, x20 yp+30 w30 h30 hidden vlevel_down10 glevel_down10, <<
gui, add, button, x+2 yp w30 h30 hidden vlevel_down glevel_down, <
gui, add, button, x+2 yp w30 h30 hidden vnextlevel gnextlevel, >
gui, add, button, x+2 yp w30 h30 hidden vlevel_up10 glevel_up10, >>


Gui, Add, text, x20 yp+45 w400 h50 hidden backgroundtrans vundo cwhite, Undo / Redo

gui, add, button, x20 yp+30 w30 h30 hidden vgoback10 ggoback10, <<
gui, add, button, x+2 yp w30 h30 hidden vgoback ggoback, <
gui, add, button, x+2 yp w30 h30 hidden vgoforth ggoforth, >
gui, add, button, x+2 yp w30 h30 hidden vgoforth10 ggoforth10, >>

gui 1: add, button, x+2 yp w30 h30 hidden vf_1_1 , focus


gui, add, text, x20 y+30 w124 h30 cyellow hidden vmoves -border backgroundtrans , % "Moves:" 0
gui, add, text, xp yp+30 w124 h30 cyellow hidden vpush -border backgroundtrans , % "Pushes:" 0


tooltip,

;---------------------------------------CHECK IF INI EXIST IF NOT CREATE IT--------------------------------------------------------

iniFile := SubStr( A_ScriptName, 1, -3 ) . "ini"
Ini_File=%A_WorkingDir%\%iniFile%
ifnotexist,%Ini_File%
 {
  iniContent =
  (
  [Game]
  lastplayed=1
  )

  replaceFile(iniFile, iniContent)
 }

; call replace file function
replaceFile(File, Content)
{
	FileDelete, %File%
	FileAppend, %Content%, %File%
}

;------------------------------------Read the ini file and store its content to variables----------------------------------------------
;Read ini file
IniRead, currentlevel, % iniFile, game, lastplayed

if !(currentlevel) || (currentlevel>180)
  currentlevel:=1

;----------------------------------------------------------------------------------------


	Gui, Mselect: +LastFound -Resize ;+OwnDialogs
	Gui, Mselect: Margin, 10, 10
	Gui, Mselect: Show, Hide AutoSize, Level Select


Menu, GameMenu, Add, &Retry`tR, Retry
Menu, GameMenu, Add, &Level Select`tF2, selectlevel
Menu, GameMenu, Add, &Exit`tESC, exit

Menu, HelpMenu, Add, &How to play, howtoplay
Menu, HelpMenu, Add, &Shortcuts, help
Menu, HelpMenu, Add, &About, about

Menu, MyMenuBar, Add, &Game, :GameMenu

; Create the menu bar by attaching the sub-menus to it:
Menu, MyMenuBar, Add, &Help, :HelpMenu

; Attach the menu bar to the window:
Gui 1: Menu, MyMenuBar

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Gui, show, AutoSize, AHKBAN v1.5 - by Speedmaster
return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

retry:
retry()
return

selectlv:
gotolv:=( agmove(a_guicontrol, "EY")*10 ) - ( 10 - agmove(a_guicontrol, "EX"))
currentlevel:=gotolv
Gui, submit
Gui 1:Default
solved:=0
if !(play){
  hidecell("title")
  hidecell("start")
  showcell("cLV")
  showcell("moves")
  showcell("push")
  showcell("goback")
  showcell("goback10")
  showcell("goforth")
  showcell("goforth10")
  showcell("nextlevel")
  showcell("level_up10")
  showcell("level_down")
  showcell("level_down10")
  showcell("undo")

}
levelclear()
loadlevelb(currentlevel)
drawchar("cLV","Level:" currentlevel)
Gui, 1: Show,, AHKBAN v1.5 - Level %CurrentLevel%
return

about:
vabout=
(
AHKBAN v1.5

by SpeedMaster
)

msgbox, % vabout
return

selectlevel:
Gui, Mselect: Show
GuiControl, Mselect: , % "5_" (currentlevel - ((currentlevel//10)*10)) "_" (currentlevel//10)+1 , 1
;guicontrol, Mselect: hide1, 5_9_11
;guicontrol, Mselect: hide1, 5_10_11
return

howtoplay:
msgbox, How to play:`n`nThe goal of the game is to push all of the barrels onto the goals.`nThe player can only push one barrel at a time and is not able to pull them.`nA level is solved when each barrel is on a goal.

~enter::
start:
if !(play)
{
  hidecell("title")
  hidecell("start")

  showcell("cLV")
  showcell("moves")
  showcell("push")

  showcell("goback")
  showcell("goback10")
  showcell("goforth")
  showcell("goforth10")

  showcell("nextlevel")
  showcell("level_up10")
  showcell("level_down")
  showcell("level_down10")

  showcell("undo")

  loadlevelb(currentlevel)
  drawpic(player, playerpicdown)
  drawchar("cLV","Level:" currentlevel)

  play:=1

}
  Gui, 1: Show,, AHKBAN v1.5 - Level %CurrentLevel%
return


z::
w::
up::
player:=AGMove(player,"y",-1)
dirprev:=dir
dir=up
deltax:=0
deltay:=-1
gosub, check_if_passable

return

s::
down::
player:=AGMove(player,"y",1)
dirprev:=dir
dir=down
deltax:=0
deltay:=1
gosub, check_if_passable
return

a::
q::
left::
player:=AGMove(player,"x",-1)
dirprev:=dir
dir=left
deltax:=-1
deltay:=0
gosub, check_if_passable

return

d::
right::
player:=AGMove(player,"x",1)
dirprev:=dir
dir=right
deltax:=1
deltay:=0
gosub, check_if_passable
return


pgup::
nextlevel:
if (currentlevel>107)
return

level_up:
currentlevel++
drawchar("cLV","Level:" currentlevel)
solved:=0
levelclear()
loadlevelb(currentlevel)

if (currentlevel>180)
showcell("congratulation")

Gui, 1: Show,, AHKBAN v1.5 - Level %CurrentLevel%
return

^pgup::
level_up10:
if (currentlevel=180) || (currentlevel=109)
return

currentlevel +=10
if (currentlevel>180)
currentlevel:=180
drawchar("cLV","Level:" currentlevel)
levelclear()
loadlevelb(currentlevel)

Gui, 1: Show,, AHKBAN v1.5 - Level %CurrentLevel%
return


pgdn::
level_down:
if (currentlevel<=109)
hidecell("congratulation")

if (currentlevel=1)
return
currentlevel--
drawchar("cLV","Level:" currentlevel)
levelclear()
loadlevelb(currentlevel)
Gui, 1: Show,, AHKBAN v1.5 - Level %CurrentLevel%
return

^pgdn::
level_down10:

if (currentlevel<=109)
hidecell("congratulation")

currentlevel -=10

if (currentlevel<1)
currentlevel:=1

drawchar("cLV","Level:" currentlevel)
levelclear()
loadlevelb(currentlevel)
Gui, 1: Show,, AHKBAN v1.5 - Level %CurrentLevel%
return

help:
  msgbox,  Shortcuts: `n`n Backspace = Rewind`n Right Control = Forward `n R = Retry `n==============`n PgUp = Next Level `n PgDn = Previous Level `n Ctr PgUp = Next level +10 `n Ctr PgDn = Previous Level -10  `n==============`n F2 = Select Level `n F3 = Debug layer1 `n F4 = Debug layer2
return


clickcell:
msgbox, % a_guicontrol
return

exit:
guiclose:
esc::
IniWrite, % currentlevel, % iniFile, game, lastplayed
exitapp
return

check_if_passable:

forward:=[]

if ispassable(nx, ny)  ; nx= new pos x  ; ny= new pos y
{

  if !(solved)
  record.push(player ":" dir ":" previous ":" dirprev)

  if (mvo) {
    push++
    record[record.length()] .= ":" free ":" obstacle
    drawchar("push", "Pushes:" push)
    mvo:=""
  }



  ;// Draw the player to the new position
  drawpic(player, playerpic%dir%)

  ;clear previous position of player
  clear_previous_playerpos()


  ; report wat there is at current player position
  lookdata()

  if checkwin()
     drawchar( "moves"  , "Moves:" . record.length())

  ongoal()


  if !checkwin() {
     for i, r in datagrid1
       for j, c in r {
          datagrid2[i][j]:=0
          solved:=1
        }
      Drawtile(exitlevel, stair)
  }

; if player go to stair
  if (Datagrid1[nX][ny]=stair) {
     gosub, level_up
   }
}
else {
  ;// Don't move the player >> restore previous player postition
  player:=previous
  if !(dir=dirprev)
    drawpic(player, playerpic%dir%)
}
return


IsPassable(npX, npy)   ; npx =new pos x , npy =new pos y
{
global
    ;// Store the value of the tile specified
    tilevalue1:= Datagrid1[npX][npy]        ;npx = new pos x   npy = new pos y
    tilevalue2:= Datagrid2[npX][npy]

    ;// Before we do anything, make sure that the coordinates are valid
    if % (npX < 1 || npX > MAP_WIDTH || npy < 1 || npy > MAP_HEIGHT)
        return false

    ;if there is an obstacle that player can move
    if ismovable(npX, npy)
    {
    MoveObstacle()
    return true
    }
    ;// Return true if it's passable
     if Tile_type[TileValue1].2 ;check if there is an obstacle at grid 1 (layer1) background
     if Tile_type[TileValue2].2 ;check if there is an obstacle at grid 2 (layer2) items
        return true

     ;// If execution get's here, it's not passable
        return False
}


IsMovable(npX, npy)   ; npx =new pos x , npy =new pos y
{
 global
  tilevalue2:= Datagrid2[npX][npy]
  tilevalue1:= Datagrid1[npX][npy]
  ;// check if there is a movable item a current location
   if Tile_type[TileValue2].3
    {
      ;// if true check if there is an obstacle at next postition
      next1:= Datagrid1[npx+deltax][npy+deltay]
      next2:= Datagrid2[npx+deltax][npy+deltay]
      if Tile_type[next1].2
      if Tile_type[next2].2
        return true
        else
        return false
    }
}


moveobstacle()
{
 global
 obstacle:="2_" . nx . "_" . ny
 free:="2_" . (nx+deltax) . "_" . (ny+deltay)
 drawtile(free, barrel)
 drawtile(obstacle, emptytile)
 mvo:=1
}

lookdata()  ; report wat there is at current player position in data grids
{
 global
 savedprevious:=previous
 currenttilevalue:= Datagrid2[nX][nY]
 previous:=savedprevious
}

Drawtile(cellname, value)
{
 global
 stringsplit, drp, cellname, _
 Datagrid%drp1%[drp2][drp3]:=value
 GuiControl, , %cellname%, % TILE_TYPE[value].1
}

clear_previous_playerpos(){
global
  for i, r in datagrid2
    for j, c in r {
if (("3_" i "_" j) != player)
      drawpic("3_" i "_" j, "")
}
}



;--------------------------------------------------------------------------------

~r::
retry()

retry(){
 global
 solved:=push:=0
 record:=[]
 forward:=[]
 drawchar("push","Pushes:" push)
 drawchar("moves","Moves:" moves)

 drawpic(player, empty)
 for i, r in datagrid1
   for j, c in r {
         datagrid2[i][j]:=0
         drawpic("2_" i "_" j, empty)

    }

 player:=startpos
 DrawDataMap(maplayer2,2,"drawtile")
 drawpic(player, playerpicdown)
 dir:="down"
 solved:=0
 Drawtile(exitlevel, rock_floor)


 if (currentlevel>180) {
    hidecell("congratulation")
    currentlevel:=180
    loadlevelb(180)
    drawchar("cLV","Level:" currentlevel)
  }
}

return


bs::
goback:
if (solved)
return
back:=record.pop()
if !(back)
return

forward.push(back)

bk:=strsplit(back, ":")
previous:=bk.1
player:=bk.3
clear_previous_playerpos()
dir:=bk.4
drawpic(player, playerpic%dir%)


if (bk.5) {
  push--
  drawchar( "push"  , "Pushes:" . push)

  drawpic(bk.5, empty)
  bpx:=strsplit(bk.5, "_").2
  bpy:=strsplit(bk.5, "_").3
  Datagrid2[bpx][bpy]:=0
  bpx:=[]
  bpy:=[]

  drawpic(bk.6, TILE_TYPE[barrel].1) ;draw barrel at is previous position
  bpx:=strsplit(bk.6, "_").2
  bpy:=strsplit(bk.6, "_").3
  Datagrid2[bpx][bpy]:=barrel
  bpx:=[]
  bpy:=[]
}

ongoal() ; draw a red barrel if barrel is on target

drawchar( "moves"  , "Moves:" . record.length())
GuiControl, Focus, f_1_1

return

goback10:
loop, 10 {
gosub, goback
sleep, 10
GuiControl, Focus, f_1_1

}
return

~RCtrl::
goforth:
forth:=forward.pop()
if !(forth)
return
record.push(forth)

ft:=strsplit(forth, ":")
previous:=ft.3
player:=ft.1
clear_previous_playerpos()
dir:=ft.2
drawpic(player, playerpic%dir%)

if (ft.5) {
  push++
  drawchar( "push"  , "Pushes:" . push)

  drawpic(ft.6, empty)
  bpx:=strsplit(ft.6, "_").2
  bpy:=strsplit(ft.6, "_").3
  Datagrid2[bpx][bpy]:=0
  bpx:=[]
  bpy:=[]

  drawpic(ft.5, TILE_TYPE[barrel].1) ;draw barrel at is previous position
  bpx:=strsplit(ft.5, "_").2
  bpy:=strsplit(ft.5, "_").3
  Datagrid2[bpx][bpy]:=barrel
  bpx:=[]
  bpy:=[]
}

ongoal() ; draw a red barrel if barrel is on target

drawchar( "moves"  , "Moves:" . record.length())

GuiControl, Focus, f_1_1
return

goforth10:
loop, 10 {
gosub, goforth
sleep, 10
}
GuiControl, Focus, f_1_1
return

f3::
debuglayer1:=!debuglayer1

if (debuglayer1) {

 for i, r in datagrid1
  for j, c in r {
         drawpic("1_" i "_" j, TILE_TYPE.14.1)
         drawchar("4_" i "_" j, c, "red")
    }
}
else
  for i, r in datagrid1
    for j, c in r {
      drawtile("1_" i "_" j, c)
      drawchar("4_" i "_" j, " ")
    }


return

f4::
debuglayer2:=!debuglayer2

if (debuglayer2) {

 for i, r in datagrid2
  for j, c in r {
         drawpic("2_" i "_" j, empty)
         drawchar("4_" i "_" j, c, "fuchsia")
    }
}
else
  for i, r in datagrid2
    for j, c in r {
      drawtile("2_" i "_" j, c)
      drawchar("4_" i "_" j, " ")
    }
return



return
;-------------------------------------------------------------------------


class layergrid
{
	__New(ctr:="pic", clln:="", cmj:="true", gpx:=10, gpy:=10, cols=30, rows:=20, wsp:="32", hsp:="32", opt:="BackGroundTrans  -disabled", fill:=".\boxxeltiles\14.png", guiname:="1" )
  {
  global
    this.guiname:=guiname, this.clln:=clln, this.cmj:=cmj, this.gpx:=gpx, this.cols:=cols, this.rows:=rows, this.wsp:=wsp, this.opt:=opt, this.fill:=fill

    r:=0,  c:=0, ai:=0
     While r++ < rows {
      ++ai
        while c++ < cols{

             gui  %guiname%: add, % ctr, % opt " v" ((cmj) ? clln c "_" r : clln r "_" c) " Hwnd" clln  r "_" c ((c=1 && r=1) ? " x"gpx " y"gpy " section"
                  : (c!=1 && r=1) ? " xp+"wsp " yp" : (c=1 && r!=1) ? " xs" " yp+"hsp : " xp+"wsp " yp"), % (fill="aindex") ? ai : fill
             ai++
          } c:=0
             ai--
     } r:=c:=ai:=0,
  }
}

ObjFullyClone(obj)
{
	nobj := obj.Clone()
	for k,v in nobj
		if IsObject(v)
			nobj[k] := A_ThisFunc.(v)
	return nobj
}

loadlevelb(number) {
 global

 map:=[]

 loop, parse, level_%number%, !
 map.push(strsplit(a_loopfield ))
 mpc:= map.1.length()
 mpr:= map.length()
  exitlevel:=""
  maplayer1:=[]
  maplayer2:=[]
  record:=[]
  forward:=[]
  push:=0

  for i, r in map
    for j, c in r {

     if (c="@")
      player:="3_" (cols-mpc)//2+j "_" (rows-mpr)//2+i
     if (c="e")
      exitlevel:="1_" (cols-mpc)//2+j "_" (rows-mpr)//2+i

     if !(c="#") &&  !(c=".") &&  !(c="*")
      maplayer1[(cols-mpc)//2+j,(rows-mpr)//2+i]:=1
     if (c="#")
      maplayer1[(cols-mpc)//2+j,(rows-mpr)//2+i]:=2
     if (c="X")
      maplayer1[(cols-mpc)//2+j,(rows-mpr)//2+i]:=14
     if (c=".") ||  (c="*")
      maplayer1[(cols-mpc)//2+j,(rows-mpr)//2+i]:=goal
     if !(c="$") &&  !(c="*")
      maplayer2[(cols-mpc)//2+j,(rows-mpr)//2+i]:=0
     if (c="$")
      maplayer2[(cols-mpc)//2+j,(rows-mpr)//2+i]:=barrel
     if (c="*")
      maplayer2[(cols-mpc)//2+j,(rows-mpr)//2+i]:=13
    }
  startpos:=player
  datagrid1:=maplayer1
  datagrid2:=ObjFullyClone(maplayer2)
  DrawDataMap(datagrid1,1,"drawtile")
  DrawDataMap(datagrid2,2,"drawtile")
  drawpic(player, playerpicdown)
  dir:="down"

  if !(exitlevel)
   exitlevel:=agmove(player, "z", -2)

  drawchar("moves", "Moves:" . record.length())
  drawchar("push",  "Pushes:" . record.length())
}


levelclear(){
global
drawpic(player, empty)
for i, r in datagrid1
  for j, c in r {
        drawpic("1_" i "_" j, TILE_TYPE.14.1)
        drawpic("2_" i "_" j, empty)
    }
}


DrawDataMap(datagrid, gridnumber:=1, function_name:="", Bypass_Values_List:="")
{

global
  For i, r In datagrid
   For j, c In r
    {
     cell_to_draw=%gridnumber%_%i%_%j%
     %function_name%(cell_to_draw, c)
    }
}

HideCell(cell_to_hide)
{
guicontrol, hide1, %cell_to_hide%
}

ShowCell(cell_to_show)
{
guicontrol, hide0, %cell_to_show%
}

disablecell(cell)
{
global
guicontrol, disable, %cell%
GuiControl, MoveDraw, % cell
}

DrawPic(cellname, object)
{
global
GuiControl, , %cellname%, %object%
}

drawchar(varname, chartodraw:="@", color:="")
{
 global
guicontrol,, %varname%, %chartodraw%
if (color)
colorcell(varname, color)
}

ColorCell(cell_to_paint, color:="red")
{
 GuiControl, +c%color%  , %cell_to_paint%
 GuiControl, MoveDraw, % cell_to_paint
}


AGMove(Varname,axes,value1:=1,value2:=1,value3:=1)
{
global
AGM(varname,value1,value2,value3)
StringSplit, ar, varname , _
if axes = z
  {
  nz:=value1+ar1
  ny:=ar3
  nx:=ar2
  }
if axes = x
  {
  nz:=ar1
  nx:=value1+ar2
  ny:=ar3
  }
if axes = y
  {
  nz:=ar1
  nx:=ar2
  ny:=value1+ar3
  }
if axes = xy
  {
  nz:=ar1
  nx:=value1+ar2
  ny:=value2+ar3
  }
if axes = zxy
  {
  nz:=value1+ar1
  nx:=value2+ar2
  ny:=value3+ar3
  }
if axes = EZ
return ar1
if axes = EX
return ar2
if axes = EY
return ar3
if axes = SX
{
nz:=ar1
nx:=value1
ny:=ar3
return % nz . "_" . nX . "_" . nY
}
if axes = SY
{
nz:=ar1
nx:=ar2
ny:=value1
return % nz . "_" . nX . "_" . nY
}

if axes = SZ
{
nz:=value1
nx:=ar2
ny:=ar3
return % nz . "_" . nX . "_" . nY
}

return % nz . "_" . nX . "_" . nY

}

;AGM is ASCII GAMING MAIN FUNCTION
AGM(varname,NewZ:="1",NewX:="0", NewY:="0")
{
global Previous, nx, ny, nz
nx:=0
ny:=0
nz:=NewZ
previous:=varname
StringSplit, ar, varname , _
nx:=newX+ar2
ny:=newY+ar3
return % nz . "_" . nX . "_" . nY
}

;f8::
;Drawtile(exitlevel, stair)
;return

checkwin(){
global
for i, r in datagrid1
   for  j, c in r
    if (c=Goal) {
       if (datagrid2[i,j]=redbarrel){
         continue
         }
         else {
            return true
            break, 1
        }
    }
}
return

ongoal(){
global
for i, r in datagrid1
   for  j, c in r
    if (c=3) {
       if (datagrid2[i,j]=barrel){
             Drawtile("2_" i "_" j, 13)
         }
     }
}


boxxlelevels:

level_1 := "####################!####################!####################!####################!####################!#########.##########!######### ##########!#########$ $.#######!#######. $@#########!##########$#########!##########.#########!####################!####################!####################!####################!####################!"
level_2 := "####################!####################!####################!#.#                #!#.#              # #!# #           $  # #!# #  $             #!# #      @       # #!# #              # #!# #           $  # #!# #  $           # #!#                #.#!#                #.#!####################!####################!####################!"
level_3 := "####################!####################!####################!##                ##!##         #      ##!##   #######      ##!##   *     # $    ##!##   #  . @# $    ##!##   ##    # $    ##!##    #    #      ##!##    #    #   ## ##!##    ###$##   # .##!##              ..##!####################!####################!####################!"
level_4 := "####################!####################!####################!####################!#######      #######!####### ####$#######!######    #  #######!###### $  $ @#######!###### $  #..#######!######    #..#######!######    ##########!######    ##########!####################!####################!####################!####################!"
level_5 := "####################!####################!####################!####################!#######@  ##########!####### $$##########!####### $ ###.######!######### ###.######!#########    .######!########   #  ######!########   #########!####################!####################!####################!####################!####################!"
level_6 := "####################!####################!####################!####################!####################!#######     ########!#######$###   ######!######@  $  $ ######!###### ..# $ #######!#######..#   #######!####################!####################!####################!####################!####################!####################!"
level_7 := "####################!####################!####################!####################!####################!######## @##########!######## $  ########!######### # ########!#######.# #  #######!#######.$  # #######!#######.   $ #######!####################!####################!####################!####################!####################!"
level_8 := "####################!####################!####################!####################!####################!####################!###### @ #    ######!##### $ ....$  #####!#####  $#### $ #####!#####   ####  ######!####################!####################!####################!####################!####################!####################!"
level_9 := "####################!####################!####################!####################!####################!#########  #########!########@$ #########!#########$ #########!######### $ ########!########.$  ########!########..*.########!####################!####################!####################!####################!####################!"
level_10 := "####################!####################!####################!####################!##########  ########!##########$ ########!#########.. ########!####### $.. ########!####### $# @########!####### $   ########!#######   ##########!####################!####################!####################!####################!####################!"
level_11 := "####################!####################!####################!####################!#######     ########!####   .### ########!#### # #    ########!#### # $ $#. #######!#### #  *  # #######!#### .#$ $ # #######!#####    # # #######!##### ###. @   #####!#####     ##   #####!####################!####################!####################!"
level_12 := "####################!####################!####################!#  ######   ###   .#!#  #    #$   $  ...#!# $# @     #####...#!#  #  ###$  #  #####!# $## ### $ # $ .###!#   # ###$     .####!#$ $# ### $ # .#####!#     ###$   .######!#.$#        ########!# .#        ########!####################!####################!####################!"
level_13 := "####################!####################!####################!####################!#####   ############!#####$  ############!#####  $############!###  $ $ ###########!### # ## ###########!#   # ## #####  ..##!# $  $          ..##!##### ### #@##  ..##!#####     ##########!####################!####################!####################!"
level_14 := "####################!####################!####################!####################!####################!#########  # @######!########   #  ######!########$ $ $ ######!######## $##  ######!######## $ # #######!######.....  #######!####################!####################!####################!####################!####################!"
level_15 := "####################!####################!####################!####################!##########     @####!########## $#$ #####!########## $  $#####!###########$ $ #####!########## $ # #####!##....  ## $  $  ###!###...    $  $   ###!##....  ############!####################!####################!####################!####################!"
level_16 := "####################!####################!####################!#####..  ####@######!#####..  ###   #####!#####..     $$ #####!#####..  # # $ #####!#####..### # $ #####!######## $ #$  #####!########  $# $ #####!######## $  $  #####!########  ##   #####!####################!####################!####################!####################!"
level_17 := "####################!####################!####################!###########   ######!##### # @## $$ #####!####    $      #####!####  $  ###   #####!###### #####$#######!#### $  ### ..######!#### $ $ $ ...######!####    ###...######!#### $$ ###...######!####  ##############!####################!####################!####################!"
level_18 := "####################!####################!####################!####################!####################!######    @ ########!###### $..  ########!########..#  #######!#########$$$ #######!#########    #######!####################!####################!####################!####################!####################!####################!"
level_19 := "####################!####################!####################!######.#      ######!#####..# $  $ #  ###!####...# ## $ #  ###!####.....  #$$   ###!#####....$    #$ ###!####### #######  ###!####   $        ####!####  $ #  $# $ ####!#### $### $ # $$ ###!####   @#  ##    ###!####################!####################!####################!"
level_20 := "####################!####################!####################!####################!####################!#######  ###########!#######@   #########!####### #$  .#######!####### $ $..#######!####### $ .#########!#######  ###########!####################!####################!####################!####################!####################!"
level_21 := "####################!####################!####################!####################!###.#.#.#.#.#.#.#.##!##.$ $ $ $ $ $    ##!### # # # # # # # ##!##.$     $       $##!### # # # # # # # ##!##.        $   $  ##!### # # # # # # # ##!##.          $   @##!####################!####################!####################!####################!"
level_22 := "####################!####################!####################!#####       ########!#####  $   $########!########    ########!######## $  ########!########   $ #######!#####.. $ ## #######!#####..  $##    ####!#####..    $    ####!#####.###$### #@####!#####.###     ######!####################!####################!####################!"
level_23 := "####################!####################!####################!####################!######   @ #########!###### $ # #########!####### $#$...######!######   $ ...######!###### ## $ ########!######    $ ########!########    ########!####################!####################!####################!####################!####################!"
level_24 := "####################!####################!####################!#                ###!# $#   $ ##  $    ##!#    $###    # $$ ##!#.###     $ $ ##  ##!#...#  #  #    #$  #!#..##$$#### $  #   #!#...#      $ ##  ###!#...$  ###  #    # #!##..  $#  ##   ##@ #!###.#              #!####################!####################!####################!"
level_25 := "####################!####################!####################!#     #   #####    #!## $  #   ####  $  #!#### $$   #..#  #  #!#  $  $  ##..#### ##!# $   ###....   $$ #!#  #$#   ....# # $ #!# #  # $ ..###$#   #!# #   $ #..#   ##  #!#   $#  ####   # $##!# #  #    @#      ##!####################!####################!####################!"
level_26 := "####################!####################!####################!#   #    #   #   #@#!# $      $   $   # #!## ###..## ###     #!#   #....#$#  $### #!# $ #....#  $  $ $ #!#   #....# # # $ $ #!#   ##..##   #$#   #!##$##    ##  #  #$##!#   $  $     #  #  #!#   #    #   #     #!####################!####################!####################!"
level_27 := "####################!####################!####################!####################!####..  #     ######!####..  # $  $  ####!####..  #$####  ####!####..    @ ##  ####!####..  # #  $ #####!######### ##$ $ ####!###### $  $ $ $ ####!######    #     ####!####################!####################!####################!####################!"
level_28 := "####################!####################!####################!#  #  ##    #   @###!##    $    # $###  #!##$# $ ##$# $ $    #!#   $#    $      ###!# ##   $ ###  #....#!# # $# # # # #....##!#    $ $ #  #....###!##$ ###  $ #....####!#  # $        ######!#      # #    ######!####################!####################!####################!"
level_29 := "####################!####################!####################!#@     ###   #  #  #!# # #  #  $  $     #!#####     # $ $#$# #!#.#..#    ##$ $    #!#.....    $   #   ##!#.....    ###$##$###!#.#..#    $    #   #!#####     #  #$  $ #!#####  #  $    $ $ #!#####  #  #  #  #  #!####################!####################!####################!"
level_30 := "####################!####################!####################!##...   ## #    #  #!#....         $ ## #!#....# # #$###$    #!#...#    #       # #!##.#  #$ #     $## #!#  #  # $ $ ###  $ #!#     $  $ #  # ## #!## # ## #$$# $#  # #!#  #   $ $ #      ##!#    #     #  #   @#!####################!####################!####################!"
level_31 := "####################!####################!####################!#   #  #@# ##  #####!# # #  $    $  #####!# #    ###### $  ###!#   #  #....#  $$  #!##$##$##....#      #!#      #....##$##$##!#  $$  #....#      #!# $  $  #  #  ###  #!#####  $   $    $  #!##### #    #  #   ##!####################!####################!####################!"
level_32 := "####################!####################!####################!#     ###..###     #!# $$  ###..###  $@ #!#  # ##......#  $  #!#     #......#  $  #!####  ###..######$ #!#   $$$ #..#    #  #!# $#   $  $  $$ #$ #!#  #  ## $  ##  #  #!# $    $ ## $    $ #!#  #  ##    ##  #  #!####################!####################!####################!"
level_33 := "####################!####################!####################!#    #  # #  #  #  #!# @# # ## $   $   ##!#### #    #  # $   #!#    # ## #$ ## ## #!#      $   $   $   #!#..###$$## $##$ ## #!#..#.#  # $   $ #  #!#....# $$   ##$ ####!#....#  #####      #!#...###            #!####################!####################!####################!"
level_34 := "####################!####################!####################!#....#       #  #  #!#....# # $  $      #!#.... ##  $# # $#$ #!#...#   $   $#  $  #!#..####  # $   $$  #!#      #### #### ###!#        #   #     #!# ##   #   $ # $ $ #!# ##    $ ## $  $  #!#     @#     #   # #!####################!####################!####################!"
level_35 := "####################!####################!####################!#....###           #!#....##### #  #$# ##!#....###   #$  $   #!#....###    $  #$$##!##  #### $#  #$ $  #!##  ####  $  $  #  #!#@  ####$###$## $  #!##        #  #  $  #!##   ###  #  $  ####!########  #  #     #!####################!####################!####################!"
level_36 := "####################!####################!####################!#     #     @#...###!#     #      ##...##!# # # ##$## ## ....#!#   $ #   $$$  ....#!###$### $$  ### ##.#!#     $  #    # ####!#  $  #  ###  # #  #!## #$##    $  $$   #!#   $ ##   #  # #  #!#     #    #  #    #!####################!####################!####################!"
level_37 := "####################!####################!####################!#     #  #...#@    #!# #       ....#    #!#  $  #   #....#   #!# ##$#### ##....#  #!# $   $  #  #...#  #!# $$ #   #   # $$  #!###  $$$#   $$  $  #!# $  #  #    # $#  #!#   $#  #       $  #!#  #    #    #  #  #!####################!####################!####################!"
level_38 := "####################!####################!####################!#@     #   #       #!## ### ##  #### # ##!#    # #  $$       #!#  # # # $ # $ ## ##!#     $ #  #$$ #   #!#  ###  #      ## ##!#..#.# $ #  $ #    #!#..#.#  $ # ## $$  #!#....##   $$  $  # #!#.....##        #  #!####################!####################!####################!"
level_39 := "####################!####################!####################!#####@###.##...##  #!#####$  ..#...#    #!####    ......#  $ #!###  $ #.....## # ##!##  $$# #####  $ $ #!## $# $    ##  $$  #!##  #  #    # $  $ #!##   $$ ### #$##   #!## $#      $ $  $ ##!###    #    #    ###!####################!####################!####################!"
level_40 := "####################!####################!####################!#  #      #   #   ##!# $# $ $ ##...$  $ #!#  $  # ##....# $  #!# ## $ ##....#   $ #!# $    #....## $   #!# $##  #...#       #!#   $$$##$##  ### ##!# # #  #   #  #    #!# $ #  $  ##       #!#    #    #@       #!####################!####################!####################!"
level_41 := "####################!####################!####################!#  #  # #    #  #  #!#   $      $ $     #!## #  #$###$##  ## #!#   $     $  #  $  #!# ###$##$#   # $   #!# #   $ $  ###### $#!# $  $$ $  #@#.#...#!# #     #  # #.#...#!# ########## #.....#!#            #.....#!####################!####################!####################!"
level_42 := "####################!####################!####################!#  #     #  ##    ##!# $#   $ #     ##  #!# $  $  #..#     $ #!# $ $  #....#   # ##!# $#  #......### $ #!#   #  #....#  #$  #!# $  ####..#   #   #!## $   ## # # $  $##!### $    $#@$ $#   #!####   #       #   #!####################!####################!####################!"
level_43 := "####################!####################!####################!#  $   ....#    ####!#      ....        #!# # ##########     #!# #$   #      ###..#!#  $   #$$###   #..#!# $ ### $       #..#!# $ #   $ $ #  ##..#!#  #  $$ # $ ##   ##!#@## $#  $  $     ##!##       ##      ###!####################!####################!####################!"
level_44 := "####################!####################!####################!#        #   #@ #  #!# $$  #$$# # #  ## #!#  # $ $ #$$ #     #!## #  #  # # #  #  #!#   ##       #     #!#   # $ #   #   #  #!# $ #$ #   #  $ #..#!##$ #  ####    #...#!#  $          #....#!#   #  #     #.....#!####################!####################!####################!"
level_45 := "####################!####################!####################!#     #   #####    #!## $  #   ####  $  #!#### $$   #..#  #  #!#  $  $  ##..#### ##!# $   ###....   $$ #!#  #$#   ....# # $ #!# #  # $ ..###$#   #!# #   $ #..#   ##  #!#   $#  ####   # $##!# #  #    @#      ##!####################!####################!####################!"
level_46 := "####################!####################!####################!#   #   #    #   #@#!#   $  $     # $ # #!##$# $### #    $$# #!#  #  #.###  #$ $  #!#  #$#....#  # ### #!# $  #.....##    # #!##$  #.#....#$$ $  #!#  ######..## #  # #!#  $         $ ### #!#   #   #        # #!####################!####################!####################!"
level_47 := "####################!####################!####################!# # # #   #@##   # #!#             $    #!#  ##$# ##### $ # ##!##    ##.....#  #  #!##$##$#.....###$#$ #!#   # ##.....#  # ##!#  $    ##..##  #  #!# $ #   $   $  $$$ #!## $  $# #  #  $   #!#   ##   #  #      #!####################!####################!####################!"
level_48 := "####################!####################!####################!########         ###!########    $ $  ###!######## $ ##### ###!#    ##### $  ##$###!#       $ $      ###!#          ## ## ###!#    ##@##### ## ###!#    ######## ## ###!#....######## $   ##!#....########     ##!####################!####################!####################!"
level_49 := "####################!####################!####################!#           ########!# ### $$    ########!#   # $  $  ########!#  $####$###########!# $ ##        ######!#  $$ $        ...##!### ## $$#     ...##!### ##   #     ...##!###      #     ...##!#####@##############!####################!####################!####################!"
level_50 := "####################!####################!####################!###     ############!###     #    #  ####!### $   #   $ $  ###!###  $  #  $ ##  ###!### $$  ##$ $    ###!#### #  ## #########!#### #  ##    ...###!###  #$       ...###!###   $$      ...###!###     ##@#  ...###!####################!####################!####################!"
level_51 := "####################!####################!####################!# #     #          #!#       $  ## ### ##!#####  ##   $  $   #!##..##  # # $ # #  #!#....  $     ##$# ##!#....  $#####   #$##!##..# #  #   #  $  #!###.# #  $   $  # @#!##  $  $ #   #  ####!##       ###########!####################!####################!####################!"
level_52 := "####################!####################!####################!####################!####################!########  @#########!######  $. #########!######  .$. ########!######## *$ ########!########   #########!####################!####################!####################!####################!####################!####################!"
level_53 := "####################!####################!####################!############ @######!######     $  ######!######   $## $######!#######$#...# ######!####### $...  ######!####### #. .# ######!#######   # #$ #####!#######$  $    #####!#######  ###########!####################!####################!####################!####################!"
level_54 := "####################!####################!####################!####  #  ###########!####  #  #...#######!###  $#  #...  #####!### $ #$$ ...  #####!###  $#  #... .#####!###   # $###########!####$       $ $ ####!####  #  $$ #   ####!#########  ##$$@####!#########      #####!####################!####################!####################!"
level_55 := "####################!####################!####################!####################!########   #. ######!########  $...######!#######  $ #*.######!####### ##$# #######!######   $  $ ######!######   #    ######!############@ ######!####################!####################!####################!####################!####################!"
level_56 := "####################!####################!####################!####################!####################!#######  #  ########!####### $ $ ########!####### .*. ########!########...#########!######  $$$ ########!######   @  ########!####################!####################!####################!####################!####################!"
level_57 := "####################!####################!####################!###########  #######!###  $      $ ######!##   ## ##   ##...##!## #$$ $ $$#$##...##!## #   @   #   ...##!##  $# ###$$   ...##!## $  $$  $ ##....##!####$       ########!####  ##############!####################!####################!####################!####################!"
level_58 := "####################!####################!####################!#    @##      #   ##!#    ##    $    $ ##!#  ###....# # #  ###!#   #....# # # $   #!### #...#  #       #!##  ##.#     $   $ #!##  $ $ ###  # # ###!## $       # # $   #!#### $  $# # # # $ #!####         # #  ##!####################!####################!####################!"
level_59 := "####################!####################!####################!####################!####################!####################!#########    #######!#######. $## #######!######..$ $  @######!######.. $ $ #######!###########  #######!####################!####################!####################!####################!####################!"
level_60 := "####################!####################!####################!#  ##########     @#!# $#    #     ######!#      ####   #  ###!#####         #  ###!#   $         #  ###!#  $####  #   #    #!# # #  #..#$###  # #!# # #$ #..#  $  $$ #!#      #..#  #   # #!#   #  #..#  #   # #!####################!####################!####################!"
level_61 := "####################!####################!####################!####################!###########.########!######.  $  ########!####### ###$########!#######$### ########!####### @ $ .#######!#######.############!####################!####################!####################!####################!####################!####################!"
level_62 := "####################!#                  #!#                  #!#$# ############ # #!# # ############ # #!#.# ############ # #!# # ###. $ ##### # #!# # ###### ##### # #!# # ######@ #### # #!# # ####### #### # #!# # ####### #### #.#!# # ####### #### # #!# # #######$#### #$#!#        $   .     #!#          .       #!####################!"
level_63 := "####################!####################!####################!####################!####################!####            ####!####  ########  ####!####  #      #  ####!####  #   @  #  ####!#### ##      #  ####!####  #      ## ####!####. $      $ .####!####################!####################!####################!####################!"
level_64 := "####################!####################!####################!####################!####################!######.$    $.######!###### # #$ # ######!###### # #. # ######!###### # @# # ######!###### # $# # ######!######.$    $.######!####################!####################!####################!####################!####################!"
level_65 := "####################!####################!####################!###     ##@#  ...###!###   $$      ...###!###  #$       ...###!#### #  ##    ...###!#### #  ## #########!### $$  ##$ $    ###!###  $  #  $ ##  ###!### $   #   $ $  ###!###     #    #  ####!###     ############!####################!####################!####################!"
level_66 := "####################!####################!####################!####################!###    #############!### ## ###  ########!### #...     $    ##!### ##.## # ##    ##!###  ...# # $  $$###!### #...# #$$$   ###!### # # # # $  $$###!###       # @#   ###!####################!####################!####################!####################!"
level_67 := "####################!####################!########         ###!########    $ $  ###!######## $ ##### ###!#    ##### $  ##$###!#       $ $      ###!#                ###!#          ## ## ###!#    ##@##### ## ###!#    ######## ## ###!#....######## $   ##!#....########     ##!####################!####################!####################!"
level_68 := "####################!####################!####################!#####.###     ######!#####.###$### #@####!#####..    $    ####!#####..  $##    ####!#####.. $ ## #######!########   $ #######!######## $  ########!########    ########!#####  $   $########!#####       ########!####################!####################!####################!"
level_69 := "####################!####################!####################!############  ######!####  $ $     ..####!####   $ ##   ..####!####   $ ##   ..####!####    $##   ..####!####     ##   ..####!###### #############!##### $###@###  ####!#####  $      $ ####!##### $ ####  $ ####!#####   ####    ####!####################!####################!"
level_70 := "####################!####################!####################!#    #    ##########!#  $ #    ##########!# $  #    ##########!#  $ #  $ ##########!##   $  $ ##########!## ###  $ ##########!## $ ###$###########!# $$ #          ...#!# $  #          ...#!#    #          ...#!###@##          ...#!####################!####################!"
level_71 := "####################!####################!####################!#############@######!#...     #      ####!#...     #   ## ####!#...     #$$ ## ####!#...        $ $$  ##!#####        ## $ ##!##########$####$  ##!#######  $  $ #   ##!#######    $$ ### ##!#######           ##!####################!####################!####################!"
level_72 := "####################!#   #######        #!# # ####### $ # #  #!# #..        ##  $ #!# #.########  #  $ #!# #.# $      $###$ #!#     ##### $ #    #!###.#### ##  $@$   #!## ...#   # $$$#  ##!##....    #  $ #####!##.####  ####    ###!##..  #     #### ###!####  #####      ###!# $  $   #   #######!#      #    ########!####################!"
level_73 := "####################!#..#    #          #!#.$  $  #$$  $## $##!#.$#  ###  ## ##   #!#  # $ #  $$   $   #!# ###  # #  #$  ####!#  ## # $   #@ #   #!# $    $  ##.##  $ #!#  # $# $# $     ###!#  #  #  #   ###   #!#  ######## #      #!#           #  #.#.#!##$########$#   ...#!#    .*  #    ##.#.#!# .*...*   $  .....#!####################!"
level_74 := "####################!####################!####################!#   ################!#   #        #######!# $$    $ $  #######!# $ ## ##### #######!# $ ##$#   $$#######!#  $## # ### #######!#    $ $ ### #######!#   ##        ....##!######        ....##!######        ....##!#######@############!####################!####################!"
level_75 := "####################!####################!####################!##########  #    ###!##########  $$   ###!##########  $  #####!###...  ## ## ##@###!###...  ##$  $    ##!###...    $$ $$   ##!###...  ## $   $  ##!########## #### ####!##########     $ ###!########## ##    ###!##########    ######!####################!####################!"
level_76 := "####################!##........##########!##...#### #  #######!##...#  ###    $ ###!##...$$     $ $  ###!##  .#  $ $# $  ####!##...# #$#   $  ####!##.# # $   $    ####!##.  #$###$####$####!###  #   $ $    ####!###  #  $@$  #  ####!###  # #### $  $####!###  #    ###   ####!###  # $$ ##########!###  #    ##########!####################!"
level_77 := "####################!####################!###  ##   ###     ##!###   $   ### ### ##!###   $   ### $ # ##!### $##      $$   ##!###  ##   ####    ##!#### ############@##!### $#####    ..####!###   ####    ..####!###  $$       ..####!### $ ####    ..####!###   ####    ..####!####################!####################!####################!"
level_78 := "####################!####################!###         #....###!###    $     ....###!####### ##  #....###!###    $ # ###   ###!###  ##    #     ###!#### #  $# # #######!#### # $ $ # #   ###!#### #  $  #     ###!#### #$######## ####!#### $@$ $    $  ###!####  $    ###   ###!#######   ##########!####################!####################!"
level_79 := "####################!####################!#########   #     ##!#########     $ $ ##!##   ##### $## # ###!## $ ##   # ## $  ##!## $  @$$ # ##$$$ ##!### ###   # ##    ##!### #   ### #####$##!### #     $  #....##!##  ### ## $ #....##!## $   $ #   #..$. #!##  ## $ #  ##.... #!######   ######...##!####################!####################!"
level_80 := "####################!####################!####################!#     #      #...###!#     #  @   ##...##!# # # ##$## ## ....#!#   $ #   $$$  ....#!###$### $$  ### ##.#!#     $  #    # ####!#  $  #  ###  # #  #!## #$##    $  $$   #!#   $ ##   #  # #  #!#     #    #  #    #!####################!####################!####################!"
level_81 := "####################!####        ########!#### ###### #  #####!#### # $ $ $  $ ####!####       #$   ####!######$  $$#  ######!######  ## # $######!#######$#   $ @#####!#######  $ $ #######!####### #   $  #####!####### ##   # #####!#######  ##### #####!######         #####!######.......#######!######.......#######!####################!"
level_82 := "####################!#####  #####  ######!#####   $@$   ######!#####$ $ $ $ $######!##### $ $ $ $ ######!#### $ $ $ $ $ #####!####           #####!######### ##########!########   #########!########   #########!######*.*.*.*#######!######.*.*.*.#######!######*.*.*.*#######!######.*.*.*.#######!######*.*#*.*#######!####################!"
level_83 := "####################!####################!####################!# #     #          #!#       $  ## ### ##!#####  ##   $  $   #!##..##  # # $ # #  #!#....  $     ##$# ##!#....  $#####   #$##!##..# #  #   #  $  #!###.# #  $   $  # @#!##  $  $ #   #  ####!##       ###########!####################!####################!####################!"
level_84 := "####################!####################!####################!#     ###..###     #!# $$  ###..###  $@ #!#  # ##......#  $  #!#     #......#  $  #!####  ###..######$ #!#   $$$ #..#    #  #!# $#   $  $  $$ #$ #!#  #  ## $  ##  #  #!# $    $ ## $    $ #!#  #  ##    ##  #  #!####################!####################!####################!"
level_85 := "####################!###    ###    ######!### ## ### $  ######!## $$     $$  ######!##  $ ## ## # ######!## # $ $    # #   ##!## $  $  # ## #   ##!##  # #$   ## #    #!##### #  #### # ## #!###  $ $##  #      #!### $ $     # # ####!### ## ###  #  ....#!##   # ###   # ....#!##   $$#   @  .....#!##   #    # ###....#!####################!"
level_86 := "####################!####################!####################!#  #    #    #  #  #!#   $#  #       $  #!# $  #  #    # $#  #!###  $$$#   $$  $  #!# $$ #   #   # $$  #!# $   $  #  #...#  #!# ##$#### ##....#  #!#  $  #   #....#   #!# #       ....#  @ #!#     #  #...#     #!####################!####################!####################!"
level_87 := "####################!####################!####################!#   #  #..#  #   # #!#      #..#  #   # #!# # #$ #..#  $  $$ #!# # #  #..#$###  # #!#  $####  #   #    #!#   $         #  ###!#####         #  ###!#      ####   #  ###!# $#    #     ######!#  ##########     @#!####################!####################!####################!"
level_88 := "####################!###  ###############!## $  ##############!##    # ...........#!###$ $# .####### #.#!###   ## ####### #.#!##@$$$            .#!##    ## ########  #!###### $$   ########!#### $    $ ########!#### $  $$ #########!####  $$  ##########!####     ###########!#####   ############!####################!####################!"
level_89 := "####################!####################!####################!#  ##        ###...#!#      #####  #....#!#### $##   $$ #....#!#  # $   $ #  #.#..#!# ## $##$ ##$$###..#!#   $   $   $      #!# ## ## $# ## #    #!#   $ #  #    # ####!##   $   $ ## # #@ #!#  #  #  # #  #    #!####################!####################!####################!"
level_90 := "####################!####################!####################!#        #   #  #@ #!# $$  #$$# # #  ## #!#  # $ $ #$$ #     #!## #  #  # # #  #  #!#   ##       #     #!#   # $ #   #   #  #!# $ #$ #   #  $ #..#!##$ #  ####    #...#!#  $          #....#!#   #  #     #.....#!####################!####################!####################!"
level_91 := "####################!####################!########  ##########!#######   ##########!###### $$ ##########!##### $  $##########!####   $    ########!####  ##### #  #####!#### $....# #    ###!#### #.... $   # ###!#### #..*.# # $  ###!#### ### ####  #####!####$##  $@ ########!###     $ ##########!###   ##  ##########!####################!"
level_92 := "####################!####################!####################!##### #    #  #   ##!#####  $   $    $  #!# $  $  #  #  ###  #!#  $$  #....#      #!#      #....##$##$##!##$##$##....#      #!#   #  #....#  $$  #!# #    ###### $  ###!# # #  $    $  #####!#   #  # #@##  #####!####################!####################!####################!"
level_93 := "####################!####################!####################!# #  #    @#      ##!#   $#  ####   # $##!# #   $ #..#   ##  #!# #  # $ ..###$#   #!#  #$#   ....# # $ #!# $   ###....   $$ #!#  $  $  ##..#### ##!#### $$   #..#  #  #!## $  #   ####  $  #!#     #   #####    #!####################!####################!####################!"
level_94 := "####################!#  #################!#  #   ..#......####!#  # # ##### ...####!##$#    ........####!#   ##$######  #####!# $ #     ######@ ##!##$ # $   ######  ##!#  $ #$$$##       ##!#      #    #$#$####!# #### #$$$$$    ###!# #    $     #   ###!# #   ##        ####!# ######$###### $ ##!#        ######   ##!####################!"
level_95 := "####################!####################!####################!#  #    # ##   ...##!# ## $         ....#!#    $###$# # #....#!# #       #    #...#!# ##$     # $#  #.##!# $  ### $ $ #  #  #!# ## #  # $  $     #!# #  #$ #$$# ## # ##!##      # $ $   #  #!#@   #  #     #    #!####################!####################!####################!"
level_96 := "####################!####################!####################!#....#       #  #  #!#....# # $  $      #!#.... ##  $# # $#$ #!#...#   $   $#  $  #!#..####  # $   $$  #!#      #### #### ###!#        #   #     #!# ##   #   $ # $ $ #!# ##    $ ## $  $  #!#     @#     #   # #!####################!####################!####################!"
level_97 := "####################!####################!####################!###.#              #!##..  $#  ##   ##@ #!#...$  ###  #    # #!#...#      $ ##  ###!#..##$$#### $  #   #!#...#  #  #    #$  #!#.###     $ $ ##  ##!#    $###    # $$ ##!# $#   $ ##  $    ##!#                ###!####################!####################!####################!"
level_98 := "####################!####################!####################!#@#   #   #    #   #!# #   $   $      $ #!#     ### ##..### ##!# ###$  #$#....#   #!# $ $  $  #....# $ #!# $ $ # # #....#   #!#   #$#   ##..##   #!##$#  #  ##    ##$##!#  #  #     $  $   #!#     #   #    #   #!####################!####################!####################!"
level_99 := "####################!####################!####################!#     ##      #   ##!# @  ##    $    $ ##!#  ###....# # #  ###!#   #....# # # $   #!### #...#  #       #!##  ##.#     $   $ #!##  $ $ ###  # # ###!## $       # # $   #!#### $  $# # # # $ #!####         # #  ##!####################!####################!####################!"
level_100 := "####################!####################!####################!#@     #   #       #!## ### ##  #### # ##!#    # #  $$       #!#  # # # $ # $ ## ##!#     $ #  #$$ #   #!#  ###  #      ## ##!#..#.# $ #  $ #    #!#..#.#  $ # ## $$  #!#....##   $$  $  # #!#.....##        #  #!####################!####################!####################!"
level_101 := "####################!####################!####################!#  #      #   #   ##!# $# $ $ ##...$  $ #!#  $  # ##....# $  #!# ## $ ##....#   $ #!# $    #....## $   #!# $##  #...#       #!#   $$$##$##  ### ##!# # #  #   #  #    #!# $ #  $  ##       #!#    #    #@       #!####################!####################!####################!"
level_102 := "####################!####################!####################!#@ #  # #    #  #  #!#   $      $ $     #!## #  #$###$##  ## #!#   $     $  #  $  #!# ###$##$#   # $   #!# #   $ $  ###### $#!# $  $$ $  ###.#...#!###     #  ###.#...#!##############.....#!##############.....#!####################!####################!####################!"
level_103 := "####################!#..........  .######!#..........$$.#  ###!###########$ #   ###!#      $  $  .  $ ##!#  #$##   #  $ #  ##!#      #   ##  # ###!#  $#  # ##  ### ###!# $ #$###    ### ###!###  $ #  #  ### ###!###    $ ## #  # ###!## $  #  $  $ $   ##!##  $  $#$$$  #   ##!##  #  $      ######!## @##  #  #  ######!####################!"
level_104 := "####################!####################!####################!##       ##   #  ###!#@## $#  $  $     ##!#  #  $$ # $ ##   ##!# $ #   $ $ #  ##..#!# $ ### $   $   #..#!#  $   #$$###   #..#!# #$   #      ###..#!# # ##########     #!#      ....        #!#      ....#    ####!####################!####################!####################!"
level_105 := "####################!########  ##########!########$     ######!######## ##  $ #####!######  $ # $ $@####!######$   ## #######!###### $ $#....#####!######$   #....#####!###### $$  ....#####!#####   $ # ...#####!#####  $ $##########!#######   ##########!######## $##########!########  ##########!####################!####################!"
level_106 := "####################!#####....   ########!#####.#.#  $ #######!#####....# # @######!#### ....#  #  #####!####     #$ ##$ ####!##### ###  $    ####!#####$  $ $ $#  ####!##### #  $ $ ## ####!#####  ###  ##  ####!#####    ## ## #####!#####  $ #  $  #####!#######$ $   #######!#######  ###########!####################!####################!"
level_107 := "####################!####################!#######      #######!##@   $ $ ##    ####!###$ $ $#$## ## ####!### $$  #...... ####!##   #  #......   ##!##  $  $#...... # ##!## $ #$$ ......$# ##!### $  $### ###   ##!### $  $  $  $  ####!### $  $  $  $  ####!########   #########!####################!####################!####################!"
level_108 := "####################!####################!##   ###############!## $  ##############!### # #       ######!### #   $#$#@  #   #!##  #      $ #   $ #!##  ### ######### ##!##  ## ..*..... # ##!### ## *.*..*.* # ##!## $## ####### ##$ #!##  $   $  $    $  #!##  #   #   #   #  #!####################!####################!####################!"
level_109 := "####################!####################!####################!#   #   #    #   # #!#   $  $     # $ # #!##$# $### #    $$# #!#  #  #.###  #$ $  #!#  #$#....#  # ### #!# $  #.....##    # #!##$  #.#....#$$ $  #!#  ######..## #  # #!#  $         $ ### #!#   #   #        #@#!####################!####################!####################!"
level_110 := "####################!####################!####################!#####@###.##...##  #!#####$  ..#...#    #!####    ......#  $ #!###  $ #.....## # ##!##  $$# #####  $ $ #!## $# $    ##  $$  #!##  #  #    # $  $ #!##   $$ ### #$##   #!## $#      $ $  $ ##!###    #    #    ###!####################!####################!####################!"
level_111 := "####################!####################!###############   ##!############### # ##!##########@$      ##!#####   ### $## $ ##!##### $    $ #### ##!##### $#  # ##### ##!##      $## ####  ##!## ## ## #  $  #$  #!## #...# #         #!##  ...  ###  ######!## #...# ###########!## # ### ###########!##       ###########!####################!"
level_112 := "####################!############...#####!############...#####!###########....#####!########......######!#####     ....#  ###!##### $###  ###  ###!#####  #  #$# $ $ ##!##### ##$  $    $ ##!##  $$$   # #  #  ##!##     $ $# ##$  ###!##  # $ $ #  $  $###!#####    $@$ #$  ###!#####    #  ##  ####!##############  ####!####################!"
level_113 := "####################!####################!####################!#      #  #   ##   #!#   $  #  # #$  $ ##!# $$$  $   $   # $ #!#  #  ##..##    $  #!## #  #.....## #   #!# $#$###.....#$##$##!#  #  #.....##    ##!## # $ ##### #$##  #!#    $             #!# #   ##@#   # # # #!####################!####################!####################!"
level_114 := "####################!####################!### ################!###  ######  #######!###   # $ $$ $ #####!###  $ @ $    $  ###!### $ # #$  $    ###!###  ## # ### ######!### ##    #  $  ####!#####... ## $ $ ####!####....##   $  ####!###....## $  $######!###...###  $  ######!###...###  #########!####################!####################!"
level_115 := "####################!###   ##############!### $ $ $  ####   ##!###  ## ## ##   $ ##!## $  $     $ $   ##!##     ## ##  $ ####!# $$##### ##### ####!#     ##@ #####$####!##  $ ###$###  $ ###!####  ###   #  $ ###!#### $$   # $ $$ ###!####  ##   #     ###!#######. ..#########!#####.........######!#####.........######!####################!"
level_116 := "####################!##......   #########!##......   #  ##   #!##..### $    $     #!##... $ $ #   ##   #!##...#$#####    #  #!####    #   #$  #$ #!####  $$ $ $  $##  #!####  $   #$#$ ##$ #!###### ## #    ##  #!#####  $ $ ## ######!#####    $  $  #####!######   # #   #####!##########@#########!####################!####################!"
level_117 := "####################!##########   #######!######## $$  #    ##!########   $ #$$$ ##!###  ###$ $ $# $  ##!###       #   $   ##!### ##### #  ###$ ##!#  .   ## $  $   ###!###.## ### ##### ###!#....  #  $ ## $  ##!#... # # $$ ## $  ##!#....  #$ $$      ##!#....##@ $  ##$$  ##!#....##     ##   ###!#....###############!####################!"
level_118 := "####################!######          ####!######  #  $$ $  ###!######$  $#  #  @###!###### #  # $ # ####!#####   $  $  # ####!#####   # $   # ####!#####  $ $      ####!#####     ##  $ ####!#####    ## $$# ####!#######$$   #   ####!##....#  ###########!##.#... ############!##....   ###########!##....   ###########!####################!"
level_119 := "####################!####################!####################!#           ###....#!## #$#  # #####....#!#   $  $#   ###....#!##$$#  $    ###....#!#  $ $#  #$ ####  ##!#  #  $  $  ####  ##!#  $ ##$###$####  @#!#  $  #  #        ##!####  $  #  ###   ##!#     #  #  ########!####################!####################!####################!"
level_120 := "####################!####################!####################!####################!####### @  #########!###### $##$    $ ###!#  $  $     $$ $ ###!# $##  # ### ##  ###!#    $ #    $   ####!##$## $##$#     ####!#  $ $  $ ##########!#  # #  #  #......##!#    #  $  #......##!# $# # ##$  .....###!##   #    #   ...###!####################!"
level_121 := "####################!####################!####################!####################!####################!######.     ########!######## $  ########!########    ########!######## @  ########!########  $ ########!########     .######!####################!####################!####################!####################!####################!"
level_122 := "####################!####################!####################!####################!######.      #######!######### ## #######!######      $ ######!######    @   ######!###### $      ######!####### ## #########!#######     . ######!####################!####################!####################!####################!####################!"
level_123 := "####################!####################!####################!####################!######. #      #####!######  #   #  #####!######* #     $#####!######    @    #####!######$     # *#####!######  #   #  #####!######      # .#####!####################!####################!####################!####################!####################!"
level_124 := "####################!####################!####################!####################!####################!########@  #########!######## $$#########!########.$. .#######!##########   #######!##########   #######!####################!####################!####################!####################!####################!####################!"
level_125 := "####################!####################!####################!#######       ######!#######  ###  ######!#######  . .  ######!#######   .   ######!#########   ########!######### # ########!#########$$$########!######### @ ########!####################!####################!####################!####################!####################!"
level_126 := "####################!####################!####################!####################!####################!######      ########!###### .# #. #######!######  # .  #######!###### $$$   #######!######   @  ########!####################!####################!####################!####################!####################!####################!"
level_127 := "####################!####################!####################!###### $@*. . ######!###### $##$ # ######!######        ######!######## $# ########!########. # ########!########    ########!########    ########!####################!####################!####################!####################!####################!####################!"
level_128 := "####################!####################!####################!####################!######  # .$ #######!######    ## #######!######     $@#######!####### # $ ########!#######.# # ########!#######.    ########!#######   ##########!####################!####################!####################!####################!####################!"
level_129 := "####################!####################!####################!####################!####################!######         #####!######  $$@$$  #####!###### ....... #####!######         #####!###### #$#$#$# #####!######         #####!####################!####################!####################!####################!####################!"
level_130 := "####################!####################!####################!####################!####################!####### ############!######  .  #########!######  #  $ #######!###### .# ## #######!####### $$ . #######!#######  @   #######!####################!####################!####################!####################!####################!"
level_131 := "####################!####################!####################!####################!####################!###### .   . #######!###### #  ## #######!###### $$  # #######!######@$   . #######!##########   #######!####################!####################!####################!####################!####################!####################!"
level_132 := "####################!####################!####################!####################!######      @  #####!######   .#$$$ #####!######       $ #####!######   ### . #####!###### # #*# # #####!###### . ###   #####!######         #####!######    #.   #####!######         #####!####################!####################!####################!"
level_133 := "####################!####################!####################!####################!####################!#######. ##  #######!#######  ##$ #######!#######  # . #######!#######    # #######!#######$## $ #######!#######@$..* #######!####################!####################!####################!####################!####################!"
level_134 := "####################!####################!####################!#######  ###########!######           ###!##.. ##   ## ##   ##!##.. ##$#$$ $@$$# ##!##..    #       # ##!##..      ###$# $ ##!##..  ##$$        ##!########        ####!##############  ####!####################!####################!####################!####################!"
level_135 := "####################!####################!####################!####################!####################!#########  @########!#########$# ########!#######  .$ ########!#######   .#########!####### $  #########!#######.  ##########!####################!####################!####################!####################!####################!"
level_136 := "####################!####################!#######    #########!####### $  #########!#########  #########!######### ##########!#########   ########!########  $ ########!########    ########!#########$$#########!########@$  ########!########$.. ########!########....########!####################!####################!####################!"
level_137 := "####################!####################!####################!####################!######## $.   ######!######## ##$ .######!########  # #.######!########  # # ######!######        ######!#####   #$##$ ######!#####  ##@..$ ######!####################!####################!####################!####################!####################!"
level_138 := "####################!####################!####################!####################!######   ..   ######!###### #    #$######!######   ##$# ######!###### # ##   ######!######.# $  #.######!######.$ ##   ######!######$ ####  ######!######@###### ######!####################!####################!####################!####################!"
level_139 := "####################!####################!####################!##########@  #######!##########$$$#######!########## # #######!#######    # #######!###### $#  . #######!######* ## # #######!######.  # # #######!#######    ..#######!####################!####################!####################!####################!####################!"
level_140 := "####################!####################!#####         ######!##### #$ *#  #######!#####   $@* ########!#####   .$ #########!##### .   ##########!##### #. ###########!#####   ############!#####  #############!##### ##############!####################!####################!####################!####################!####################!"
level_141 := "####################!####################!####################!####################!####################!########      ######!###### .$ .*$ ######!###### @ ##   ######!######  .. $$ ######!######      ########!####################!####################!####################!####################!####################!####################!"
level_142 := "####################!####################!####################!####################!####################!######  ..  ########!######  ##. ########!###### $# * ########!###### $  $@########!#######    #########!####################!####################!####################!####################!####################!####################!"
level_143 := "####################!####################!####################!####################!####################!#######      #######!####### #$   #######!####### $ @#.#######!########$#.  #######!########    .#######!####################!####################!####################!####################!####################!####################!"
level_144 := "####################!####################!####################!####################!####################!########@*..  ######!###### #  # #.######!######  $$  # ######!######    $   ######!########## #  ######!####################!####################!####################!####################!####################!####################!"
level_145 := "####################!####################!####################!####################!####################!#######   ##########!#######    #########!####### # $@########!#######  $#$ #######!######## . . #######!########  #.########!####################!####################!####################!####################!####################!"
level_146 := "####################!####################!####################!####################!####################!######    #   ######!###### ##*.## ######!###### . #  * ######!######  *@$*$ ######!######        ######!####################!####################!####################!####################!####################!####################!"
level_147 := "####################!####################!########.$ #########!########   #########!######### ##########!########   #########!###  ## ...@  # .###!###$    # # #   $###!###. ## $ $ $ #  ###!##########  ########!########## #########!########## #########!#########   ########!######### $.########!####################!####################!"
level_148 := "####################!####################!####################!####################!####### @   ########!####### $#. ########!#######   $ ########!#######  # #########!#######  #.#########!#######   $#########!#######  . #########!####################!####################!####################!####################!####################!"
level_149 := "####################!####################!####################!####################!####################!########   @ #######!####### $ *$ #######!####### $ #  #######!#######  ##  #######!####### ... ########!####################!####################!####################!####################!####################!####################!"
level_150 := "####################!####################!####################!####################!####################!#######. .##########!#######.# $ ########!#######     ########!####### $#$ ########!########  @#########!####################!####################!####################!####################!####################!####################!"
level_151 := "####################!#      $.#         #!# ######## ####### #!# ######## ####### #!# ###         #### #!# ### #$### $ #### #!# ### #...$$ @#### #!# ### #...# $ #### #!# ### $...#$  #### #!# ######$## $ #### #!# ######      #### #!# ################ #!# ################ #!# ################ #!#                  #!####################!"
level_152 := "####################!####################!####################!####################!####################!#######  . #########!###### $$#  ########!######. $  .########!######  # # ########!####### .$@#########!####################!####################!####################!####################!####################!####################!"
level_153 := "####################!####################!####################!####################!####################!########   #########!#######   $ ########!#######.   *########!#######.#$# ########!#######  @  ########!####################!####################!####################!####################!####################!####################!"
level_154 := "####################!##############     #!##############. ##.#!#########      $  *#!#########  ### $#  #!#########  ###  #  #!#########  #########!#########  #########!####. @    #########!#  .$  #   #########!# #  ###           #!# $ $ .######   $# #!####   ######.#  $ #!#############  .#$##!#############.    # !################### !"
level_155 := "####################!####################!####################!####################!####################!###### ..  $@#######!######  #$## #######!#######   ##########!###### *# *. #######!######  $    #######!######  #   ########!####################!####################!####################!####################!####################!"
level_156 := "####################!####################!####################!####################!#########    #######!######### .$ #######!###########$ #######!#######    $.#######!#######  $# .#######!######### ##.#######!####### .$@# #######!#######      #######!####################!####################!####################!####################!"
level_157 := "####################!####################!####################!####################!####################!####################!######  .@$ .  #####!###### $# $ $  #####!###### .#. *## #####!###### .     $ #####!####################!####################!####################!####################!####################!####################!"
level_158 := "####################!####################!####################!####################!####################!###########  #######!#########  $ #######!####### @    #######!####### #.$$########!#######.  . ########!####################!####################!####################!####################!####################!####################!"
level_159 := "####################!####################!####################!####################!######       #######!######       #######!######### ## #######!#######   #  #######!#####  $#    #######!##### $ $$#...######!#####   $@#. .######!#######  ###########!####################!####################!####################!####################!"
level_160 := "####################!####################!####################!####################!####################!####### @###########!#######.$###########!#######  ###########!####### $.##########!####### $    #######!######## .   #######!####################!####################!####################!####################!####################!"
level_161 := "####################!####################!#####.......########!#####....####  #####!#######...#  $ #####!#######$  # #  #####!#######  $   $ #####!##### $ $  $ $ #####!##### # ## $$  #####!##### #$##$  $ #####!##### #    #########!#####   $###########!#######  ###########!######@  ###########!####################!####################!"
level_162 := "####################!####################!#########.....######!#########.....######!######@ #$..########!###### $#   ########!######  ##$#########!###### $$     ######!####### ## #$ ######!######  #  #  ######!###### $$ ##  ######!######   $##$ ######!###### $$    #######!######   #   #######!####################!####################!"
level_163 := "####################!####################!####################!#########   ########!########  $.*#######!#######.  .$. ######!######  $*$.$ ######!#####   *@*   ######!##### $.$*$  #######!##### .$.  .########!######*.$  #########!#######   ##########!####################!####################!####################!####################!"
level_164 := "####################!####################!####################!####################!#####           ####!##### #### #### ####!#####     #     ####!###  ..**$#$**..  ##!### #           # ##!###  #$#######$#  ##!####  . $ @ $ .  ###!####################!####################!####################!####################!####################!"
level_165 := "####################!####################!####################!####################!######## @  ########!########$$# ########!####### * #.########!#######   #.########!#######    .########!##########$.########!######### $ ########!#########   ########!####################!####################!####################!####################!"
level_166 := "####################!####################!####################!##########   #######!##########  @#######!######      *#######!######.#   #.#######!######     # #######!###### $  ## #######!######## $#  #######!########$ #  #######!########  .  #######!####################!####################!####################!####################!"
level_167 := "####################!####################!####################!####################!####################!#######... #########!####### @#$  #######!####### $ $  #######!#######   #  #######!####################!####################!####################!####################!####################!####################!####################!"
level_168 := "####################!####################!####################!####################!####################!#########  #########!#######  . . #######!####### #.$# #######!#######@$  $ #######!#########  #########!####################!####################!####################!####################!####################!####################!"
level_169 := "####################!####################!####################!####################!####################!###### Y..  ########!######  ##. ########!###### $# * ########!###### $  $@########!#######    #########!####################!####################!####################!####################!####################!####################!"
level_170 := "####################!#######. . .########!#######. . .########!####### .#. ########!#######.   .########!#######.....########!########$#$#########!####  $ $ $ $  #####!#### $ $ $ $ $ #####!####  $ $ $ $  #####!####     @     #####!######## # #########!####### $ $ ########!#######$.$.$########!#######. . .########!####################!"
level_171 := "####################!####################!####################!####################!####################!####################!#######@*  #########!#######$$$  ########!#######.  # ########!#######   ..########!####################!####################!####################!####################!####################!####################!"
level_172 := "####################!####################!####################!####################!#######   #  #######!####### $ #..#######!#######  $$..#######!#######@$ #..#######!#######  $$..#######!####### $ #  #######!#######  $##########!#######   ##########!####################!####################!####################!####################!"
level_173 := "####################!####################!####################!####################!##########  ########!######## . $########!#######  #.  #######!####### $  # #######!######## #.  #######!########@$  ########!########  ##########!####################!####################!####################!####################!####################!"
level_174 := "####################!####################!####################!####################!#######    ..#######!###### $ #   #######!######  $###.#######!######@*     #######!#########  $ #######!#########$  ########!######### .#########!####################!####################!####################!####################!####################!"
level_175 := "####################!####################!####################!####################!#######@$..#########!####### $$*  #######!######### $# #######!#########  . #######!######## $  ########!########  #.########!########  . ########!####################!####################!####################!####################!####################!"
level_176 := "####################!####################!####################!####################!####################!########    .#######!########.. $ #######!####### $$##########!#######   ##########!####### #@##########!#######   ##########!####################!####################!####################!####################!####################!"
level_177 := "####################!####################!################  ##!#######..#  $     ##!#######..#   $ $  ##!#######....$$#$# ###!#######....    $ ###!#### $.###*#########!#### $##  .#########!##  $ $  #.#########!##  $   $#.  #######!### @ $$$ .# #######!### $   $#.  #######!#######  ###########!####################!####################!"
level_178 := "####################!####################!####################!########  #  #######!########     #######!######  *$# *  #####!######   *.*$  #####!####### #.@.# ######!######  $*.*   #####!######  * #$*  #####!########     #######!########  #  #######!####################!####################!####################!####################!"
level_179 := "####################!##########  ########!######## $ $ #######!####### $  .$ ######!###### $.#. .$ #####!##### $.$. . .$ ####!#### $. .$.$.$.$ ###!### $.$.$.$.$.#@$###!###   . .   . .$  ##!####$ #.$.$.$.$.$ ##!#### $.$.$.$. .  ###!##### $. . .$.$ ####!###### $. .#.$ #####!####### $.  $ ######!######## $ $ #######!#########  #########!"
level_180 := "####################!####################!####################!####################!####################!####@$  $.. *.$ ####!#### $   *.$.*  ####!##### $ $.. *.$ ####!#####  $ *.$.*  ####!##### $ $.. *.$  ###!#####  $ *.$.*   ###!####################!####################!####################!####################!####################!"
return

extract_tiles:

01 :="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgAgMAAAAOFJJnAAAACVBMVEV3fnlqcWyBiIOsuk0QAAAAJklEQVQY02MIhQIEI2oVGCxFYixgAAIuZAYDGAwtBrovMH2KGRoAC+Y5HfX3uBIAAAAASUVORK5CYII="
02 :="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAaVBMVEWhoaFtbW3CwsKUlJSpqalGRkZpaWnExMTn5+esrKykpKRlZWVdXV2RkZG6urpLS0vJycm9vb2ZmZmWlpa0tLRwcHC/v7+cnJzi4uKLi4t/f391dXXW1taPj49ZWVk9PT3Q0NCFhYVSUlJG8PdqAAAAyElEQVQ4y7WS2Q6DIBBFB1QsUAFZ3Je2//+R9ckMNtQ0puftkpMZYAZuMd3U4WQsTIZGNDgoS8D4PE07aqAc0mSkgDq/KjRnLSi/XOH/QvlFEDYU4NssiZu3CsNIMCHgxJYVCMPIjSi/oMRQ3juFD3wPNJ7/4B94QfgAh/mTJlqQTIKI382o4eid8/34MbKmWKg+BZUQUIszocx/bHH9kuKsghAou1gQ+SZYh+bfM6ZUW+3ZPhcgGHaXIgtsz0FqKDBaayI1zusbvUAPDjfZlaMAAAAASUVORK5CYII="
03 :="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAGFBMVEWAjoVjdGsjLiswPTg3R0JMX1VXbGNAT0hiWm0fAAAATElEQVQoz2MgAigpKRkDgQsYGGMXAPLggGwBiIgxCGAVAIqAQSgI4BBQAvMFQQCXgFJ5eTl+gfK0tDTKBIyN0QScnVEFgG4eDAKEAABvSVUhkHq4BgAAAABJRU5ErkJggg=="
06 :="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAHlBMVEUAAABwAABUAAIAAACMAAKoAADEAAD//wD/AAD+//8MEF22AAAAAXRSTlMAQObYZgAAALJJREFUKM+NksENwyAMRZEi9f4DC+As4JSoPSOcDTJLzx2j49alkDqn5h2IeHoOEsI1UnIHBhE+iGXdyuVpghxyuL9MABGUhw1EcriZAOsGlF3MGmji9wkAIrqwEYARcxf+vCCKwEj0K9To3o6Qso8MoAa4Cc1Tmig2saDjSw0EQSqA8CfI+Brot9QAIrkvrJcDQ2A344D/KyZ3RUO6iP1/UEYVBAPpsRTNvgpLqg/BwO4NnCcsqnHHktMAAAAASUVORK5CYII="
07 :="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAPFBMVEUAAAAAAABwAABUAAKMAAKQkJD/qFT/gADEZAC0tLT/xIzg4OCoVACoAACMSAD/4MTEAAD/AAD//wD+//9DRHj9AAAAAXRSTlMAQObYZgAAASBJREFUOMt10o2SgjAMBGA3oY0UQfTe/11vk9xNB213tDjuN/yk3K4BcxvndXq/MBj3P+/T+32fiPNtOxaRxb8Ygdd9j34qdu8zYwGI6F+G4gH2XXwB3MFiLhIg4/QTQAhQyrptaymIU3wBFH7WlSuF6AdQApihFF8noB61AY2HGUCtZrViCjYcZsc2ABCCagesNQOMQgUXwKcwXqC2Vv2I63NiAQEMwPPJhf1lx+Bb/IhBFcSiARb0PsFaIivYp+h9ApRtKwjQBdgHEP0fNfuMA+RPBFD4DSTIgCAkQ0HDln1eN4EG4ACCqrfAwnTAwLdA8s+YhWTUgQYwIxAv0Ig7oGDACBMgR814kSBfw0yeTZnomWg7oPB0QJHRS+Bh/wtxFAmIq2JcwQAAAABJRU5ErkJggg=="
08 :="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAKlBMVEUAAABwAAAAAABUAAKMAAL/qFSQkJD/gAD/xIy0tLTg4OD/4MSoAACMSAA3i+TNAAAAAXRSTlMAQObYZgAAAONJREFUKM9V0LEOAUEQBmDZNxg8gJ1lHaK42ydw2VJ1yYVGs4VEK7moNBKhViiUColWq1V6KCNYM3+3X/7J7mztE4VYE2l7L0SNnw/fEoURQM4K3oMADe8044xyFAGIaFI2o07XeXAcFke0VIkzyoZyJWCTzErDZtSkKiR012cJyW5YFQT1H0y3VblMoZH9YHBLJhpyF28JNiwB8iwuZ+cHDcA+pH85AEEeoXekAq/YoOWHoCagRGhrEKBGVKdzg4Oms4lAWyA93DHAu8nMH1JI9hvjOHTKwqUu+0MdDV/fffOGFwpEMehnU7P3AAAAAElFTkSuQmCC"
09 :="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAPFBMVEUAAABwAAAAAABUAAKMAAL/qFSQkJDEZAD/xIz/gAC0tLSoAACoVADg4ODEAAD/4MT/AAD//wD+//+MSADOJxWtAAAAAXRSTlMAQObYZgAAANdJREFUOMt90tGugyAQhOHuICsLVdtz3v9dO2tqmhaW/8aL+QyRePsO3i0MWLxQ+NwYRbCLtzDMwGN3Mdn/njsfCMH+tJYYgj3tj7WBBYBvtqZ12yqiXQForRoCuyNDyYY7QV6RC1CmIJvlGcC/GX6BeL47sFI6kNIpYASWS+ERnTiPga0AjmNwUQ4Y1vMjFaO/QbwVVXW8f8C2IXqf4LzqAZAPgGoP5OoOCDAFIlh6kN77QsA6gXSREFA4AYHXAwpXB4AIOCnMQUK/i4vMAiCMgskQ/HaBF8TGBvfnTrgxAAAAAElFTkSuQmCC"
14 :="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgAgMAAAAOFJJnAAAACVBMVEUyTGg1UW4sQ1xHLJp8AAAAMklEQVQY02NYBQUIxtJQMIhCYgQwAAErMoMBDEhnsAagMwJY8TIwdZFpO6YvMH2KGRoAgEI9GTLd3iEAAAAASUVORK5CYII="
barrel:="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABSlBMVEUAAABTUFAjHRwuKikiHh1kZGQfGhkhGhktJSNpaWkxMDAkHBp4eHhgYGBycnEsJSRRUVEhHx9NTEwzLi1+f358fHxHRkZRUFBoZ2cyLCspIR9NTExpaGg4NzeOjYxeXV2KiopQT0+RkZCYl5ZCPz8cHBydnZxoaGhgYGAuLS14eHg3LSorIyFMPzolJCMuKyp4YFZyWlEcHBxCPz6bemqNcGNYRkA9My9KSEhBNjIxKCWCgH9dS0SRc2ZuWE8sJyUnIR6WdmiEaV6AZluJbGAzMC+JiIdVRD9IPTg8NzY3MzIiHx5GOTSenp2Tk5JlY2JiVE9pVExYT0tlUUghHBsXFxdxb22ffWxqaWgTEBB9fX12dnVfXl5cWllVVFNOTUxhTkdHREOOjo19ZVpNREJSRD5GOziZmZd6eXhvamhkX11sY2AICAd+cm6BgtSGAAAAK3RSTlMACekXN7Hrn+vYtYVYWDYwJ93c2tCxsa+QiWMz5+fW08m7rZN1dWNjQEAqHypdNQAAAqRJREFUOMuNk1dzm0AUhaXYktztuJf0nuwCC0ggOgIhqnqxrN5d8/9fswpS7GT8kG+YHWbOuZezl93IU35sbW1tb2/vRZ4junN09CaXy0mSdBiL7UT/1b+8y900u33Xojy22CgUDr/+ZYl+zN+wLiBsbg7BDzsF6TT6RP+Q73g8lmW5SmNUWXAbo5NHx06hzRMDVaVpZGZTWfwYyM61Lv4Y1vOTKW1kFSWVSSaTmfmiZO/yb5f6yvqIJWSaNo1UyjDGuA9CdLlyvb6yMGz2ChNVSSoZXHt5icsv5ysaDTcXERPutSSbWFeyarlcRTiEkho3WlYijLlaA8X8PY37mzJSMopaxa+oJPVhbTU0kLxwe32DW5gohZCZonGUhtSnxIUh4buOUCwUpJ8lA4dIKnTpvtnsaxAyid+GFzU8pGqlOMrncxgJ0+hRIoT+Qzw0+BRrj02nUum2W61Wu5NmLSgCSNavXoQGoHmdEhqYaOAQRCCIgBCAONfh0hBQ6eatjcYqR5dtjhcIACmsAyo0xDWBnw27zbvSwCkPpgSwKBLLdR1ooWGNcUHZZtP9NIZlLc33rx6udJySjC8MFqhmOZlgPYqiSKZe93UA5ymYsMM53kUFyYapEhgeAF2Y8RBgvXYeTlIkrU6JMA0kq3SVswPgBADqJOMvJrm7Bqh0sVlSq5yqljlOADyAGq6H8d3wd57xwGO7xW5lYsuy4/DAwjIDob65PDAHwCHcYRozZN15TobxNVF/uRJZ8MkT5KkwYy0qVElN00Wd+RxZsrLPBkTAyTMgCPj7IgCirpNhg5CL/bQLCG4aOAEhiFDEe7AOwoTLHu9fFScVFvB4DJpGkt7rjbD+kW+n7bbUuL3r9dI91jv7/tz13YvFYifHxxsbe9HI//MLLqOoHBWFZtMAAAAASUVORK5CYII="
barrel_red:="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABnlBMVEUAAAAtFxFhYV8yHxthYV8tFxFJR0c6KyhFQkJ5eXcdHRx5eXcdHRxpaWcwGRQbGBYwLSxDHRaVk5FtbWswFg+ioqBtbWtTUlE7ODeRj41+fXtKIRYtFxFYV1VFQkKUlJJ6enhmZmQ0MTC1cE+mXT+YSi8jIiFYKBVkLRhSJhQ4NjV8Nh90Mh03GhC4dFOfUzdEIhI9HRGKiYaEOiEdHRwxHhYtFw+DgoCwakyKRS2QRCkqKCc1JSFlOSmdnZuWl5VoaGatZUhuMRxpMBo0IBkWFhV8e3lubWxQTkyZUTiJQig8LCZcMyRQLyQnHRo+IxaJcWdHRENQQj6iWDyTSS88Jx04IBZMJhONd2xyYltbU09YTEdBPj5CNDJCLypILiZ5OyWPPiQuJCJ2OCBeKxZLIRWRj413dXNZWFZVVFJyV01jUkyIVkJ+SDNePC1/Pyg4KiU+JSBNKh1HJx0jGhckEgsOCQiioqCQioZ/dG98bWhkYF2AZlxrWlWbZ1KWXERmS0J8UEGcWT1UPDZzRjUwLi1RNSsZDQqFdW6LW0reKr2QAAAAI3RSTlMAVVU5qqpVVTmqqlVVOePGqqo5HBzj4+PjxsbGxqqqjo6OjqddB5cAAAK6SURBVDjLbZN1dxpBFMUpSSAuTeredZbNKgu7LO7uEkESIO7u3rT91h2yAdI2d8/ZP+b+3sy778xonmp8YGBAq9WOa55XX987juPMZvP77u7/3ZdfOPPi6XQpopTTAb+d+zr0j/9qYbm0HXUbgdzR7Rm//fVfxNAhV951kyTPhxGgLLlTcgR6nx5vT+PGcFiSs6EMDHQTklYdnzq+ljvGwjTscrksEARZoMlJyLLGmXUdwLFar8kIDTdFI01J1SmHtg1EFlZJGGqWT4Ji9e9a4ZQ24PUf3WWay5aQJEkwZAHo5XHA1PJ7qFt7kkdgOFuVXBZ4c5OGM+EVsyL2PAL9Oez88OwSglxZ0AGdQSDo4swfTFD9qj8xsuXBVuxc8WLtBoJAAOn3eWAxZWKUkYkH4IVojeHGq4DdfpRMFovFZNLvX4okqITv4IUKUKjBJtPuq6lfCw6Hg1s8TUcogjGhB9QjwOas0+vwZkgyRjc2Nu63mTrBECbU95N9BLz1RMp5XQXdkfKc0UjgHizhRX37TF4FBlGcuE85p9bkOTctkySBEbn5Zn3BOqjuIGzlSVs6uLw0E7XZojuKFfX5DkSGUgR1B33cqtToatQwO2swGH6gqODbF0WCEdE9FegaBilCchYJV8qVSs4r7mN1ggVdCsNd6qTGTCAFH6JpcGFIjwdjjDhB5VFhrzXqMcabct6tIwgvIzJP4gW8mUIwUS2gq4EpIMU1aeTnQEysgYEUwKfACao+4ETsIYXNZovt7M5bUSHuZcSPmpb0uwTpjnVSCIKJZdi9QU1bn2M4ifO18lYkosTjJqLAslS8X9NRbzCGEzXejeFgzGyhwLBi3Kp20CLeTN9iICEOPpbKi1bDW9XvEN+cJyczlUaDzc+XQCvf235H3d3g4QaczmBwdFTzvMDT1+l0ev3TtT/trapAD1uiwQAAAABJRU5ErkJggg=="
goal:=" iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAV1BMVEVhTTxYRDRmUkGdAAA+BSf+AgHfAADAAAD/W1j/Ly14BSdvBSf5AADzAADlAACwAACUAABYAABSAAD/xsb/Pz/CISL/Ih/XAACmAACTAACFAAB4AABkAACMPgk4AAAAa0lEQVQ4y9XTRw6AMAwEQINTIJ3Qy//fyQdwCOQCex7JsuyF6iY5oE4kH8BFngAg8legEHUKjM3A3UYD1fYNt5KRAHk7ceE7EqzWGCGRBlq4WWKgR8C+eAxHak0WI4Ov3+IFKP/q8maVt/sEcfYFF7Qkxh8AAAAASUVORK5CYII="
PRESS_ENTER_TO_START :="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"
Project_2D :="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"

congratulation:="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"

FileCreateDir, boxxeltiles

tileset=01,02,03,06,07,08,09,14,barrel,barrel_red,goal,PRESS_ENTER_TO_START,Project_2D,congratulation

loop, parse, tileset, "`,"
{
 if !fileexist(a_scriptdir . "\boxxeltiles\" . a_loopfield . ".png")
 extract_tile(%a_loopfield%,a_loopfield . ".png")
}

filemove, *.png, boxxeltiles\*.*

extract_tile(var,filename)
{
nBytes := Base64Dec(var, Bin )
File := FileOpen(filename, "w")
File.RawWrite(Bin, nBytes)
File.Close()
}

Base64Dec( ByRef B64, ByRef Bin ) {  ; By SKAN / 18-Aug-2017
Local Rqd := 0, BLen := StrLen(B64)                 ; CRYPT_STRING_BASE64 := 0x1
  DllCall( "Crypt32.dll\CryptStringToBinary", "Str",B64, "UInt",BLen, "UInt",0x1
         , "UInt",0, "UIntP",Rqd, "Int",0, "Int",0 )
  VarSetCapacity( Bin, 128 ), VarSetCapacity( Bin, 0 ),  VarSetCapacity( Bin, Rqd, 0 )
  DllCall( "Crypt32.dll\CryptStringToBinary", "Str",B64, "UInt",BLen, "UInt",0x1
         , "Ptr",&Bin, "UIntP",Rqd, "Int",0, "Int",0 )
Return Rqd
}

return
User avatar
joedf
Posts: 8937
Joined: 29 Sep 2013, 17:08
Location: Canada
Contact:

Re: [Game] AHKBAN a Boxxle (Sokoban) clone

19 Jun 2018, 10:03

Just saw this... Very nice! :+1:
Image Image Image Image Image
Windows 10 x64 Professional, Intel i5-8500, NVIDIA GTX 1060 6GB, 2x16GB Kingston FURY Beast - DDR4 3200 MHz | [About Me] | [About the AHK Foundation] | [Courses on AutoHotkey]
[ASPDM - StdLib Distribution] | [Qonsole - Quake-like console emulator] | [LibCon - Autohotkey Console Library]
User avatar
SpeedMaster
Posts: 494
Joined: 12 Nov 2016, 16:09

Re: [Game] AHKBAN a Boxxle (Sokoban) clone

20 Jun 2018, 06:27

TheDewd wrote:Just for fun, I modified your script to use levels from Bulldozer 1, Bulldozer 2, and Bulldozer 3.
Fantastic ! :D
I got new ideas. :angel: :idea: :idea:
I think i will move on to a new project. :geek:

Cheers
User avatar
Drachenbauer
Posts: 46
Joined: 06 May 2019, 08:37
Contact:

Re: [Game] AHKBAN a Boxxle (Sokoban) clone

08 May 2019, 11:59

The first sokoban-clone, i ever saw, where a solved level opens a staircase for the player to enter the next one.

Cool idea!

Return to “Gaming Scripts (v1)”

Who is online

Users browsing this forum: No registered users and 34 guests