Subversion Repositories Kolibri OS

Rev

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

  1. LEVELCONV equ 10
  2. SQ equ 8
  3. FLDSIZE equ 49
  4. FLDSIZE2 equ FLDSIZE*8
  5. DELAY equ 20
  6. TICKS equ 10
  7. LEV_START equ 1
  8. MOBILITY equ 9;13
  9.  
  10.   use32
  11.   org     0x0
  12.  
  13.   db     'MENUET01'              ; 8 byte id
  14.   dd     0x01                    ; header version
  15.   dd     run                   ; start of code
  16.   dd     I_END                   ; size of image
  17.   dd     stak+0x400             ; memory for app
  18.   dd     stak+0x400             ; esp
  19.   dd     0x0 , 0x0               ; I_Param , I_Icon
  20. include "macros.inc"
  21. ;include "debug.inc"
  22.  
  23. run:
  24. if  LEVELCONV eq 1
  25.     call compress_levels
  26.     jmp  close
  27. end if
  28.     mcall 3
  29.     mov  cl,16
  30.     ror  eax,cl
  31.     mov  [generator],eax    ; random generator from Tetris
  32. reset:
  33.     mov  [levptr],level
  34.     mov  [levnum],LEV_START
  35.   if ~ LEV_START eq 1
  36.     mov  ecx,[levnum]
  37.     dec  ecx
  38.     mov  esi,[levptr]
  39.     jecxz start
  40.   .lp:
  41.     movzx eax,word[esi]
  42.     and  eax,0x7fff
  43.     add  esi,eax ; limit
  44.     loop .lp
  45.     mov  [levptr],esi
  46. ;    sub  esi,level
  47. ;    dpd  esi
  48.   end if
  49. start:
  50.     mov  ecx,[generator]
  51.     and  ecx,0xff
  52.   .shuf:
  53.     call random
  54.     loop .shuf
  55.     xor  eax,eax
  56.     and  [locked],eax
  57.     and  [captured],eax
  58.     mov  [ticks],TICKS
  59.     mov  [mode],-1
  60.     mov  ebx,FLDSIZE
  61.     mov  eax,[generator]
  62.     xor  edx,edx
  63.     div  ebx
  64.     mov  cl,dl
  65.     call random
  66.     mov  eax,[generator]
  67.     xor  edx,edx
  68.     div  ebx
  69.     mov  ch,dl
  70.     xchg eax,ecx
  71.     movzx ecx,al
  72.     imul cx,bx
  73.     shr  ax,8
  74.     add  cx,ax
  75.     mov  esi,[levptr]
  76.     mov  [dot],ecx
  77.     call decompress_level
  78.     mov  ebx,8
  79.     call  nokey
  80. red:
  81.     call  draw_window
  82. ;    and  [event],0
  83.  
  84. still:
  85.  
  86.   .flush:
  87.     mcall 2
  88.     test al,al
  89.     jz   .flush
  90.  
  91.     mov  ebx,DELAY
  92.     mov  eax,[levnum]
  93.     shr  eax,1
  94.     sub  ebx,eax
  95.     mov  eax,23
  96.     cmp  [mode],0
  97.     jl   .wait
  98.     mov  eax,10
  99.   .wait:
  100.     mcall
  101.   .evt:
  102.     mov  ebx,8
  103.     test eax,eax
  104.     jne  .ev_yes
  105.     dec  [ticks]
  106.     jne  still
  107. ;    mov  [ticks],TICKS
  108. ;    cmp  al,[event]
  109.     jmp   key.ex
  110. ;    and  [event],al
  111. ;    jmp  still
  112.   .ev_yes:
  113.     cmp  eax,2
  114.     je   key
  115.     cmp  eax,1                  ; redraw request ?
  116.     je   red
  117.     cmp  eax,3                  ; button in buffer ?
  118.     je   button
  119. key:
  120. ;    mov  [event],al
  121.     mcall 2
  122.         and  eax, 0xffff
  123.     cmp  ah,13
  124.     je   button.mode
  125.     cmp  ah,27
  126.     je   button.mode
  127.     cmp  [mode],-1
  128.     jne  still
  129.     cmp  ah,104
  130.     jne  .nohelp
  131.     mov  [mode],4
  132.     jmp  red
  133.   .nohelp:
  134.     cmp  ah,112
  135.     jne  .nopau
  136.     mov  [mode],3
  137.     jmp  red
  138.   .nopau:
  139.     shr  eax,8
  140. ;    dpd  eax
  141.     cmp  eax,' '
  142.     je   .ex
  143.     cmp  eax,176
  144.     jb   still
  145.     cmp  eax,179
  146.     ja   still
  147.     cmp  [locked],0
  148.     jnz  still
  149.     lea  ebx,[eax-176]
  150.   .ex:
  151.     mov  [ticks],TICKS
  152.     call nokey
  153.     call evolution
  154.     call  red_field
  155.     jmp  still
  156.  
  157. button:                       ; BUTTON - only close supported
  158.     mcall 17
  159.     cmp  ah,2
  160.     jne  close
  161.     mcall 8,,,2+1 shl 31
  162. ;    mov  [event],2
  163.   .mode:
  164.     mov  [ticks],TICKS
  165.     mov  al,[mode]
  166.     cmp  al,1
  167.     je   reset
  168.     cmp  al,2
  169.     je   reset
  170.     mov  [mode],-1
  171.     test  al,al
  172.     jnz  .no0
  173.     inc  [levnum]
  174.     jmp  start
  175.   .no0:
  176.     jmp  red
  177.   close:
  178.     or   eax,-1
  179.     int  0x40
  180.  
  181. ;   *********************************************
  182. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  183. ;   *********************************************
  184. draw_window:
  185.     mov  [ticks],TICKS
  186.     mcall 12,1
  187.     mcall 0,<100,FLDSIZE2+16>,<100,FLDSIZE2+38>,0x14008000, , header
  188.  
  189.   if lang eq ru
  190.     mcall 47,0x20000,[levnum],<128,8>, 0
  191.   else
  192.     mcall 47,0x20000,[levnum],<117,8>, 0
  193.   end if
  194.     call  red_field
  195.     cmp   [mode],0
  196.     jl    .edraw
  197.     mov   ecx,(FLDSIZE2-20) shl 16+20
  198.     cmp   [mode],4
  199.     jne    .nohelp
  200.     mov   ecx,100 shl 16+FLDSIZE2-35-100+38
  201.   .nohelp:
  202.     mcall 13,<5+8,FLDSIZE2-8>,,0xf5deb3;0xffff00
  203.     mcall 8,<FLDSIZE2-40,35>,<FLDSIZE2-18,15>,2,0xc0c000
  204.     mcall 4,<363,FLDSIZE2-20+6>,0x100000ff,msg_ok,2
  205.     mov   ebx,(5+8+35)shl 16+FLDSIZE2-20+6
  206.     movzx ecx,[mode]
  207.     mov   edx,messages+4
  208.     cmp   ecx,4
  209.     jne   .nxt
  210.     mov   edx,desc+4
  211.     xor   ecx,ecx
  212.     mov   ebx,20 shl 16+110
  213.   .nxt:
  214.     mov   esi,[edx-4]
  215.     jecxz .drw
  216.     dec   ecx
  217.     lea   edx,[edx+esi+4]
  218.     jmp   .nxt
  219.   .drw:
  220.     cmp   esi,-1
  221.     je    .edraw
  222.     mcall ,,0x000000ff
  223.     mov   ecx,1
  224.     add   ebx,18
  225.     cmp   [mode],4
  226.     je    .nxt
  227.   .edraw:
  228.     mcall 12,2
  229.     ret
  230.  
  231. red_field:
  232.     mov   edi,field
  233.     mov   ebp,28 shl 16+SQ ; y
  234.     mov   ecx,FLDSIZE
  235.   .lp1:
  236.     push  ecx
  237.     mov   ecx,FLDSIZE
  238.     mov   ebx,8 shl 16+SQ  ; x
  239.   .lp2:
  240.     push  ecx
  241.     mov   edx,0x8000
  242.     cmp   byte[edi],0
  243.     je    .zero
  244.     cmp   byte[edi],2
  245.     jne   .nored
  246.     mov   edx,0xff0000
  247.     cmp   [locked],0
  248.     jz    .zero
  249.     mov   edx,0xa00000
  250.     jmp   .zero
  251.   .nored:
  252.     mov   edx,0
  253.   .zero:
  254.     mcall 13,,ebp
  255.     inc   edi
  256.     pop   ecx
  257.     add   ebx,8 shl 16
  258.     loop  .lp2
  259.     pop   ecx
  260.     add   ebp,8 shl 16
  261.     loop  .lp1
  262.  
  263.     mov   eax,[dot]
  264.     mov   cl,FLDSIZE
  265.     div   cl
  266.  
  267. ;    movzx ebx,ah
  268. ;    shl   ebx,19
  269. ;    add   ebx,8 shl 16+7
  270. ;    movzx ecx,al
  271. ;    shl   ecx,19
  272. ;    add   ecx,28 shl 16+7
  273. ;    push  eax
  274. ;    mcall 13,,,0xff
  275. ;    pop   eax
  276.  
  277.     movzx ebx,ah
  278.     shl   ebx,19
  279.     add   ebx,8 shl 16
  280.     shld  edx,ebx,16
  281.     add   dx,SQ-1
  282.     mov   bx,dx
  283.     movzx ecx,al
  284.     shl   ecx,19
  285.     add   ecx,28 shl 16
  286.     shld  edx,ecx,16
  287.     add   dx,SQ-1
  288.     mov   cx,dx
  289.     mcall 38,,,0xffffff
  290.     ror   ecx,16
  291.     mcall
  292.     ret
  293.  
  294. nokey:
  295.     xor  eax,eax
  296.     mov  edi,buff
  297.     mov  ecx,FLDSIZE*FLDSIZE+3
  298.     push ecx edi
  299.     rep  stosb
  300.     pop  edi
  301.     ;mov  esi,field
  302.     mov  edi,field
  303.     mov  edx,FLDSIZE
  304.     pop  ecx
  305.   .llp:
  306.     mov  eax,2
  307.     repne scasb
  308.     jecxz .exx
  309.     and  byte[edi-1],0
  310.     push ecx
  311.     lea  eax,[edi-field-1]
  312.     div  dl
  313.     call get_cell
  314.     mov  byte[buff+ecx],2
  315.     pop  ecx
  316.     loop .llp
  317.   .exx:
  318.     mov  edi,field
  319.     mov  esi,buff
  320.     mov  ecx,FLDSIZE*FLDSIZE
  321.   .lp4:
  322.     lodsb
  323.     cmp  al,2
  324.     jne  .skip3
  325.     mov  [edi],al
  326.   .skip3:
  327.     inc  edi
  328.     loop  .lp4
  329.  
  330.     ret
  331.  
  332. get_cell:
  333. ; ax - source cell [x][y]
  334. ; ebx - direction
  335. ;     4 2 5
  336. ;     0 . 3
  337. ;     6 1 7
  338. ; out - ecx cell ptr
  339.  
  340.     push eax ebx
  341.     add  ax,[ebx*2+dirs]
  342.     mov  ebx,FLDSIZE
  343.   .c0:
  344.     cmp  al,bl
  345.     jb   .c1
  346.     sub  al,bl
  347.     jmp  .c0
  348.   .c1:
  349.     cmp  ah,bl
  350.     jb   .c2
  351.     sub  ah,bl
  352.     jmp  .c1
  353.   .c2:
  354.     movzx ecx,al
  355.     imul cx,bx
  356.     shr  ax,8
  357.     add  cx,ax
  358.     pop  ebx eax
  359.     ret
  360.  
  361. evolution:
  362.     xor   edi,edi
  363.     and   [locked],edi
  364.     mov   edx,FLDSIZE
  365.     mov   ecx,FLDSIZE*FLDSIZE
  366.   .l1:
  367.     push  ecx
  368.     mov   eax,edi
  369.     div   dl
  370.     mov   ecx,8
  371.     xor   ebx,ebx
  372.     mov   word[neib],bx ; neighbour count
  373.   .l2:
  374.     push  ecx
  375.     call  get_cell
  376.     movzx esi,byte[field+ecx]
  377.     test   esi,esi ; 0?
  378.     jz    .skip2
  379.     inc   byte[neib-1+esi]
  380.   .skip2:
  381.     inc   ebx
  382.     pop   ecx
  383.     loop  .l2
  384.     mov   cl,[neib]
  385.     add   cl,[neib+1]
  386.     cmp   cl,2
  387.     jne   .no2
  388.     mov   al,[field+edi]
  389.     jmp   .writebuf
  390.   .no2:
  391.     xor   al,al
  392.     cmp   cl,3
  393.     jne   .writebuf
  394.     inc   al
  395.     mov   cl,[neib+1]
  396.     cmp   cl,[neib]
  397.     jb    .writebuf
  398.     inc   al
  399.   .writebuf:
  400.     mov   [buff+edi],al
  401.     pop   ecx
  402.     inc   edi
  403.     loop  .l1
  404.  
  405.     mov   esi,buff
  406.     mov   edi,field
  407.     mov   ecx,FLDSIZE*FLDSIZE
  408.     rep   movsb
  409.     call  square_check
  410.     call  dot_move
  411.     ret
  412.  
  413. square_check:
  414.     mov   ecx,FLDSIZE*FLDSIZE+3
  415.     mov   edx,FLDSIZE
  416.     mov   edi,field
  417.     xor   eax,eax
  418.     pusha
  419.     and   dword[cells],eax
  420.     and   [locked],eax
  421.   .nored:
  422.     mov   al,[edi]
  423.     inc   edi
  424.     dec   ecx
  425.     jecxz .ex1
  426.     test   al,al
  427.     jz    .nored
  428.     inc   [cells-2+eax*2]
  429.     jmp   .nored
  430.   .ex1:
  431.     mov   ax,[cells+2]
  432.     cmp   ax,[cells]
  433.     ja    dot_move.next_lev
  434.     cmp   [cells+2],4
  435.     je    .sq_check
  436.     add   esp,32
  437.     cmp   [cells+2],0
  438.     jne   .loc
  439.     mov   [mode],1
  440.     mov   dword[esp+4],red
  441.   .loc:
  442.     inc   [locked]
  443.     ret
  444.   .sq_check:
  445.     popa
  446.   .nored2:
  447.     mov   eax,2
  448.     repne scasb
  449.     jecxz .loc
  450.     lea   eax,[edi-field-1]
  451.     div   dl
  452.     xor   dh,dh
  453.     push  ecx
  454.     mov   ebx,1
  455.     call  get_cell
  456.     add   dh,[field+ecx]
  457.     mov   ebx,3
  458.     call  get_cell
  459.     add   dh,[field+ecx]
  460.     mov   ebx,7
  461.     call  get_cell
  462.     add   dh,[field+ecx]
  463.     pop   ecx
  464.     cmp   dh,6
  465.     jne   .nored2
  466.     ret
  467.  
  468. random:
  469.     mov  eax, [generator]
  470.     sub  eax,0x43ab45b5    ; next random number
  471.     ror  eax,1
  472.     xor  eax,0x32c4324f
  473.     ror  eax,1
  474.     mov  [generator],eax
  475.     ret
  476.  
  477. dot_move:
  478.     call random
  479.     mov  eax,[generator]
  480.     xor  edx,edx
  481.     mov  ebx,MOBILITY
  482.     div  ebx
  483.     cmp  edx,8
  484.     jb   .nostay
  485.     mov  edx,16
  486.   .nostay:
  487.     mov  ebx,edx
  488.     shr  ebx,1
  489.     mov  eax,[dot]
  490. ;    dpd  eax
  491.     mov  cl,FLDSIZE
  492.     div  cl
  493.     call get_cell
  494.     mov  [dot],ecx
  495.     cmp  byte[field+ecx],2
  496.     jne  .nocap
  497.     inc  [captured]
  498.     cmp  [captured],2
  499.     jne  .ex
  500.   .next_lev:
  501.     mov  [mode],0
  502.     pop  eax
  503.     mov  eax,[levptr]
  504.     cmp  word[eax],0
  505.     jne  .nxt
  506.     mov  [mode],2
  507.   .nxt:
  508.     mov  dword[esp],red
  509.     ret
  510.   .nocap:
  511.     and  [captured],0
  512.   .ex:
  513.     ret
  514.  
  515. if LEVELCONV eq 1
  516. fileinfo:
  517.  
  518.      dd   2
  519.      dd   0x0
  520.      dd   0x0
  521. .fsize dd   10000
  522. .ptr dd   0x20000
  523.      db   '/sys/newlev.bin',0
  524.  
  525. macro flush
  526. {
  527.   mov  [edi],dh
  528.   inc  edi
  529. }
  530.  
  531. compress_levels:
  532.     mov  esi,raw_level
  533.     mov  edi,I_END
  534.     mov  [fileinfo.ptr],edi
  535.     mov  ecx,(raw_level_size-raw_level)/(FLDSIZE*FLDSIZE*4) ; 19
  536.   .lp1:
  537.     push ecx
  538.     mov  ecx,FLDSIZE*FLDSIZE
  539.     mov  ebx,edi
  540.     mov  eax,[esi]
  541. ;    movzx eax,byte[esi]
  542.     movzx edx,al
  543.     dpd  edx
  544.     shl  eax,15
  545.     stosw
  546.   .lp2:
  547.     lodsd ;lodsb
  548.     cmp  al,0xd
  549.     jne  .nored
  550.     flush
  551.     xor  al,al
  552.     stosb
  553.     add  esi,4
  554.     dec  ecx
  555.     xor  dh,dh
  556.     jmp  .eloop
  557.   .nored:
  558.     cmp  al,dl
  559.     jne  .change
  560.     inc  dh
  561.     cmp  dh,0xff
  562.     jb   .eloop
  563.     flush
  564.     xor  dh,dh
  565.     jmp  .eloop
  566.   .change:
  567.     flush
  568.     xor  dl,1
  569.     mov  dh,1
  570.   .eloop:
  571.     loop .lp2
  572.     flush
  573.     mov  eax,edi
  574.     sub  eax,ebx
  575.     add  [ebx],ax
  576.     pop  ecx
  577.     loop .lp1
  578.     xor  eax,eax
  579.     stosw
  580.     sub  edi,I_END
  581.     mov  [fileinfo.fsize],edi
  582.     mcall 70,fileinfo
  583.     ret
  584.  
  585. raw_level:
  586.     file 'noname1.dat'
  587. raw_level_size:
  588.  
  589. end if
  590.  
  591. decompress_level:
  592. ; esi - level begin
  593.     mov  edi,field
  594.     movzx edx,word[esi]
  595.     xor  ecx,ecx
  596.     mov  eax,edx
  597.     and  edx,0x7fff
  598.     add  edx,esi ; limit
  599.     mov  [levptr],edx
  600.     add  esi,2
  601.     shr  eax,15
  602.   .next:
  603.     cmp  esi,edx
  604.     jae  .exloop
  605.     movzx ebx,byte[esi]
  606.     inc  esi
  607.     test ebx,ebx
  608.     jne  .nored
  609.     rep  stosb
  610.     xor  al,1
  611.     mov  word[edi],0x0202
  612.     add  edi,2
  613.     jmp  .next
  614.   .nored:
  615.     add  ecx,ebx
  616.     cmp  ebx,0xff
  617.     je   .next
  618.     rep  stosb
  619.     xor  al,1
  620.     jmp  .next
  621.   .exloop:
  622.     rep  stosb
  623.     ret
  624.  
  625. ; DATA AREA
  626.  
  627. FS1 equ (FLDSIZE-1)
  628. dirs  dw  FS1 shl 8,\
  629.           1,\
  630.           FS1,\
  631.           1 shl 8,\
  632.           FS1 shl 8+FS1,\
  633.           1 shl 8+FS1,\
  634.           FS1 shl 8+1,\
  635.           1 shl 8+1,\
  636.           0
  637. level:
  638. file 'rlevels.bin'
  639.  
  640. msg_ok db 'OK'
  641. if lang eq ru
  642. header db 'Red Square - Уровень       h - Помощь, p - Пауза', 0
  643.  
  644. messages mstr 'Отлично! Вы переходите на следующий уровень.',\
  645.               'Красные клетки уничтожены. Вы проиграли.',\
  646.               'Вы прошли все уровни. Поздравляем!',\
  647.               'Игра приостановлена...'
  648.  
  649. desc mstr   '   Вы играете красным квадратиком. Цель игры - выжить среди',\
  650.             'развивающихся черных клеток. Если Вам удастся поймать белый',\
  651.             'крестик, Вы пройдете уровень.',\
  652.             '   Чтобы поймать белый крестик, он должен быть накрыт одной',\
  653.             'из красных клеток на протяжении 2 поколений подряд.',\
  654.             '   Если красный квадрат разрушен, это еще не проигрыш. Может',\
  655.             'быть, Вам повезет и если в процессе эволюции количество Ваших',\
  656.             'красных клеток станет больше, чем черных, уровень будет',\
  657.             "пройден.",\
  658.             '---',\
  659.             'Джон Хортон Конуэй изобрел прекрасную игру. Почти каждый',\
  660.             'программист начинает свою практику с нее. Однако реальные',\
  661.             'возможности этой игры еще плохо изучены.',\
  662.             '---',\
  663.             'Оригинал игры под Win32 написал Владимир Привалов, 2002',\
  664.             'Запрограммировал на ассемблере Willow, 2005'
  665. else
  666. header db 'Red Square - Level         h - Help,  p - Pause', 0
  667.  
  668. messages mstr 'Well done! You are on the next level',\
  669.               'Your red cells are vanished! Game over.',\
  670.               "You've completed the game. Congratulations!",\
  671.               'Game paused...'
  672.  
  673. desc mstr   '   The main goal of the game for your red square is to stay',\
  674.             'alive going through the evolving black cells. If you manage to',\
  675.             'catch the white cross, you will pass the level.',\
  676.             '   To catch the white cross, it must be covered by red cell',\
  677.             'during 2 generations.',\
  678.             "   If your red square is corrupted, you haven't lost yet. You",\
  679.             'may have a luck, and if your red cells is developing and the',\
  680.             'quantity of black cells is bigger than that of black cells,',\
  681.             "you'll pass the level.",\
  682.             '---',\
  683.             'John Horton Conway has created a great game. Almost every',\
  684.             'programmer begins his professional work from it. But the real',\
  685.             'possibilities of this game have not discovered yet.',\
  686.             '---',\
  687.             'Original game under Win32 by Vladimir Privalov, 2002',\
  688.             'Programmed in assembly by Willow, 2005'
  689. end if
  690. I_END:
  691. neib db ?,?
  692. cells dw ?,?
  693. mode db ?
  694. levptr dd ?
  695. levnum dd ?
  696. reds dd ?
  697. locked dd ?
  698. generator dd ?
  699. dot  dd ?
  700. ticks dd ?
  701. captured dd ?
  702. if LEVELCONV eq 1
  703.   os_work rb 4096
  704. end if
  705. field:
  706.     rb FLDSIZE*FLDSIZE
  707. rd 1
  708. buff:
  709.     rb FLDSIZE*FLDSIZE
  710. stak:
  711.