Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 4322 → Rev 4323

/programs/games/bomber/ackack.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/bomber/bomb.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/bomber/bomber.asm
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:
 
/programs/games/bomber/englang.inc
0,0 → 1,17
_window_caption db 'Soft landing',0 ;çàãîëîâîê ïðèëîæåíèÿ
 
_text_game_over db 'G A M E O V E R', 0
_text_level_complete db 'L E V E L C O M P L E T E', 0
_text_intro_title db ' S O F T L A N D I N G', 0
_text_intro_description1 db 'Provide a soft landing, clearing the runway from the city buildings', 0
 
_text_intro_key_controls db ' Control keys:', 0
_text_intro_key_ctrl db ' CTRL - drop a bomb', 0
_text_intro_key_space db 'SPACE - do a barrel roll', 0
_text_intro_select_level db ' Use UP and DOWN arrow keys for select game level:', 0
_text_intro_level_num db ' LEVEL', 0
_text_intro_set_volume db ' Use LEFT and RIGHT arrow keys for setting volume:', 0
_text_intro_volume_num db 'VOLUME', 0
 
_text_intro_start_space db 'Press SPACE for start game', 0
_text_intro_exit_key db 'Esc - exit', 0
/programs/games/bomber/plane.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/bomber/ruslang.inc
0,0 → 1,16
_window_caption db 'à¨§¥¬«¥­¨¥',0 ;§ £®«®¢®ª ¯à¨«®¦¥­¨ï
 
_text_game_over db 'Š Ž  … – ˆ ƒ  ›', 0
_text_level_complete db '“  Ž ‚ …  œ   Ž ‰ „ … ', 0
_text_intro_title db '   ˆ ‡ … Œ ‹ …  ˆ … ' , 0
_text_intro_description1 db ' Ž¡¥á¯¥çì⥠¯à¨§¥¬«¥­¨¥, à áç¨á⨢ ¯®«®á㠮⠣®à®¤áª¨å áâ஥­¨©', 0
 
_text_intro_key_controls db 'Š« ¢¨è¨ ã¯à ¢«¥­¨ï:', 0
_text_intro_key_ctrl db ' CTRL - ¡à®á¨âì ¡®¬¡ã', 0
_text_intro_key_space db 'SPACE - ᤥ« âì ¡®çªã', 0
_text_intro_select_level db ' ˆá¯®«ì§ã©â¥ áâ५ª¨ ¢¢¥àå ¨ ¢­¨§ ¤«ï ¢ë¡®à  ã஢­ï:', 0
_text_intro_level_num db '“஢¥­ì ', 0
_text_intro_set_volume db ' ˆá¯®«ì§ã©â¥ áâ५ª¨ ¢«¥¢® ¨ ¢¯à ¢® ¤«ï § ¤ ­¨ï £à®¬ª®áâ¨:', 0
_text_intro_volume_num db 'ƒà®¬ª®áâì', 0
_text_intro_start_space db ' ¦¬¨â¥ SPACE ¤«ï ­ ç «  ¨£àë', 0
_text_intro_exit_key db 'Esc - ¢ë室', 0
/programs/games/bomber/snd.inc
0,0 → 1,41
 
struc CTRL_INFO
{ .pci_cmd dd ?
.irq dd ?
.glob_cntrl dd ?
.glob_sta dd ?
.codec_io_base dd ?
.ctrl_io_base dd ?
.codec_mem_base dd ?
.ctrl_mem_base dd ?
.codec_id dd ?
}
CTRL_INFO_SIZE equ 9*4
 
SRV_GETVERSION equ 0
SND_CREATE_BUFF equ 1
SND_DESTROY_BUFF equ 2
SND_SETFORMAT equ 3
SND_GETFORMAT equ 4
SND_RESET equ 5
SND_SETPOS equ 6
SND_GETPOS equ 7
SND_SETBUFF equ 8
SND_OUT equ 9
SND_PLAY equ 10
SND_STOP equ 11
SND_SETVOLUME equ 12
SND_GETVOLUME equ 13
SND_SETPAN equ 14
SND_GETPAN equ 15
SND_GETBUFFSIZE equ 16
SND_GETFREESPACE equ 17
SND_SETTIMEBASE equ 18
SND_GETTIMESTAMP equ 19
 
DEV_SET_BUFF equ 4
DEV_NOTIFY equ 5
DEV_SET_MASTERVOL equ 6
DEV_GET_MASTERVOL equ 7
DEV_GET_INFO equ 8
 
/programs/games/bomber/snd_const.inc
0,0 → 1,45
SOUND_VERSION equ 0x0101
PCM_ALL equ 0
 
PCM_OUT equ 0x08000000
PCM_RING equ 0x10000000
PCM_STATIC equ 0x20000000
PCM_FLOAT equ 0x40000000
PCM_FILTER equ 0x80000000
 
PCM_2_16_48 equ 1
PCM_1_16_48 equ 2
PCM_2_16_44 equ 3
PCM_1_16_44 equ 4
PCM_2_16_32 equ 5
PCM_1_16_32 equ 6
PCM_2_16_24 equ 7
PCM_1_16_24 equ 8
PCM_2_16_22 equ 9
PCM_1_16_22 equ 10
PCM_2_16_16 equ 11
PCM_1_16_16 equ 12
PCM_2_16_12 equ 13
PCM_1_16_12 equ 14
PCM_2_16_11 equ 15
PCM_1_16_11 equ 16
PCM_2_16_8 equ 17
PCM_1_16_8 equ 18
PCM_2_8_48 equ 19
PCM_1_8_48 equ 20
PCM_2_8_44 equ 21
PCM_1_8_44 equ 22
PCM_2_8_32 equ 23
PCM_1_8_32 equ 24
PCM_2_8_24 equ 25
PCM_1_8_24 equ 26
PCM_2_8_22 equ 27
PCM_1_8_22 equ 28
PCM_2_8_16 equ 29
PCM_1_8_16 equ 30
PCM_2_8_12 equ 31
PCM_1_8_12 equ 32
PCM_2_8_11 equ 33
PCM_1_8_11 equ 34
PCM_2_8_8 equ 35
PCM_1_8_8 equ 36
/programs/games/bomber/sounds/airradewarning16_2_11.wav
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/bomber/sounds/bombbang16_2_11.wav
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/bomber/sounds/bomberdata.asm
0,0 → 1,31
db 'datapack'
count dd 5
dd wav_file1, wav_file1_end - wav_file1
dd wav_file2, wav_file2_end - wav_file2
dd wav_file3, wav_file3_end - wav_file3
dd wav_file4, wav_file4_end - wav_file4
dd wav_file5, wav_file5_end - wav_file5
dd 0
 
align 4
 
 
wav_file1:
file 'bombfly16_2_11.wav':0x36
wav_file1_end:
 
wav_file2:
file 'bombbang16_2_11.wav':0x36
wav_file2_end:
 
wav_file3:
file 'zenitka16_2_11.wav':0x36
wav_file3_end:
 
wav_file4:
file 'plane16_2_11.wav':0x36
wav_file4_end:
 
wav_file5:
file 'airradewarning16_2_11.wav':0x36
wav_file5_end:
/programs/games/bomber/sounds/bombfly16_2_11.wav
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/bomber/sounds/plane16_2_11.wav
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/bomber/sounds/zenitka16_2_11.wav
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/bomber/sounds
Property changes:
Added: tsvn:logminsize
+5
\ No newline at end of property
/programs/games/bomber/ssmix.inc
0,0 → 1,571
SSMIX_CHANMODE_FREE equ 0
SSMIX_CHANMODE_SINGLE equ 1
SSMIX_CHANMODE_REPEAT equ 2
SSMIX_CHANMODE_SINGLE_WITHOUT_RESET equ 3
SSMIX_CHANMODE_WAITRESET equ 4
 
include 'snd.inc'
include 'snd_const.inc'
include 'proc32.inc'
;include 'macros.inc'
;include 'debug.inc'
 
SSMIX_CHANNEL_COUNT equ 32
 
DEBUG equ 0 ; 0
 
 
; èíèöèàëèçàöèÿ ìèêøåðà
ssmix_init:
; âûäåëèòü ïàìÿòü äëÿ êàíàëîâ ìèêøåðà
mov eax, 68
mov ebx, 12
mov ecx, 4*8*SSMIX_CHANNEL_COUNT
int 0x40
mov [ssmix_channels], eax
; âûäåëèòü ïàìÿòü äëÿ ñòåêà ïîòîêà ìèêøåðà
mov eax, 68
mov ebx, 12
mov ecx, 4096
int 0x40
mov [ssmix_thread_stack], eax
; âêëþ÷èòü ìèêøåð
mov [ssmix_state], 1
; óñòàíîâèòü ãðîìêîñòè ñòåðåîêàíàëîâ
mov [ssmix_volumeL], 128
mov [ssmix_volumeR], 128
; ñîçäàòü ïîòîê
mov eax, 51
mov ebx, 1
mov ecx, ssmix_thread_proc
mov edx,[ssmix_thread_stack]
add edx,4092
int 0x40
 
ret
 
 
 
; çàâåðøåíèå ðàáîòû ìèêøåðà
ssmix_release:
; âûêëþ÷èòü ìèêøåð
mov [ssmix_state], 0
 
ret
 
 
 
; îñâîáîæäåíèå ïàìÿòè
ssmix_free:
; îñâîáîäèòü ïàìÿòü êàíàëîâ ìèêøåðà
mov eax, 68
mov ebx, 13
mov ecx, [ssmix_channels]
int 0x40
; îñâîáîäèòü ïàìÿòü ñòåêà ïîòîêà ìèêøåðà
mov eax, 68
mov ebx, 13
mov ecx, [ssmix_thread_stack]
int 0x40
 
ret
 
; óñòàíîâèòü ãðîìêîñòü
ssmix_setvolume: ; stdcall
; LeftVolume: dword, RightVolume: dword
 
push eax
mov eax, [esp+8] ; ãðîìêîñòü ëåâîãî êàíàëà
cmp eax, 255
jle @f
mov eax, 255
@@:
cmp eax, 0
jge @f
mov eax, 0
@@:
mov [ssmix_volumeL], eax
 
mov eax, [esp+12] ; ãðîìêîñòü ïðàâîãî êàíàëà
cmp eax, 255
jle @f
mov eax, 255
@@:
cmp eax, 0
jge @f
mov eax, 0
@@:
mov [ssmix_volumeR], eax
pop eax
 
ret
 
 
; âîñïðîèçâåñòè òðåê
ssmix_playtrack: ; stdcall
; p_starttrack:dword, p_endtrack:dword, volumeL: dword, volumeR: dword; playmode:dword;
; return eax - number of channel, if eax=-1 then no free channel
 
push ebx ecx
mov ebx, [ssmix_channels]
mov ecx, SSMIX_CHANNEL_COUNT
.channel_loop:
mov eax, [ebx]
cmp eax, SSMIX_CHANMODE_FREE
je .find_free_channel
add ebx, 32
dec ecx
jnz .channel_loop
mov eax, -1
jmp .end
.find_free_channel:
mov eax, [esp+28] ; ðåæèì âîñïðîèçâåäåíèÿ
mov [ebx], eax
mov eax, [esp+20] ; ãðîìêîñòü ëåâîãî êàíàëà
imul eax, [ssmix_volumeL]
sar eax, 7
mov [ebx+4], eax
mov eax, [esp+24] ; ãðîìêîñòü ïðàâîãî êàíàëà
imul eax, [ssmix_volumeR]
sar eax, 7
mov [ebx+8], eax
mov eax, [esp+12] ; íà÷àëî òðåêà
mov [ebx+16], eax
mov [ebx+20], eax
mov eax, [esp+16] ; êîíåö òðåêà
mov [ebx+24], eax
mov eax, SSMIX_CHANNEL_COUNT
sub eax, ecx
.end:
pop ecx ebx
 
ret 20
 
 
; îñòàíîâèòü òðåê ïî íîìåðó êàíàëà
ssmix_stoptrack: ; stdcall
; numchannel: dword
push eax ebx
mov ebx, [esp+12]
cmp ebx, 0
jl .end
cmp ebx, SSMIX_CHANNEL_COUNT
jge .end
shl ebx, 5
add ebx, [ssmix_channels]
mov eax, SSMIX_CHANMODE_FREE
mov [ebx], eax
.end:
pop ebx eax
 
ret 4
 
 
; îñòàíîâèòü âñå òðåêè
ssmix_stopalltracks:
 
push eax ebx ecx
mov eax, SSMIX_CHANMODE_FREE
mov ebx, [ssmix_channels]
mov ecx, SSMIX_CHANNEL_COUNT
.channel_loop:
mov [ebx], eax
add ebx, 32
dec ecx
jnz .channel_loop
pop ecx ebx eax
 
ret
 
 
; ïîòîê ìèêøåðà
ssmix_thread_proc:
 
stdcall _InitSound@4, ssmix_driver_version
test eax, eax
jz @f
if DEBUG
print "ssmix. Cannot load sound driver"
end if
jmp .end
@@:
 
mov ecx, [ssmix_driver_version]
cmp cx, SOUND_VERSION
jae @f
shr ecx, 16
cmp ecx, SOUND_VERSION
jbe @f
if DEBUG
print "ssmix. Sound version mismatch"
end if
jmp .end
@@:
 
stdcall _CreateBuffer@12, PCM_2_16_11+PCM_RING, 0, ssmix_hbuffer
test eax, eax
jz @f
if DEBUG
print "ssmix. create buffer error"
end if
jmp .end
@@:
 
stdcall _GetBufferSize@8, [ssmix_hbuffer], ssmix_buffer_size
test eax, eax
jz @f
if DEBUG
print "ssmix. getbuffersize procedure error"
end if
jmp .destroy_buffer
@@:
 
mov ecx, [ssmix_buffer_size]
shr ecx, 1
mov [ssmix_buffer_size], ecx
if DEBUG
print "ssmix. buffer size"
dph ecx
newline
end if
 
; âûäåëèòü ïàìÿòü äëÿ áóôôåðà âîñïðîèçâåäåíèÿ
mov eax, 68
mov ebx, 12
mov ecx, [ssmix_buffer_size]
int 0x40
test eax, eax
jnz @f
if DEBUG
print "ssmix. malloc memory error"
end if
jmp .destroy_buffer
@@:
mov [ssmix_pbuffer], eax
 
stdcall _PlayBuffer@8, [ssmix_hbuffer], 0
test eax, eax
jz @f
if DEBUG
print "ssmix. playbuffer error"
end if
jmp .free_buffer_memory
@@:
 
; öèêë âîñïðîèçâåäåíèÿ
.mixloop:
; ïîëó÷èòü äàííûå ñîáûòèÿ îò äðàéâåðà
mov eax, 68
mov ebx, 14
mov ecx, ssmix_driver_notify_struct
int 0x40
; ïðîâåðêà íà code
mov eax, [ssmix_driver_notify_struct]
cmp eax, 0xFF000001
jne .mixloop
; ïðîâåðêà íà stream
mov eax, [ssmix_driver_notify_struct+8]
cmp eax, [ssmix_hbuffer]
jne .mixloop
; ïîëó÷èòü ñìåùåíèå â áóôôåðå
mov eax, [ssmix_driver_notify_struct+12]
mov [ssmix_buffer_offset], eax
; öèêë çàïîëíåíèÿ áóôôåðà
mov ebx, [ssmix_pbuffer]
mov ecx, [ssmix_buffer_size]
shr ecx, 2
.fill_buffer_loop:
push ebx ecx
; öèêë ñìåøèâàíèÿ êàíàëîâ
mov esi, 0 ; ñóììà äëÿ ëåâîãî ñòåðåîêàíàëà
mov edi, 0 ; ñóììà äëÿ ïðàâîãî ñòåðåîêàíàëà
mov edx, [ssmix_channels]
mov ecx, SSMIX_CHANNEL_COUNT
.channel_loop:
mov eax, [edx]
cmp eax, SSMIX_CHANMODE_FREE
je .channel_end
cmp eax, SSMIX_CHANMODE_WAITRESET
je .channel_end
push ecx
; ñìåøèâàíèå êàíàëîâ ñ ó÷åòîì ãðîìêîñòè
mov ebx, [edx+4]
mov ecx, [edx+16]
movsx eax, word [ecx]
imul eax, ebx
add esi, eax
mov ebx, [edx+8]
movsx eax, word [ecx+2]
imul eax, ebx
add edi, eax
; ïðîâåðêà íà çàâåðøåíèå òðåêà
add ecx, 4
cmp ecx, [edx+24]
jb .notrackend
mov eax, [edx]
cmp eax, SSMIX_CHANMODE_SINGLE
jne @f
mov ebx, SSMIX_CHANMODE_FREE
mov [edx], ebx
jmp .notrackend
@@:
cmp eax, SSMIX_CHANMODE_REPEAT
jne @f
mov ecx, [edx+20]
jmp .notrackend
@@:
cmp eax, SSMIX_CHANMODE_SINGLE_WITHOUT_RESET
jne @f
mov ebx, SSMIX_CHANMODE_WAITRESET
mov [edx], ebx
jmp .notrackend
@@:
.notrackend:
mov [edx+16], ecx
pop ecx
.channel_end:
add edx, 32
dec ecx
jnz .channel_loop
; íîðìàëèçàöèÿ ñòåðåîêàíàëîâ
sar esi, 7
cmp esi, 0x7FFF
jle @f
mov esi, 0x7FFF
@@:
cmp esi, -0x8000
jge @f
mov esi, -0x8000
@@:
sar edi, 7
cmp edi, 0x7FFF
jle @f
mov edi, 0x7FFF
@@:
cmp edi, -0x8000
jge @f
mov edi, -0x8000
@@:
; ñîõðàíåíèå ðåçóëüòàòà â áóôôåðå ìèêøåðà
shl edi, 16
add esi, edi
pop ecx ebx
mov [ebx], esi
add ebx, 4
dec ecx
jnz .fill_buffer_loop
; óñòàíîâêà áóôôåðà äðàéâåðà
stdcall _SetBuffer@16, [ssmix_hbuffer], [ssmix_pbuffer], [ssmix_buffer_offset], [ssmix_buffer_size]
cmp [ssmix_state], 1
je .mixloop
 
; îñâîáîäèòü ïàìÿòü áóôôåðà âîñïðîèçâåäåíèÿ
.free_buffer_memory:
mov eax, 68
mov ebx, 13
mov ecx, [ssmix_pbuffer]
; óíè÷òîæèòü áóôôåð äðàéâåðà
.destroy_buffer:
stdcall _DestroyBuffer@4, [ssmix_hbuffer]
 
; çàâåðøèòü ðàáîòó ïîòîêà
.end:
call ssmix_free
mov eax, -1
int 0x40
 
;ret
 
 
;=================================================================================
 
align 4
_InitSound@4: ;p_ver:dword
 
push ebx
push ecx
 
mov eax, 68
mov ebx, 16
mov ecx, ssmix_szInfinity
int 0x40
mov [ssmix_hSound], eax
test eax, eax
jz .fail
 
mov eax, 68
mov ebx, 16
mov ecx, ssmix_szSound
int 0x40
mov [ssmix_hrdwSound], eax
 
lea eax, [esp+12] ;p_ver
xor ebx, ebx
 
push 4 ;.out_size
push eax ;.output
push ebx ;.inp_size
push ebx ;.input
push SRV_GETVERSION ;.code
push [ssmix_hSound] ;.handle
 
mov eax, 68
mov ebx, 17
mov ecx, esp ;[handle]
int 0x40
add esp, 24
pop ecx
pop ebx
ret 4
.fail:
or eax, -1
pop ecx
pop ebx
ret 4
 
 
align 4
_CreateBuffer@12: ;format:dword,size:dword,p_str:dword
 
push ebx
push ecx
lea eax, [esp+20] ;p_str
lea ebx, [esp+12] ;format
 
push 4 ;.out_size
push eax ;.output
push 8 ;.inp_size
push ebx ;.input
push SND_CREATE_BUFF;.code
push [ssmix_hSound] ;.handle
 
mov eax, 68
mov ebx, 17
mov ecx, esp
int 0x40
add esp, 24 ;io_cintrol
pop ecx
pop ebx
ret 12
 
align 4
_DestroyBuffer@4: ;str:dword
 
push ebx
push ecx
 
xor eax, eax
lea ebx, [esp+12] ;[stream]
 
push eax ;.out_size
push eax ;.output
push 4 ;.inp_size
push ebx ;.input
push SND_DESTROY_BUFF;.code
push [ssmix_hSound] ;.handle
 
mov eax, 68
mov ebx, 17
mov ecx, esp ;[handle]
int 0x40
add esp, 24
pop ecx
pop ebx
ret 4
 
align 4
_GetBufferSize@8: ;str:dword, p_size:dword
push ebx
push ecx
lea eax, [esp+16]
lea ebx, [esp+12] ;[stream]
 
push 4 ;.out_size
push eax ;.output
push 4 ;.inp_size
push ebx ;.input
push SND_GETBUFFSIZE;.code
push dword [ssmix_hSound] ;.handle
 
mov eax, 68
mov ebx, 17
mov ecx, esp
int 0x40
add esp, 24
pop ecx
pop ebx
ret 8
 
align 4
_SetBuffer@16: ;str:dword, src:dword, offs:dword, size:dword
 
push ebx
push ecx
xor eax, eax
lea ebx, [esp+12] ;[stream]
 
push eax ;.out_size
push eax ;.output
push 16 ;.inp_size
push ebx ;.input
push SND_SETBUFF ;.code
push dword [ssmix_hSound] ;.handle
 
mov eax, 68
mov ebx, 17
mov ecx, esp
int 0x40
add esp, 24
pop ecx
pop ebx
ret 16
align 4
_PlayBuffer@8: ;str:dword,flags:dword
 
push ebx
push ecx
 
xor eax, eax
lea ebx, [esp+12] ;[stream]
 
push eax ;.out_size
push eax ;.output
push 8 ;.inp_size
push ebx ;.input
push SND_PLAY ;.code
push dword [ssmix_hSound] ;.handle
 
mov eax, 68
mov ebx, 17
mov ecx, esp
int 0x40
add esp, 24
pop ecx
pop ebx
ret 8
 
 
 
; ========================= data =====================================
 
ssmix_hSound dd ?
ssmix_hrdwSound dd ?
 
ssmix_szInfinity db 'INFINITY',0
ssmix_szSound db 'SOUND',0
 
ssmix_channels dd 0
ssmix_thread_stack dd 0
ssmix_state dd 0
ssmix_volumeL dd ?
ssmix_volumeR dd ?
ssmix_driver_version dd ?
ssmix_hbuffer dd ?
ssmix_pbuffer dd 0
ssmix_buffer_size dd ?
ssmix_buffer_offset dd ?
ssmix_driver_notify_struct rd 6 ; ñòêóêòóðà ñîáûòèÿ îò äðàéâåðà
/programs/games/bomber/tile.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/games/bomber
Property changes:
Added: tsvn:logminsize
+5
\ No newline at end of property