0,0 → 1,2367 |
;çàãîëîâîê ïðèëîæåíèÿ |
|
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 '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 ? |
|
|
;include 'ruslang.inc' |
include 'englang.inc' |
|
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: |
|