;çàãîëîâîê ïðèëîæåíèÿ
SK_SPACE equ 0x39
SK_CTRL equ 0x1D
SK_UP equ 0x48
SK_DOWN equ 0x50
SK_LEFT equ 0x4B
SK_RIGHT equ 0x4D
SK_ESC equ 0x01
INIT_PLANE_X equ 20
INIT_PLANE_Y equ 20
BACK_COLOR equ 0x9bcdfa
GROUND_COLOR equ 0x808080
BANG_COLOR equ 0xB0140E
ANIM_PLANE_BMP_PIXELS_COUNT equ 22*32*32
WINDOW_WIDTH equ 800
WINDOW_HEIGHT equ 600
GROUNG_HEIGHT equ 100
CITY_OFFSET equ (WINDOW_WIDTH-32*20)/2
MAX_BOMBS equ 8
GRAVY_ACCEL equ 1
BOMB_DELAY equ 12
MAX_LEVEL equ 5
ACKACK_BULLET_SPEED equ 17
BULLET_SIZE equ 7
MAX_SOUNDS equ 8
VOLUME_BOMBFLY equ 16
VOLUME_BOMBBANG equ 28
VOLUME_ACKACK equ 24
VOLUME_PLANE equ 48
VOLUME_ARW equ 16
use32 ; òðàíñëÿòîð, èñïîëüçóþùèé 32 ðàçðÿäíûõ êîìàíäû
org 0x0 ; áàçîâûé àäðåñ êîäà, âñåãäà 0x0
db 'MENUET01' ; èäåíòèôèêàòîð èñïîëíÿåìîãî ôàéëà (8 áàéò)
dd 0x1 ; âåðñèÿ ôîðìàòà çàãîëîâêà èñïîëíÿåìîãî ôàéëà
dd start ; àäðåñ, íà êîòîðûé ñèñòåìà ïåðåäà¸ò óïðàâëåíèå
; ïîñëå çàãðóçêè ïðèëîæåíèÿ â ïàìÿòü
dd i_end ; ðàçìåð ïðèëîæåíèÿ
dd i_end ; Îáúåì èñïîëüçóåìîé ïàìÿòè, äëÿ ñòåêà îòâåäåì 0õ100 áàéò
dd i_end ; ðàñïîëîæèì ïîçèöèþ ñòåêà â îáëàñòè ïàìÿòè, ñðàçó çà òåëîì ïðîãðàììû. Âåðøèíà ñòåêà â äèàïàçîíå ïàìÿòè, óêàçàííîì âûøå
dd 0x0, _s_current_dir ; óêàçàòåëü íà ñòðîêó ñ ïàðàìåòðàìè.
; åñëè ïîñëå çàïóñêà íåðàâíî íóëþ, ïðèëîæåíèå áûëî
; çàïóùåíî ñ ïàðàìåòðàìè èç êîìàíäíîé ñòðîêè
; óêàçàòåëü íà ñòðîêó, â êîòîðóþ çàïèñàí ïóòü,
; îòêóäà çàïóùåíî ïðèëîæåíèå
;Îáëàñòü êîäà
;----------------- include -------------------------------------
include 'lang.inc'
include 'ssmix.inc'
;---------------------------------------------------------------------------
;----------------------------- ãëàâíûé öèêë --------------------------------
;---------------------------------------------------------------------------
align 4
start: ;Òî÷êà âõîäà â ïðîãðàììó
; ðåæèì êëàâèàòóðû: ñêàí-êîäû
mov eax, 66
mov ebx, 1
mov ecx, 1
int 0x40
; èíèöèàëèçàöèÿ êó÷è
mov eax, 68
mov ebx, 11
int 0x40
cmp eax, 1000000 ; êó÷à íóæíà ìèíèìóì íà ~1000êá (ýòî ñ çàïàñîì)
ja heap_ok
mov eax, -1
int 0x40 ; èíà÷å çàêðûâàåì âñå
heap_ok:
mov eax, bmp_plane
mov ebx, 736*32*3
call convert_bmp_backcolor
mov eax, bmp_bomb
mov ebx, 96*16*3
call convert_bmp_backcolor
mov eax, bmp_tile
mov ebx, 20*20*3
call convert_bmp_backcolor
mov eax, bmp_ackack
mov ebx, 40*20*3
call convert_bmp_backcolor
call read_sounds_file
call ssmix_init
mov [_game_state], 0
redraw_window:
call draw_window
cmp [_game_state], 0
jne still_no_intro
call draw_intro
still_no_intro:
still:
; îáðàáîòêà ñîáûòèé
mov eax,11
int 0x40
cmp eax,1
je redraw_window
cmp eax,2
je key
cmp eax,3
je close_button
; ïàóçà
mov eax,5
mov ebx,1
int 0x40
mov eax, 26
mov ebx, 9
int 0x40
mov ebx, eax
sub eax, [_last_value_timecount]
cmp eax, [_delay]
jbe still
mov [_last_value_timecount], ebx
call timer_x2
call timer_x4
; ïðîâåðêà íà èãðó
cmp [_game_state], 1
jne still_no_game
; âûçîâ ïðîöåäóð èãðîâîãî ïðîöåññà
mov eax, [_plane_health]
cmp eax, 0
jle still_no_plane
call flight_control_plane
call plane_interaction
call draw_plane
still_no_plane:
call draw_plane_health
call bomb_proc
call bang_proc
call ground_draw
call city_draw
call ackack_draw
call ackack_bullet_proc
; òàéìåð çàâåðøåíèÿ èãðû
call game_over_timer
still_no_game:
jmp still
key: ; îáðàáîòêà íàæàòèÿ êëàâèø
mov eax,2
int 0x40
push eax
key_SPACE:
cmp ah, SK_SPACE
jne key_SPACE_end
cmp [_game_state], 1
je key_SPACE_do_a_barrel_roll
key_SPACE_start_game: ; çàïóñê èãðû
mov [_game_state], 1
call init_game_state
jmp key_SPACE_end
key_SPACE_do_a_barrel_roll: ; ñäåëàòü áî÷êó
mov eax, [_plane_state]
cmp eax, 0
je key_SPACE_do_a_barrel_roll_r
cmp eax, 1
je key_SPACE_do_a_barrel_roll_l
jmp key_SPACE_end
key_SPACE_do_a_barrel_roll_r:
mov eax,[_X_plane]
cmp eax, WINDOW_WIDTH-130-32
jg key_SPACE_end
mov [_plane_state], 4
mov [_plane_state_step], 0
jmp key_SPACE_end
key_SPACE_do_a_barrel_roll_l:
mov eax,[_X_plane]
cmp eax, 130
jl key_SPACE_end
mov [_plane_state], 5
mov [_plane_state_step], 0
key_SPACE_end:
pop eax
key_CTRL:
cmp ah, SK_CTRL
jne key_CTRL_end
call bomb_drop
key_CTRL_end:
key_UP:
cmp ah, SK_UP
jne key_UP_end
cmp [_game_state], 0
jne key_UP_end
mov ebx, [_level_num]
inc ebx
mov [_level_num], ebx
cmp ebx, MAX_LEVEL
jbe key_UP_no_max
mov [_level_num], MAX_LEVEL
key_UP_no_max:
call draw_level_num
key_UP_end:
key_DOWN:
cmp ah, SK_DOWN
jne key_DOWN_end
cmp [_game_state], 0
jne key_DOWN_end
mov ebx, [_level_num]
dec ebx
mov [_level_num], ebx
cmp ebx, 1
jae key_DOWN_no_min
mov [_level_num], 1
key_DOWN_no_min:
call draw_level_num
key_DOWN_end:
key_LEFT:
cmp ah, SK_LEFT
jne key_LEFT_end
cmp [_game_state], 0
jne key_LEFT_end
mov ebx, [_set_volume]
dec ebx
cmp ebx, 0
jge @f
mov ebx, 0
@@:
mov [_set_volume], ebx
shl ebx, 4
stdcall ssmix_setvolume, ebx, ebx
call draw_volume_num
key_LEFT_end:
key_RIGHT:
cmp ah, SK_RIGHT
jne key_RIGHT_end
cmp [_game_state], 0
jne key_RIGHT_end
mov ebx, [_set_volume]
inc ebx
cmp ebx, 8
jle @f
mov ebx, 8
@@:
mov [_set_volume], ebx
shl ebx, 4
stdcall ssmix_setvolume, ebx, ebx
call draw_volume_num
key_RIGHT_end:
key_ESC:
cmp ah, SK_ESC
jne key_ESC_end
jmp close_button
key_ESC_end:
jmp still
close_button: ; çàâåðøåíèå ðàáîòû
call ssmix_release
call sounds_free_memory
; çàêðûòü ïðèëîæåíèå
mov eax, -1
int 0x40
;---------------------------------------------------------------------------
;----------------------------- ïîäðîãðàììû ---------------------------------
;---------------------------------------------------------------------------
convert_bmp_backcolor: ; eax - óêàçàòàëü íà íà÷àëî äàííûõ, ebx - ðàçìåð äàííûõ
push ecx
cbb_loop:
cmp ebx, 0
jle cbb_loop_end
mov ecx, [eax]
and ecx, 0x00FFFFFF
cmp ecx, 0x00FFFFFF
jne @f
mov ecx, BACK_COLOR
mov [eax], cl
shr ecx, 8
mov [eax+1], cl
shr ecx, 8
mov [eax+2], cl
@@:
add eax, 3
sub ebx, 3
jmp cbb_loop
cbb_loop_end:
pop ecx
ret
; ÷òåíèå ôàéëà ñî çâóêàìè
read_sounds_file:
mov edi, _s_current_dir
mov al, 0
mov ecx, 4096
repne scasb
mov dword[edi-1], 'data'
mov dword[edi+3], '.bin'
mov [_flag_bomberdatabin_ok], 1
; ïðî÷èòàòü èç ôàéëà äàííûõ êîëè÷åñòâî çâóêîâ
mov [_fi_func], 0
mov [_fi_pos], 8
mov [_fi_size], 4
mov [_fi_pbuff], _count_sounds
mov [_fi_pfilename], _s_current_dir
mov eax, 70
mov ebx, file_info
int 0x40
cmp ebx, -1
jne @f
mov [_flag_bomberdatabin_ok], 0
jmp .end
@@:
; ïðî÷èòàòü äàííûå î ñìåùåíèè è ðàçìåðå çâóêîâ â ôàéëå, è çàïèñàòü èõ (âðåìåííî) â ìàññèâ çâóêîâ
mov ecx, [_count_sounds]
shl ecx, 3
mov [_fi_func], 0
mov [_fi_pos], 12
mov [_fi_size], ecx
mov [_fi_pbuff], _array_sounds
mov [_fi_pfilename], _s_current_dir
mov eax, 70
mov ebx, file_info
int 0x40
; ïðî÷èòàòü çâóêè â ôàéëå è çàïèñàòü èõ â ïàìÿòü
mov ecx, [_count_sounds]
mov esi, _array_sounds
.loop:
push ecx
; ïîäãîòîâèòü äàííûå èíôîðìàöèîííîé ñòðóêòóðû äëÿ ÷òåíèÿ èç ôàéëà
mov [_fi_func], 0
mov eax, [esi]
mov [_fi_pos], eax
mov eax, [esi+4]
mov [_fi_size], eax
; âûäåëèòü ïàìÿòü ïîä çâóê, ïîëó÷èòü óêàçàòåëü, è èçìåíèòü äàííûå â ìàññèâå çâóêîâ
mov ecx, [esi+4]
mov eax, 68
mov ebx, 12
int 0x40
mov [esi], eax
mov ecx, [esi+4]
add ecx, eax
mov [esi+4], ecx
; ïðî÷èòàòü ñýìïë èç ôàéëà
mov [_fi_pbuff], eax
mov [_fi_pfilename], _s_current_dir
mov eax, 70
mov ebx, file_info
int 0x40
pop ecx
add esi, 8
dec ecx
jnz .loop
.end:
ret
sounds_free_memory:
mov ecx, [_count_sounds]
mov esi, _array_sounds
.loop:
push ecx
; âûäåëèòü ïàìÿòü ïîä çâóê, ïîëó÷èòü óêàçàòåëü, è èçìåíèòü äàííûå â ìàññèâå çâóêîâ
mov eax, 68
mov ebx, 13
mov ecx, [esi]
int 0x40
pop ecx
add esi, 8
dec ecx
jnz .loop
ret
init_game_state: ; èíèöèàëèçàöèÿ èãðîâûõ äàííûõ
mov [_game_over_time], 0
mov [_X_plane], INIT_PLANE_X
mov [_Y_plane], INIT_PLANE_Y
mov [_VX_plane], 4
mov [_plane_state], 0
mov [_anim_pos_plane], 0
mov [_plane_health], 100
mov [_timer_x2], 0
mov [_timer_x4], 0
mov [_bomb_count], 0
mov [_bomb_delay_time], 0
mov [_addit_VY_plane], 0
mov [_flag_air_raid_warning], 0
call load_level
; èíèöèàëèçàöèÿ ìàññèâà âçðûâîâ
mov ebx, _bang_array
xor ecx, ecx
igs_bang_array_loop:
cmp ecx, MAX_BOMBS
jae igs_bang_array_loop_end
mov eax, -1
mov [ebx], eax
add ebx, 8
inc ecx
jmp igs_bang_array_loop
igs_bang_array_loop_end:
; èíèöèàëèçàöèÿ ìàññèâà çåíèòíûõ ñíàðÿäîâ
mov ebx, _ackack_bullet
xor ecx, ecx
igs_bullet_array_loop:
cmp ecx, 32
jae igs_bullet_array_loop_end
mov eax, 0
mov [ebx], eax
add ebx, 4
inc ecx
jmp igs_bullet_array_loop
igs_bullet_array_loop_end:
; î÷èñòèòü ýêðàí
call draw_window
;çàïóñòèòü çâóê ïðîïåëåðà
cmp [_flag_bomberdatabin_ok], 1
jne @f
stdcall ssmix_playtrack, [_array_sounds+8*((( 4 ))-1)], [_array_sounds+8*((( 4 ))-1)+4], VOLUME_PLANE, VOLUME_PLANE, SSMIX_CHANMODE_REPEAT
@@:
mov [_channel_sound_plane], eax
mov [_channel_sound_arw], -1
ret
game_over:
mov [_game_over_time], 30 ; çàäàåì çàäåðæêó íà game over
;âûâîä òåêñòà GAME OVER
mov eax,4
mov ebx,(WINDOW_WIDTH/2 - 50)*65536 + 30
mov ecx,0x80000000
mov edx,_text_game_over
int 0x40
cmp [_flag_bomberdatabin_ok], 1
jne @f
stdcall ssmix_stoptrack, [_channel_sound_plane]
@@:
ret
game_over_timer: ; òàéìåð çàâåðøåíèÿ èãðû, ñîçäàåò íåáîëüøóþ ïàóçó ïåðåä îñòàíîâêîé èãðû
mov ebx, [_game_over_time]
cmp ebx, 0
je got_end
dec ebx
mov [_game_over_time], ebx
cmp ebx, 0
jg got_end
mov [_game_state], 0
cmp [_flag_bomberdatabin_ok], 1
jne @f
call ssmix_stopalltracks
@@:
call draw_window
call draw_intro
got_end:
ret
next_level: ; ñëåäóþùèé óðîâåíü
push eax
mov [_game_over_time], 1 ; áûñòðåíüêî çàâåðøèì èãðó
mov eax, [_level_num] ; íà ñëåäóþùèé óðîâåíü
inc eax
cmp eax, MAX_LEVEL
jbe next_level_no_overmax
mov eax, MAX_LEVEL
next_level_no_overmax:
mov [_level_num], eax
pop eax
ret
check_level_complete: ; ïðîâåðêà íà çàâåðøåíèå óðîâíÿ
push eax
push ebx
push ecx
push edx
mov edx, 0 ; ôëàã íàëè÷èÿ ñòðîåíèé â ãîðîäå: 0 - íåò ñòðîåíèé, 1 - åñòü ñòðîåíèÿ
mov ebx, _city
xor ecx, ecx
clc_loop:
cmp ecx, 32
jae clc_loop_end
xor eax, eax
mov ax, [ebx]
cmp eax, 0
je clc_no_buildings
mov edx, 1
jmp clc_loop_end
clc_no_buildings:
add ebx, 2
inc ecx
jmp clc_loop
clc_loop_end :
cmp edx, 0
jne clc_end
; óðîâåíü çàâåðøåí - èäåì íà ïîñàäêó
;âûâîä òåêñòà LEVEL COMPLETE
mov eax,4
mov ebx,(WINDOW_WIDTH/2 - 70)*65536 + 30
mov ecx,0x80000000
mov edx,_text_level_complete
int 0x40
; áûñòðîå ñíèæåíèå ñàìîëåòà
mov [_addit_VY_plane], 3 ; çàäàòü ñêîðîñòü áûñòðîãî ñíèæåíèÿ
; âûêëþ÷èòü ñèðåíó
call air_raid_warning_off
clc_end:
pop edx
pop ecx
pop ebx
pop eax
ret
draw_plane_health:
mov ebx, 5*0x00010000 + 100
mov ecx, 5*0x00010000 + 10
mov edx, 0x00000000
mov eax, 13
int 0x40
mov ebx, [_plane_health]
add ebx, 5*0x00010000
mov edx, 0x00008000
int 0x40
ret
air_raid_warning_on:
push eax
cmp [_flag_air_raid_warning], 1
je .end
mov [_flag_air_raid_warning], 1
cmp [_flag_bomberdatabin_ok], 1
jne @f
stdcall ssmix_playtrack, [_array_sounds+8*((( 5 ))-1)], [_array_sounds+8*((( 5 ))-1)+4], VOLUME_ARW, VOLUME_ARW, SSMIX_CHANMODE_REPEAT
@@:
mov [_channel_sound_arw], eax
.end:
pop eax
ret
air_raid_warning_off:
cmp [_flag_air_raid_warning], 0
je .end
mov [_flag_air_raid_warning], 0
cmp [_flag_bomberdatabin_ok], 1
jne .end
stdcall ssmix_stoptrack, [_channel_sound_arw]
.end:
ret
;======================================= ÑÀÌÎËÅÒ ======================================
flight_control_plane: ; ïðîöåäóðà óïðàâëåíèÿ ïîëåòîì ñàìîëåòà
mov eax,[_X_plane]
add eax, [_VX_plane]
mov [_X_plane], eax
cmp eax, WINDOW_WIDTH-60-32
jl fcp_set_utunr_rl
mov ebx, [_plane_state]
cmp ebx, 0
jne fcp_set_utunr_rl
mov [_plane_state],2
mov [_plane_state_step], 0
fcp_set_utunr_rl:
cmp eax, 60
jg fcp_set_utunr_lr
mov ebx, [_plane_state]
cmp ebx, 1
jne fcp_set_utunr_lr
mov [_plane_state],3
mov [_plane_state_step], 0
fcp_set_utunr_lr:
; äàëåå êîä âûïîëíÿåòñÿ â 2 ðàçà ìåäëåííåé
mov eax, [_timer_x2]
cmp eax, 0
jne fcp_timex2_end
mov eax, [_plane_state]
cmp eax, 2 ; åñëè äåëàåì ðàçâîðîò íàëåâî
jne fcp_uturn_rl_end
mov eax, [_plane_state_step]
mov ebx, 4
sub ebx, eax
mov [_VX_plane], ebx ; òî ðàñ÷èòûâàåì ñêîðîñòü èñõîäÿ èç òåêóùåãî øàãà ñîñòîÿíèÿ
inc eax ; ïåðåõîäèì íà ñëåäóþùèé øàã ñîñòîÿíèÿ
mov [_plane_state_step], eax
cmp eax, 9 ; ïðîâåðÿåì, çàêîí÷èëèñü ëè øàãè
jne fcp_uturn_rl_end
mov [_plane_state], 1 ; åñëè äà òî ïåðåâîäèì ñîñòîÿíèå íà ïðÿìîé ïîëåò
fcp_uturn_rl_end:
mov eax, [_plane_state]
cmp eax, 3 ; åñëè äåëàåì ðàçâîðîò íàïðàâî
jne fcp_uturn_lr_end
mov eax, [_plane_state_step]
mov ebx, -4
add ebx, eax
mov [_VX_plane], ebx ; òî ðàñ÷èòûâàåì ñêîðîñòü èñõîäÿ èç òåêóùåãî øàãà ñîñòîÿíèÿ
inc eax ; ïåðåõîäèì íà ñëåäóþùèé øàã ñîñòîÿíèÿ
mov [_plane_state_step], eax
cmp eax, 9 ; ïðîâåðÿåì, çàêîí÷èëèñü ëè øàãè
jne fcp_uturn_lr_end
mov [_plane_state], 0 ; åñëè äà òî ïåðåâîäèì ñîñòîÿíèå íà ïðÿìîé ïîëåò
fcp_uturn_lr_end:
mov eax, [_plane_state]
cmp eax, 4 ; åñëè äåëàåì áî÷êó âïðàâî
jne fcp_barrel_r_end
mov eax, [_plane_state_step]
inc eax ; ïåðåõîäèì íà ñëåäóþùèé øàã ñîñòîÿíèÿ
mov [_plane_state_step], eax
cmp eax, 8 ; ïðîâåðÿåì, çàêîí÷èëèñü ëè øàãè
jne fcp_barrel_r_end
mov [_plane_state], 0 ; åñëè äà òî ïåðåâîäèì ñîñòîÿíèå íà ïðÿìîé ïîëåò
fcp_barrel_r_end :
mov eax, [_plane_state]
cmp eax, 5 ; åñëè äåëàåì áî÷êó âëåâî
jne fcp_barrel_l_end
mov eax, [_plane_state_step]
inc eax ; ïåðåõîäèì íà ñëåäóþùèé øàã ñîñòîÿíèÿ
mov [_plane_state_step], eax
cmp eax, 8 ; ïðîâåðÿåì, çàêîí÷èëèñü ëè øàãè
jne fcp_barrel_l_end
mov [_plane_state], 1 ; åñëè äà òî ïåðåâîäèì ñîñòîÿíèå íà ïðÿìîé ïîëåò
fcp_barrel_l_end:
call animation_plane
fcp_timex2_end:
; äàëåå êîä âûïîëíÿåòñÿ â 4 ðàçà ìåäëåííåé
mov eax, [_timer_x4]
cmp eax, 0
jne fcp_timex4_end
; ìåäëåííîå ñíèæåíèå ñàìîëåòà
mov eax,[_Y_plane]
add eax, 1
mov [_Y_plane], eax
fcp_timex4_end:
; áûñòðîå ñíèæåíèå ñàìîëåòà
mov eax,[_Y_plane]
mov ebx,[_addit_VY_plane]
add eax, ebx
mov [_Y_plane], eax
; êîíòðîëü âûñîòû ñàìîëåòà, ïîñàäêà
mov eax,[_Y_plane]
cmp eax, WINDOW_HEIGHT - GROUNG_HEIGHT - 32
jl fcp_end_plane_landing
mov [_addit_VY_plane], 0 ; ïðåêðàòèòü áûñòðîå ñíèæåíèå
mov ebx, [_plane_state]
cmp ebx, 6
je fcp_end_plane_landing
cmp ebx, 0
jne fcp_horiz_fly
mov [_plane_state], 6 ; ðåæèì ïîñàäêè
;jmp fcp_end_plane_landing
fcp_horiz_fly:
mov eax, WINDOW_HEIGHT - GROUNG_HEIGHT - 32
fcp_end_plane_landing:
cmp eax, WINDOW_HEIGHT - GROUNG_HEIGHT - 32 + 6
jle fcp_no_plane_underground ; ïðîâåðêà íà òî, ÷òîáû ñàìîëåò íå óøåë "ïîä çåìëþ"
mov eax, WINDOW_HEIGHT - GROUNG_HEIGHT - 32 + 6
mov ebx, [_X_plane]
cmp ebx, WINDOW_WIDTH - 60-32
jl fcp_no_end_level ; ïðîâåðêà íà òî, ÷òî äîêàòèëñÿ äî êîíöà ïîñàäî÷íîé ïîëîñû
; çàâåðøåíèå óðîâíÿ
call next_level ; ïåðåõîä íà ñëåäóþùèé óðîâåíü
fcp_no_end_level:
fcp_no_plane_underground:
mov [_Y_plane], eax
ret
animation_plane:
; àíèìàöèÿ ñàìîëåòà
; ïîëåò âïðàâî
mov eax, [_plane_state]
cmp eax, 0
jne ap_state0_end
mov [_anim_pos_plane], 0
ap_state0_end:
; ïîëåò âëåâî
mov eax, [_plane_state]
cmp eax, 1
jne ap_state1_end
mov [_anim_pos_plane], 8
ap_state1_end:
; àíèìàöèÿ äëÿ ðàçâîðîòîâ è áî÷åê
mov eax, [_plane_state]
cmp eax, 5
ja ap_state2345_end
cmp eax, 2
jb ap_state2345_end
sub eax, 2
mov ebx, eax ; óìíîæèòü eax íà 9
shl eax, 3
add eax, ebx
add eax, [_plane_state_step] ; ïðèáàâèòü íîìåð øàãà
shl eax, 2 ; óìíîæèòü íà 4
add eax, _anim_array_uturn_rl ; ïîëó÷àåòñÿ ñìåùåíèå äëÿ íîìåðà òðåáóåìîãî êàäðà
mov ebx, [eax]
mov [_anim_pos_plane], ebx ; çäåñü âûòàñêèâàåì ñàì íîìåð
ap_state2345_end:
; ïîñàäêà (òîëüêî âïðàâî)
mov eax, [_plane_state]
cmp eax, 6
jne ap_state6_end
mov [_anim_pos_plane], 22
ap_state6_end:
ret
draw_plane:
; ñòåðåòü ïðåäûäóùåå èçîáðàæåíèå
mov eax, 13
mov ebx,[_last_XY_plane]
and ebx, 0xffff0000
add ebx, 32
mov ecx,[_last_XY_plane]
shl ecx, 16
add ecx, 32
mov edx, BACK_COLOR
int 0x40
; ðàñ÷åò àäðåñà êàðòèíêè èñõîäÿ èç íîìåðà êàäðà _anim_pos_plane
mov ebx, [_anim_pos_plane]
shl ebx, 10
mov eax, ebx
add ebx, eax
add ebx, eax
add ebx, bmp_plane
; ïîäãîòîâêà êîîðäèíàò
mov edx,[_X_plane]
shl edx, 16
add edx,[_Y_plane]
mov [_last_XY_plane], edx
; âûâîä êàðòèíêè
mov eax,7
mov ecx,32*65536+32
int 0x40
ret
plane_interaction:
push eax
push ebx
push ecx
push edx
mov eax, [_X_plane]
mov ebx, [_Y_plane]
add ebx, 16
mov ecx, [_VX_plane]
cmp ecx, 0
jl pi_no_positive_vx
add eax, 32 ; çäåñü â çàâèñèìîñòè îò íàïðàâëåíèÿ ïîëåòà îïðåäåëÿåì òî÷êó âçàèìîäåéñòâèÿ ñ ãîðîäîì
pi_no_positive_vx:
; òåïåðü â eax è ebx êîîðäèíàòû X,Y òî÷êè âçàèìîäåéñòâèÿ ñàìîëåòà ñ ãîðîäîì
mov edx, eax
sub eax, CITY_OFFSET
; ïðîâåðêà íà âûëåò çà ïðåäåëû ãîðîäà
cmp eax, 0
jl pi_out_of_city
cmp eax, 32*20
jg pi_out_of_city
; ïðîâåðêà íà âçàèìîäåéñòâèå ñ ãîðîäîì
add eax, 10 ; äåëèì êîîðäèíàòó X íà 20
mov ecx, eax
shr eax, 4
shr ecx, 6
sub eax, ecx
shr ecx, 2
add eax, ecx
shr ecx, 2
sub eax, ecx
dec eax ; â eax íîìåð ñòîëáöà ãîðîäà ïî êîòîðîìó ëåòèò áîìáà
mov esi, eax
shl esi, 1
add esi, _city ; â esi óêàçàòåëü íà âûñîòó ïîñòðîéêè â äàííîì ñòîëáöå
mov eax, edx
; òåïåðü ñðàâíèì êîîðäèíàòó Y âåðøèíû ïîñòðîéêè ñ êîîðäèíàòîé Y òî÷êè âçàèìîäåéñòâèÿ ñàìîëåòà
xor ecx, ecx
mov cx, [esi]
mov edx, ecx
shl ecx, 4
shl edx, 2
add ecx, edx
mov edx, WINDOW_HEIGHT - GROUNG_HEIGHT
sub edx, ecx ; â edx êîîðäèíàòà Y âåðøèíû ïîñòðîéêè
cmp ebx, edx
jl pi_no_crash
; åñëè ñòîëêíîâåíèå ïðîèçîøëî
mov [_plane_health], 0
call bang_add ; äåëàåì âçðûâ
call game_over ; çàâåðøåíèå èãðû
pi_no_crash:
pi_out_of_city:
pop edx
pop ecx
pop ebx
pop eax
ret
; ================================== ÁÎÌÁÛ ===========================================
bomb_drop: ; ïðîöåäóðà "áðîñàíèÿ áîìáû". ñîçäàåò íîâóþ áîìáó, çàäàåò äëÿ íåå íà÷àëüíûå ïàðàìåòðû.
; ïðîâåðêà íà çäîðîâüå ñàìîëåòà
mov eax, [_plane_health]
cmp eax, 0
jle bomb_drop_end
; ïðîâåðèòü íà äîïóñòèìûå ñîñòîÿíèÿ ñàìîëåòà (íåëüçÿ âî âðåìÿ áî÷êè)
mov eax, [_plane_state]
cmp eax, 3
ja bomb_drop_end
; ïðîâåðèòü âûäåðæàí ëè èíòåðâàë âðåìåíè ìåæäó áðîñêàìè
mov eax, [_bomb_delay_time]
cmp eax, 0
jne bomb_drop_end
mov [_bomb_delay_time], BOMB_DELAY
; ñîáñòâåííî, áðîñàåì áîìáó
mov eax, [_bomb_count]
cmp eax, MAX_BOMBS-1
jae bomb_drop_end
inc eax
mov [_bomb_count], eax
dec eax
shl eax, 4
add eax, _bomb_array ; çäåñü â åàõ ïîëó÷èëè óêàçàòåëü íà íà÷àëî äàííûõ î áîìáå
mov ebx, [_X_plane]
mov [eax], ebx ; çàäàíèå êîîðäèíàòû X
add eax, 4
mov ebx, [_Y_plane]
add ebx, 30
mov [eax], ebx ; çàäàíèå êîîðäèíàòû Y
add eax, 4
mov ebx, [_VX_plane]
cmp ebx, 0
jge bomb_drop_pos_dir_vx
bomb_drop_neg_dir_vx:
neg ebx
shr ebx, 1
neg ebx
jmp bomb_drop_dir_vx_end
bomb_drop_pos_dir_vx:
shr ebx, 1
bomb_drop_dir_vx_end:
mov [eax], ebx ; çàäàíèå âåêòîðà ñêîðîñòè ïî X
add eax, 4
mov ebx, 0
mov [eax], ebx ; çàäàíèå âåêòîðà ñêîðîñòè ïî Y
push ecx
mov ecx, [_bomb_count]
dec ecx
call bombfly_sound_start
pop ecx
bomb_drop_end:
ret
bomb_proc:
; òàéìåð èíòåðâàëà ìåæäó áðîñàíèÿìè áîìá
mov eax, [_bomb_delay_time]
cmp eax, 0
je bomb_proc_delay_timer_end
dec eax
mov [_bomb_delay_time], eax
bomb_proc_delay_timer_end:
; îáðàáîòêà äâèæåíèÿ áîìá
mov eax, [_bomb_count]
cmp eax, 0
je bomb_proc_end
xor ecx, ecx
bomb_proc_loop: ; öèêë îáðàáîòêè ïàäåíèÿ áîìá
cmp ecx, [_bomb_count]
jae bomb_proc_end
mov ebx, ecx
shl ebx, 4
add ebx, _bomb_array ; ïîëó÷èëè óêàçàòåëü íà íà÷àëî äàííûõ î áîìáå
call bomb_hide ; ñòåðåòü ïðåäûäóùåå çíà÷åíèå
; îáðàáîòêà
; âûïîëíÿåòñÿ ïåðåñ÷åò äëÿ ñêîðîñòè VY òåêóùåé áîìáû
add ebx, 4*3
mov eax, [_timer_x2]
cmp eax, 0
jne bomb_proc_gravity_accel_end
mov eax, [ebx]
add eax, GRAVY_ACCEL
mov [ebx], eax
bomb_proc_gravity_accel_end:
; âûïîëíÿåòñÿ ïåðåñ÷åò äëÿ êîîðäèíàò X òåêóùåé áîìáû
sub ebx, 4*3
mov eax, [ebx]
add ebx, 4*2
mov edx, [ebx]
add eax, edx
sub ebx, 4*2
mov [ebx], eax
push eax
; âûïîëíÿåòñÿ ïåðåñ÷åò äëÿ êîîðäèíàò Y òåêóùåé áîìáû
add ebx, 4
mov eax, [ebx]
add ebx, 4*2
mov edx, [ebx]
add eax, edx
sub ebx, 4*2
mov [ebx], eax
push eax
; âçàèìîäåéñòâèå áîìá ñ ìèðîì
sub ebx, 4
pop edx ; êîîðäèíàòà Y
pop eax ; êîîðäèíàòà X
; ïðîâåðêà íà âûõîä áîìá çà ïðåäåëû èãðîâîé çîíû, áîìáû ïðîñòî óäàëÿþòñÿ ïðè âûëåòå çà ãðàíèöû
cmp eax, 10
jle bomb_proc_delete_bomb
cmp eax, WINDOW_WIDTH - 36
jge bomb_proc_delete_bomb
; ïðîâåðêà íà âçàèìîäåéòñâèå ñ ìèðîì
push eax
push ebx
mov ebx, edx
call bomb_check_detonation
cmp eax, 1
pop ebx
pop eax
je bomb_proc_interaction_with_world
cmp edx, WINDOW_HEIGHT - GROUNG_HEIGHT
jae bomb_proc_interaction_with_world
jmp bomb_proc_interaction_end
bomb_proc_interaction_with_world:
push eax
push ebx
mov ebx, edx
call bang_add
call air_raid_warning_on ; âêëþ÷åíèå âîçäóøíîé òðåâîãè
pop ebx
pop eax
bomb_proc_delete_bomb:
call bomb_delete ; óäàëÿåì áîìáó
dec ecx ; ò.ê. áîìáû óäàëåíà - îñòàåìñÿ íà òîì æå íîìåðå áîìáû
mov eax, [_bomb_count]
dec eax
mov [_bomb_count], eax ; óìåíüøàåì êîëè÷åñòâî áîìá
jmp bomb_proc_draw_end ; íå ðèñóåì áîìáó åñëè óäàëèëè åå
bomb_proc_interaction_end:
call bomb_draw
bomb_proc_draw_end:
inc ecx
jmp bomb_proc_loop
bomb_proc_end:
ret
bomb_delete: ; óäàëåíèå äàííûõ î áîìáå, â åñõ íîìåð óäàëÿåìîé áîìáû
push eax
push ebx
push ecx
push edx
call bombfly_sound_stop
inc ecx
bomb_delete_loop:
cmp ecx, [_bomb_count]
jae bomb_delete_loop_end
mov ebx, ecx
shl ebx, 4
add ebx, _bomb_array ; ïîëó÷èëè óêàçàòåëü íà íà÷àëî äàííûõ î áîìáå
dec ecx
mov edx, ecx
shl edx, 4
add edx, _bomb_array ; ïîëó÷èëè óêàçàòåëü íà íà÷àëî äàííûõ î ñëåäóþùåé áîìáå
inc ecx
; ïåðåìåùåíèå äàííûõ î ñëåäóþùåé áîìáå íà ìåñòî ïðåäûäóùåé
mov eax, [ebx]
mov [edx], eax
add ebx,4
add edx,4
mov eax, [ebx]
mov [edx], eax
add ebx,4
add edx,4
mov eax, [ebx]
mov [edx], eax
add ebx,4
add edx,4
mov eax, [ebx]
mov [edx], eax
; ïåðåõîä ê ñëåäóþùåé áîìáå
inc ecx
jmp bomb_delete_loop
bomb_delete_loop_end:
pop edx
pop ecx
pop ebx
pop eax
ret
bomb_hide: ; ñòåðåòü áîìáó ñ ýêðàíà, ebx - óêàçàòåëü íà íà÷àëî äàííûõ î áîìáå
push eax
push ebx
push ecx
push edx
mov eax, 13
mov edx, ebx
mov ebx, [edx]
shl ebx, 16
add ebx, 16
add edx, 4
mov ecx, [edx]
shl ecx, 16
add ecx, 16
mov edx, BACK_COLOR
int 0x40
pop edx
pop ecx
pop ebx
pop eax
ret
bomb_draw: ; îòðèñîâàòü áîìáó, ebx - óêàçàòåëü íà íà÷àëî äàííûõ î áîìáå
push eax
push ebx
push ecx
push edx
; ïîëó÷åíèå â edx êîîðäèíàò áîìáû
mov edx, [ebx]
shl edx, 16
add ebx, 4
mov eax, [ebx]
add edx, eax
; ïîëó÷åíèå óêàçàòåëÿ íà êàðòèíêó áîìáû â ebx (ñðàçó ñ âûáîðîì íóæíîé êàðòèíêè)
add ebx, 4
mov eax, [ebx] ; çäåñü â eax - ãîðèçîíòàëüíàÿ ñêîðîñòü áîìáû
add ebx, 4
mov ecx, [ebx] ; çäåñü â ecx - âåðòèêàëüíàÿ ñêîðîñòü áîìáû
xor ebx, ebx
cmp ecx, 3
jl bomb_draw_midspeed_end
inc ebx
bomb_draw_midspeed_end:
cmp ecx, 9
jl bomb_draw_highspeed_end
inc ebx
bomb_draw_highspeed_end:
cmp eax, 0
jge bomb_draw_left_dir_end
add ebx, 3
bomb_draw_left_dir_end:
; òåïåðü â ebx íîìåð êàðòèíêè áîìáû
shl ebx, 8
mov eax, ebx
add ebx, eax
add ebx, eax
add ebx, bmp_bomb ; òåïåðü â ebx óêàçàòåëü íà êàðòèíêó áîìáû
; âûâîä êàðòèíêè
mov eax,7
mov ecx,16*65536+16
int 0x40
pop edx
pop ecx
pop ebx
pop eax
ret
; âçàèìîäåéñòâèå áîìá ñ ìèðîì
bomb_check_detonation: ; ïðîâåðèòü áîìáó ñ êîîðäèíàòàìè: eax - êîîðäèíàòà X, eab - êîîðäèíàòà Y
; è ïðè íåîáõîäèìîñòè ïðîâåñòè íóæíûå ðàçðóøåíèÿ (èëè ïóñòîé âçðûâ)
; â eax âåðíóòü ðåçóëüòàò ñîáûòèÿ: 0 - íè÷åãî íå ïðîèçøëî, 1 - ïðîèçîøåë âçðûâ
; (êîðÿâàÿ ðåàëèçàöèÿ)
push ecx
push edx
add eax, 8
add ebx, 8
sub eax, CITY_OFFSET
; ïðîâåðêà íà âûëåò çà ïðåäåëû ãîðîäà
cmp eax, 0
jl bcd_out_of_city
cmp eax, 32*20
jg bcd_out_of_city
; ïðîâåðêà íà âçàèìîäåéñòâèå ñ ãîðîäîì
add eax, 10 ; äåëèì êîîðäèíàòó X íà 20
mov ecx, eax
shr eax, 4
shr ecx, 6
sub eax, ecx
shr ecx, 2
add eax, ecx
shr ecx, 2
sub eax, ecx
dec eax ; â eax íîìåð ñòîëáöà ãîðîäà ïî êîòîðîìó ëåòèò áîìáà
mov esi, eax
shl esi, 1
add esi, _city ; â esi óêàçàòåëü íà âûñîòó ïîñòðîéêè â äàííîì ñòîëáöå
mov edx, WINDOW_HEIGHT - GROUNG_HEIGHT
sub edx, ebx
mov ebx, edx
cmp ebx, 0
jg bcd_no_neg_value_Y
xor ecx, ecx
mov cx, [esi]
xor ebx, ebx
jmp bcd_damage ; íàíîñèì ðàçðóøåíèÿ
bcd_no_neg_value_Y:
add ebx, 10 ; äåëèì êîîðäèíàòó Y íà 20
mov ecx, ebx
shr ebx, 4
shr ecx, 6
sub ebx, ecx
shr ecx, 2
add ebx, ecx
shr ecx, 2
sub ebx, ecx ; â ebx âûñîòà áîìáû "â ïëèòêàõ" íàä ïîâåðõíîñòüþ
xor ecx, ecx
mov cx, [esi]
cmp ebx, ecx ; ïðîâåðêà íà ïîïàäàíèå â ñòðîåíèå
jg bcd_no_detonation
bcd_damage: ; ðàçðóøåíèÿ
;ðàçðóøåíèå ñòîëáèêà â êîòîðûé ïîïàëà áîìáà
mov edx, ecx
mov ecx, ebx
sub ecx, 2
cmp ecx, 0 ; ïðîñòî ïðîâåðêà íà 0, ÷òîá íå óøëî â ìèíóñ
jge bcd_no_neg_value_H
xor ecx, ecx
bcd_no_neg_value_H:
mov [esi], cx ; âîçâðàò çíà÷åíèÿ âûñîòû ñòîëáöà ïîñëå âçðûâà
; çà÷èñòêà âçîðâàííîé îáëàñòè
call clear_tiles
; ïðîâåðêà íà ïîïàäàíèå â çåíèòêè
call ackack_check_bombing
; ðàçðóøåíèå ñîñåäíåãî ñòîëáèêà ñëåâà
; íà äàííûé ìîìåíò èìååì: eax - íîìåð öåíòðàëüíîãî (öåíòðàëüíûé - ýòî â êîòîðûé íåïîñðåäñòâåííî ïîïàëà áîìáà) ñòîëáèêà,
; ebx - âûñîòà ïîïàäàíèÿ áîìáû, ecx - íîâàÿ âûñîòà öåíòðàëüíîãî ñòîëáèêà, edx - ïðåæíÿÿ âûñîòà öåíòðàëüíîãî ñòîëáèêà,
; esi - óêàçàòåëü íà çíà÷åíèå âûñîòû öåíòðàëüíîãî ñòîëáèêà â ìàññèâå
dec eax
cmp eax, 0
jl bcd_damage_left_end
sub esi, 2
xor ecx, ecx
mov cx, [esi] ; â ecx âûñîòà ëåâîãî ñòîëáèêà
mov edx, ecx
push ecx
sub ecx, ebx
inc ecx
cmp ecx, 2
pop ecx
ja bcd_damage_left_end ; óñëîâèå |ecx-ebx|<=1
dec ecx
cmp ecx, 0 ; ïðîñòî ïðîâåðêà íà 0, ÷òîá íå óøëî â ìèíóñ
jge bcd_no_neg_value_HL
xor ecx, ecx
bcd_no_neg_value_HL:
mov [esi], cx
call clear_tiles
; ïðîâåðêà íà ïîïàäàíèå â çåíèòêè
call ackack_check_bombing
bcd_damage_left_end:
; ðàçðóøåíèå ñîñåäíåãî ñòîëáèêà ñïðàâà
; íà äàííûé ìîìåíò èìååì: eax - íîìåð ëåâîãî ñòîëáèêà,
; ebx - âûñîòà ïîïàäàíèÿ áîìáû, ecx - íîâàÿ âûñîòà ëåâîãî ñòîëáèêà, edx - ïðåæíÿÿ âûñîòà ëåâîãî ñòîëáèêà,
; esi - óêàçàòåëü íà çíà÷åíèå âûñîòû ëåâîãî ñòîëáèêà â ìàññèâå
inc eax
inc eax
cmp eax, 32
jge bcd_damage_right_end
add esi, 4
xor ecx, ecx
mov cx, [esi] ; â ecx âûñîòà ïðàâîãî ñòîëáèêà
mov edx, ecx
push ecx
sub ecx, ebx
inc ecx
cmp ecx, 2
pop ecx
ja bcd_damage_right_end ; óñëîâèå |ecx-ebx|<=1
dec ecx
cmp ecx, 0 ; ïðîñòî ïðîâåðêà íà 0, ÷òîá íå óøëî â ìèíóñ
jge bcd_no_neg_value_HR
xor ecx, ecx
bcd_no_neg_value_HR:
mov [esi], cx
call clear_tiles
; ïðîâåðêà íà ïîïàäàíèå â çåíèòêè
call ackack_check_bombing
bcd_damage_right_end:
call check_level_complete
bcd_detonation:
mov eax, 1
jmp bcd_end
bcd_no_detonation:
mov eax, 0
jmp bcd_end
bcd_out_of_city:
mov eax, 1
cmp ebx, WINDOW_HEIGHT - GROUNG_HEIGHT
jge bcd_end
mov eax, 0
bcd_end:
pop edx
pop ecx
ret
bombfly_sound_start: ; ecx - íîìåð áîìáû â ìàññèâå
push eax ebx ecx
cmp [_flag_bomberdatabin_ok], 1
jne @f
stdcall ssmix_playtrack, [_array_sounds+8*((( 1 ))-1)], [_array_sounds+8*((( 1 ))-1)+4], VOLUME_BOMBFLY, VOLUME_BOMBFLY, SSMIX_CHANMODE_SINGLE_WITHOUT_RESET
@@:
mov ebx, ecx
shl ebx, 2
add ebx, _array_bombsoundchannels
mov [ebx], eax
pop ecx ebx eax
ret
bombfly_sound_stop: ; ecx - íîìåð áîìáû â ìàññèâå
push eax ebx ecx
mov ebx, ecx
shl ebx, 2
add ebx, _array_bombsoundchannels
mov eax, [ebx]
cmp [_flag_bomberdatabin_ok], 1
jne @f
stdcall ssmix_stoptrack, eax
@@:
inc ecx
.delete_loop:
cmp ecx, MAX_BOMBS
jae .delete_loop_end
mov ebx, ecx
shl ebx, 2
add ebx, _array_bombsoundchannels
mov eax, [ebx]
mov [ebx-4], eax
inc ecx
jmp .delete_loop
.delete_loop_end:
pop ecx ebx eax
ret
; ==================================== ÂÇÐÛÂÛ =======================================
fill_circle:
; ïîñòðîåíèå çàïîëíåííîãî êðóãà (àëãîðèòì Áðåçåíõåìà)
; âõîäíûå ïàðàìåòðû:
; eax - êîîðäèíàòà öåíòðà ïî X
; ebx - êîîðäèíàòà öåíòðà ïî Y
; ecx - ðàäèóñ
; edx - öâåò
mov edi, eax
mov esi, ebx
push edx ; öâåò â ñòåê
mov eax, ecx
shl eax, 1
mov edx, 3
sub edx, eax ; D:=3-2*R
xor ebx, ebx ; òåïåðü â ebx áóäåò êîîðä X, â ecx êîîðä Y, â edx ïåðåìåííàÿ D, â eax - ïðîìåæóòî÷íûå äàííûå
fc_loop:
cmp ebx, ecx
jg fc_loop_end
; îòðèñîâêà ëèíèÿìè
pop eax ; öâåò èç ñòåêà
push edx ; D â ñòåê
mov edx, eax ; â edx - öâåò
push ebx
push ecx
; ðèñóåì ïåðâûé îòðåçîê
mov eax, edi
sub eax, ebx
shl eax, 16
add ebx, edi
add ebx, eax ; ïîëó÷èëè êîíöû îòðåçêà ïî õ
add ecx, esi
mov eax, ecx
shl eax, 16
add ecx, eax ; ïîëó÷èëè êîíöû îòðåçêà ïî y
mov eax, 38
int 0x40
pop ecx
push ecx
; ðèñóåì âòîðîé îòðåçîê
mov eax, esi
sub eax, ecx
mov ecx, eax
shl eax, 16
add ecx, eax ; ïîëó÷èëè êîíöû îòðåçêà ïî y
mov eax, 38
int 0x40
pop ecx
pop ebx
push ecx
push ebx ; îáðàòèòü âíèìàíèå! ïîðÿäîê çàãðóçêè êîîðäèíàò â ñòåê ïîìåíÿëñÿ!
; ðèñóåì òðåòèé îòðåçîê
mov eax, edi
sub eax, ecx
shl eax, 16
add ecx, edi
add ecx, eax
mov eax, ebx
mov ebx, ecx ; ïîëó÷èëè êîíöû îòðåçêà ïî õ
mov ecx, eax ; âíèìàíèå! â ecx - êîîðäèíàòà x
add ecx, esi
mov eax, ecx
shl eax, 16
add ecx, eax ; ïîëó÷èëè êîíöû îòðåçêà ïî y
mov eax, 38
int 0x40
pop ecx
push ecx
; ðèñóåì ÷åòâåðòûé îòðåçîê
mov eax, esi
sub eax, ecx
mov ecx, eax
shl eax, 16
add ecx, eax ; ïîëó÷èëè êîíöû îòðåçêà ïî y
mov eax, 38
int 0x40
pop ebx
pop ecx
mov eax, edx ; â eax - öâåò
pop edx ; D èç ñòåêà
push eax ; öâåò â ñòåê
; ïåðåõîä â ñëåäóþùåé òî÷êå
cmp edx, 0
jge fc_loop_D_more_0 ; åñëè D<0
fc_loop_D_low_0: ; òî
mov eax, ebx
shl eax, 2
add edx, eax
add edx, 4 ; D:=D+4*X+6
jmp fc_loop_cmpD_end
fc_loop_D_more_0: ; èíà÷å
mov eax, ebx
sub eax, ecx
shl eax, 2
add edx, eax
add edx, 10 ; D:=D+4*(X-Y)+10
dec ecx
fc_loop_cmpD_end: ; êîíåö åñëè
inc ebx
jmp fc_loop
fc_loop_end:
pop edx ; öâåò èç ñòåêà
ret
bang_add: ; äîáàâèòü âçðûâ îò áîìáû, eax - êîîðäèíàòà X, eab - êîîðäèíàòà Y
push eax
push ebx
push ecx
push edx
shl eax, 16
add eax, ebx
mov ebx, _bang_array
xor ecx, ecx
bang_add_loop:
cmp ecx, MAX_BOMBS
jae bang_add_loop_end
mov edx, [ebx]
cmp edx, -1
jne bang_add_loop_freecheck_end
mov edx, 5*65536 + 3
mov [ebx], edx
add ebx, 4
mov [ebx], eax
cmp [_flag_bomberdatabin_ok], 1
jne @f
stdcall ssmix_playtrack, [_array_sounds+8*((( 2 ))-1)], [_array_sounds+8*((( 2 ))-1)+4], VOLUME_BOMBBANG, VOLUME_BOMBBANG, SSMIX_CHANMODE_SINGLE
@@:
jmp bang_add_loop_end
bang_add_loop_freecheck_end:
add ebx, 8
inc ecx
jmp bang_add_loop
bang_add_loop_end:
pop edx
pop ecx
pop ebx
pop eax
ret
bang_proc:
mov ebx, _bang_array
xor ecx, ecx
bang_proc_loop:
cmp ecx, MAX_BOMBS
jae bang_proc_loop_end
; ïðîâåðêà íà íàëè÷èå âçðûâà
mov edx, [ebx]
cmp edx, -1
je bang_proc_loop_freecheck_end
; ïðîâåðêà íà çàâåðøåíèå âçðûâà
and edx, 0x0000FFFF
cmp edx, 0
jne bang_proc_loop_endcheck_end
; çäåñü ïèøåì îáðàáîòêó çàâåðøåíèÿ âçðûâà
push ebx
push ecx
mov ecx, [ebx]
shr ecx, 16
add ebx, 4
mov eax, [ebx]
mov ebx, eax
shr eax, 16
and ebx, 0x0000FFFF
mov edx, BACK_COLOR
call fill_circle
pop ecx
pop ebx
mov eax, -1
mov [ebx], eax
jmp bang_proc_loop_continue
bang_proc_loop_endcheck_end:
; çäåñü ïèøåì îáðàáîòêó âçðûâà
push ebx
push ecx
; çàäàåì ðàäèóñ è ñ÷èòàåì íîâûé
mov eax, [ebx]
mov edx, eax
shr eax, 16
mov ecx, eax
and edx, 0x0000FFFF
mov eax, edx
shl eax, 3
add eax, ecx
shl eax, 16
dec edx
add eax, edx
mov [ebx], eax
; çàäàåì êîîðäèíàòû
add ebx, 4
mov eax, [ebx]
mov ebx, eax
shr eax, 16
and ebx, 0x0000FFFF
;çàäàåì öâåò
mov edx, BANG_COLOR
call fill_circle
pop ecx
pop ebx
bang_proc_loop_freecheck_end:
bang_proc_loop_continue:
add ebx, 8
inc ecx
jmp bang_proc_loop
bang_proc_loop_end:
ret
; ===================================== ÇÅÍÈÒÊÈ =========================================
; óïðàâëåíèå çåíèòêàìè, äîáàâëåíèå çåíèòîê, îòðèñîâêà çåíèòîê, ñòðåëüáà
ackack_draw: ; îòðèñîâêà çåíèòîê
mov ebx, _ackack
xor ecx, ecx
xor esi, esi ; ôëàã íàëè÷èÿ õîòÿ áû îäíîé çåíèòêè (äåéñòâóþùåé èëè â ïåðñïåêòèâå)
ackack_draw_loop:
cmp ecx, 32
jae ackack_draw_loop_end
xor eax, eax
mov ax, [ebx]
cmp eax, 1
jne ackack_draw_continue ; åñëè çíà÷åíèå òåêóùåé ÿ÷åéêè â ìàññèâå íå 1 òî íå ðèñóåì çåíèòêó
push ebx
push ecx
; â ebx ïîëó÷àåì óêàçàòåëü íà âûñîòó ïîñòðîéêè
mov ebx, ecx
shl ebx, 1
add ebx, _city ; ïîëó÷èëè óêàçàòåëü íà âûñîòó ïîñòðîéêè
xor eax, eax
mov ax, [ebx] ; ïîëó÷èëè âûñîòó ïîñòðîéêè
cmp eax, 0
jle ackack_draw_continue2 ; åñëè ïîñòðîéêè íåò òî íå ðèñóåì çåíèòêó
mov esi, 1
call ackack_bullet_start
; îòðèñîâêà çåíèòêè
mov ebx, bmp_ackack ; ïîëó÷èëè óêàçàòåëü íà êàðòèíêó
cmp edx, 0
je ackack_draw_no_start_bullet
add ebx, 20*20*3 ; êàðòèíêà ñî òðåëÿþùåé çåíèòêîé
ackack_draw_no_start_bullet:
; ôîðìèðîâàíèå êîîðäèíàò êàðòèíêè â edx
mov edx, ecx
shl edx, 4
shl ecx, 2
add edx, ecx
add edx, CITY_OFFSET
shl edx, 16
mov ecx, eax
shl eax, 4
shl ecx, 2
add eax, ecx
mov ecx, WINDOW_HEIGHT-GROUNG_HEIGHT
sub ecx, eax
sub ecx, 20 ; ïîäíÿëè êîîðäèíàòó íà ïëèòêó âûøå ïîñòðîéêè
add edx, ecx ; ïîëó÷èëè êîîðäèíàòû
mov ecx, 20*0x00010000 + 20 ; çàäàëè ðàçìåð êàðòèíêè
mov eax, 7
int 0x40 ; âûâîäèì êàðòèíêó
ackack_draw_continue2:
pop ecx
pop ebx
ackack_draw_continue:
add ebx, 2
inc ecx
jmp ackack_draw_loop
ackack_draw_loop_end:
cmp esi, 0
jne @f
; âûêëþ÷èòü ñèðåíó
call air_raid_warning_off
@@:
ret
ackack_check_bombing: ; ïðîâåðêà íà ïîäðûâ çåíèòîê áîìáàìè : eax - íîìåð ñòîëáöà
push eax
push ebx
push ecx
push edx
; ïðîâåðêà íà ïîïàäàíèå â ñòîëáåö çåíèòêè
mov ebx, eax
shl ebx, 1
push ebx
add ebx, _ackack
mov edx, ebx ; çàïîìíèì óêàçàòåëü ñîñòîÿíèÿ çåíèòêè â edx
xor eax, eax
mov ax, [ebx] ; â eax ïîëó÷èëè ñîñòîÿíèå çåíèòêè
cmp eax, 1
jne acb_no_bombing ; ïðîâåðêà íà íàëè÷èå çåíèòêè â äàííîì ñòîëáöå
xor eax, eax
mov [ebx], ax ; óáèðàåì çåíèòêó
call ackack_next_wave
acb_no_bombing:
; ïðîâåðêà íà ïîëíîå óíè÷íîæåíèå ñòîëáöà
pop ebx
add ebx, _city
xor eax, eax
mov ax, [ebx] ; â eax ïîëó÷èëè ñîñòîÿíèå çåíèòêè
cmp eax, 0
jg acb_no_destroy_building ; ïðîâåðêà íà íàëè÷èå ïîñòðîéêè â ñòîëáöå
xor eax, eax
mov [ebx], ax ; óáèðàåì çåíèòêó äàæå â ïåðñïåêòèâå
acb_no_destroy_building:
pop edx
pop ecx
pop ebx
pop eax
ret
ackack_next_wave: ; íîâàÿ âîëíà çåíèòîê
push eax
push ebx
push ecx
push edx
anw_begin:
mov ebx, _ackack
xor ecx, ecx
xor edx, edx ; ôëàã êîíòðîëÿ çà çåíèòêàìè
anw_loop:
cmp ecx, 32
jae anw_loop_end
xor eax, eax
mov ax, [ebx]
cmp eax, 1
jle anw_continue ; åñëè çíà÷åíèå òåêóùåé ÿ÷åéêè <=1 òî ïðîïóñêàåì
dec eax
mov [ebx], ax
cmp eax, 1
jg anw_no_active_ackack ; åñëè çíà÷åíèå òåêóùåé ÿ÷åéêè â ìàññèâå >1 òî ïðîïóñêàåì
mov edx, 1 ; ïîêàçûâàåì ÷òî åñòü äåéñòâóþùàÿ çåíèòêà
jmp anw_continue
anw_no_active_ackack:
cmp edx, 1
je anw_continue ; åñëè ôëàãà 1 òî ïðîïóñêàåì
mov edx, 2
anw_continue:
add ebx, 2
inc ecx
jmp anw_loop
anw_loop_end:
cmp edx, 2
je anw_begin
pop edx
pop ecx
pop ebx
pop eax
ret
ackack_bullet_start: ; çàïóñê ñíàðÿäîâ (âõîäíûå: eax - âûñîòà ñòîëáöà, ecx - íîìåð ñòîëáöà;
; âûõîäíûå: edx - ôëàã íîâîãî çàïóñêà (0-íåò, 1 -äà)
push eax
push ebx
push ecx
cmp [_flag_air_raid_warning], 1
jne abs_no_start_bullet
; â ebx ïîëó÷àåì óêàçàòåëü íà ïîëîæåíèå ñíàðÿäà
mov edx, eax
mov ebx, ecx
shl ebx, 2
add ebx, _ackack_bullet ; ïîëó÷èëè óêàçàòåëü íà ïîëîæåíèå ñíàðÿäà
mov eax, [ebx] ; ïîëó÷èëè ïîëîæåíèå ñíàðÿäà
cmp eax, 0
jne abs_no_start_bullet ; åñëè íå 0, òî íå çàïóñêàåì íîâûé
; çàïóñê ñíàðÿäà
mov eax, edx ; ïîìåùàåì â eax âûñîòó ïîñòðîéêè
; ñ÷èòàåì êîîðäèíàòó âåðøèíû
mov ecx, eax
shl eax, 4
shl ecx, 2
add eax, ecx
mov ecx, WINDOW_HEIGHT-GROUNG_HEIGHT
sub ecx, eax
sub ecx, 20+BULLET_SIZE ; ïîäíÿëè êîîðäèíàòó íà ïëèòêó âûøå ïîñòðîéêè + âûñîòà ñíàÿðÿäà (â ecx - íà÷àëüíàÿ êîîðäèíàòà ñíàðÿäà)
mov [ebx], ecx ; çàäàëè íà÷àëüíóþ êîîðäèíàòó ñíàðÿäó
cmp [_flag_bomberdatabin_ok], 1
jne @f
stdcall ssmix_playtrack, [_array_sounds+8*((( 3 ))-1)], [_array_sounds+8*((( 3 ))-1)+4], VOLUME_ACKACK,VOLUME_ACKACK , SSMIX_CHANMODE_SINGLE
@@:
mov edx, 1
jmp abs_end_start_bullet
abs_no_start_bullet:
mov edx, 0
abs_end_start_bullet:
pop ecx
pop ebx
pop eax
ret
ackack_bullet_proc: ; ïðîöåäóðà îáðàáîòêè è îòðèñîâêè ñíàðÿäîâ
mov ebx, _ackack_bullet
xor ecx, ecx
abp_loop:
cmp ecx, 32
jae abp_loop_end
mov eax, [ebx]
cmp eax, 0
je abp_continue
jl abp_low_zero
push ebx
push ecx
; ñòèðàíèå ñòàðîãî èçîáðàæåíèÿ
mov ebx, ecx
shl ebx, 4
shl ecx, 2
add ebx, ecx
add ebx, CITY_OFFSET
add ebx, 7 ; ñìåùåíèå ñíàðÿäà
mov edx, ebx
shl ebx, 16
add ebx, edx ; â ebx êîîðäèíàòû íà÷àëà è êîíöà îòðåçêà ïî îñè X
mov ecx, eax
mov edx, ecx
add edx, BULLET_SIZE ; ïðèáàâèëè äëèíó ñíàðÿäà
shl ecx, 16
add ecx, edx ; â ebx êîîðäèíàòû íà÷àëà è êîíöà îòðåçêà ïî îñè Y
mov edx, BACK_COLOR
mov eax, 38
int 0x40
add ebx, 0x00050005
int 0x40
pop ecx
pop ebx
push ebx
push ecx
mov eax, [ebx]
sub eax, ACKACK_BULLET_SPEED
mov [ebx], eax
cmp eax, 0
jle abp_end_draw_bullet
call ackack_bullet_interaction_check
cmp edx, 0
je abp_no_bullet_interaction ; åñëè íå áûëî âçàèìîäåéñòâèå òî ðèñóåì ñíàðÿäû
xor eax, eax
mov [ebx], eax
jmp abp_end_draw_bullet
abp_no_bullet_interaction:
; ðèñóåì ñíàðÿäû
mov ebx, ecx
shl ebx, 4
shl ecx, 2
add ebx, ecx
add ebx, CITY_OFFSET
add ebx, 7 ; ñìåùåíèå ñíàðÿäà
mov edx, ebx
shl ebx, 16
add ebx, edx ; â ebx êîîðäèíàòû íà÷àëà è êîíöà îòðåçêà ïî îñè X
mov ecx, eax
mov edx, ecx
add edx, BULLET_SIZE ; ïðèáàâèëè äëèíó ñíàðÿäà
shl ecx, 16
add ecx, edx ; â ebx êîîðäèíàòû íà÷àëà è êîíöà îòðåçêà ïî îñè Y
mov edx, 0x00000000
mov eax, 38
int 0x40
add ebx, 0x00050005
int 0x40
abp_end_draw_bullet:
pop ecx
pop ebx
jmp abp_continue
abp_low_zero:
xor eax, eax
mov [ebx], eax
abp_continue:
add ebx, 4
inc ecx
jmp abp_loop
abp_loop_end:
ret
ackack_bullet_interaction_check: ; ïðîâåðêà âçàèìîäåéñòâèÿ ñíàðÿäîâ
; (âõîäíûå: eax - êîîðäèíàòà ñíàðÿäà ïî Y, ecx - íîìåð ñòîëáöà;
; âûõîäíûå: edx - ôëàã ïîïàäàíèÿ (0-íåò, 1 -äà))
push eax
push ebx
push ecx
; åñëè ñàìîëåò äåëàåò áî÷êó òî ïðîïóñêàåì
mov ebx, [_plane_health]
cmp ebx, 0
jle abic_with_plane_no
mov ebx, [_plane_state]
cmp ebx, 4
je abic_with_plane_no
cmp ebx, 5
je abic_with_plane_no
; ïðîâåðêà íà êîîðäèíàòû
mov ebx, [_Y_plane]
cmp eax, ebx
jl abic_with_plane_no ; åñëè ñíÿðÿä âûøå êîîðäèíàòû ïîïàäÿíèÿ òî ïðîïóñêàåì
add ebx, 20 ; â ebx - êîîðäèíàòà ïîïàäàíèÿ â ñàìîëåò
cmp eax, ebx
jg abic_with_plane_no ; åñëè ñíÿðÿä íèæå êîîðäèíàòû ïîïàäÿíèÿ òî ïðîïóñêàåì
; ñ÷èòàåì êîîðäèíàòó X âåðøèíû
mov edx, ecx
shl edx, 4
shl ecx, 2
add ecx, edx
add ecx, CITY_OFFSET
add ecx, 7 ; â ecx - êîîðäèíàòà X ëåâîãî ñíàðÿäà
mov ebx, [_X_plane]
add ebx, 32
cmp ecx, ebx
jg abic_with_plane_no
mov ebx, [_X_plane]
add ecx, 5
cmp ecx, ebx
jl abic_with_plane_no
; åñòü ïîïàäàíèå!!!
mov ebx, [_plane_health]
sub ebx, 20
mov [_plane_health], ebx
cmp ebx, 0 ; ïðîâåðêà íà game over
jg abic_no_plane_crash
mov [_plane_health], 0
mov eax, [_X_plane]
mov ebx, [_Y_plane]
call bang_add ; äåëàåì âçðûâ
call game_over ; çàâåðøåíèå èãðû
abic_no_plane_crash:
mov edx, 1
jmp abic_with_plane_end
abic_with_plane_no:
mov edx, 0
abic_with_plane_end:
pop ecx
pop ebx
pop eax
ret
; ===================================== ÌÈÐ =========================================
ground_draw:
mov eax, 13
mov ebx, 0*0x00010000 + (WINDOW_WIDTH-10)
mov ecx, (WINDOW_HEIGHT-GROUNG_HEIGHT)*0x00010000 + (GROUNG_HEIGHT-5-20)
mov edx, GROUND_COLOR
int 0x40
mov eax, 38
mov ebx, 0*0x00010000 + (WINDOW_WIDTH-10)
mov ecx, (WINDOW_HEIGHT-GROUNG_HEIGHT)*0x00010000 + (WINDOW_HEIGHT-GROUNG_HEIGHT)
mov edx, 0x000000
int 0x40
ret
city_draw: ; îòðèñîâêà ãîðîäà
mov ebx, _city
xor edx, edx
city_draw_loop:
cmp edx, 32
jae city_draw_loop_end
xor eax, eax
mov ax, [ebx]
push ebx
push edx
mov ebx, bmp_tile
city_draw_loop2:
cmp eax, 0
jle city_draw_loop2_end
push eax
push edx
; ôîðìèðîâàíèå êîîðäèíàò êàðòèíêè â edx
mov ecx, edx
shl edx, 4
shl ecx, 2
add edx, ecx
add edx, CITY_OFFSET
shl edx, 16
mov ecx, eax
shl eax, 4
shl ecx, 2
add eax, ecx
mov ecx, WINDOW_HEIGHT-GROUNG_HEIGHT
sub ecx, eax
add edx, ecx ; ïîëó÷èëè êîîðäèíàòû
mov ecx, 20*0x00010000 + 20 ; çàäàëè ðàçìåð êàðòèíêè
mov eax, 7
int 0x40 ; âûâîäèì êàðòèíêó
pop edx
pop eax
dec eax
jmp city_draw_loop2
city_draw_loop2_end:
pop edx
pop ebx
add ebx, 2
inc edx
jmp city_draw_loop
city_draw_loop_end:
ret
clear_tiles: ; çà÷èñòêà âçîðâàííûõ ïëèòîê: eax - íîìåð ñòîëáöà, ecx - íèæíÿÿ ïëèòêà èç óäàëÿåìûõ, edx - âåðõíÿÿ ïëèòêà èç óäàëÿåìûõ
push eax
push ebx
push ecx
push edx
; ôîðìèðîâàíèå êîîðäèíàòû X óãëà ïðÿìîóãîëüíèêà
mov ebx, eax
shl eax, 4
shl ebx, 2
add eax, ebx
add eax, CITY_OFFSET
; ôîðìèðîâàíèå êîîðäèíàòû Y1 íèæíåãî êðàÿ íèæíåé ïëèòêè
mov ebx, ecx
shl ecx, 4
shl ebx, 2
add ecx, ebx
mov ebx, WINDOW_HEIGHT-GROUNG_HEIGHT
sub ebx, ecx
mov ecx, ebx
add ecx, 20
; ôîðìèðîâàíèå êîîðäèíàòû Y2 âåðõíåãî êðàÿ âåðõíåé ïëèòêè
mov ebx, edx
shl edx, 4
shl ebx, 2
add edx, ebx
mov ebx, WINDOW_HEIGHT-GROUNG_HEIGHT
sub ebx, edx
mov edx, ebx
sub edx, 20 ; ÷òîá è çåíèòêè ñòèðàòü, åñëè îíè åñòü
; çàäàíèå êîîðäèíàòû ïðÿìîóãîëüíèêà ïî Y=Y2 è åãî âûñîòû H=Y1-Y2
sub ecx, edx
shl edx, 16
add ecx, edx
; çàäàíèå êîîðäèíàòû ïðÿìîóãîëüíèêà ïî X è åãî øèðèíû 20
shl eax, 16
add eax, 20
mov ebx, eax
; îòðèñîâêà ïðÿìîóãîëüíèêà öâåòà ôîíà
mov eax, 13
mov edx, BACK_COLOR
int 0x40
pop edx
pop ecx
pop ebx
pop eax
ret
load_level: ; çàãðóçêà óðîâíÿ, â eax íîìåð çàãðóæàåìîãî óðîâíÿ
mov eax, [_level_num]
dec eax
shl eax, 7 ; óìíîæèòü íà ðàçìåð äàííûõ äëÿ îäíîãî óðîâíÿ (128 áàéò)
mov ebx, levels
add ebx, eax ; â ebx óêàçàòåëü íà íà÷àëî çàãðóæàåìîãî óðîâíÿ
mov edx, cur_level
mov ecx, 0
load_level_loop:
cmp ecx, 128/4
jae load_level_loop_end
mov eax, [ebx]
mov [edx], eax
add ebx, 4
add edx, 4
inc ecx
jmp load_level_loop
load_level_loop_end:
load_level_end:
ret
; =================================== ÐÀÇÍÎÅ ========================================
timer_x4:
mov eax, [_timer_x4]
inc eax
mov [_timer_x4],eax
cmp eax, 4
ja timer_x4_do
jmp timer_x4_end
timer_x4_do:
mov [_timer_x4],0
timer_x4_end:
ret
timer_x2:
mov eax, [_timer_x2]
inc eax
mov [_timer_x2],eax
cmp eax, 2
ja timer_x2_do
jmp timer_x2_end
timer_x2_do:
mov [_timer_x2],0
timer_x2_end:
ret
draw_window: ; îòðèñîâêà îêíà
mov eax,12
mov ebx,1
int 0x40
mov eax,0
mov ebx,100*65536+WINDOW_WIDTH
mov ecx,100*65536+WINDOW_HEIGHT
mov edx,0x34000000+BACK_COLOR
mov edi,_window_caption
int 0x40
mov eax,12
mov ebx,2
int 0x40
ret
draw_intro:
;çàãîëîâîê
mov eax,4
mov ebx,(WINDOW_WIDTH/2-80)*65536 + 60
mov ecx,0x80000000
mov edx,_text_intro_title
int 0x40
;îïèñàíèå èãðû
mov eax,4
mov ebx,(WINDOW_WIDTH/2-200)*65536 + 120
mov ecx,0x80000000
mov edx,_text_intro_description1
int 0x40
;êëàâèøè óïðàâëåíèÿ
mov eax,4
mov ebx,(WINDOW_WIDTH/2-60)*65536 + 200
mov ecx,0x80000000
mov edx,_text_intro_key_controls
int 0x40
mov eax,4
mov ebx,(WINDOW_WIDTH/2-70)*65536 + 230
mov ecx,0x80000000
mov edx,_text_intro_key_ctrl
int 0x40
mov eax,4
mov ebx,(WINDOW_WIDTH/2-70)*65536 + 245
mov ecx,0x80000000
mov edx,_text_intro_key_space
int 0x40
; âûáîð óðîâíÿ
mov eax,4
mov ebx,(WINDOW_WIDTH/2-175)*65536 + 300
mov ecx,0x80000000
mov edx,_text_intro_select_level
int 0x40
mov eax,4
mov ebx,(WINDOW_WIDTH/2-25)*65536 + 320
mov ecx,0x80000000
mov edx,_text_intro_level_num
int 0x40
call draw_level_num
; óñòàíîâêà ãðîìêîñòè
mov eax,4
mov ebx,(WINDOW_WIDTH/2-175)*65536 + 350
mov ecx,0x80000000
mov edx,_text_intro_set_volume
int 0x40
mov eax,4
mov ebx,(WINDOW_WIDTH/2-25)*65536 + 370
mov ecx,0x80000000
mov edx,_text_intro_volume_num
int 0x40
call draw_volume_num
; çàïóñê èãðû è âûõîä
mov eax,4
mov ebx,(WINDOW_WIDTH/2-80)*65536 + 400
mov ecx,0x80FF0000
mov edx,_text_intro_start_space
int 0x40
mov eax,4
mov ebx,(WINDOW_WIDTH/2-30)*65536 + 460
mov ecx,0x80000000
mov edx,_text_intro_exit_key
int 0x40
ret
draw_level_num:
mov eax, 13
mov ebx, (WINDOW_WIDTH/2+25)*0x00010000 + 30
mov ecx, 320*0x00010000 + 15
mov edx, BACK_COLOR
int 0x40
mov eax, 47
mov ebx, 0x80020000
mov ecx, [_level_num]
mov edx, (WINDOW_WIDTH/2+25)*65536 + 320
mov esi,0x00000000
int 0x40
ret
draw_volume_num:
mov eax, 13
mov ebx, (WINDOW_WIDTH/2+25)*0x00010000 + 30
mov ecx, 370*0x00010000 + 15
mov edx, BACK_COLOR
int 0x40
mov eax, 47
mov ebx, 0x80020000
mov ecx, [_set_volume]
mov edx, (WINDOW_WIDTH/2+25)*65536 + 370
mov esi,0x00000000
int 0x40
ret
;---------------------------------------------------------------------------
;-------------------------------- äàííûå -----------------------------------
;---------------------------------------------------------------------------
_game_state dd ?
_delay dd 6
_timer_x2 dd ?
_timer_x4 dd ?
_game_over_time dd ?
_flag_air_raid_warning dd ?
_flag_bomberdatabin_ok dd ?
_last_value_timecount dd ?
_X_plane dd ?
_Y_plane dd ?
_last_XY_plane dd ?
_VX_plane dd ?
_addit_VY_plane dd ?
_plane_state dd ? ; 0 - ïîëåò íàïðàâî, 1- ïîëåò íàëåâî, 2-ðàçâîðîò ñïðàâà-íàëåâî, 3-ðàçâîðîò ñëåâà-íàïðàâî, 4 - áî÷êà âïðàâî, 5 - áî÷êà âëåâî
_plane_state_step dd ? ; íîìåð øàãà òåêóùåãî ñîñòîÿíèÿ (íóæíî äëÿ ñèíõíîïèçàöèè ñ àíèìàöèåé)
_plane_health dd ? ; çäîðîâüå ñàìîëåòà
_bomb_count dd ?
_bomb_array rd 4*MAX_BOMBS
_bomb_delay_time dd ? ; çàäåðæêà âðåìåíè íà ñáðîñ áîìáû
_bang_array rd 2*MAX_BOMBS
_anim_pos_plane dd ?
; ïîñëåäîâàòåëüíîñòè êàðòèíîê àíèìàöèè
_anim_array_uturn_rl dd 0,1,2,3,4,5,6,7,8
_anim_array_uturn_lr dd 8,7,6,9,10,11,2,1,0
_anim_array_barrel_r dd 0,1,2,12,13,14,15,16,0
_anim_array_barrel_l dd 8,17,18,19,20,21,6,7,8
cur_level:
; ìàññèâ, â êîòîðîì õðàíèòüñÿ òåêóùåå ñîñòîÿíèå ãîðîäà. èçíà÷àëüíî â íåãî çàãðóçàþòñÿ óðîâíè
_city rw 32
; ìàññèâ, â êîòîðîì õðàíèòüñÿ òåêóùåå ñîñòîÿíèå çåíèòîê. èçíà÷àëüíî â íåãî çàãðóçàþòñÿ óðîâíè
_ackack rw 32
; ìàññèâ, â êîòîðîì õðàíÿòñÿ çíà÷åíèÿ òåêóùèõ êîîðäèíà ñíàðÿäîâ îò çåíèòîê
_ackack_bullet rd 32
; íîìåð òåêóùåãî óðîâíÿ
_level_num dd 1
; çàäàíèå óðîâíåé: 32 ÷èñëà îçíà÷àþò âûñîòó ñòðîåíèé (âûñîòà "â êâàäðàòàõ") äëÿ _level?_city
; è ïîðÿäîê ïîÿâëåíèÿ çåíèòîê äëÿ _level?_ackack
levels:
_level1_city dw 0, 0, 0, 6, 5, 6, 5, 6, 3, 3, 3, 3, 3, 6, 7, 8, 8, 7, 6, 3, 3, 3, 3, 3, 6, 5, 6, 5, 6, 0, 0, 0
_level1_ackack dw 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
_level2_city dw 0, 0, 0, 5, 5, 2, 5, 7, 7, 2, 7, 9, 9, 9, 2, 9, 9, 2, 9, 9, 9, 7, 2, 7, 7, 5, 2, 5, 5, 0, 0, 0
_level2_ackack dw 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 5, 0, 0, 6, 0, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 0, 0
_level3_city dw 0, 0, 0,12,12,12, 9, 9, 9,12,12,12, 9, 7, 5, 3, 3, 5, 7, 9,12,12,12, 9, 9, 9,12,12,12, 0, 0, 0
_level3_ackack dw 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 4, 0, 3, 0, 2, 1, 1, 2, 0, 3, 0, 5, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0
_level4_city dw 0, 0, 0,12,12,12, 3,12,12,12, 3, 1, 1, 6,12,18, 18,12, 6, 1, 1, 3,12,12,12, 3,12,12,12, 0, 0, 0
_level4_ackack dw 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 1, 0, 3, 0, 0, 2, 6, 0, 0, 3, 0, 1, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0
_level5_city dw 0, 5,10,10,10,10,15,15,15,15,17,17,17,17, 1,15, 15, 1,17,17,17,17,15,15,15,15,10,10,10,10, 5, 0
_level5_ackack dw 0, 8, 0, 9, 9, 0, 3, 3, 3, 3, 0, 0, 0, 0, 5, 1, 2, 5, 0, 0, 0, 0, 4, 4, 4, 4, 0,10,10, 0, 7, 0
; çâóêè
_count_sounds dd ?
_array_sounds rd 2*MAX_SOUNDS
_channel_sound_plane dd ? ; íîìåð êàíàëà çâóêà ïðîïåëåðà ñàìîëåòà
_channel_sound_arw dd ? ; íîìåð êàíàëà çâóêà ñèðåíû
_array_bombsoundchannels rd MAX_BOMBS ; ìàññèâ íîìåðîâ çâóêîâûõ êàíàëîâ äëÿ áîìá
_set_volume dd 8 ; ãðîìêîñòü 0..8
; ðàçíîå
_s_current_dir rb 4096 ; ïóòü ê èñïîëíÿåìîìó ôàéëó
file_info: ; èíôîðìàöèîííàÿ ñòðóêòóðà äëÿ ðàáîòû ñ ôàéëàìè
_fi_func dd ?
_fi_pos dd ?
dd 0
_fi_size dd ?
_fi_pbuff dd ?
db 0
_fi_pfilename dd ?
if lang eq ru
include 'ruslang.inc'
else
include 'englang.inc'
end if
bmp_plane:
file "plane.bmp":54
bmp_bomb:
file "bomb.bmp":54
bmp_tile:
file "tile.bmp":54
bmp_ackack:
file "ackack.bmp":54
align 16
rb 0x100 ; ðåçåðâ ïàìÿòè äëÿ ñòåêà.
i_end: