-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathgame.asm
More file actions
1291 lines (1272 loc) · 26.3 KB
/
Copy pathgame.asm
File metadata and controls
1291 lines (1272 loc) · 26.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
; Copyleft (c) 2007,God reserved all rights.
;
; 文件名称:game.asm
;
; 当前版本:0.13
; 作 者:邹伟
; 摘 要:各主要子程序都在此间
; 说 明:程序中用于输出字符的位置未加说明则默认为相对于游戏区域左上角即(GM_LEFT,GM_TOP)
public setDSAndES , GA_gameInit , GA_gameCircle , stackPoint
extern main_quit:far,restart_the_game:far
include game.h
;设置块坐标的宏
assignPos macro x,y
mov (Brick ptr [si]).b_sPos.pos_bX,x
mov (Brick ptr [si]).b_sPos.pos_bY,y
add si,size Brick
endm
assignBase macro x,y
mov (ManyBrick ptr [di]).mb_sPos.pos_bX,x
mov (ManyBrick ptr [di]).mb_sPos.pos_bY,y
endm
assume cs:GameCode,ds:MainData,ss:StackSpase
GameCode segment
;游戏循环---不断获取输入,根据与定义规则合理的转化为输出
GA_gameCircle proc far
GA_gameCircle_again:
mov dir,KEY_WRONG_DIR
lea bx,levelFPS
mov di,level
add di,challenge
cmp di,LEVEL_LIMITT
jbe level_ok
mov di,LEVEL_LIMITT
level_ok:
shl di,1
mov cx,[bx+di]
wast_time:
call delay
cmp dir,KEY_WRONG_DIR
je may_be_life_is_long
call Brick_goNext
mov dir,KEY_WRONG_DIR
call ManyBrick_drawSelf
may_be_life_is_long:
loop wast_time
cmp dir,KEY_WRONG_DIR
jz user_press_no_dir_key
call Brick_goNext
user_press_no_dir_key:
mov dir,DIR_DOWN
call Brick_goNext
cmp game.ga_state,GS_OVER
jz GA_over
call ManyBrick_drawSelf
jmp GA_gameCircle_again
GA_over:
call doGameOver
ret
GA_gameCircle endp
;每次游戏开始时的初始化调用
GA_gameInit proc far
call clrScreen
;hide the cursor
mov ch,020h
mov cl,020h
mov ah,01h
int 10h
;初始化随机序列的第一个数,读取BIOS提供的当前秒
xor al,al
out 70h,al
in ax,71h
mov seed,ax
;初始化,如:得分,游戏状态,游戏地图
mov challenge,0
mov game.ga_score,0
mov game.ga_state,GS_RUNNING
lea di,game.ga_map
mov cx,GM_HEIGHT
cld
xor ax,ax
rep stosw
mov nextNO,0
call MB_gernicNext
call MB_gernicNext
call drawNextBrick
call moreBeautiful
;show some strings
mov si,offset scoreStr
mov dl,X_SCORE_STR
mov dh,Y_SCORE_STR
mov cx,6
call showStr
mov si,offset levelStr
mov dl,X_LEVEL_STR
mov dh,Y_LEVEL_STR
mov cx,6
call showStr
mov si,offset levelDeltStr
mov dl,X_adjustLevelDelt_STR
mov dh,Y_adjustLevelDelt_STR
mov cx,10
call showStr
mov si,offset modeStr
mov dl,X_MODE_STR
mov dh,Y_MODE_STR
mov cx,10
call showStr
mov si,offset usageStr
mov dl,-GM_LEFT
mov dh,-4
mov cx,usageStrCNT
call showStr
mov si,offset usageStrEx
mov dl,-GM_LEFT
mov dh,-3
mov cx,usageStrExCNT
call showStr
mov si,offset linkToCoderStr
mov dl,-GM_LEFT
mov dh,-2
mov cx,linkToCoderCNT
call showStr
;show some digitials
call showScore
call calcLevel
call showadjustLevelDelt
call showMode
ret
GA_gameInit endp
;全局初始化,调用一次,设置DS,ES指向同一个数据段,程序运行过程中不再改变
setDSAndES proc far
mov ax,MainData
mov ds,ax
mov es,ax
ret
setDSAndES endp
;判断游戏区域(dl,dh)位置是否为空
;in : dl-->x, dh-->y
;out : flag register
isPosNotEmpty proc
push dx
push bx
push ax
push cx
push di
push si
mov si,curMB
mov si,(ManyBrick ptr [si]).mb_bCnt
;ax--mask,第dl位置1
mov ax,1
mov cl,dl
shl ax,cl
lea di,game.ga_map
;map+2*dh
xor bh,bh
mov bl,dh
shl bl,1
only_one_brick:
and ax,[bx+di]
je is_pos_empty_out
cmp si,1
jne is_pos_empty_out
cmp bx,(2*GM_HEIGHT-2)
je is_pos_empty_out_pre
add bx,2
jmp only_one_brick
;ensure the result is correct
is_pos_empty_out_pre:
cmp bx,0
is_pos_empty_out:
pop si
pop di
pop cx
pop ax
pop bx
pop dx
ret
isPosNotEmpty endp
;判断游戏是否结束
isGameOver proc
push bx
mov bx,curMB
cmp (ManyBrick ptr [bx]).mb_sPos.pos_bY,Y_START
jne still_alive
;游戏的确结束了
mov game.ga_state,GS_OVER
call doGameOver
still_alive:
pop bx
ret
isGameOver endp
;游戏结束后,调用此过程,显示一些提示信息,待等用户下一步指示,重玩或退出
doGameOver proc
call clrScreen
call moreBeautiful
mov si,offset gameOverStr
mov cx,45
mov dl,X_GAME_OVER ;x
mov dh,Y_GAME_OVER ;y
call showStr
mov ax,game.ga_score
mov cx,43
call AXModCX
and ax,3
mov di,ax
shl di,1
mov cx,judgeCnt[di]
mov si,judgeTable[di]
mov dl,X_JUDGE_STR
mov dh,Y_JUDGE_STR
call showStr
mov al,CHAR_BRICK
wait_for_restart:
call randomDraw
call delay
jmp wait_for_restart
ret
doGameOver endp
;in : ax--ax0, cx--cx0
;out: ax=ax0/cx0, cx=ax0%cx0
AXModCX proc
push dx
xor dx,dx
div cx
mov cx,dx
pop dx
ret
AXModCX endp
;信手涂鸦
randomDraw proc
push dx
push bx
push ax
call getRand
mov cx,GM_WIDTH
call AXModCX
mov dl,cl
call getRand
mov cx,GM_HEIGHT
call AXModCX
mov dh,cl
call getRand
and al,7
or al,8
mov bl,al
pop ax
call drawBrick
pop bx
pop dx
ret
randomDraw endp
;游戏暂停时调用此过程,显示提示信息,按任意键继续
doGamePaused proc
push si
push cx
push dx
push ax
mov si,offset gamePausedStr
mov cx,46 ;46 chars
mov dl,0 ;x
mov dh,GM_HEIGHT/2;y
call showStr
call waitForKeyPress
mov game.ga_state,GS_RUNNING
mov dl,0
mov dh,GM_HEIGHT/2
mov al,CHAR_CLEAR
mov cx,46 ;46 chars
erase_paused_words:
mov bl,COLOR_CLEAR
call drawBrick
inc dl
loop erase_paused_words
call moreBeautiful
call drawMap
call ManyBrick_drawSelf
pop ax
pop dx
pop cx
pop si
ret
doGamePaused endp
;clear the screen
clrScreen proc
push ax
mov ah,00h
mov al,03h
int 10h
pop ax
ret
clrScreen endp
;游戏完成时跳转到此,表示对极富耐心者的景仰^_^,并退出游戏
doGameFinished:
call clrScreen
call moreBeautiful
mov si,offset gameFinishedStr
mov cx,58 ;58 chars
mov dl,-GM_LEFT+5
mov dh,-2
call showStr
dGF_keybuf_empty:
call getRand
call randomDraw
mov ah,1
int 16h
jz dGF_keybuf_empty
jmp main_quit
;等待直到有键被按下
waitForKeyPress proc
push ax
key_buf_empty:
mov ah,1
int 16h
jz key_buf_empty
;ignore the key just press
mov ah,0
int 16h
pop ax
ret
waitForKeyPress endp
;方块下落停止时,设置当前下落方块所占用的地图位置,并消除满行
lastBattle proc
call ManyBrick_setMap
call checkFull
ret
lastBattle endp
;若map数组相应为置位 则在相应位置显示一个方块
drawMap proc
push ax
push dx
push bx
push cx
push si
push di
lea si,game.ga_map
mov cx,GM_HEIGHT
xor dh,dh
drawMap_outer:
push cx
mov cx,GM_WIDTH
xor dl,dl
mov di,1
push si
mov si,[si]
mov ah,3
drawMap_inner:
mov bl,3
sub bl,ah
mov ah,bl
test si,di
jz clear_it
;draw a brick
mov al,CHAR_BRICK
mov bl,COLOR_DIED_BRICK
jmp draw_map_over
clear_it:
cmp mode,2
jne ignor_background
mov al,'|'
mov bl,ah
jmp draw_map_over
ignor_background:
mov al,CHAR_CLEAR
mov bl,COLOR_CLEAR
draw_map_over:
call drawBrick
inc dl
shl di,1
loop drawMap_inner
pop si
pop cx
add si,2
inc dh
loop drawMap_outer
pop di
pop si
pop cx
pop bx
pop dx
pop ax
ret
drawMap endp
;检查是否有满行的情况,满则消除,并增加得分...
checkFull proc
push ax
push bx
push cx
push dx
xor dx,dx ;此次能消除的行数
lea bx,game.ga_map
add bx,2*(GM_HEIGHT-1)
mov cx,GM_HEIGHT
check_full_again:
mov ax,[bx]
cmp ax,GM_MASK
jne brick_not_full
inc dx
call mapScrollDown
loop check_full_again
brick_not_full:
sub bx,2
loop check_full_again
test dx,dx
jz get_zero_score
;此次得分:2*行数-1
shl dx,1
dec dx
add game.ga_score,dx
call calcLevel
call showScore
get_zero_score:
pop dx
pop cx
pop bx
pop ax
ret
checkFull endp
;根据得分计算当前关数
calcLevel proc
push ax
push bx
push cx
mov bx,offset levelScoreLast
xor ah,ah
mov cx,LEVEL_LIMITT
add_level_again:
mov al,[bx]
cmp game.ga_score,ax
jae calc_level_out
dec bx
loop add_level_again
calc_level_out:
mov level,cx
cmp level,LEVEL_LIMITT
jb game_unfinished
add sp,6
jmp doGameFinished
game_unfinished:
call showLevel
pop cx
pop bx
pop ax
ret
calcLevel endp
;显示当前关
showLevel proc
push dx
push bx
push ax
mov bl,COLOR_NUMBER
mov dl,X_LEVEL_POS
mov dh,Y_LEVEL_POS
mov ax,level
call showInt
pop ax
pop bx
pop dx
ret
showLevel endp
;显示当前得分
showScore proc
push dx
push bx
push ax
mov bl,COLOR_NUMBER
mov dl,X_SCORE_POS
mov dh,Y_SCORE_POS
mov ax,game.ga_score
call showInt
pop ax
pop bx
pop dx
ret
showScore endp
;显示当前自动提升的关数
showAdjustLevelDelt proc
push dx
push bx
push ax
mov bl,COLOR_NUMBER
mov dl,X_adjustLevelDelt_POS
mov dh,Y_adjustLevelDelt_POS
mov ax,challenge
call showInt
pop ax
pop bx
pop dx
ret
showAdjustLevelDelt endp
showMode proc
push dx
push bx
push ax
mov bl,COLOR_NUMBER
mov dl,X_MODE_POS
mov dh,Y_MODE_POS
mov ax,mode
call showInt
call drawMap
pop ax
pop bx
pop dx
ret
ret
showMode endp
;在(dl,dh)为起始的位置显示ax中的一个整数
;in : ax--the integer to be show
; dl--x , dh--y;
showInt proc
push cx
push si
push di
xor di,di
mov cx,10
show_int_again:
inc di
push dx
xor dx,dx
;dx:ax /cx, ax ,dx
div cx
mov si,ax
mov al,dl
pop dx
add al,30h
call drawBrick
dec dl
mov ax,si
cmp ax,0
jnz show_int_again
cmp di,1
jne no_need_to_clear
mov al,CHAR_CLEAR
push bx
mov bl,COLOR_CLEAR
call drawBrick
pop bx
no_need_to_clear:
pop di
pop si
pop cx
ret
showInt endp
;在(X_NEXT_BRICK,Y_NEXT_BRICK)处显示下一个将要下落的方块s
drawNextBrick proc
push bx
push dx
;first clear the last draw
mov bx,curMB
mov dx,WORD ptr (ManyBrick ptr [bx]).mb_sPos.pos_bX
mov (ManyBrick ptr [bx]).mb_sPos.pos_bX ,X_NEXT_BRICK
mov (ManyBrick ptr [bx]).mb_sPos.pos_bY ,Y_NEXT_BRICK
call ManyBrick_clearCur
mov WORD ptr (ManyBrick ptr [bx]).mb_sPos.pos_bX,dx
;second draw the next-brick
mov bx,nextMB
mov dx,WORD ptr (ManyBrick ptr [bx]).mb_sPos.pos_bX
mov (ManyBrick ptr [bx]).mb_sPos.pos_bX ,X_NEXT_BRICK
mov (ManyBrick ptr [bx]).mb_sPos.pos_bY ,Y_NEXT_BRICK
xchg bx,curMB
call ManyBrick_drawSelf
xchg curMB,bx
mov WORD ptr (ManyBrick ptr [bx]).mb_sPos.pos_bX,dx
pop dx
pop bx
ret
drawNextBrick endp
;游戏区域对应map数组在bx行处下卷,即清除bx所在行
;in: bx --the line to be clear
mapScrollDown proc
push bx
push ax
push cx
dec cx
je scroll_over
push si
push di
mov di,bx
lea si,[di-2]
std
rep movsw
pop di
pop si
scroll_over:
mov game.ga_map,0
call drawMap
pop cx
pop ax
pop bx
ret
mapScrollDown endp
;根据当前下落的方块所在位置设置游戏区域所代表的map数组
ManyBrick_setMap proc
push ax
push bx
push cx
push dx
push si
push di
push bp
lea di,game.ga_map
mov bx,curMB
mov cx,(ManyBrick ptr [bx] ).mb_bCnt
lea si,(ManyBrick ptr [bx] ).mb_sBrick
lea bp,(ManyBrick ptr [bx]).mb_sPos
setMap_again:
mov dh,(Brick ptr [si]).b_sPos.pos_bY
add dh,ds:(Pos ptr[bp]).pos_bY
mov dl,(Brick ptr [si]).b_sPos.pos_bX
add dl,ds:(Pos ptr[bp]).pos_bX
call isPosLeagel
js setMap_ignore
cmp dh,0
js setMap_ignore
;map[dh]
mov bl,dh
shl bl,1
xor bh,bh
;bx--&map[dh]
lea bx,[bx+di]
mov ax,1
push cx
mov cl,dl
shl ax,cl
pop cx
or [bx],ax
setMap_ignore:
add si,size Brick
loop setMap_again
cmp mode,0
jz color_stay
call drawMap
color_stay:
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
ManyBrick_setMap endp
;接受用户输入,并转化为内部数据,有的立即响应,如:ESC退出
processUserInput proc
push ax
push bx
push cx
mov ah,1
int 16h
jz just_ignore
cmp game.ga_state,GS_OVER
jnz no_need_to_restart
jmp restart_the_game
no_need_to_restart:
mov ah,0
int 16h
cmp ah,KEY_ESC
jnz gameCont
;quit the game
jmp main_quit
gameCont:
cmp ah,KEY_PAUSE
jz away_for_a_while
cmp ah,KEY_QUICKLY
jz go_quickly
cmp ah,KEY_SLOW_DOWN
jz go_slow_down
cmp ah,KEY_LEFT
jz set_dir_left
cmp ah,KEY_RIGHT
jz set_dir_right
cmp ah,KEY_DOWN
jz set_dir_down
cmp ah,KEY_TURN
jz set_dir_turn
cmp ah,KEY_CHANG_MODE
jz set_mode
cmp ah,KEY_ROLATE
jnz just_ignore
set_dir_rolate:
mov dir,DIR_ROTATE
jmp just_ignore
set_dir_left:
mov dir,DIR_LEFT
jmp just_ignore
set_dir_right:
mov dir,DIR_RIGHT
jmp just_ignore
set_dir_turn:
mov dir,DIR_TURN
jmp just_ignore
set_mode:
inc mode
mov ax,mode
mov cx,3
call AXModCX
mov mode,cx
call showMode
jmp just_ignore
go_slow_down:
dec challenge
jmp adjustLevelDelt_adjust
go_quickly:
inc challenge
adjustLevelDelt_adjust:
and challenge,0fh
call showadjustLevelDelt
jmp just_ignore
away_for_a_while:
mov game.ga_state,GS_PAUSED
call doGamePaused
jmp just_ignore
set_dir_down:
mov dir,DIR_DOWN_COMPLETE
just_ignore:
pop cx
pop bx
pop ax
ret
processUserInput endp
;判断方块下一步是否能继续,不能则转updateGameState
Brick_goNext proc
push ax
push bx
push cx
push dx
push di
push si
mov si,dir
;shl si,1
mov bx,curMB
xor ax,ax
down_complete_agian:
mov cx,(ManyBrick ptr [bx]).mb_bCnt
lea di,(ManyBrick ptr [bx]).mb_sBrick
Brick_goNext_again:
;jc Brick_goNext_can
mov dl,(Brick ptr [di]).b_sPos.pos_bX
mov dh,(Brick ptr [di]).b_sPos.pos_bY
jmp cs:Brick_tryTable[si]
Brick_tryRight:
inc dl
jmp Brick_checkLegal
Brick_tryLeft:
dec dl
jmp Brick_checkLegal
Brick_tryDown:
inc dh
jmp Brick_checkLegal
Brick_tryTrun:
neg dl
jmp Brick_checkLegal
Brick_tryRotate:
xchg dl,dh
neg dh
Brick_checkLegal:
add dl,(ManyBrick ptr [bx]).mb_sPos.pos_bX
add dh,(ManyBrick ptr [bx]).mb_sPos.pos_bY
call isPosLeagel
js do_more_work
cmp dh,0
js go_next_check_again
;now 0<=dl<GM_WIDTH,0<=dh<GM_HEIGHT
call isPosNotEmpty
jne do_more_work
go_next_check_again:
add di,size Brick
loop Brick_goNext_again
cmp (ManyBrick ptr [bx]).mb_bCnt,1
jne more_than_one_brick
call drawMap
jmp clear_pre_brick_over
more_than_one_brick:
call ManyBrick_clearCur
clear_pre_brick_over:
jmp cs:Brick_goTable[si]
Brick_goRight_can:
inc (ManyBrick ptr [bx]).mb_sPos.pos_bX
jmp Brick_goNext_over
Brick_goLeft_can:
dec (ManyBrick ptr [bx]).mb_sPos.pos_bX
jmp Brick_goNext_over
Brick_goDown_can:
inc (ManyBrick ptr [bx]).mb_sPos.pos_bY
jmp Brick_goNext_over
Brick_goTrun_can:
call Brick_turn
jmp Brick_goNext_over
Brick_goRotate_can:
call Brick_rotate
jmp Brick_goNext_over
do_more_work:
;ignor the left or right or down_complete lead to death
cmp dir,DIR_DOWN
jne ring_up_and_ignore
call updateGameState
jmp Brick_goNext_over
ring_up_and_ignore:
mov ax,1
Brick_goNext_over:
cmp ax,0
jne Brick_go_over
cmp dir,DIR_DOWN_COMPLETE
je down_complete_agian
Brick_go_over:
pop si
pop di
pop dx
pop cx
pop bx
pop ax
ret
Brick_tryTable dw Brick_tryRight , Brick_tryLeft , Brick_tryDown , Brick_tryRotate , Brick_tryDown , Brick_tryTrun
Brick_GoTable dw Brick_goRight_can , Brick_goLeft_can , Brick_goDown_can , Brick_goRotate_can , Brick_goDown_can , Brick_goTrun_can
Brick_goNext endp
;在方块不能继续下落时,转到此,判断游戏结束,检查满行,产生新块等。
updateGameState proc
call isGameOver
cmp game.ga_state,GS_RUNNING
jne game_is_not_running
call lastBattle
call MB_gernicNext
call drawNextBrick
game_is_not_running:
ret
updateGameState endp
;旋转较为麻烦,单独成子程序
Brick_rotate proc
push bx
push cx
push di
push ax
mov bx,curMB
mov cx,(ManyBrick ptr [bx]).mb_bCnt
lea di,(ManyBrick ptr [bx]).mb_sBrick
Brick_rotate_again:
sub cx,1
jc Brick_rotate_over
;rotate it
neg (Brick ptr [di]).b_sPos.pos_bX
mov al,(Brick ptr [di]).b_sPos.pos_bY
xchg al,(Brick ptr [di]).b_sPos.pos_bX
mov (Brick ptr [di]).b_sPos.pos_bY,al
add di,size Brick
jmp Brick_rotate_again
Brick_rotate_over:
pop ax
pop di
pop cx
pop bx
ret
Brick_rotate endp
;同旋转,水平翻转也独立成子程序
Brick_turn proc
push bx
push cx
push di
push ax
mov bx,curMB
mov cx,(ManyBrick ptr [bx]).mb_bCnt
lea di,(ManyBrick ptr [bx]).mb_sBrick
Brick_turn_again:
sub cx,1
jc Brick_turn_over
;turn it
neg (Brick ptr [di]).b_sPos.pos_bX
add di,size Brick
jmp Brick_turn_again
Brick_turn_over:
pop ax
pop di
pop cx
pop bx
ret
Brick_turn endp
;随机生成下一个方块
MB_gernicNext proc
push ax
push bx
push cx
push si
push di
lea cx,mbArray
mov di,cx
mov ax,1
sub ax,nextNO
jnz cur_will_be_zero
add cx,size ManyBrick
jmp set_next_cur_over
cur_will_be_zero:
add di,size ManyBrick
set_next_cur_over:
mov curMB,cx
mov nextNO,ax
mov nextMB,di
;di----ManyBrick *
assignBase X_START,Y_START
call getRand
and al,07h ;ensure the brick's color is <=8 and >=1
jnz brick_color_ok
inc al
brick_color_ok:
or al,8
mov (ManyBrick ptr [di]).mb_bColor,al
mov (ManyBrick ptr [di]).mb_bCnt ,4
lea bx,(ManyBrick ptr [di]).mb_bCnt
;si---Brick *
lea si,(ManyBrick ptr [di]).mb_sBrick
call getRand
;now di is use for other
mov di,ax
call getProperIndex
shl di,1
jmp MB_gernicNext_jmpTable[di]
MBM_gernicNext_Style_0:
assignPos -1,0
assignPos 0,0
assignPos 1,0
assignPos 2,0
jmp MBM_gernicNext_over
MBM_gernicNext_Style_1:
assignPos 0,0
assignPos 1,0
assignPos 0,-1
assignPos 1,-1
jmp MBM_gernicNext_over
MBM_gernicNext_Style_2:
assignPos -1,0
assignPos 0,0
assignPos 1,0
assignPos 0,-1
jmp MBM_gernicNext_over
MBM_gernicNext_Style_3:
assignPos -1,0
assignPos 0,0
assignPos 0,-1
assignPos 1,-1
jmp MBM_gernicNext_over
MBM_gernicNext_Style_4:
assignPos 0,0
assignPos 0,-1
assignPos 0,-2
assignPos 1,0
jmp MBM_gernicNext_over
MBM_gernicNext_Style_5:
mov (ManyBrick ptr [bx]).mb_bCnt,1
assignPos 0,0
jmp MBM_gernicNext_over
MBM_gernicNext_Style_6:
mov (ManyBrick ptr [bx]).mb_bCnt,2
assignPos 0,0
assignPos 0,1
jmp MBM_gernicNext_over
MBM_gernicNext_Style_7:
mov (ManyBrick ptr [bx]).mb_bCnt,3
assignPos 0,0
assignPos -1,0
assignPos 1,0
jmp MBM_gernicNext_over
MBM_gernicNext_Style_8:
mov (ManyBrick ptr [bx]).mb_bCnt,3
assignPos 0,0
assignPos -1,0
assignPos 0,-1
jmp MBM_gernicNext_over
MBM_gernicNext_Style_9:
mov (ManyBrick ptr [bx]).mb_bCnt,2
assignPos 0,0
assignPos 1,-1
jmp MBM_gernicNext_over
;the next styles but style_F may more difficult
MBM_gernicNext_Style_A:
mov (ManyBrick ptr [bx]).mb_bCnt,3
assignPos 0,0
assignPos -1,0
assignPos 1,-1
jmp MBM_gernicNext_over
MBM_gernicNext_Style_B:
mov (ManyBrick ptr [bx]).mb_bCnt,3
assignPos -1,0
assignPos 1,0
assignPos 0,-1
jmp MBM_gernicNext_over
MBM_gernicNext_Style_C:
mov (ManyBrick ptr [bx]).mb_bCnt,3
assignPos 0,0
assignPos -1,1
assignPos 1,-1
jmp MBM_gernicNext_over
MBM_gernicNext_Style_D:
mov (ManyBrick ptr [bx]).mb_bCnt,4
assignPos 0,0
assignPos -1,0
assignPos -1,-1