Subversion Repositories Kolibri OS

Rev

Rev 5305 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ; KOLIBRI PUZZLE CHALLENGE
  2.  
  3. TILE.W=64
  4. TILE.H=64
  5. MAP.X=TILE.W
  6. MAP.Y=TILE.H
  7. MAP.W=8
  8. MAP.H=8
  9. PUZZLE.W=MAP.W*TILE.W
  10. PUZZLE.H=MAP.H*TILE.H
  11.  
  12. WINDOW.W=PUZZLE.W+(TILE.W*2)
  13. WINDOW.H=PUZZLE.H+(TILE.H*2)
  14.  
  15. include 'a.inc'
  16.  
  17. text title(64)='Kolibri Puzzle Challenge'
  18.  
  19. align
  20.  
  21. integer scene
  22. numeric SCENE.*, TITLE, PLAY, SOLVED
  23.  
  24. integer solved, select.x, select.y
  25.  
  26. puzzle: db (MAP.W*MAP.H*4) dup(0)
  27. numeric NORMAL, ROTATE.R, INVERT.XY, ROTATE.L
  28.  
  29. IMAGE piece.i
  30. piece.pixels: db (TILE.W*TILE.H*4) dup(0)
  31.  
  32. BOX my.box, puzzle.box
  33. integer grid.color=WHITE
  34.  
  35. IMAGE kolibri.i='kolibri', logo.i='logo2',\
  36.  wood1.i='wood1', wood2.i='wood2',\
  37.  close.i='x', solved.i='solved'
  38.  
  39. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  40.  
  41. get.random equ random.x ROTATE.R, ROTATE.L
  42.  
  43. function erase.puzzle
  44.   memory.zero piece.pixels, (TILE.W*TILE.H*4)
  45. endf
  46.  
  47. function randomize.puzzle
  48.   locals q, n
  49.   alias p=r0, x=r1
  50.   . q=puzzle, n=(MAP.W*MAP.H)
  51.   loop n
  52.     get x=get.random
  53.     . p=q, (u32) *p=x, q+4
  54.   endl
  55. endf
  56.  
  57. function reset.game
  58.   randomize.puzzle
  59. endf
  60.  
  61. function on.create
  62.   erase.puzzle
  63.   . scene=SCENE.TITLE
  64.   set.box puzzle.box,\
  65.    MAP.X, MAP.Y, PUZZLE.W, PUZZLE.H
  66. endf
  67.  
  68. function is.solved
  69.   locals n
  70.   alias p=r0, x=r1
  71.   . p=puzzle, n=(MAP.W*MAP.H)
  72.   loop n, (u32) x=*p++
  73.     if x<>NORMAL, return 0, end
  74.   endl
  75. endf 1
  76.  
  77. function get.piece, x, y
  78.   . r0=y, r0*MAP.W, r0+x, r0*4, r0+puzzle
  79. endf
  80.  
  81. function get.piece.rotate, x, y
  82.   get.piece x, y
  83.   . (u32) r0=*r0
  84. endf
  85.  
  86. function set.piece.rotate, x, y, r
  87.   if r>ROTATE.L, r=0, end
  88.   get.piece x, y
  89.   . r1=r, (u32) *r0=r1
  90.   is.solved
  91.   if true
  92.     . scene=SCENE.SOLVED
  93.   end
  94. endf
  95.  
  96. function copy.piece, x, y
  97.   locals w, h, pw
  98.   alias p=r0, s=r1, n=r2
  99.   . p=piece.pixels, piece.i.p=p
  100.   . piece.i.w=TILE.W, piece.i.h=TILE.H
  101.   . n=PUZZLE.W, n*4, pw=n
  102.   . n=y, n*pw, n*TILE.W
  103.   . s=x, s*TILE.W, s*4, n+s
  104.   . s=kolibri.i.p, s+n
  105.   . h=TILE.H
  106.   loop h, w=TILE.W
  107.     loop w, (u32) *p++=*s++
  108.     endl
  109.     . n=TILE.W, n*4, s-n, s+pw
  110.   endl
  111. endf
  112.  
  113. function draw.piece, px, py, x, y
  114.   locals z
  115.   get z=get.piece.rotate px, py
  116.   copy.piece px, py
  117.   if z=NORMAL
  118.     draw.image piece.i, x, y
  119.   else.if z=ROTATE.R
  120.     draw.image.rr piece.i, x, y
  121.   else.if z=INVERT.XY
  122.     . r0=y, r0+TILE.H
  123.     draw.image.ixy piece.i, x, r0
  124.   else.if z=ROTATE.L
  125.     draw.image.rl piece.i, x, y
  126.   end
  127. endf
  128.  
  129. function draw.puzzle
  130.   locals x, y
  131.   . y=0
  132.   while y<8, x=0
  133.     while x<8
  134.       . r0=x, r0*TILE.W, r0+MAP.X
  135.       . r1=y, r1*TILE.H, r1+MAP.Y
  136.       draw.piece x, y, r0, r1
  137.       . x++
  138.     endw
  139.     . y++
  140.   endw
  141. endf
  142.  
  143. function draw.grid
  144.   locals x, y
  145.   . y=0
  146.   while y<8, x=0
  147.     while x<8
  148.       . r0=x, r0*TILE.W, r0+MAP.X
  149.       . r1=y, r1*TILE.H, r1+MAP.Y
  150.       draw.outline r0, r1,\
  151.        TILE.W, TILE.H, grid.color
  152.       . x++
  153.     endw
  154.   . y++
  155.   endw
  156. endf
  157.  
  158. function draw.wood.frame
  159.   draw.image wood1.i, 0, 0
  160.   draw.image wood1.i, 0, WINDOW.H-TILE.H
  161.   draw.image wood2.i, 0, TILE.H
  162.   draw.image wood2.i, WINDOW.W-TILE.W, TILE.H
  163.   draw.image close.i, WINDOW.W-40, 8
  164. endf
  165.  
  166. function on.draw
  167.   draw.wood.frame
  168.   draw.puzzle
  169.   if scene=SCENE.TITLE
  170.     draw.box.o puzzle.box, grid.color
  171.   end
  172.   if scene=SCENE.PLAY
  173.     draw.grid
  174.   end
  175.   if scene=SCENE.SOLVED
  176.     draw.image.v solved.i, 132, 13, WHITE
  177.   else
  178.     draw.image.v logo.i, 180, 13, WHITE
  179.   end
  180. endf
  181.  
  182. function on.key
  183.   ; ...
  184. endf
  185.  
  186. function get.select.xy
  187.   . r0=mouse.x, r0-MAP.X, r0-WINDOW.X
  188.   . r1=TILE.W, r0/r1, select.x=r0
  189.   . r0=mouse.y, r0-MAP.Y, r0-WINDOW.Y
  190.   . r1=TILE.H, r0/r1, select.y=r0
  191. endf
  192.  
  193. function on.mouse
  194.   locals r
  195.   if mouse.event='c'
  196.     . r0=&close.i.x
  197.     if.select r0
  198.       exit
  199.     end
  200.     if scene=SCENE.TITLE
  201.       reset.game
  202.       . scene=SCENE.PLAY
  203.       go .draw
  204.     end
  205.     if scene=SCENE.PLAY
  206.       if.select puzzle.box
  207.         get.select.xy
  208.         get r=get.piece.rotate \
  209.          select.x, select.y
  210.         . r++
  211.         set.piece.rotate \
  212.          select.x, select.y, r
  213.         go .draw
  214.       end
  215.     end
  216.     if scene=SCENE.SOLVED
  217.       reset.game
  218.       . scene=SCENE.TITLE
  219.       go .draw
  220.     end
  221.     .draw:
  222.     render
  223.   end
  224. endf
  225.  
  226. function on.timer
  227.   ; ...
  228. endf
  229.  
  230. function on.exit
  231.   ; ...
  232. endf