cr34m3

KlotskiPuzzleMBMA

Mar 9th, 2014
76
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --[[ KlotskiPuzzle.lua
  2.     Klotski-style sliding puzzle for MBMA.
  3. --]]
  4.  
  5. solution = {{9, 0, 0,10},
  6.             {9,11,11,10},
  7.             {8,11,11, 6},
  8.             {8, 7, 7, 3},
  9.             {1, 5, 4, 2}}
  10. --initialise board (double index)
  11. board = {{9,11,11,10},
  12.          {9,11,11,10},
  13.          {8, 7, 7, 6},
  14.          {8, 5, 4, 3},
  15.          {1, 0, 0, 2}}
  16.  
  17. -- initialise pieces
  18. --          {     1         2       3      4         5    }
  19. -- tbl[x] = {CharObject, letter, height, width, TLposition}
  20. tblPieces = {}
  21. tblPieces[1]  = {getObject("Characters[KlotskiA]"), "A", 1, 1, 51}
  22. tblPieces[2]  = {getObject("Characters[KlotskiB]"), "B", 1, 1, 54}
  23. tblPieces[3]  = {getObject("Characters[KlotskiC]"), "C", 1, 1, 44}
  24. tblPieces[4]  = {getObject("Characters[KlotskiD]"), "D", 1, 1, 43}
  25. tblPieces[5]  = {getObject("Characters[KlotskiE]"), "E", 1, 1, 42}
  26. tblPieces[6]  = {getObject("Characters[KlotskiF]"), "F", 1, 1, 34}
  27. tblPieces[7]  = {getObject("Characters[KlotskiG]"), "G", 1, 2, 32}
  28. tblPieces[8]  = {getObject("Characters[KlotskiH]"), "H", 2, 1, 31}
  29. tblPieces[9]  = {getObject("Characters[KlotskiI]"), "I", 2, 1, 11}
  30. tblPieces[10] = {getObject("Characters[KlotskiJ]"), "J", 2, 1, 14}
  31. tblPieces[11] = {getObject("Characters[KlotskiK]"), "K", 2, 2, 12}
  32.  
  33. solved = getObject("Conditions[KlotskiPuzzleSolved]")
  34. MoreSteps = getObject("Conditions[AnotherStep]")
  35.  
  36. function ResetPuzzle()
  37.     ResetOutfits()
  38.     board = {{9,11,11,10},
  39.              {9,11,11,10},
  40.              {8, 7, 7, 6},
  41.              {8, 5, 4, 3},
  42.              {1, 0, 0, 2}}
  43.     tblPieces[1][5]  = 51
  44.     tblPieces[2][5]  = 54
  45.     tblPieces[3][5]  = 44
  46.     tblPieces[4][5]  = 43
  47.     tblPieces[5][5]  = 42
  48.     tblPieces[6][5]  = 34
  49.     tblPieces[7][5]  = 32
  50.     tblPieces[8][5]  = 31
  51.     tblPieces[9][5]  = 11
  52.     tblPieces[10][5] = 14
  53.     tblPieces[11][5] = 12
  54. end
  55.  
  56. function CheckSolution()
  57.     tmpsolved = false
  58.     runsolved = true
  59.     for r = 1,5 do
  60.         for c = 1,4 do
  61.             tmpsolved = board[r][c] == solution[r][c]
  62.             runsolved = runsolved and tmpsolved
  63.         end
  64.     end
  65.     if runsolved then
  66.         solved:setValue(VConditionValue, true)
  67.     end
  68. end
  69.  
  70. function ResetOutfits()
  71.     for x = 1,11 do
  72.         tblPieces[x][1]:setValue(VCharacterCurrentOutfit,
  73.           getObject("Characters[Klotski"..tblPieces[x][2].."].CharacterOutfits[NotSelected]"))
  74.     end
  75. end
  76.  
  77. function row(index)
  78.     return math.floor(index/10)
  79. end
  80.  
  81. function col(index)
  82.     return index % 10
  83. end
  84.  
  85. function blocksize(blockno)
  86.     bsizec = tblPieces[blockno][4]
  87.     bsizer = tblPieces[blockno][3]
  88.     return bsizer,bsizec
  89. end
  90. --OnBlockClick - select block, deselect other, selected block = current character (all in VS)
  91.  
  92. function OnSpaceClick(S)
  93.     curN,curpos = GetBlockInfo()
  94.     xtrans,ytrans = GetMoveDir(curpos,S,curN)
  95.     movable = DoMoves(xtrans,ytrans,curN,curpos)
  96.     MoreSteps:setValue(VConditionValue, movable)
  97. end
  98.  
  99. function GetBlockInfo()
  100.     CurBlock = game:getLink(VGameCurrentCharacter)
  101.     curN = getObject("Characters["..CurBlock:getName().."].CharacterValues[BlockN]"):getInt(VValueInt)
  102.     tlpos = tblPieces[curN][5]
  103.     return curN,tlpos
  104. end
  105.  
  106. function GetMoveDir(from,to,curN)
  107.     bsizer,bsizec = blocksize(curN)
  108.     xtrans = col(to)-col(from) --raw
  109.     ytrans = row(to)-row(from) --raw
  110.     if xtrans > 0 then
  111.         xtrans = xtrans-(bsizec-1) --fixed for size
  112.     end
  113.     if ytrans > 0 then
  114.         ytrans = ytrans-(bsizer-1) --fixed for size
  115.     end
  116.     return xtrans, ytrans
  117. end
  118.  
  119. function DoMoves(xtm,ytm,curN,curpos)
  120. --check space to determin first move
  121.     ready = false
  122.     dox = 0
  123.     doy = 0
  124.     bsizer,bsizec = blocksize(curN)
  125.   --check x
  126.     if xtm > 0 then
  127.         if bsizec == 1 and bsizer == 1 then
  128.             ready = board[row(curpos)][col(curpos)+1] == 0
  129.         elseif bsizec == 2 and bsizer == 1 then
  130.             ready = board[row(curpos)][col(curpos)+2] == 0
  131.         elseif bsizec == 1 and bsizer == 2 then
  132.             ready = board[row(curpos)][col(curpos)+1] == 0 and
  133.                     board[row(curpos)+1][col(curpos)+1] == 0
  134.         elseif bsizec == 2 and bsizer == 2 then
  135.             ready = board[row(curpos)][col(curpos)+2] == 0 and
  136.                     board[row(curpos)+1][col(curpos)+2] == 0
  137.         end
  138.     elseif xtm < 0 then
  139.         if (bsizec == 1 or bsizec == 2) and bsizer == 1 then
  140.             ready = board[row(curpos)][col(curpos)-1] == 0
  141.         elseif (bsizec == 1 or bsizec == 2) and bsizer == 2 then
  142.             ready = board[row(curpos)][col(curpos)-1] == 0 and
  143.                     board[row(curpos)+1][col(curpos)-1] == 0
  144.         end
  145.     end
  146.     if ready then dox = xtm/math.abs(xtm) end --do a single x move (with direction)
  147.   --check y
  148.     if not ready and ytm > 0 then
  149.         if bsizec == 1 and bsizer == 1 then
  150.             ready = board[row(curpos)+1][col(curpos)] == 0
  151.         elseif bsizec == 2 and bsizer == 1 then
  152.             ready = board[row(curpos)+1][col(curpos)] == 0 and
  153.                     board[row(curpos)+1][col(curpos)+1] == 0
  154.         elseif bsizec == 1 and bsizer == 2 then
  155.             ready = board[row(curpos)+2][col(curpos)] == 0
  156.         elseif bsizec == 2 and bsizer == 2 then
  157.             ready = board[row(curpos)+2][col(curpos)] == 0 and
  158.                     board[row(curpos)+2][col(curpos)+1] == 0
  159.         end
  160.     elseif not ready and ytm < 0 then
  161.         if bsizec == 1 and (bsizer == 1 or bsizer == 2) then
  162.             ready = board[row(curpos)-1][col(curpos)] == 0
  163.         elseif bsizec == 2 and (bsizer == 1 or bsizer == 2) then
  164.             ready = board[row(curpos)-1][col(curpos)] == 0 and
  165.                     board[row(curpos)-1][col(curpos)+1] == 0
  166.         end
  167.     end
  168.     if ready and dox == 0 then doy = ytm/math.abs(ytm) end --do a single y move
  169. --single move
  170.     if ready then
  171.         newpos = curpos+(10*doy)+(dox)
  172.         nowrunning = startAction(actionnumber(newpos))
  173.         updateboard(curN,newpos)
  174.     end
  175.     return ready
  176. end
  177.  
  178. function actionnumber(index)
  179.     return getObject("Scenes[PUZ_KlotskiBox].SceneActions[MoveTo"..index.."]")
  180. end
  181.  
  182. function updateboard(curN,newpos)
  183.     --update piece TLposition
  184.     tblPieces[curN][5] = newpos
  185.     --update board layout
  186.     ----'remove' moved block
  187.     for r = 1,5 do
  188.         for c = 1,4 do
  189.             if board[r][c] == curN then
  190.                 board[r][c] = 0
  191.             end
  192.         end
  193.     end
  194.     ----'add' moved block
  195.     if     bsizec == 1 and bsizer == 1 then
  196.         board[row(newpos)][col(newpos)] = curN
  197.     elseif bsizec == 2 and bsizer == 1 then
  198.         board[row(newpos)][col(newpos)] = curN
  199.         board[row(newpos)][col(newpos)+1] = curN
  200.     elseif bsizec == 1 and bsizer == 2 then
  201.         board[row(newpos)][col(newpos)] = curN
  202.         board[row(newpos)+1][col(newpos)] = curN
  203.     elseif bsizec == 2 and bsizer == 2 then
  204.         board[row(newpos)][col(newpos)] = curN
  205.         board[row(newpos)+1][col(newpos)] = curN
  206.         board[row(newpos)][col(newpos)+1] = curN
  207.         board[row(newpos)+1][col(newpos)+1] = curN
  208.     end
  209. end
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×