forked from KolibriOS/kolibrios
905 lines
23 KiB
NASM
905 lines
23 KiB
NASM
|
; Initially written by CH@YKIN EVGENY, 2009
|
|||
|
; Then disassembled for fun by dunkaist, 2017
|
|||
|
use32
|
|||
|
org 0
|
|||
|
db 'MENUET01'
|
|||
|
dd 1
|
|||
|
dd start
|
|||
|
dd I_END
|
|||
|
dd stacktop
|
|||
|
dd stacktop
|
|||
|
dd 0, 0
|
|||
|
|
|||
|
include 'proc32.inc'
|
|||
|
include 'struct.inc'
|
|||
|
include 'macros.inc'
|
|||
|
include 'encoding.inc'
|
|||
|
|
|||
|
CLIENT_WIDTH = 300
|
|||
|
CLIENT_HEIGHT = 200
|
|||
|
|
|||
|
HEALTH_INIT = 24
|
|||
|
HEALTH_BONUS = 3
|
|||
|
HEALTH_LEVEL_UP = 297
|
|||
|
|
|||
|
BULLET_DAMAGE = 12
|
|||
|
BULLETS_CNT = 4
|
|||
|
|
|||
|
NOTE_DAMAGE = 0x31
|
|||
|
NOTE_SAVE = 0x63
|
|||
|
NOTE_WIN_0 = 0x36
|
|||
|
NOTE_WIN_1 = 0x35
|
|||
|
NOTE_WIN_2 = 0x31
|
|||
|
NOTE_LOST_0 = 0x0d
|
|||
|
NOTE_LOST_1 = 0x09
|
|||
|
NOTE_LOST_2 = 0x20
|
|||
|
|
|||
|
BULLET_SIZE = 7
|
|||
|
SHIELD_SIZE = 20
|
|||
|
|
|||
|
DELAY_INIT = 10
|
|||
|
DELAY_NOTE = 10
|
|||
|
|
|||
|
DELAYS_PER_GAME_STEP = 10
|
|||
|
|
|||
|
NW = 1 ; north west
|
|||
|
SW = 2
|
|||
|
NE = 3
|
|||
|
SE = 4
|
|||
|
|
|||
|
macro draw_bullet off_on, x, y {
|
|||
|
mov eax, 7
|
|||
|
mov ebx, _pic_bullet_#off_on
|
|||
|
mov ecx, (BULLET_SIZE SHL 16) + BULLET_SIZE
|
|||
|
mov edx, x
|
|||
|
imul edx, edx, 0x10000
|
|||
|
add edx, y
|
|||
|
mcall
|
|||
|
}
|
|||
|
|
|||
|
macro draw_shield side, x, y {
|
|||
|
mov eax, 7
|
|||
|
mov ebx, pic_shield_#side
|
|||
|
mov ecx, (SHIELD_SIZE SHL 16) + SHIELD_SIZE
|
|||
|
mov edx, x
|
|||
|
imul edx, edx, 0x10000
|
|||
|
add edx, y
|
|||
|
mcall
|
|||
|
}
|
|||
|
|
|||
|
macro play_note note {
|
|||
|
mov eax, note
|
|||
|
mov dword [speaker.note], eax
|
|||
|
mov eax, 55
|
|||
|
mov ebx, eax
|
|||
|
mov esi, speaker
|
|||
|
mcall
|
|||
|
}
|
|||
|
|
|||
|
start:
|
|||
|
mcall 48, 3, sys_colors, sizeof.system_colors
|
|||
|
jmp menu
|
|||
|
menu:
|
|||
|
mcall 10
|
|||
|
cmp eax, 1
|
|||
|
jz .redraw
|
|||
|
cmp eax, 2
|
|||
|
jz .button
|
|||
|
cmp eax, 3
|
|||
|
jz .key
|
|||
|
jmp menu
|
|||
|
.redraw:
|
|||
|
jmp .draw
|
|||
|
.button:
|
|||
|
mcall 2
|
|||
|
cmp ah, '1'
|
|||
|
jz .init_game
|
|||
|
cmp ah, '2'
|
|||
|
jz .resume_game
|
|||
|
jmp menu
|
|||
|
.init_game:
|
|||
|
mov eax, 13
|
|||
|
mov ebx, 0
|
|||
|
imul ebx, ebx, 0x10000
|
|||
|
add ebx, CLIENT_WIDTH
|
|||
|
mov ecx, 0
|
|||
|
imul ecx, ecx, 0x10000
|
|||
|
add ecx, CLIENT_HEIGHT
|
|||
|
mov edx, 0
|
|||
|
mcall
|
|||
|
mov [game_started], 0
|
|||
|
mov [shield_position], SE
|
|||
|
mov [finish_draw], 1
|
|||
|
mov [next_bullet_side_prng], 3
|
|||
|
mov [next_bullet_side], SE
|
|||
|
mov [bullet_1_pos], 1
|
|||
|
mov [bullet_2_pos], 2
|
|||
|
mov [bullet_3_pos], 3
|
|||
|
mov [bullet_4_pos], 4
|
|||
|
mov eax, NW
|
|||
|
mov [bullet_1_side], eax
|
|||
|
mov eax, SW
|
|||
|
mov [bullet_2_side], eax
|
|||
|
mov eax, NE
|
|||
|
mov [bullet_3_side], eax
|
|||
|
mov eax, SE
|
|||
|
mov [bullet_4_side], eax
|
|||
|
mov eax, 1
|
|||
|
mov [bullet_pos], eax
|
|||
|
mov eax, NW
|
|||
|
mov [bullet_side], eax
|
|||
|
mov eax, 1
|
|||
|
mov [cur_bullet], eax
|
|||
|
mov eax, 1
|
|||
|
mov [delays_cnt], eax
|
|||
|
mov eax, HEALTH_INIT
|
|||
|
mov [health], eax
|
|||
|
mov eax, DELAY_INIT
|
|||
|
mov [delay], eax
|
|||
|
jmp redraw_window
|
|||
|
.resume_game:
|
|||
|
mov eax, 13
|
|||
|
mov ebx, 0
|
|||
|
imul ebx, ebx, 0x10000
|
|||
|
add ebx, CLIENT_WIDTH
|
|||
|
mov ecx, 0
|
|||
|
imul ecx, ecx, 0x10000
|
|||
|
add ecx, CLIENT_HEIGHT
|
|||
|
mov edx, 0
|
|||
|
mcall
|
|||
|
jmp redraw_window
|
|||
|
.key:
|
|||
|
mcall 17
|
|||
|
cmp ah, 0x01 ; close button
|
|||
|
jnz menu
|
|||
|
.exit:
|
|||
|
mcall -1
|
|||
|
.draw:
|
|||
|
mov eax, [finish_draw]
|
|||
|
cmp eax, 1
|
|||
|
jz .draw.start
|
|||
|
jmp .draw.finish
|
|||
|
.draw.finish:
|
|||
|
mcall 12, 2
|
|||
|
jmp .draw.start
|
|||
|
.draw.start:
|
|||
|
mov eax, 0
|
|||
|
mov [finish_draw], eax
|
|||
|
mcall 12, 1
|
|||
|
mcall 48, 4
|
|||
|
mov [skin_height], eax
|
|||
|
mcall 48, 4
|
|||
|
mov [skin_height], eax
|
|||
|
mov eax, 0
|
|||
|
mov ebx, (100 SHL 16) + CLIENT_WIDTH + 10
|
|||
|
mov ecx, 100
|
|||
|
imul ecx, ecx, 0x10000
|
|||
|
add ecx, CLIENT_HEIGHT + 4
|
|||
|
add ecx, [skin_height]
|
|||
|
mov edx, 0x33000000
|
|||
|
mov edi, window_title
|
|||
|
mcall
|
|||
|
mov eax, 13
|
|||
|
mov ebx, 0
|
|||
|
imul ebx, ebx, 0x10000
|
|||
|
add ebx, CLIENT_WIDTH + 1
|
|||
|
mov ecx, 0
|
|||
|
imul ecx, ecx, 0x10000
|
|||
|
add ecx, CLIENT_HEIGHT
|
|||
|
mov edx, 0
|
|||
|
mcall
|
|||
|
mcall 4, (140 SHL 16) + 60, 0x10bbbbbb, msg_ataka, msg_ataka.size
|
|||
|
mcall 4, (140 SHL 16) + 61, 0x10bbbbbb, msg_ataka, msg_ataka.size
|
|||
|
mcall 4, (141 SHL 16) + 61, 0x10bbbbbb, msg_ataka, msg_ataka.size
|
|||
|
mcall 4, (141 SHL 16) + 60, 0x10bbbbbb, msg_ataka, msg_ataka.size
|
|||
|
mcall 4, ( 55 SHL 16) + 190, 0x10444444, msg_copyright, msg_copyright.size
|
|||
|
mov eax, 4
|
|||
|
mov ebx, (34 SHL 16) + 160
|
|||
|
mov ecx, 0x888888
|
|||
|
mov edx, msg_control_by_numpad
|
|||
|
mov esi, 40
|
|||
|
.print_line:
|
|||
|
mcall
|
|||
|
add ebx, 10 ; one line down
|
|||
|
add edx, 40
|
|||
|
cmp byte [edx], 'x'
|
|||
|
jnz .print_line
|
|||
|
mcall 4, (110 SHL 16) + 95, 0x10999999, msg_new_game, msg_new_game.size
|
|||
|
mov eax, [game_started]
|
|||
|
cmp eax, 0
|
|||
|
jz menu
|
|||
|
mcall 4, (110 SHL 16) + 110, 0x10999999, msg_continue, msg_continue.size
|
|||
|
jmp menu
|
|||
|
|
|||
|
redraw_window:
|
|||
|
mov eax, [finish_draw]
|
|||
|
cmp eax, 1
|
|||
|
jz redraw_window.start
|
|||
|
mcall 12, 2
|
|||
|
jmp redraw_window.start
|
|||
|
redraw_window.start:
|
|||
|
mov eax, 0
|
|||
|
mov [finish_draw], eax
|
|||
|
mcall 12, 1
|
|||
|
mcall 48, 4
|
|||
|
mov [skin_height], eax
|
|||
|
mov eax, 0
|
|||
|
mov ebx, (100 SHL 16) + CLIENT_WIDTH + 10
|
|||
|
mov ecx, 100
|
|||
|
imul ecx, ecx, 0x10000
|
|||
|
add ecx, CLIENT_HEIGHT + 4
|
|||
|
add ecx, [skin_height]
|
|||
|
mov edx, 0x33000000
|
|||
|
mov edi, window_title
|
|||
|
mcall
|
|||
|
jmp draw_field
|
|||
|
|
|||
|
game_loop:
|
|||
|
mov [game_started], 1
|
|||
|
mov eax, [health]
|
|||
|
cmp eax, HEALTH_LEVEL_UP
|
|||
|
jg level_up
|
|||
|
cmp eax, 0
|
|||
|
jl lost
|
|||
|
jmp game_alive
|
|||
|
level_up:
|
|||
|
mov eax, HEALTH_INIT
|
|||
|
mov [health], eax
|
|||
|
mov eax, [delay]
|
|||
|
cmp eax, 10 ; delay for level_0
|
|||
|
jz level_up_1
|
|||
|
mov eax, [delay]
|
|||
|
cmp eax, 8 ; delay for level_1
|
|||
|
jz level_up_2
|
|||
|
mov eax, [delay]
|
|||
|
cmp eax, 7
|
|||
|
jz level_up_3
|
|||
|
mov eax, [delay]
|
|||
|
cmp eax, 6
|
|||
|
jz level_up_4
|
|||
|
mov eax, [delay]
|
|||
|
cmp eax, 5
|
|||
|
jz level_up_5
|
|||
|
mov eax, [delay]
|
|||
|
cmp eax, 4
|
|||
|
jz level_up_6
|
|||
|
mov eax, [delay]
|
|||
|
cmp eax, 3
|
|||
|
jz win
|
|||
|
jmp game_alive
|
|||
|
lost:
|
|||
|
mcall 5, DELAY_NOTE
|
|||
|
play_note NOTE_LOST_0
|
|||
|
mcall 5, DELAY_NOTE
|
|||
|
play_note NOTE_LOST_1
|
|||
|
mcall 5, DELAY_NOTE
|
|||
|
play_note NOTE_LOST_2
|
|||
|
|
|||
|
mov [game_started], 0
|
|||
|
mcall 4, (105 SHL 16) + 100, 0xff0000, msg_you_lost, msg_you_lost.size
|
|||
|
mcall 5, 100
|
|||
|
mov eax, SE
|
|||
|
mov [shield_position], eax
|
|||
|
mov eax, 1
|
|||
|
mov [finish_draw], eax
|
|||
|
mov eax, 3
|
|||
|
mov [next_bullet_side_prng], eax
|
|||
|
mov eax, SE
|
|||
|
mov [next_bullet_side], eax
|
|||
|
mov eax, 1
|
|||
|
mov [bullet_1_pos], eax
|
|||
|
mov eax, 2
|
|||
|
mov [bullet_2_pos], eax
|
|||
|
mov eax, 3
|
|||
|
mov [bullet_3_pos], eax
|
|||
|
mov eax, 4
|
|||
|
mov [bullet_4_pos], eax
|
|||
|
mov eax, NW
|
|||
|
mov [bullet_1_side], eax
|
|||
|
mov eax, SW
|
|||
|
mov [bullet_2_side], eax
|
|||
|
mov eax, NE
|
|||
|
mov [bullet_3_side], eax
|
|||
|
mov eax, SE
|
|||
|
mov [bullet_4_side], eax
|
|||
|
mov eax, 1
|
|||
|
mov [bullet_pos], eax
|
|||
|
mov eax, NW
|
|||
|
mov [bullet_side], eax
|
|||
|
mov eax, 1
|
|||
|
mov [cur_bullet], eax
|
|||
|
mov eax, 1
|
|||
|
mov [delays_cnt], eax
|
|||
|
mov eax, HEALTH_INIT
|
|||
|
mov [health], eax
|
|||
|
mov eax, DELAY_INIT
|
|||
|
mov [delay], eax
|
|||
|
jmp menu.draw
|
|||
|
|
|||
|
level_up_1:
|
|||
|
mov eax, 8
|
|||
|
mov [delay], eax
|
|||
|
jmp game_alive
|
|||
|
level_up_2:
|
|||
|
mov eax, 7
|
|||
|
mov [delay], eax
|
|||
|
jmp game_alive
|
|||
|
level_up_3:
|
|||
|
mov eax, 6
|
|||
|
mov [delay], eax
|
|||
|
jmp game_alive
|
|||
|
level_up_4:
|
|||
|
mov eax, 5
|
|||
|
mov [delay], eax
|
|||
|
jmp game_alive
|
|||
|
level_up_5:
|
|||
|
mov eax, 4
|
|||
|
mov [delay], eax
|
|||
|
jmp game_alive
|
|||
|
level_up_6:
|
|||
|
mov eax, 3
|
|||
|
mov [delay], eax
|
|||
|
jmp game_alive
|
|||
|
win:
|
|||
|
mcall 5, DELAY_NOTE
|
|||
|
play_note NOTE_WIN_0
|
|||
|
mcall 5, DELAY_NOTE
|
|||
|
play_note NOTE_WIN_1
|
|||
|
mcall 5, DELAY_NOTE
|
|||
|
play_note NOTE_WIN_2
|
|||
|
|
|||
|
mcall 5, DELAY_NOTE
|
|||
|
|
|||
|
mov [game_started], 0
|
|||
|
mov eax, DELAY_INIT
|
|||
|
mov [delay], eax
|
|||
|
mcall 4, (105 SHL 16) + 100, 0xff0000, msg_you_won, msg_you_won.size
|
|||
|
mcall 5, 200
|
|||
|
jmp menu.draw
|
|||
|
|
|||
|
game_alive:
|
|||
|
; draw max health bar
|
|||
|
mov eax, 13
|
|||
|
mov ebx, 0
|
|||
|
imul ebx, ebx, 0x10000
|
|||
|
add ebx, CLIENT_WIDTH + 1
|
|||
|
mov ecx, 0
|
|||
|
imul ecx, ecx, 0x10000
|
|||
|
inc ecx
|
|||
|
mov edx, 0xff0000
|
|||
|
mcall
|
|||
|
; draw left health bar
|
|||
|
mov eax, 13
|
|||
|
mov ebx, 0
|
|||
|
imul ebx, ebx, 0x10000
|
|||
|
add ebx, [health]
|
|||
|
mov ecx, 0
|
|||
|
imul ecx, ecx, 0x10000
|
|||
|
inc ecx
|
|||
|
mov edx, 0x0000ff
|
|||
|
mcall
|
|||
|
mov eax, [next_bullet_side_prng]
|
|||
|
inc eax
|
|||
|
mov [next_bullet_side_prng], eax
|
|||
|
mov eax, [next_bullet_side_prng]
|
|||
|
cmp eax, 1
|
|||
|
jz ._1
|
|||
|
mov eax, [next_bullet_side_prng]
|
|||
|
cmp eax, 2
|
|||
|
jz ._2
|
|||
|
mov eax, [next_bullet_side_prng]
|
|||
|
cmp eax, 3
|
|||
|
jz ._3
|
|||
|
mov eax, [next_bullet_side_prng]
|
|||
|
cmp eax, 4
|
|||
|
jz ._4
|
|||
|
mov eax, [next_bullet_side_prng]
|
|||
|
cmp eax, 5
|
|||
|
jz ._5
|
|||
|
mov eax, [next_bullet_side_prng]
|
|||
|
cmp eax, 6
|
|||
|
jz ._6
|
|||
|
mov eax, [next_bullet_side_prng]
|
|||
|
cmp eax, 7
|
|||
|
jz ._7
|
|||
|
mov eax, [next_bullet_side_prng]
|
|||
|
cmp eax, 8
|
|||
|
jz ._8
|
|||
|
mov eax, [next_bullet_side_prng]
|
|||
|
cmp eax, 9
|
|||
|
jg ._9
|
|||
|
mov eax, 3
|
|||
|
mov [next_bullet_side], eax
|
|||
|
jmp check_event
|
|||
|
._1:
|
|||
|
mov eax, 1
|
|||
|
mov [next_bullet_side], eax
|
|||
|
jmp check_event
|
|||
|
._2:
|
|||
|
mov eax, 4
|
|||
|
mov [next_bullet_side], eax
|
|||
|
jmp check_event
|
|||
|
._3:
|
|||
|
mov eax, 3
|
|||
|
mov [next_bullet_side], eax
|
|||
|
jmp check_event
|
|||
|
._4:
|
|||
|
mov eax, 4
|
|||
|
mov [next_bullet_side], eax
|
|||
|
jmp check_event
|
|||
|
._5:
|
|||
|
mov eax, 1
|
|||
|
mov [next_bullet_side], eax
|
|||
|
jmp check_event
|
|||
|
._6:
|
|||
|
mov eax, 2
|
|||
|
mov [next_bullet_side], eax
|
|||
|
jmp check_event
|
|||
|
._7:
|
|||
|
mov eax, 1
|
|||
|
mov [next_bullet_side], eax
|
|||
|
jmp check_event
|
|||
|
._8:
|
|||
|
mov eax, 2
|
|||
|
mov [next_bullet_side], eax
|
|||
|
jmp check_event
|
|||
|
._9:
|
|||
|
mov eax, 3
|
|||
|
mov [next_bullet_side], eax
|
|||
|
mov eax, 1
|
|||
|
mov [next_bullet_side_prng], eax
|
|||
|
jmp check_event
|
|||
|
|
|||
|
check_event:
|
|||
|
mcall 5, [delay]
|
|||
|
mcall 11
|
|||
|
cmp eax, 1
|
|||
|
jz redraw_window
|
|||
|
cmp eax, 2
|
|||
|
jz .button
|
|||
|
cmp eax, 3
|
|||
|
jz .key
|
|||
|
jmp draw_field
|
|||
|
.key:
|
|||
|
mov al, 17
|
|||
|
mcall
|
|||
|
cmp ah, 1
|
|||
|
jnz draw_field
|
|||
|
mcall -1
|
|||
|
|
|||
|
.button:
|
|||
|
mov al, 2
|
|||
|
mcall
|
|||
|
cmp ah, 0xb0 ; arrow left / numpad 4
|
|||
|
jz .move_shield_tl
|
|||
|
cmp ah, 0xb5 ; end / numpad 1
|
|||
|
jz .move_shield_bl
|
|||
|
cmp ah, 0xb3 ; arrow right / numpad 6
|
|||
|
jz .move_shield_tr
|
|||
|
cmp ah, 0xb7 ; page down / numpad 3
|
|||
|
jz .move_shield_br
|
|||
|
cmp ah, 0xb0 ; never happens, fixme
|
|||
|
jz menu.draw
|
|||
|
cmp ah, 'p' ; 'p' for pause
|
|||
|
jz menu.draw
|
|||
|
cmp ah, '4'
|
|||
|
jz .move_shield_tl
|
|||
|
cmp ah, '1'
|
|||
|
jz .move_shield_bl
|
|||
|
cmp ah, '6'
|
|||
|
jz .move_shield_tr
|
|||
|
cmp ah, '3'
|
|||
|
jz .move_shield_br
|
|||
|
jmp draw_field
|
|||
|
.move_shield_tl:
|
|||
|
mov eax, 1
|
|||
|
mov [shield_position], eax
|
|||
|
jmp draw_field
|
|||
|
.move_shield_bl:
|
|||
|
mov eax, 2
|
|||
|
mov [shield_position], eax
|
|||
|
jmp draw_field
|
|||
|
.move_shield_tr:
|
|||
|
mov eax, 3
|
|||
|
mov [shield_position], eax
|
|||
|
jmp draw_field
|
|||
|
.move_shield_br:
|
|||
|
mov eax, 4
|
|||
|
mov [shield_position], eax
|
|||
|
jmp draw_field
|
|||
|
draw_field:
|
|||
|
mcall 18, 14
|
|||
|
; mcall 65, pic_bg, (CLIENT_WIDTH SHL 16) + CLIENT_HEIGHT, 0, 8, paletter, 0
|
|||
|
mov eax, 65
|
|||
|
mov ebx, pic_bg
|
|||
|
mov ecx, (CLIENT_WIDTH SHL 16) + CLIENT_HEIGHT
|
|||
|
mov edx, 0
|
|||
|
mov esi, 8 ; indexed image
|
|||
|
mov edi, palette
|
|||
|
mov ebp, 0
|
|||
|
mcall
|
|||
|
mov eax, [shield_position]
|
|||
|
cmp eax, NW
|
|||
|
jz .shield_nw
|
|||
|
cmp eax, SW
|
|||
|
jz .shield_sw
|
|||
|
cmp eax, NE
|
|||
|
jz .shield_ne
|
|||
|
cmp eax, SE
|
|||
|
jz .shield_se
|
|||
|
.shield_nw:
|
|||
|
draw_shield nw, 90, 70
|
|||
|
jmp draw_bullets
|
|||
|
.shield_sw:
|
|||
|
draw_shield sw, 90, 105
|
|||
|
jmp draw_bullets
|
|||
|
.shield_ne:
|
|||
|
draw_shield ne, CLIENT_HEIGHT, 70
|
|||
|
jmp draw_bullets
|
|||
|
.shield_se:
|
|||
|
draw_shield se, CLIENT_HEIGHT, 105
|
|||
|
jmp draw_bullets
|
|||
|
|
|||
|
draw_bullets: ; off
|
|||
|
draw_bullet off, 90, 70
|
|||
|
draw_bullet off, 75, 58
|
|||
|
draw_bullet off, 59, 46
|
|||
|
draw_bullet off, 89, 117
|
|||
|
draw_bullet off, 74, 129
|
|||
|
draw_bullet off, 56, 144
|
|||
|
draw_bullet off, 211, 68
|
|||
|
draw_bullet off, 224, 57
|
|||
|
draw_bullet off, 236, 46
|
|||
|
draw_bullet off, 210, 119
|
|||
|
draw_bullet off, 223, 131
|
|||
|
draw_bullet off, 237, 143
|
|||
|
jmp draw_bullets_on
|
|||
|
|
|||
|
draw_bullets_on:
|
|||
|
mov eax, [cur_bullet]
|
|||
|
cmp eax, 1
|
|||
|
jz ._1
|
|||
|
cmp eax, 2
|
|||
|
jz ._2
|
|||
|
cmp eax, 3
|
|||
|
jz ._3
|
|||
|
cmp eax, 4
|
|||
|
jz ._4
|
|||
|
._1:
|
|||
|
mov eax, [bullet_1_pos]
|
|||
|
mov [bullet_pos], eax
|
|||
|
mov eax, [bullet_1_side]
|
|||
|
mov [bullet_side], eax
|
|||
|
jmp bullet_on_defined
|
|||
|
._2:
|
|||
|
mov eax, [bullet_2_pos]
|
|||
|
mov [bullet_pos], eax
|
|||
|
mov eax, [bullet_2_side]
|
|||
|
mov [bullet_side], eax
|
|||
|
jmp bullet_on_defined
|
|||
|
._3:
|
|||
|
mov eax, [bullet_3_pos]
|
|||
|
mov [bullet_pos], eax
|
|||
|
mov eax, [bullet_3_side]
|
|||
|
mov [bullet_side], eax
|
|||
|
jmp bullet_on_defined
|
|||
|
._4:
|
|||
|
mov eax, [bullet_4_pos]
|
|||
|
mov [bullet_pos], eax
|
|||
|
mov eax, [bullet_4_side]
|
|||
|
mov [bullet_side], eax
|
|||
|
jmp bullet_on_defined
|
|||
|
|
|||
|
bullet_on_defined:
|
|||
|
mov eax, [bullet_side]
|
|||
|
cmp eax, NW
|
|||
|
jz bullet_nw
|
|||
|
cmp eax, SW
|
|||
|
jz bullet_sw
|
|||
|
cmp eax, NE
|
|||
|
jz bullet_ne
|
|||
|
cmp eax, SE
|
|||
|
jz bullet_se
|
|||
|
bullet_nw:
|
|||
|
mov eax, [bullet_pos]
|
|||
|
cmp eax, 1
|
|||
|
jz bullet_nw_dist._1
|
|||
|
cmp eax, 2
|
|||
|
jz bullet_nw_dist._2
|
|||
|
cmp eax, 3
|
|||
|
jz bullet_nw_dist._3
|
|||
|
cmp eax, 4
|
|||
|
jz bullet_nw_dist._4
|
|||
|
cmp eax, 5
|
|||
|
jz bullet_nw_dist._5
|
|||
|
bullet_sw:
|
|||
|
mov eax, [bullet_pos]
|
|||
|
cmp eax, 1
|
|||
|
jz bullet_sw_dist._1
|
|||
|
cmp eax, 2
|
|||
|
jz bullet_sw_dist._2
|
|||
|
cmp eax, 3
|
|||
|
jz bullet_sw_dist._3
|
|||
|
cmp eax, 4
|
|||
|
jz bullet_sw_dist._4
|
|||
|
cmp eax, 5
|
|||
|
jz bullet_sw_dist._5
|
|||
|
bullet_ne:
|
|||
|
mov eax, [bullet_pos]
|
|||
|
cmp eax, 1
|
|||
|
jz bullet_ne_dist._1
|
|||
|
cmp eax, 2
|
|||
|
jz bullet_ne_dist._2
|
|||
|
cmp eax, 3
|
|||
|
jz bullet_ne_dist._3
|
|||
|
cmp eax, 4
|
|||
|
jz bullet_ne_dist._4
|
|||
|
cmp eax, 5
|
|||
|
jz bullet_ne_dist._5
|
|||
|
bullet_se:
|
|||
|
mov eax, [bullet_pos]
|
|||
|
cmp eax, 1
|
|||
|
jz bullet_se_dist._1
|
|||
|
cmp eax, 2
|
|||
|
jz bullet_se_dist._2
|
|||
|
cmp eax, 3
|
|||
|
jz bullet_se_dist._3
|
|||
|
cmp eax, 4
|
|||
|
jz bullet_se_dist._4
|
|||
|
cmp eax, 5
|
|||
|
jz bullet_se_dist._5
|
|||
|
|
|||
|
bullet_nw_dist:
|
|||
|
._1:
|
|||
|
draw_bullet on, 44, 33
|
|||
|
jmp bullet_on_drawn
|
|||
|
._2:
|
|||
|
draw_bullet on, 59, 46
|
|||
|
jmp bullet_on_drawn
|
|||
|
._3:
|
|||
|
draw_bullet on, 75, 58
|
|||
|
jmp bullet_on_drawn
|
|||
|
._4:
|
|||
|
draw_bullet on, 90, 70
|
|||
|
jmp bullet_on_drawn
|
|||
|
._5:
|
|||
|
jmp bullet_on_drawn
|
|||
|
|
|||
|
bullet_sw_dist:
|
|||
|
._1:
|
|||
|
draw_bullet on, 42, 156
|
|||
|
jmp bullet_on_drawn
|
|||
|
._2:
|
|||
|
draw_bullet on, 56, 144
|
|||
|
jmp bullet_on_drawn
|
|||
|
._3:
|
|||
|
draw_bullet on, 74, 129
|
|||
|
jmp bullet_on_drawn
|
|||
|
._4:
|
|||
|
draw_bullet on, 89, 117
|
|||
|
jmp bullet_on_drawn
|
|||
|
._5:
|
|||
|
jmp bullet_on_drawn
|
|||
|
|
|||
|
bullet_ne_dist:
|
|||
|
._1:
|
|||
|
draw_bullet on, 250, 34
|
|||
|
jmp bullet_on_drawn
|
|||
|
._2:
|
|||
|
draw_bullet on, 236, 46
|
|||
|
jmp bullet_on_drawn
|
|||
|
._3:
|
|||
|
draw_bullet on, 224, 57
|
|||
|
jmp bullet_on_drawn
|
|||
|
._4:
|
|||
|
draw_bullet on, 211, 68
|
|||
|
jmp bullet_on_drawn
|
|||
|
._5:
|
|||
|
jmp bullet_on_drawn
|
|||
|
|
|||
|
bullet_se_dist:
|
|||
|
._1:
|
|||
|
draw_bullet on, 251, 156
|
|||
|
jmp bullet_on_drawn
|
|||
|
._2:
|
|||
|
draw_bullet on, 237, 143
|
|||
|
jmp bullet_on_drawn
|
|||
|
._3:
|
|||
|
draw_bullet on, 223, 131
|
|||
|
jmp bullet_on_drawn
|
|||
|
._4:
|
|||
|
draw_bullet on, 210, 119
|
|||
|
jmp bullet_on_drawn
|
|||
|
._5:
|
|||
|
jmp bullet_on_drawn
|
|||
|
|
|||
|
bullet_on_drawn:
|
|||
|
mov eax, [cur_bullet]
|
|||
|
inc eax
|
|||
|
mov [cur_bullet], eax
|
|||
|
mov eax, [cur_bullet]
|
|||
|
cmp eax, BULLETS_CNT + 1
|
|||
|
jz all_bullets_drawn
|
|||
|
jmp draw_bullets_on
|
|||
|
all_bullets_drawn:
|
|||
|
mov eax, 1
|
|||
|
mov [cur_bullet], eax
|
|||
|
jmp check_for_game_step
|
|||
|
check_for_game_step:
|
|||
|
mov eax, [delays_cnt]
|
|||
|
cmp eax, DELAYS_PER_GAME_STEP
|
|||
|
jz game_step
|
|||
|
jmp no_game_step
|
|||
|
no_game_step:
|
|||
|
mov eax, [delays_cnt]
|
|||
|
inc eax
|
|||
|
mov [delays_cnt], eax
|
|||
|
jmp game_loop
|
|||
|
game_step:
|
|||
|
mov eax, 1
|
|||
|
mov [delays_cnt], eax
|
|||
|
mov eax, [bullet_1_pos]
|
|||
|
inc eax
|
|||
|
mov [bullet_1_pos], eax
|
|||
|
mov eax, [bullet_2_pos]
|
|||
|
inc eax
|
|||
|
mov [bullet_2_pos], eax
|
|||
|
mov eax, [bullet_3_pos]
|
|||
|
inc eax
|
|||
|
mov [bullet_3_pos], eax
|
|||
|
mov eax, [bullet_4_pos]
|
|||
|
inc eax
|
|||
|
mov [bullet_4_pos], eax
|
|||
|
mov eax, [bullet_1_pos]
|
|||
|
cmp eax, 6
|
|||
|
jz bullet_1_new
|
|||
|
mov eax, [bullet_2_pos]
|
|||
|
cmp eax, 6
|
|||
|
jz bullet_2_new
|
|||
|
mov eax, [bullet_3_pos]
|
|||
|
cmp eax, 6
|
|||
|
jz bullet_3_new
|
|||
|
mov eax, [bullet_4_pos]
|
|||
|
cmp eax, 6
|
|||
|
jz bullet_4_new
|
|||
|
jmp check_bullet_hit
|
|||
|
|
|||
|
bullet_1_new:
|
|||
|
play_note NOTE_SAVE
|
|||
|
mov eax, 1
|
|||
|
mov [bullet_1_pos], eax
|
|||
|
mov eax, [next_bullet_side]
|
|||
|
mov [bullet_1_side], eax
|
|||
|
jmp check_bullet_hit
|
|||
|
bullet_2_new:
|
|||
|
play_note NOTE_SAVE
|
|||
|
mov eax, 1
|
|||
|
mov [bullet_2_pos], eax
|
|||
|
mov eax, [next_bullet_side]
|
|||
|
mov [bullet_2_side], eax
|
|||
|
jmp check_bullet_hit
|
|||
|
bullet_3_new:
|
|||
|
play_note NOTE_SAVE
|
|||
|
mov eax, 1
|
|||
|
mov [bullet_3_pos], eax
|
|||
|
mov eax, [next_bullet_side]
|
|||
|
mov [bullet_3_side], eax
|
|||
|
jmp check_bullet_hit
|
|||
|
bullet_4_new:
|
|||
|
play_note NOTE_SAVE
|
|||
|
mov eax, 1
|
|||
|
mov [bullet_4_pos], eax
|
|||
|
mov eax, [next_bullet_side]
|
|||
|
mov [bullet_4_side], eax
|
|||
|
jmp check_bullet_hit
|
|||
|
|
|||
|
check_bullet_hit:
|
|||
|
mov eax, [bullet_1_pos]
|
|||
|
cmp eax, 5
|
|||
|
jz bullet_1_hit
|
|||
|
mov eax, [bullet_2_pos]
|
|||
|
cmp eax, 5
|
|||
|
jz bullet_2_hit
|
|||
|
mov eax, [bullet_3_pos]
|
|||
|
cmp eax, 5
|
|||
|
jz bullet_3_hit
|
|||
|
mov eax, [bullet_4_pos]
|
|||
|
cmp eax, 5
|
|||
|
jz bullet_4_hit
|
|||
|
jmp game_loop
|
|||
|
|
|||
|
bullet_1_hit:
|
|||
|
mov eax, [bullet_1_side]
|
|||
|
cmp eax, [shield_position]
|
|||
|
jz save
|
|||
|
jmp damage
|
|||
|
bullet_2_hit:
|
|||
|
mov eax, [bullet_2_side]
|
|||
|
cmp eax, [shield_position]
|
|||
|
jz save
|
|||
|
jmp damage
|
|||
|
bullet_3_hit:
|
|||
|
mov eax, [bullet_3_side]
|
|||
|
cmp eax, [shield_position]
|
|||
|
jz save
|
|||
|
jmp damage
|
|||
|
bullet_4_hit:
|
|||
|
mov eax, [bullet_4_side]
|
|||
|
cmp eax, [shield_position]
|
|||
|
jz save
|
|||
|
jmp damage
|
|||
|
|
|||
|
damage:
|
|||
|
mov eax, [health]
|
|||
|
sub eax, BULLET_DAMAGE
|
|||
|
mov [health], eax
|
|||
|
play_note NOTE_DAMAGE
|
|||
|
jmp game_loop
|
|||
|
save:
|
|||
|
mov eax, [health]
|
|||
|
add eax, HEALTH_BONUS
|
|||
|
mov [health], eax
|
|||
|
play_note NOTE_SAVE
|
|||
|
jmp game_loop
|
|||
|
|
|||
|
skin_height dd 0
|
|||
|
shield_position dd SE
|
|||
|
finish_draw dd 1 ; 0 -- finish, 1 -- start
|
|||
|
next_bullet_side_prng dd 3
|
|||
|
next_bullet_side dd SE
|
|||
|
bullet_1_pos dd 1
|
|||
|
bullet_2_pos dd 2
|
|||
|
bullet_3_pos dd 3
|
|||
|
bullet_4_pos dd 4
|
|||
|
bullet_1_side dd NW
|
|||
|
bullet_2_side dd SW
|
|||
|
bullet_3_side dd NE
|
|||
|
bullet_4_side dd SE
|
|||
|
bullet_pos dd 1 ; nearest to the gun
|
|||
|
bullet_side dd NW
|
|||
|
cur_bullet dd NW
|
|||
|
delays_cnt dd 1
|
|||
|
health dd HEALTH_INIT
|
|||
|
delay dd DELAY_INIT
|
|||
|
game_started dd 0
|
|||
|
speaker:
|
|||
|
.duration db 0x90
|
|||
|
.note db 0x30
|
|||
|
.end db 0x00
|
|||
|
pic_bg:
|
|||
|
file 'picture_bg.rgba'
|
|||
|
pic_shield_sw:
|
|||
|
file 'shield_sw.rgb'
|
|||
|
pic_shield_nw:
|
|||
|
file 'shield_nw.rgb'
|
|||
|
pic_shield_ne:
|
|||
|
file 'shield_ne.rgb'
|
|||
|
pic_shield_se:
|
|||
|
file 'shield_se.rgb'
|
|||
|
_pic_bullet_off:
|
|||
|
file 'bullet_off.rgb'
|
|||
|
_pic_bullet_on:
|
|||
|
file 'bullet_on.rgb'
|
|||
|
sz msg_copyright, '(c) 2009 CH@YKIN EVGENY'
|
|||
|
msg_new_game cp866 '1 новая игра'
|
|||
|
msg_new_game.size = $ - msg_new_game
|
|||
|
msg_continue cp866 '2 продолжить'
|
|||
|
msg_continue.size = $ - msg_continue
|
|||
|
msg_you_lost cp866 ' вы проиграли'
|
|||
|
msg_you_lost.size = $ - msg_you_lost
|
|||
|
msg_you_won cp866 'ПОБЕДА :)'
|
|||
|
msg_you_won.size = $ - msg_you_won
|
|||
|
msg_control_by_numpad cp866 'Управление клавишами NumLock клавиатуры'
|
|||
|
msg_control_by_numpad.size = $ - msg_control_by_numpad
|
|||
|
msg_controls cp866 ' 1, 4, 6, 3 и пауза Р(Eng). x'
|
|||
|
msg_controls.size = $ - msg_controls
|
|||
|
palette:
|
|||
|
file 'palette.rgba'
|
|||
|
|
|||
|
sz msg_ataka, 'ATAKA'
|
|||
|
window_title db 'ATAKA V 1.0',0
|
|||
|
I_END:
|
|||
|
sys_colors system_colors
|
|||
|
rb 0x80d
|
|||
|
stacktop:
|