Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1518 dunkaist 1
;;===Level_mode================================================================================================================
2
 
3
Level_begin:
4
 
5
    mov  [score],   0
6
    mov  [action],  0
1522 dunkaist 7
    mov  eax,   [gw_mul_gh]
8
    sub  eax, 3
9
    mov  [number_of_free_dots], ax
1518 dunkaist 10
 
11
      invoke  ini.get_str, cur_dir_path, aScore, aChampion_name, champion_name, 15, champion_name
12
      invoke  ini.get_int, cur_dir_path, aScore, aHiscore, 0
13
 
14
    test eax, eax
15
     jz  @f
16
    mov  dword  [hi_score],    eax
17
  @@:
18
 
19
    mov  esi, start_map
20
    mov  edi, field_map
1522 dunkaist 21
    mov  ecx, [gw_mul_gh]
22
    shr  ecx, 2
1518 dunkaist 23
    rep  movsd
24
 
1522 dunkaist 25
      call      Get_eat
26
 
1518 dunkaist 27
Level_body:
28
    ;;===Level_body========================================================================================================
29
 
30
mcall     26, 9
31
    mov  [time_before_waiting], eax
32
    mov  eax, [time_wait_limit]
33
    mov  [time_to_wait],    eax
34
 
1522 dunkaist 35
  .redraw:
1518 dunkaist 36
      mcall     12,1
1522 dunkaist 37
    mov  ebx, [wp_x]
38
    shl  ebx, 16
39
    add  ebx, dword[window_width]
40
    mov  ecx, [wp_y]
41
    shl  ecx, 16
42
    add  ecx, dword[window_height]
43
      mcall     0, , ,[window_style], ,window_title
1518 dunkaist 44
 
45
      call      Draw_decorations
46
      call      Draw_snake
47
      call      Draw_eat
48
      call      Draw_level_strings
49
 
50
      mcall     12,2
51
 
1522 dunkaist 52
  .still:
1518 dunkaist 53
      mcall     26, 9
54
    push eax
55
    sub  eax, [time_before_waiting]
56
    pop  [time_before_waiting]
57
    cmp  [time_to_wait],    eax
58
     jg  @f
59
    cmp  [action],  0
60
     jne Game_step
61
  @@:
62
    sub  [time_to_wait],    eax
63
      mcall     23, [time_to_wait]              ;
64
 
65
    test al,  al
66
     jnz  @f
67
    cmp  [action],  0
68
     jne Game_step
69
      mcall     26, 9
70
    mov  [time_before_waiting], eax
71
    mov  eax, [time_wait_limit]
72
    mov  [time_to_wait],    eax
1522 dunkaist 73
     jmp .still
1518 dunkaist 74
  @@:
75
 
1522 dunkaist 76
      .message:                                 ; ok, what an event?
1518 dunkaist 77
        dec  al                                 ; has the window been moved or resized?
1522 dunkaist 78
         jz  .redraw                            ;
1518 dunkaist 79
        dec  al                                 ; was a key pressed?
1522 dunkaist 80
         jz  .key                               ;
1518 dunkaist 81
        dec  al                                 ; was a button pressed?
1522 dunkaist 82
         jz  .button                            ;
1518 dunkaist 83
 
84
 
1522 dunkaist 85
  .key:
1518 dunkaist 86
      mcall     2                               ; get keycode
87
 
88
    cmp  ah,  0x1B                              ; Escape
89
     je  First_menu
90
    cmp  ah,  0x20                              ; Space
91
     je  Pause_mode
92
    cmp  ah,  0xB0                              ; Left
1522 dunkaist 93
     je  .key.left
1518 dunkaist 94
    cmp  ah,  0xB1                              ; Down
1522 dunkaist 95
     je  .key.down
1518 dunkaist 96
    cmp  ah,  0xB2                              ; Up
1522 dunkaist 97
     je  .key.up
1518 dunkaist 98
    cmp  ah,  0xB3                              ; Right
1522 dunkaist 99
     je  .key.right
1518 dunkaist 100
 
1522 dunkaist 101
     jmp .still                                 ; jump to wait for another event
102
 
103
 
104
  .button:                                       ; процедура обрабоки кнопок в программе
105
      mcall     17                              ; функция 17: получить номер нажатой кнопки
106
 
107
    shr  eax, 8                                 ; сдвигаем регистр eax на 8 бит вправо, чтобы получить номер нажатой кнопки
108
    cmp  eax, 1
109
     je  Exit                                   ; если это не кнопка 1 (зарезервирована системой как кнопка закрытия программы), пропускаем 2 следующие строчки кода
110
 
111
     jmp .still
112
 
113
 
114
  .key.left:
115
    bts  dword[action], 0
116
     jc  @f
1518 dunkaist 117
    mov  [time_to_wait],    0
118
  @@:
1522 dunkaist 119
    mov  [snake_napravlenie_next],  LEFT
120
     jmp .still
1518 dunkaist 121
 
1522 dunkaist 122
  .key.down:
123
    bts  dword[action], 0
124
     jc  @f
1518 dunkaist 125
    mov  [time_to_wait],    0
126
  @@:
1522 dunkaist 127
    mov  [snake_napravlenie_next],  DOWN
128
     jmp .still
1518 dunkaist 129
 
1522 dunkaist 130
  .key.up:
131
    bts  dword[action], 0
132
     jc  @f
1518 dunkaist 133
    mov  [time_to_wait],    0
134
  @@:
1522 dunkaist 135
    mov  [snake_napravlenie_next],  UP
136
     jmp .still
1518 dunkaist 137
 
1522 dunkaist 138
  .key.right:
139
    bts  dword[action], 0
140
     jc  @f
1518 dunkaist 141
    mov  [time_to_wait],    0
142
  @@:
1522 dunkaist 143
    mov  [snake_napravlenie_next],  RIGHT
144
     jmp .still
1518 dunkaist 145
 
146
 
147
  Game_step:
148
 
149
    cmp  [snake_napravlenie],   LEFT            ; are we moving to left?
150
     jz  .left
151
    cmp  [snake_napravlenie],   DOWN            ; ... down?
152
     jz  .down
153
    cmp  [snake_napravlenie],   UP              ; ... up?
154
     jz  .up
155
     jmp .right                                 ; then right
156
 
157
  .left:
158
    cmp  [snake_napravlenie_next],  RIGHT       ; next step is to right?
159
     jz  .with_rewerse
160
     jmp .without_rewerse
161
 
162
  .down:
163
    cmp  [snake_napravlenie_next],  UP          ; next step is to up?
164
     jz  .with_rewerse
165
     jmp .without_rewerse
166
 
167
  .up:
168
    cmp  [snake_napravlenie_next],  DOWN        ; next step is to bottom?
169
     jz  .with_rewerse
170
     jmp .without_rewerse
171
 
172
  .right:
173
    cmp  [snake_napravlenie_next],  LEFT        ; next step is to left?
174
     jz  .with_rewerse
175
     jmp .without_rewerse
176
 
177
 
178
  .with_rewerse:
179
      call      Set_reverse_napravlenie
180
      call      Reverse
181
 
182
  .without_rewerse:
183
;    mov  [time_to_wait],   0
184
    mov  edx, snake_dots-2
185
    add  edx, [snake_length_x2]
186
 
187
    cmp  [snake_napravlenie_next],  LEFT
188
     je  .to_left
189
    cmp  [snake_napravlenie_next],  DOWN
190
     je  .to_down
191
    cmp  [snake_napravlenie_next],  UP
192
     je  .to_up
193
    cmp  [snake_napravlenie_next],  RIGHT
194
     je  .to_right
195
 
196
      .to_left:
197
        mov  [snake_napravlenie],   LEFT
198
        mov  ax,  [edx]
199
        dec  al
200
        cmp  al,  -1
201
         jne @f
1522 dunkaist 202
        mov  al,  byte[g_w]
203
        dec  al
1518 dunkaist 204
      @@:
205
         jmp Snake_move
206
 
207
      .to_down:
208
        mov  [snake_napravlenie],   DOWN
209
        mov  ax,  [edx]
210
        inc  ah
1522 dunkaist 211
        cmp  ah,  byte[g_h]
1518 dunkaist 212
         jne @f
213
        mov  ah,  0
214
      @@:
215
         jmp Snake_move
216
 
217
      .to_up:
218
        mov  [snake_napravlenie],   UP
219
        mov  ax,  [edx]
220
        dec  ah
221
        cmp  ah,  -1
222
         jne @f
1522 dunkaist 223
        mov  ah,  byte[g_h]
224
        dec  ah
1518 dunkaist 225
      @@:
226
         jmp Snake_move
227
 
228
      .to_right:
229
        mov  [snake_napravlenie],   RIGHT
230
        mov  ax,  [edx]
231
        inc  al
1522 dunkaist 232
        cmp  al,  byte[g_w]
1518 dunkaist 233
         jne @f
234
        mov  al,  0
235
      @@:
236
         jmp Snake_move
237
 
238
    ;;---Level_body--------------------------------------------------------------------------------------------------------
239
 
240
;;---Level_mode----------------------------------------------------------------------------------------------------------------
241
 
242
 
243
;;===Some_functions============================================================================================================
244
 
245
Draw_snake:
246
    ;;===Draw_snake========================================================================================================
247
 
248
      call      Draw_head_prehead
249
    mov  edx, [snake_color]
250
    mov  esi, snake_dots-6
251
    add  esi, [snake_length_x2]
252
 
253
  @@:
254
    mov  bx,  [esi]
255
    sub  esi, 2
256
      call      Draw_square
257
    cmp  esi, snake_dots-2
258
     jne @b
259
 
260
    ret
261
 
262
    ;;---Draw_snake--------------------------------------------------------------------------------------------------------
263
 
264
 
265
Draw_head_prehead:
266
    ;;===Draw_head_prehead=================================================================================================
267
 
268
    mov  edx, [snake_head_color]
269
    mov  esi, snake_dots-2
270
    add  esi, [snake_length_x2]
271
    mov  bx,  [esi]
272
      call      Draw_square
273
    sub  esi, 2
274
    mov  bx,  [esi]
275
    mov  edx, [snake_color]
276
      call      Draw_square
277
 
278
    ret
279
 
280
    ;;---Draw_head_prehead-------------------------------------------------------------------------------------------------
281
 
282
 
283
Draw_level_strings:
284
    ;;===Draw_level_strings================================================================================================
285
 
1522 dunkaist 286
    mov  ebx, [window_width]
287
    shr  ebx, 1
288
    sub  ebx, (string_resume_space-string_pause_space-1)*3+6
289
    shl  ebx, 16
290
    add  ebx, [top_strings]
291
      mcall     4, ,[navigation_strings_color],string_pause_space ; Draw 'PAUSE - SPACE' string
292
 
293
;    call    Draw_menu_esc
1518 dunkaist 294
    call    Draw_score_string
295
    call    Draw_score_number                   ; Draw score (number)
1522 dunkaist 296
    call    Draw_champion_string
297
    call    Draw_champion_name
1518 dunkaist 298
    call    Draw_hiscore_string
299
    call    Draw_hiscore_number
300
 
301
    ret
302
 
303
    ;;---Draw_level_strings------------------------------------------------------------------------------------------------
304
 
305
 
306
Reverse:
307
    ;;===Reverse===========================================================================================================
308
 
309
    mov  ecx, [snake_length_x2]
310
    shr  ecx, 2
311
    mov  esi, snake_dots
312
    mov  edi, snake_dots-2
313
    add  edi, [snake_length_x2]
314
 
315
  @@:
316
    mov  ax,  [edi]
317
    xchg ax,  [esi]
318
    mov  [edi], ax
319
 
320
    add  esi, 2
321
    sub  edi, 2
1522 dunkaist 322
    dec  cx
1518 dunkaist 323
     jnz @b
324
 
325
    ret
326
 
327
    ;;---Reverse-----------------------------------------------------------------------------------------------------------
328
 
329
 
330
Draw_eat:
331
    ;;===Draw_eat==========================================================================================================
332
 
333
    mov  bx,  word[eat]
334
    mov  edx, [eat_color]
335
 
336
    call    Draw_square
337
 
338
    ret
339
 
340
    ;;---Draw_eat----------------------------------------------------------------------------------------------------------
341
 
342
 
343
Get_eat:
344
    ;;===Get_eat===========================================================================================================
345
    ;;  in  :
346
    ;;
347
    ;;  out :
348
    ;;          ax  =   coord's of the eat square (al=x, ah=y)
349
    ;;
350
 
351
      mcall     26,9
352
;    xor  eax, esp
353
    shl  eax, 1
354
    xor  edx, edx
355
    div  word[number_of_free_dots]
356
    mov  ebx, field_map
357
 
358
  .loop:
359
    cmp  byte[ebx], 0
360
     jne @f
361
    test dx,  dx
362
     jz  .place_found
363
    dec  dx
364
  @@:
365
    inc  ebx
366
     jmp .loop
367
 
368
  .place_found:
369
    sub  ebx, field_map
370
    mov  eax, ebx
1522 dunkaist 371
    mov  bl,  byte[g_w]
1518 dunkaist 372
    div  bl
373
    xchg al,  ah
374
 
375
    mov  word[eat], ax
376
 
377
    ret
378
 
379
    ;;---Get_eat-----------------------------------------------------------------------------------------------------------
380
 
381
 
382
Sdvig:
383
    ;;===Sdvig=============================================================================================================
384
 
385
    mov  esi, snake_dots+2
386
    mov  edi, snake_dots
387
    mov  ecx, [snake_length_x2]
388
    shr  ecx, 1
389
 
390
    cld
391
    rep  movsw
392
 
393
    ret
394
 
395
    ;;---Sdvig-------------------------------------------------------------------------------------------------------------
396
 
397
 
398
Set_reverse_napravlenie:
399
    ;;===Set_reverse_napravlenie===========================================================================================
400
 
401
    mov  eax, snake_dots
402
    mov  ebx, snake_dots+2
403
 
404
    mov  cl,  [eax]                             ; The last dot x_coord
1522 dunkaist 405
    mov  ch,  [ebx]                             ; The pre_last dot x_coord
1518 dunkaist 406
 
1522 dunkaist 407
    cmp  cl,  ch
1518 dunkaist 408
     je  .X_ravny
409
 
410
    cmp  cl,  0
411
     jne .skip2
412
 
1522 dunkaist 413
    mov  dl,  byte[g_w]
414
    dec  dl
415
    cmp  ch,  dl
1518 dunkaist 416
     jne .Normal_y_ravny
1522 dunkaist 417
    mov  [snake_napravlenie_next],  RIGHT
1518 dunkaist 418
    ret
419
 
420
  .skip2:
1522 dunkaist 421
    mov  dl,  byte[g_w]
422
    dec  dl
423
    cmp  cl,  dl
1518 dunkaist 424
     jne .Normal_y_ravny
1522 dunkaist 425
    cmp  ch,  0
1518 dunkaist 426
     jne .Normal_y_ravny
1522 dunkaist 427
    mov  [snake_napravlenie_next],  LEFT
1518 dunkaist 428
    ret
429
 
430
  .Normal_y_ravny:
431
 
1522 dunkaist 432
    cmp  cl,  ch
1518 dunkaist 433
     jg  .Napravlenie_to_right
1522 dunkaist 434
    mov  [snake_napravlenie_next],  LEFT
1518 dunkaist 435
    ret
436
 
437
  .Napravlenie_to_right:
1522 dunkaist 438
    mov  [snake_napravlenie_next],  RIGHT
1518 dunkaist 439
    ret
440
 
441
  .X_ravny:
442
    inc  eax
443
    inc  ebx
444
    mov  cl,  [eax]
1522 dunkaist 445
    mov  ch,  [ebx]
1518 dunkaist 446
 
447
    cmp  cl,  0
448
     jne .skip3
449
 
1522 dunkaist 450
    mov  dl,  byte[g_h]
451
    dec  dl
452
    cmp  ch,  dl
1518 dunkaist 453
     jne .Normal_x_ravny
1522 dunkaist 454
    mov  [snake_napravlenie_next],  DOWN
1518 dunkaist 455
    ret
456
 
457
  .skip3:
1522 dunkaist 458
    mov  dl,  byte[g_h]
459
    dec  dl
460
    cmp  ch,  dl
1518 dunkaist 461
     jne .Normal_x_ravny
1522 dunkaist 462
    cmp  ch,  0
1518 dunkaist 463
     jne .Normal_x_ravny
1522 dunkaist 464
    mov  [snake_napravlenie_next],  UP
1518 dunkaist 465
    ret
466
 
467
  .Normal_x_ravny:
468
 
1522 dunkaist 469
    cmp  cl,  ch                                ; !!!
1518 dunkaist 470
     jg  .Napravlenie_to_down                   ; 0 1 2 ...
1522 dunkaist 471
    mov  [snake_napravlenie_next],  UP          ; 1
1518 dunkaist 472
    ret                                         ; 2
473
                                                ; .
474
  .Napravlenie_to_down:                         ; .
1522 dunkaist 475
    mov  [snake_napravlenie_next],  DOWN        ; .
1518 dunkaist 476
 
477
    ret
478
 
479
    ;;---Set_reverse_napravlenie-------------------------------------------------------------------------------------------
480
 
481
 
482
Snake_move:
483
    ;;===Snake_move========================================================================================================
484
    ;;  in  :
485
    ;;           ax =   coord's of new head
486
    ;;          edx =   snake_dots+[snake_length_x2]-2 (snake head)
487
    ;;
488
 
489
    add  edx, 2
490
    mov  [edx], ax
491
    cmp  ax,  word[eat]
492
     jne .eat_and_new_head_are_different
493
 
494
    add  [snake_length_x2], 2
495
    add  [score],   SCORE_EAT
496
    dec  word[number_of_free_dots]
497
    cmp  word[number_of_free_dots], 0
498
     je  Game_over
499
    mov  ax,  word[eat]
500
    mov  cl,  1
501
      call      Draw_on_map
502
      call      Draw_head_prehead
503
      call      Get_eat
504
      call      Draw_eat
505
 
506
     jmp Keys_done
507
 
508
 
509
  .eat_and_new_head_are_different:
510
 
1522 dunkaist 511
    push ax
512
 
513
    mov  ax,  word[snake_dots]
514
    mov  cl,  0
515
      call      Draw_on_map
1518 dunkaist 516
 
1522 dunkaist 517
    pop ax
518
 
1518 dunkaist 519
      call      Get_from_map
520
    test bl,  bl
521
     jnz Game_over
522
 
523
    mov  cl,  1
524
      call      Draw_on_map
525
 
526
    mov  bx,  word[snake_dots]
527
    mov  edx, [background_color]
528
      call      Draw_square
1522 dunkaist 529
 
1518 dunkaist 530
      call      Sdvig
531
 
532
      call      Draw_head_prehead
533
 
534
 
535
  Keys_done:
536
 
537
    cmp  [score],   0
538
     je  @f
539
    dec  [score]
540
      call      Draw_score_number
541
  @@:
542
      mcall     26, 9
543
    mov  [time_before_waiting], eax
544
    mov  eax, [time_wait_limit]
545
    mov  [time_to_wait],    eax
1522 dunkaist 546
     jmp Level_body.still
1518 dunkaist 547
 
1522 dunkaist 548
    ;;---Snake_move------------------------------------------------------------------------------------------------------------
1518 dunkaist 549
 
550
;;---Some_functions------------------------------------------------------------------------------------------------------------