kolibrios/programs/games/attack/attack.asm
Ivan Baravy 227880f17b Attack (aka Ataka): source of old game by chaykin.
git-svn-id: svn://kolibrios.org@8151 a494cfbc-eb01-0410-851d-a64ba20cac60
2020-11-06 18:11:19 +00:00

905 lines
23 KiB
NASM
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; 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: