-
Notifications
You must be signed in to change notification settings - Fork 36
/
game.asm
424 lines (318 loc) · 12.2 KB
/
game.asm
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
;;=============================================================================;;
;; ;;
;; Balloon Shooting Game ;;
;; ;;
;; ;;
;; ;;
;; Md. Rezve Hasan 13141103056 ;;
;; ;;
;; ;;
;;=============================================================================;;
.model large
.data
exit db 0
player_pos dw 1760d ;position of player
arrow_pos dw 0d ;position of arrow
arrow_status db 0d ;0 = arrow ready to go else not
arrow_limit dw 22d ;150d
loon_pos dw 3860d ;3990d
loon_status db 0d
;direction of player
;up=8, down=2
direction db 0d
state_buf db '00:0:0:0:0:0:00:00$' ;score veriable
hit_num db 0d
hits dw 0d
miss dw 0d
game_over_str dw ' ',0ah,0dh
dw ' | |',0ah,0dh
dw ' |---------------|',0ah,0dh
dw ' | ^ Score ^ |',0ah,0dh
dw ' |_______________|',0ah,0dh
dw ' ',0ah,0dh
dw ' ',0ah,0dh
dw ' ',0ah,0dh
dw ' ',0ah,0dh
dw ' ',0ah,0dh
dw ' ',0ah,0dh
dw ' Game Over',0ah,0dh
dw ' Press Enter to start again$',0ah,0dh
game_start_str dw ' ',0ah,0dh
dw ' ',0ah,0dh
dw ' ',0ah,0dh
dw ' ',0ah,0dh
dw ' ====================================================',0ah,0dh
dw ' || ||',0ah,0dh
dw ' || * Balloon Shooting Game * ||',0ah,0dh
dw ' || ||',0ah,0dh
dw ' ||--------------------------------------------------||',0ah,0dh
dw ' || ||',0ah,0dh
dw ' || ||',0ah,0dh
dw ' || ||',0ah,0dh
dw ' || Use up and down key to move player ||',0ah,0dh
dw ' || and space button to shoot ||',0ah,0dh
dw ' || ||',0ah,0dh
dw ' || Press Enter to start ||',0ah,0dh
dw ' || ||',0ah,0dh
dw ' || ||',0ah,0dh
dw ' ====================================================',0ah,0dh
dw '$',0ah,0dh
.code
main proc
mov ax,@data
mov ds,ax
mov ax, 0B800h
mov es,ax
jmp game_menu ;display main menu
main_loop: ;update logic and display everything
;check any key is pressed
mov ah,1h
int 16h ;go if pressed
jnz key_pressed
jmp inside_loop ;or just continue
inside_loop: ;checking every thing
cmp miss,9 ;if baloon miss 9 times.go to game over section
jge game_over
mov dx,arrow_pos ;checking collitions
cmp dx, loon_pos
je hit
cmp direction,8d ;update player position
je player_up
cmp direction,2d ;up or down based on direction veriable
je player_down
mov dx,arrow_limit ;hide arrow
cmp arrow_pos, dx
jge hide_arrow
cmp loon_pos, 0d ;check missed loon
jle miss_loon
jne render_loon
hit: ;play sound if hit
mov ah,2
mov dx, 7d
int 21h
inc hits ;update score
lea bx,state_buf ;display score
call show_score
lea dx,state_buf
mov ah,09h
int 21h
mov ah,2 ;new line
mov dl, 0dh
int 21h
jmp fire_loon ;new loon pops up
render_loon: ;draw loon
mov cl, ' ' ;hide old loon
mov ch, 1111b
mov bx,loon_pos
mov es:[bx], cx
sub loon_pos,160d ;and draw new one in new position
mov cl, 15d
mov ch, 1101b
mov bx,loon_pos
mov es:[bx], cx
cmp arrow_status,1d ;check any arrow to rander
je render_arrow
jne inside_loop2
render_arrow: ;render arrow
mov cl, ' '
mov ch, 1111b
mov bx,arrow_pos ;hide old position
mov es:[bx], cx
add arrow_pos,4d ;draw new position
mov cl, 26d
mov ch, 1001b
mov bx,arrow_pos
mov es:[bx], cx
inside_loop2:
mov cl, 125d ;draw player
mov ch, 1100b
mov bx,player_pos
mov es:[bx], cx
cmp exit,0
je main_loop ;end main loop
jmp exit_game
jmp inside_loop2
player_up: ;hide player old position
mov cl, ' '
mov ch, 1111b
mov bx,player_pos
mov es:[bx], cx
sub player_pos, 160d ;set new postion of player
mov direction, 0
jmp inside_loop2 ;it will draw in main loop
player_down:
mov cl, ' ' ;same as player up
mov ch, 1111b ;hide old one and set new postion
mov bx,player_pos
mov es:[bx], cx
add player_pos,160d ;and main loop draw that
mov direction, 0
jmp inside_loop2
key_pressed: ;input hanaling section
mov ah,0
int 16h
cmp ah,48h ;go upKey if up button is pressed
je upKey
cmp ah, 50h
je downKey
cmp ah,39h ;go spaceKey if up button is pressed
je spaceKey
cmp ah,4Bh ;go leftKey (this is for debuging)
je leftKey
;if no key is pressed go to inside of loop
jmp inside_loop
leftKey: ;we use it for debuging
;jmp game_over
inc miss
lea bx,state_buf
call show_score
lea dx,state_buf
mov ah,09h
int 21h
mov ah,2
mov dl, 0dh
int 21h
jmp inside_loop
upKey: ;set player direction to up
mov direction, 8d
jmp inside_loop
downKey:
mov direction, 2d ;set player direction to down
jmp inside_loop
spaceKey: ;shoot a arrow
cmp arrow_status,0
je fire_arrow
jmp inside_loop
fire_arrow: ;set arrow postion in player position
mov dx, player_pos ;so arrow fire from player postion
mov arrow_pos, dx
mov dx,player_pos ;when fire an arrow it also set limit
mov arrow_limit, dx ;of arrow. where it should be hide
add arrow_limit, 22d ;150
mov arrow_status, 1d ;set arrow status.It prevents multiple
jmp inside_loop ;shooting
miss_loon:
add miss,1 ;update score
lea bx,state_buf ;display score
call show_score
lea dx,state_buf
mov ah,09h
int 21h
;new line
mov ah,2
mov dl, 0dh
int 21h
jmp fire_loon
fire_loon: ;fire new balloon
mov loon_status, 1d
mov loon_pos, 3860d ;3990d
jmp render_loon
hide_arrow:
mov arrow_status, 0 ;hide arrow
mov cl, ' '
mov ch, 1111b
mov bx,arrow_pos
mov es:[bx], cx
cmp loon_pos, 0d
jle miss_loon
jne render_loon
jmp inside_loop2
;print game over screen
game_over:
mov ah,09h
;mov dh,0
mov dx, offset game_over_str
int 21h
mov cl, ' ' ;hide last of screen balloon
mov ch, 1111b
mov bx,arrow_pos
mov cl, ' ' ;hide player
mov ch, 1111b
mov bx,player_pos
;reset value ;update veriable for start again
mov miss, 0d
mov hits,0d
mov player_pos, 1760d
mov arrow_pos, 0d
mov arrow_status, 0d
mov arrow_limit, 22d ;150d
mov loon_pos, 3860d ;3990d
mov loon_status, 0d
mov direction, 0d
;wait for input
input:
mov ah,1
int 21h
cmp al,13d
jne input
call clear_screen
jmp main_loop
game_menu:
;game menu screen
mov ah,09h
mov dh,0
mov dx, offset game_start_str
int 21h
;wait for input
input2:
mov ah,1
int 21h
cmp al,13d
jne input2
call clear_screen
lea bx,state_buf ;display score
call show_score
lea dx,state_buf
mov ah,09h
int 21h
mov ah,2
mov dl, 0dh
int 21h
jmp main_loop
exit_game: ;end of our sweet game :)
mov exit,10d
main endp
;;--------------------------------------------------------------------;;
;; ;;
;; show score in same postion on screen ;;
;; using base pointer to get segment of veriable ;;
;; ;;
;;____________________________________________________________________;;
proc show_score
lea bx,state_buf
mov dx, hits
add dx,48d
mov [bx], 9d
mov [bx+1], 9d
mov [bx+2], 9d
mov [bx+3], 9d
mov [bx+4], 'H'
mov [bx+5], 'i'
mov [bx+6], 't'
mov [bx+7], 's'
mov [bx+8], ':'
mov [bx+9], dx
mov dx, miss
add dx,48d
mov [bx+10], ' '
mov [bx+11], 'M'
mov [bx+12], 'i'
mov [bx+13], 's'
mov [bx+14], 's'
mov [bx+15], ':'
mov [bx+16], dx
ret
show_score endp
;;--------------------------------------------------------------------;;
;; ;;
;; Clear the sceen ;;
;; Just set new text mood for avoiding complexicity ;;
;; ;;
;;____________________________________________________________________;;
clear_screen proc near
mov ah,0
mov al,3
int 10h
ret
clear_screen endp
end main