Subversion Repositories Kolibri OS

Rev

Rev 625 | Rev 4917 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
484 diamond 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 "lang.inc"
21
include "MACROS.INC"
22
;include "DEBUG.INC"
23
 
24
run:
25
if  LEVELCONV eq 1
26
    call compress_levels
27
    jmp  close
28
end if
29
    mcall 3
30
    mov  cl,16
31
    ror  eax,cl
32
    mov  [generator],eax    ; random generator from Tetris
33
reset:
34
    mov  [levptr],level
35
    mov  [levnum],LEV_START
36
  if ~ LEV_START eq 1
37
    mov  ecx,[levnum]
38
    dec  ecx
39
    mov  esi,[levptr]
40
    jecxz start
41
  .lp:
42
    movzx eax,word[esi]
43
    and  eax,0x7fff
44
    add  esi,eax ; limit
45
    loop .lp
46
    mov  [levptr],esi
47
;    sub  esi,level
48
;    dpd  esi
49
  end if
50
start:
51
    mov  ecx,[generator]
52
    and  ecx,0xff
53
  .shuf:
54
    call random
55
    loop .shuf
56
    xor  eax,eax
57
    and  [locked],eax
58
    and  [captured],eax
59
    mov  [ticks],TICKS
60
    mov  [mode],-1
61
    mov  ebx,FLDSIZE
62
    mov  eax,[generator]
63
    xor  edx,edx
64
    div  ebx
65
    mov  cl,dl
66
    call random
67
    mov  eax,[generator]
68
    xor  edx,edx
69
    div  ebx
70
    mov  ch,dl
71
    xchg eax,ecx
72
    movzx ecx,al
73
    imul cx,bx
74
    shr  ax,8
75
    add  cx,ax
76
    mov  esi,[levptr]
77
    mov  [dot],ecx
78
    call decompress_level
79
    mov  ebx,8
80
    call  nokey
81
red:
82
    call  draw_window
83
;    and  [event],0
84
 
85
still:
86
 
87
  .flush:
88
    mcall 2
89
    test al,al
90
    jz   .flush
91
 
92
    mov  ebx,DELAY
93
    mov  eax,[levnum]
94
    shr  eax,1
95
    sub  ebx,eax
96
    mov  eax,23
97
    cmp  [mode],0
98
    jl   .wait
99
    mov  eax,10
100
  .wait:
101
    mcall
102
  .evt:
103
    mov  ebx,8
104
    test eax,eax
105
    jne  .ev_yes
106
    dec  [ticks]
107
    jne  still
108
;    mov  [ticks],TICKS
109
;    cmp  al,[event]
110
    jmp   key.ex
111
;    and  [event],al
112
;    jmp  still
113
  .ev_yes:
114
    cmp  eax,2
115
    je   key
116
    cmp  eax,1                  ; redraw request ?
117
    je   red
118
    cmp  eax,3                  ; button in buffer ?
119
    je   button
120
key:
121
;    mov  [event],al
122
    mcall 2
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
2682 leency 187
    mcall 0,<100,FLDSIZE2+16>,<100,FLDSIZE2+38>,0x14008000, , header
188
 
484 diamond 189
  if lang eq ru
2682 leency 190
    mcall 47,0x20000,[levnum],<128,8>, 0
484 diamond 191
  else
2682 leency 192
    mcall 47,0x20000,[levnum],<117,8>, 0
484 diamond 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,,,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
539 spraid 523
     db   '/sys/newlev.bin',0
484 diamond 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
 
637
level:
638
file 'rlevels.bin'
639
 
640
msg_ok db 'OK'
641
if lang eq ru
2682 leency 642
header db 'Red Square - Уровень       h - Помощь, p - Пауза', 0
643
 
484 diamond 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
2682 leency 666
header db 'Red Square - Level         h - Help,  p - Pause', 0
667
 
484 diamond 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: