From 308d1bc7857af93284e885e67726792793a45e66 Mon Sep 17 00:00:00 2001 From: nmlgc Date: Sat, 2 Mar 2019 23:23:38 +0100 Subject: [PATCH] [Reverse-engineering] [th04/th05] Boss explosions So apparently, this way of distorting a circle into an ellipse (?) by adding a value to the angle for one of the two coordinates isn't actually widely known in math and doesn't have a name. Fair enough. Funded by -Tom-. --- th04/boss/explode_big.asm | 12 + th04/boss/explode_small.asm | 69 ++++ th04/boss/explosions[bss].asm | 31 ++ th04/boss/explosions_big.asm | 113 ++++++ th04/boss/explosions_big[data].asm | 2 + th04/boss/explosions_reset.asm | 10 + th04/boss/explosions_small.asm | 97 +++++ th04_main.asm | 548 ++++------------------------- th05/boss/2_explode_big.asm | 22 ++ th05/boss/2_explode_small.asm | 23 ++ th05/boss/explode_big.asm | 25 ++ th05_main.asm | 514 +++------------------------ 12 files changed, 521 insertions(+), 945 deletions(-) create mode 100644 th04/boss/explode_big.asm create mode 100644 th04/boss/explode_small.asm create mode 100644 th04/boss/explosions[bss].asm create mode 100644 th04/boss/explosions_big.asm create mode 100644 th04/boss/explosions_big[data].asm create mode 100644 th04/boss/explosions_reset.asm create mode 100644 th04/boss/explosions_small.asm create mode 100644 th05/boss/2_explode_big.asm create mode 100644 th05/boss/2_explode_small.asm create mode 100644 th05/boss/explode_big.asm diff --git a/th04/boss/explode_big.asm b/th04/boss/explode_big.asm new file mode 100644 index 00000000..a32271fd --- /dev/null +++ b/th04/boss/explode_big.asm @@ -0,0 +1,12 @@ +; void boss_explode_big(unsigned int type); +public boss_explode_big +boss_explode_big proc near + +@@type = word ptr 4 + + push bp + mov bp, sp + push si + mov si, offset _explosions_big + EXPLOSION_TYPED +boss_explode_big endp diff --git a/th04/boss/explode_small.asm b/th04/boss/explode_small.asm new file mode 100644 index 00000000..d34cc799 --- /dev/null +++ b/th04/boss/explode_small.asm @@ -0,0 +1,69 @@ +EXPLOSION_TYPED macro + mov [si+explosion_t.flag], 1 + mov [si+explosion_t.age], 0 + mov ax, _boss_pos.cur.x + mov [si+explosion_t.center.x], ax + mov ax, _boss_pos.cur.y + mov [si+explosion_t.center.y], ax + mov [si+explosion_t.EXPLOSION_radius_cur.x], 8 + mov [si+explosion_t.EXPLOSION_radius_cur.y], 8 + mov [si+explosion_t.EXPLOSION_radius_delta.x], (11 shl 4) + mov [si+explosion_t.EXPLOSION_radius_delta.y], (11 shl 4) + mov [si+explosion_t.angle_offset], 0 + mov bx, [bp+@@type] + dec bx + cmp bx, 3 + ja short @@ret + add bx, bx + jmp cs:@@switch[bx] + +@@type1: + mov [si+explosion_t.angle_offset], 32 + jmp short @@ret +; --------------------------------------------------------------------------- + +@@type2: + mov [si+explosion_t.angle_offset], -32 + jmp short @@ret +; --------------------------------------------------------------------------- + +@@type3: + mov [si+explosion_t.EXPLOSION_radius_delta.x], (13 shl 4) + mov [si+explosion_t.EXPLOSION_radius_delta.y], (7 shl 4) + jmp short @@ret +; --------------------------------------------------------------------------- + +@@type4: + mov [si+explosion_t.EXPLOSION_radius_delta.x], (7 shl 4) + mov [si+explosion_t.EXPLOSION_radius_delta.y], (13 shl 4) + +@@ret: + call snd_se_play pascal, 15 + pop si + pop bp + retn 2 + +@@switch label word + dw offset @@type1 + dw offset @@type2 + dw offset @@type3 + dw offset @@type4 +endm + +; void boss_explode_small(unsigned int type); +public boss_explode_small +boss_explode_small proc near + +@@type = word ptr 4 + + push bp + mov bp, sp + push si + mov si, offset _explosions_small + cmp [si+explosion_t.flag], 0 + jz short @@set + add si, size explosion_t + +@@set: + EXPLOSION_TYPED +boss_explode_small endp diff --git a/th04/boss/explosions[bss].asm b/th04/boss/explosions[bss].asm new file mode 100644 index 00000000..39bc8e2e --- /dev/null +++ b/th04/boss/explosions[bss].asm @@ -0,0 +1,31 @@ +explosion_t struc + flag db ? + age db ? + ; Stored in 1/16th-pixel playfield coordinates. + center Point + EXPLOSION_radius_cur Point + EXPLOSION_radius_delta Point + db ? + ; Offset to add to the angle for the Y coordinate, turning the circle into + ; a slanted ellipse. See https://www.desmos.com/calculator/faeefi6w1u for + ; a plot of the effect. + angle_offset db ? +explosion_t ends + +EXPLOSION_AGE_MAX = 32 +EXPLOSION_SMALL_COUNT = 2 +EXPLOSION_SMALL_W = 16 +EXPLOSION_SMALL_H = 16 +EXPLOSION_SMALL_SPRITES = 64 +EXPLOSION_BIG_SPRITES = 16 + +if GAME eq 5 +EXPLOSION_SMALL_PATNUM = 164 +else +EXPLOSION_SMALL_PATNUM = 68 +endif + +public _explosions_small +public _explosions_big +_explosions_small explosion_t EXPLOSION_SMALL_COUNT dup () +_explosions_big explosion_t diff --git a/th04/boss/explosions_big.asm b/th04/boss/explosions_big.asm new file mode 100644 index 00000000..2ff0c632 --- /dev/null +++ b/th04/boss/explosions_big.asm @@ -0,0 +1,113 @@ +; void explosions_big_update_and_render(void); +public explosions_big_update_and_render +explosions_big_update_and_render proc near + +@@angle = byte ptr -5 +@@draw_y = word ptr -4 +@@i = word ptr -2 + + enter 6, 0 + push si + push di + mov si, offset _explosions_big + cmp [si+explosion_t.flag], 0 + jz @@reset_frame + mov [bp+@@i], 0 + mov [bp+@@angle], 0 + jmp short @@more_sprites? +; --------------------------------------------------------------------------- + +@@sprite_loop: + push [si+explosion_t.center.x] + push [si+explosion_t.EXPLOSION_radius_cur.x] + mov al, [bp+@@angle] + mov ah, 0 + add ax, ax + mov bx, ax + push _CosTable8[bx] + call vector1_at + mov di, ax + sar ax, 4 + mov di, ax + push [si+explosion_t.center.y] + push [si+explosion_t.EXPLOSION_radius_cur.y] + mov al, [si+explosion_t.angle_offset] + add al, [bp+@@angle] + mov ah, 0 + add ax, ax + mov bx, ax + push _SinTable8[bx] + call vector1_at + mov [bp+@@draw_y], ax + sar ax, 4 + ; Yes, these are not clipped exactly to the playfield boundaries? + add ax, -16 + mov [bp+@@draw_y], ax + or di, di + jl short @@next_sprite + cmp di, 384 + jg short @@next_sprite + cmp [bp+@@draw_y], 0 + jl short @@next_sprite + cmp [bp+@@draw_y], 336 + jg short @@next_sprite + call super_put pascal, di, ax, 3 + +@@next_sprite: + inc [bp+@@i] + mov al, [bp+@@angle] + add al, (256 / EXPLOSION_BIG_SPRITES) + mov [bp+@@angle], al + +@@more_sprites?: + cmp [bp+@@i], EXPLOSION_BIG_SPRITES + jl short @@sprite_loop + mov ax, [si+explosion_t.EXPLOSION_radius_delta.x] + add [si+explosion_t.EXPLOSION_radius_cur.x], ax + mov ax, [si+explosion_t.EXPLOSION_radius_delta.y] + add [si+explosion_t.EXPLOSION_radius_cur.y], ax + inc [si+explosion_t.age] + cmp [si+explosion_t.age], EXPLOSION_AGE_MAX + jb short @@tone_update + mov [si+explosion_t.flag], 0 + +@@tone_update: + inc _explosion_big_frame + cmp _explosion_big_frame, 8 + jge short @@tone_flash? + test byte ptr _explosion_big_frame, 1 + jz short @@tone_flash? + mov PaletteTone, 150 + jmp short @@ret_palette_changed +; --------------------------------------------------------------------------- + +@@tone_flash?: + cmp _explosion_big_frame, 8 + jl short @@tone_regular + cmp _explosion_big_frame, 16 + jge short @@tone_regular + mov ax, _explosion_big_frame + imul ax, 6 + mov dx, 196 + sub dx, ax + mov PaletteTone, dx + +@@ret_palette_changed: + mov _palette_changed, 1 + jmp short @@ret +; --------------------------------------------------------------------------- + +@@tone_regular: + mov PaletteTone, 100 + jmp short @@ret_palette_changed +; --------------------------------------------------------------------------- + +@@reset_frame: + mov _explosion_big_frame, 0 + +@@ret: + pop di + pop si + leave + retn +explosions_big_update_and_render endp diff --git a/th04/boss/explosions_big[data].asm b/th04/boss/explosions_big[data].asm new file mode 100644 index 00000000..43e57d71 --- /dev/null +++ b/th04/boss/explosions_big[data].asm @@ -0,0 +1,2 @@ +public _explosion_big_frame +_explosion_big_frame dw 0 diff --git a/th04/boss/explosions_reset.asm b/th04/boss/explosions_reset.asm new file mode 100644 index 00000000..82c3a30d --- /dev/null +++ b/th04/boss/explosions_reset.asm @@ -0,0 +1,10 @@ +; void explosions_small_reset(void); +public explosions_small_reset +explosions_small_reset proc far + push bp + mov bp, sp + mov _explosions_small[0 * size explosion_t].flag, 0 + mov _explosions_small[1 * size explosion_t].flag, 0 + pop bp + retf +explosions_small_reset endp diff --git a/th04/boss/explosions_small.asm b/th04/boss/explosions_small.asm new file mode 100644 index 00000000..4b05397e --- /dev/null +++ b/th04/boss/explosions_small.asm @@ -0,0 +1,97 @@ +; void explosions_small_update_and_render(void); +public explosions_small_update_and_render +explosions_small_update_and_render proc near + +@@angle = byte ptr -7 +@@i = word ptr -6 +@@draw_y = word ptr -4 +@@draw_x = word ptr -2 + + enter 8, 0 + push si + push di + mov ax, GRAM_400 + mov es, ax + assume es:nothing + call _grcg_setmode_rmw_1 + mov si, offset _explosions_small + mov [bp+@@i], 0 + jmp @@more_explosions? +; --------------------------------------------------------------------------- + +@@explosion_loop: + cmp [si+explosion_t.flag], 0 + jz @@next_explosion + xor di, di + mov [bp+@@angle], 0 + jmp short @@more_sprites? +; --------------------------------------------------------------------------- + +@@sprite_loop: + push [si+explosion_t.center.x] + push [si+explosion_t.EXPLOSION_radius_cur.x] + mov al, [bp+@@angle] + mov ah, 0 + add ax, ax + mov bx, ax + push _CosTable8[bx] + call vector1_at + mov [bp+@@draw_x], ax + push [si+explosion_t.center.y] + push [si+explosion_t.EXPLOSION_radius_cur.y] + mov al, [si+explosion_t.angle_offset] + add al, [bp+@@angle] + mov ah, 0 + add ax, ax + mov bx, ax + push _SinTable8[bx] + call vector1_at + mov [bp+@@draw_y], ax + sar ax, 4 + add ax, PLAYFIELD_Y - (EXPLOSION_SMALL_H / 2) + mov dx, ax + mov ax, [bp+@@draw_x] + sar ax, 4 + add ax, PLAYFIELD_X - (EXPLOSION_SMALL_W / 2) + cmp ax, PLAYFIELD_X - EXPLOSION_SMALL_W + jbe short @@next_sprite + cmp ax, PLAYFIELD_X + PLAYFIELD_W + jnb short @@next_sprite + or dx, dx + jbe short @@next_sprite + cmp dx, PLAYFIELD_Y + PLAYFIELD_H + jnb short @@next_sprite + push EXPLOSION_SMALL_PATNUM + call z_super_roll_put_tiny + +@@next_sprite: + inc di + mov al, [bp+@@angle] + add al, (256 / EXPLOSION_SMALL_SPRITES) + mov [bp+@@angle], al + +@@more_sprites?: + cmp di, EXPLOSION_SMALL_SPRITES + jl short @@sprite_loop + mov ax, [si+explosion_t.EXPLOSION_radius_delta.x] + add [si+explosion_t.EXPLOSION_radius_cur.x], ax + mov ax, [si+explosion_t.EXPLOSION_radius_delta.y] + add [si+explosion_t.EXPLOSION_radius_cur.y], ax + inc [si+explosion_t.age] + cmp [si+explosion_t.age], EXPLOSION_AGE_MAX + jb short @@next_explosion + mov [si+explosion_t.flag], 0 + +@@next_explosion: + inc [bp+@@i] + add si, size explosion_t + +@@more_explosions?: + cmp [bp+@@i], 2 + jl @@explosion_loop + GRCG_OFF_CLOBBERING dx + pop di + pop si + leave + retn +explosions_small_update_and_render endp diff --git a/th04_main.asm b/th04_main.asm index 1cf6844c..575873e3 100644 --- a/th04_main.asm +++ b/th04_main.asm @@ -5152,225 +5152,8 @@ loc_D888: retn sub_D7EE endp - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_D88C proc near - -var_7 = byte ptr -7 -var_6 = word ptr -6 -var_4 = word ptr -4 -var_2 = word ptr -2 - - enter 8, 0 - push si - push di - mov ax, GRAM_400 - mov es, ax - assume es:nothing - call _grcg_setmode_rmw_1 - mov si, 4298h - mov [bp+var_6], 0 - jmp loc_D943 -; --------------------------------------------------------------------------- - -loc_D8A5: - cmp byte ptr [si], 0 - jz loc_D93D - xor di, di - mov [bp+var_7], 0 - jmp short loc_D920 -; --------------------------------------------------------------------------- - -loc_D8B4: - push word ptr [si+2] - push word ptr [si+6] - mov al, [bp+var_7] - mov ah, 0 - add ax, ax - mov bx, ax - push _CosTable8[bx] - call vector1_at - mov [bp+var_2], ax - push word ptr [si+4] - push word ptr [si+8] - mov al, [si+0Fh] - add al, [bp+var_7] - mov ah, 0 - add ax, ax - mov bx, ax - push _SinTable8[bx] - call vector1_at - mov [bp+var_4], ax - sar ax, 4 - add ax, 8 - mov dx, ax - mov ax, [bp+var_2] - sar ax, 4 - add ax, 18h - cmp ax, 10h - jbe short loc_D917 - cmp ax, 1A0h - jnb short loc_D917 - or dx, dx - jbe short loc_D917 - cmp dx, 180h - jnb short loc_D917 - push 44h ; 'D' - call z_super_roll_put_tiny - -loc_D917: - inc di - mov al, [bp+var_7] - add al, 4 - mov [bp+var_7], al - -loc_D920: - cmp di, 40h - jl short loc_D8B4 - mov ax, [si+0Ah] - add [si+6], ax - mov ax, [si+0Ch] - add [si+8], ax - inc byte ptr [si+1] - cmp byte ptr [si+1], 20h ; ' ' - jb short loc_D93D - mov byte ptr [si], 0 - -loc_D93D: - inc [bp+var_6] - add si, 10h - -loc_D943: - cmp [bp+var_6], 2 - jl loc_D8A5 - GRCG_OFF_CLOBBERING dx - pop di - pop si - leave - retn -sub_D88C endp - - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_D955 proc near - -var_5 = byte ptr -5 -var_4 = word ptr -4 -var_2 = word ptr -2 - - enter 6, 0 - push si - push di - mov si, 42B8h - cmp byte ptr [si], 0 - jz loc_DA45 - mov [bp+var_2], 0 - mov [bp+var_5], 0 - jmp short loc_D9E1 -; --------------------------------------------------------------------------- - -loc_D970: - push word ptr [si+2] - push word ptr [si+6] - mov al, [bp+var_5] - mov ah, 0 - add ax, ax - mov bx, ax - push word ptr [bx+566h] - call vector1_at - mov di, ax - sar ax, 4 - mov di, ax - push word ptr [si+4] - push word ptr [si+8] - mov al, [si+0Fh] - add al, [bp+var_5] - mov ah, 0 - add ax, ax - mov bx, ax - push _SinTable8[bx] - call vector1_at - mov [bp+var_4], ax - sar ax, 4 - add ax, 0FFF0h - mov [bp+var_4], ax - or di, di - jl short loc_D9D6 - cmp di, 180h - jg short loc_D9D6 - cmp [bp+var_4], 0 - jl short loc_D9D6 - cmp [bp+var_4], 150h - jg short loc_D9D6 - push di - push ax - push 3 - call super_put - -loc_D9D6: - inc [bp+var_2] - mov al, [bp+var_5] - add al, 10h - mov [bp+var_5], al - -loc_D9E1: - cmp [bp+var_2], 10h - jl short loc_D970 - mov ax, [si+0Ah] - add [si+6], ax - mov ax, [si+0Ch] - add [si+8], ax - inc byte ptr [si+1] - cmp byte ptr [si+1], 20h ; ' ' - jb short loc_D9FF - mov byte ptr [si], 0 - -loc_D9FF: - inc word_22C18 - cmp word_22C18, 8 - jge short loc_DA19 - test byte ptr word_22C18, 1 - jz short loc_DA19 - mov PaletteTone, 96h - jmp short loc_DA36 -; --------------------------------------------------------------------------- - -loc_DA19: - cmp word_22C18, 8 - jl short loc_DA3D - cmp word_22C18, 10h - jge short loc_DA3D - mov ax, word_22C18 - imul ax, 6 - mov dx, 0C4h - sub dx, ax - mov PaletteTone, dx - -loc_DA36: - mov _palette_changed, 1 - jmp short loc_DA4B -; --------------------------------------------------------------------------- - -loc_DA3D: - mov PaletteTone, 64h ; 'd' - jmp short loc_DA36 -; --------------------------------------------------------------------------- - -loc_DA45: - mov word_22C18, 0 - -loc_DA4B: - pop di - pop si - leave - retn -sub_D955 endp +include th04/boss/explosions_small.asm +include th04/boss/explosions_big.asm ; --------------------------------------------------------------------------- @@ -7499,8 +7282,8 @@ loc_EA55: GRCG_OFF_CLOBBERING dx loc_EA5B: - call sub_D88C - call sub_D955 + call explosions_small_update_and_render + call explosions_big_update_and_render cmp byte_26719, 0FFh jnb short loc_EA6B call sub_E2C3 @@ -7979,8 +7762,8 @@ loc_EDC3: call super_large_put loc_EDD7: - call sub_D88C - call sub_D955 + call explosions_small_update_and_render + call explosions_big_update_and_render pop di pop si pop bp @@ -13003,8 +12786,8 @@ loc_11629: call super_large_put loc_1163D: - call sub_D88C - call sub_D955 + call explosions_small_update_and_render + call explosions_big_update_and_render pop di pop si pop bp @@ -13415,8 +13198,8 @@ loc_1193A: call super_large_put loc_11961: - call sub_D88C - call sub_D955 + call explosions_small_update_and_render + call explosions_big_update_and_render pop di pop si leave @@ -13554,8 +13337,8 @@ loc_11A69: call super_large_put loc_11A90: - call sub_D88C - call sub_D955 + call explosions_small_update_and_render + call explosions_big_update_and_render pop di pop si leave @@ -13924,8 +13707,8 @@ loc_11D7A: mov byte_25A1E, 0 loc_11D86: - call sub_D88C - call sub_D955 + call explosions_small_update_and_render + call explosions_big_update_and_render call sub_E2C3 call sub_11B44 @@ -14065,8 +13848,8 @@ loc_11E71: call super_put loc_11EC1: - call sub_D88C - call sub_D955 + call explosions_small_update_and_render + call explosions_big_update_and_render pop di pop si leave @@ -16271,8 +16054,8 @@ loc_12F2E: call super_large_put loc_12F55: - call sub_D88C - call sub_D955 + call explosions_small_update_and_render + call explosions_big_update_and_render pop di pop si leave @@ -16420,8 +16203,8 @@ loc_1306D: call super_zoom loc_13083: - call sub_D88C - call sub_D955 + call explosions_small_update_and_render + call explosions_big_update_and_render call sub_E2C3 cmp byte_26719, 5 jnz short loc_130E9 @@ -20553,150 +20336,9 @@ off_15B4D dw offset loc_159A4 dw offset loc_15A81 dw offset loc_15AD2 -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_15C6D proc far - push bp - mov bp, sp - mov byte_255D8, 0 - mov byte_255E8, 0 - pop bp - retf -sub_15C6D endp - - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_15C7C proc near - -arg_0 = word ptr 4 - - push bp - mov bp, sp - push si - mov si, 4298h - cmp byte ptr [si], 0 - jz short loc_15C8B - add si, 10h - -loc_15C8B: - mov byte ptr [si], 1 - mov byte ptr [si+1], 0 - mov ax, _boss_pos.cur.x - mov [si+2], ax - mov ax, _boss_pos.cur.y - mov [si+4], ax - mov word ptr [si+6], 8 - mov word ptr [si+8], 8 - mov word ptr [si+0Ah], 0B0h ; '°' - mov word ptr [si+0Ch], 0B0h ; '°' - mov byte ptr [si+0Fh], 0 - mov bx, [bp+arg_0] - dec bx - cmp bx, 3 - ja short loc_15CE8 - add bx, bx - jmp cs:off_15CF4[bx] - -loc_15CC6: - mov byte ptr [si+0Fh], 20h ; ' ' - jmp short loc_15CE8 -; --------------------------------------------------------------------------- - -loc_15CCC: - mov byte ptr [si+0Fh], 0E0h - jmp short loc_15CE8 -; --------------------------------------------------------------------------- - -loc_15CD2: - mov word ptr [si+0Ah], 0D0h - mov word ptr [si+0Ch], 70h ; 'p' - jmp short loc_15CE8 -; --------------------------------------------------------------------------- - -loc_15CDE: - mov word ptr [si+0Ah], 70h ; 'p' - mov word ptr [si+0Ch], 0D0h - -loc_15CE8: - call snd_se_play pascal, 15 - pop si - pop bp - retn 2 -sub_15C7C endp - -; --------------------------------------------------------------------------- -off_15CF4 dw offset loc_15CC6 - dw offset loc_15CCC - dw offset loc_15CD2 - dw offset loc_15CDE - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_15CFC proc near - -arg_0 = word ptr 4 - - push bp - mov bp, sp - push si - mov si, 42B8h - mov byte ptr [si], 1 - mov byte ptr [si+1], 0 - mov ax, _boss_pos.cur.x - mov [si+2], ax - mov ax, _boss_pos.cur.y - mov [si+4], ax - mov word ptr [si+6], 8 - mov word ptr [si+8], 8 - mov word ptr [si+0Ah], 0B0h ; '°' - mov word ptr [si+0Ch], 0B0h ; '°' - mov byte ptr [si+0Fh], 0 - mov bx, [bp+arg_0] - dec bx - cmp bx, 3 - ja short loc_15D60 - add bx, bx - jmp cs:off_15D6C[bx] - -loc_15D3E: - mov byte ptr [si+0Fh], 20h ; ' ' - jmp short loc_15D60 -; --------------------------------------------------------------------------- - -loc_15D44: - mov byte ptr [si+0Fh], 0E0h - jmp short loc_15D60 -; --------------------------------------------------------------------------- - -loc_15D4A: - mov word ptr [si+0Ah], 0D0h - mov word ptr [si+0Ch], 70h ; 'p' - jmp short loc_15D60 -; --------------------------------------------------------------------------- - -loc_15D56: - mov word ptr [si+0Ah], 70h ; 'p' - mov word ptr [si+0Ch], 0D0h - -loc_15D60: - call snd_se_play pascal, 15 - pop si - pop bp - retn 2 -sub_15CFC endp - -; --------------------------------------------------------------------------- -off_15D6C dw offset loc_15D3E - dw offset loc_15D44 - dw offset loc_15D4A - dw offset loc_15D56 +include th04/boss/explosions_reset.asm +include th04/boss/explode_small.asm +include th04/boss/explode_big.asm ; =============== S U B R O U T I N E ======================================= @@ -21781,8 +21423,7 @@ loc_16742: mov _bullet_clear_time, 20 loc_1674E: - push 0 - call sub_15C7C + call boss_explode_small pascal, 0 inc byte_26719 mov ax, _boss_phase_end_hp mov _boss_hp, ax @@ -21825,8 +21466,7 @@ loc_167AF: mov _bullet_clear_time, 20 loc_167BB: - push 1 - call sub_15C7C + call boss_explode_small pascal, 1 inc byte_26719 mov word_2671A, 0 mov byte_2671F, 0 @@ -21907,8 +21547,7 @@ loc_1685D: mov _bullet_clear_time, 20 loc_16869: - push 0 - call sub_15C7C + call boss_explode_small pascal, 0 inc byte_26719 mov ax, _boss_phase_end_hp mov _boss_hp, ax @@ -21938,8 +21577,7 @@ loc_168A8: call sub_1E67C cmp word_2671A, 120h jl loc_169B8 - push 4 - call sub_15C7C + call boss_explode_small pascal, 4 cmp _bullet_clear_time, 20 jnb short loc_168C9 mov _bullet_clear_time, 20 @@ -21981,8 +21619,7 @@ loc_1691A: jl loc_169B8 loc_1692E: - push 1 - call sub_15C7C + call boss_explode_small pascal, 1 inc byte_26719 cmp word_2671A, 3E8h jge short loc_16946 @@ -22002,14 +21639,12 @@ loc_16953: inc word_2671A cmp word_2671A, 10h jnz short loc_16963 - push 4 - call sub_15C7C + call boss_explode_small pascal, 4 loc_16963: cmp word_2671A, 20h ; ' ' jnz short loc_169B8 - push 2 - call sub_15CFC + call boss_explode_big pascal, 2 mov byte_26719, 0FEh mov al, byte_2671F mov _bullet_clear_trigger, al @@ -24163,8 +23798,7 @@ loc_17B98: mov byte_2671F, 1 loc_17BA4: - push 3 - call sub_15C7C + call boss_explode_small pascal, 3 inc byte_26719 mov word_2671A, 0 @@ -24222,8 +23856,7 @@ loc_17C30: call sub_19FD8 mov al, byte_25674 mov ah, 0 - push ax - call sub_15C7C + call boss_explode_small pascal, ax inc byte_25674 jmp short loc_17CA4 ; --------------------------------------------------------------------------- @@ -24232,14 +23865,12 @@ loc_17C44: inc word_2671A cmp word_2671A, 10h jnz short loc_17C54 - push 4 - call sub_15C7C + call boss_explode_small pascal, 4 loc_17C54: cmp word_2671A, 20h ; ' ' jnz short loc_17CA4 - push 2 - call sub_15CFC + call boss_explode_big pascal, 2 mov byte_26719, 0FEh mov al, byte_2671F mov _bullet_clear_trigger, al @@ -25530,13 +25161,12 @@ sub_18655 endp sub_18684 proc near arg_0 = word ptr 4 -arg_2 = word ptr 6 +@@type = word ptr 6 push bp mov bp, sp call sub_1E692 - push [bp+arg_2] - call sub_15C7C + call boss_explode_small pascal, [bp+@@type] inc byte_26719 mov word_2671A, 0 mov byte_2671D, 0 @@ -25784,8 +25414,7 @@ loc_188BD: call sub_18556 cmp word_2671A, 0 jnz loc_189A1 - push 3 - call sub_15C7C + call boss_explode_small pascal, 3 inc byte_26719 mov word_2671A, 0 mov _boss_sprite_cur, 129 @@ -25814,8 +25443,7 @@ loc_18904: jl loc_189A1 loc_18915: - push 1 - call sub_15C7C + call boss_explode_small pascal, 1 inc byte_26719 cmp word_2671A, 0FA0h jge short loc_1892D @@ -25838,14 +25466,12 @@ loc_1894A: inc word_2671A cmp word_2671A, 10h jnz short loc_1895A - push 4 - call sub_15C7C + call boss_explode_small pascal, 4 loc_1895A: cmp word_2671A, 20h ; ' ' jnz short loc_189A1 - push 2 - call sub_15CFC + call boss_explode_big pascal, 2 mov byte_26719, 0FEh mov al, byte_2671F mov _bullet_clear_trigger, al @@ -27178,8 +26804,7 @@ loc_194C1: loc_194D2: inc byte_26719 call sparks_add_circle pascal, _boss_pos.cur.x, _boss_pos.cur.y, large (((8 shl 4) shl 16) or 48) - push 4 - call sub_15C7C + call boss_explode_small pascal, 4 cmp word_2671A, 258h jge short loc_194FB mov byte_2671F, 1 @@ -27225,14 +26850,12 @@ loc_19548: inc word_2671A cmp word_2671A, 10h jnz short loc_1955E - push 4 - call sub_15C7C + call boss_explode_small pascal, 4 loc_1955E: cmp word_2671A, 20h ; ' ' jnz short loc_195A9 - push 0 - call sub_15CFC + call boss_explode_big pascal, 0 mov byte_26719, 0FEh mov al, byte_2671F mov _bullet_clear_trigger, al @@ -28139,8 +27762,7 @@ loc_19DBE: mov byte_2671F, 0 loc_19DC3: - push 3 - call sub_15C7C + call boss_explode_small pascal, 3 inc byte_26719 mov word_2671A, 0 mov byte_2671D, 0 @@ -28178,14 +27800,12 @@ loc_19E27: inc word_2671A cmp word_2671A, 10h jnz short loc_19E3D - push 4 - call sub_15C7C + call boss_explode_small pascal, 4 loc_19E3D: cmp word_2671A, 20h ; ' ' jnz short loc_19E8D - push 0 - call sub_15CFC + call boss_explode_big pascal, 0 mov byte_26719, 0FEh mov al, byte_2671F mov _bullet_clear_trigger, al @@ -31024,7 +30644,7 @@ sub_1B3E2 endp sub_1B42F proc near arg_0 = word ptr 4 -arg_2 = word ptr 6 +@@type = word ptr 6 push bp mov bp, sp @@ -31033,8 +30653,7 @@ arg_2 = word ptr 6 mov _bullet_clear_time, 20 loc_1B43E: - push [bp+arg_2] - call sub_15C7C + call boss_explode_small pascal, [bp+@@type] inc byte_26719 mov word_2671A, 0 mov byte_2671F, 0 @@ -31255,8 +30874,7 @@ loc_1B652: jl loc_1B8EA cmp _boss_pos.cur.y, (80 shl 4) jnz loc_1B8EA - push 2 - call sub_15C7C + call boss_explode_small pascal, 2 cmp _bullet_clear_time, 20 jnb short loc_1B681 mov _bullet_clear_time, 20 @@ -31481,8 +31099,7 @@ loc_1B84B: jl loc_1B8EA loc_1B85F: - push 1 - call sub_15C7C + call boss_explode_small pascal, 1 inc byte_26719 cmp word_2671A, 9C4h jge short loc_1B877 @@ -31505,14 +31122,12 @@ loc_1B894: inc word_2671A cmp word_2671A, 10h jnz short loc_1B8A4 - push 4 - call sub_15C7C + call boss_explode_small pascal, 4 loc_1B8A4: cmp word_2671A, 20h ; ' ' jnz short loc_1B8EA - push 2 - call sub_15CFC + call boss_explode_big pascal, 2 mov byte_26719, 0FEh mov al, byte_2671F mov _bullet_clear_trigger, al @@ -32905,8 +32520,7 @@ loc_1C4D3: loc_1C4EB: mov al, byte_25A24 mov ah, 0 - push ax - call sub_15C7C + call boss_explode_small pascal, ax mov byte_2671D, 0FFh inc byte_25A24 mov al, byte_25A24 @@ -32982,8 +32596,7 @@ loc_1C585: loc_1C591: inc byte_26719 call sparks_add_circle pascal, _boss_pos.cur.x, _boss_pos.cur.y, large (((8 shl 4) shl 16) or 48) - push 4 - call sub_15C7C + call boss_explode_small pascal, 4 mov word_2671A, 0 loc_1C5B1: @@ -33021,8 +32634,7 @@ loc_1C600: call sub_19FD8 mov al, byte_25A24 mov ah, 0 - push ax - call sub_15C7C + call boss_explode_small pascal, ax mov byte_2671D, 0FFh mov word_2671A, 0 inc byte_25A24 @@ -33033,14 +32645,12 @@ loc_1C61F: inc word_2671A cmp word_2671A, 10h jnz short loc_1C62F - push 4 - call sub_15C7C + call boss_explode_small pascal, 4 loc_1C62F: cmp word_2671A, 20h ; ' ' jnz short loc_1C67A - push 3 - call sub_15CFC + call boss_explode_big pascal, 3 mov byte_26719, 0FEh mov al, byte_2671F mov _bullet_clear_trigger, al @@ -36339,7 +35949,7 @@ sub_1DF61 proc near mov _boss_pos.velocity.x, 0 mov _boss_pos.velocity.y, 0 mov byte_2671C, 0 - nopcall sub_15C6D + nopcall explosions_small_reset mov _boss_phase_timed_out, 1 pop bp retn @@ -36884,8 +36494,7 @@ arg_2 = word ptr 6 mov si, [bp+arg_2] cmp si, 0FFFFh jz short loc_1E719 - push si - call sub_15C7C + call boss_explode_small pascal, si cmp _boss_phase_timed_out, 0 jnz short loc_1E719 cmp _bullet_clear_time, 20 @@ -38822,8 +38431,7 @@ loc_1F802: jl loc_1F8A5 loc_1F822: - push 3 - call sub_15C7C + call boss_explode_small pascal, 3 inc byte_26719 mov byte_2671F, 0 cmp word_2671A, 3E8h @@ -38839,14 +38447,12 @@ loc_1F845: inc word_2671A cmp word_2671A, 10h jnz short loc_1F855 - push 4 - call sub_15C7C + call boss_explode_small pascal, 4 loc_1F855: cmp word_2671A, 20h ; ' ' jnz short loc_1F8A5 - push 2 - call sub_15CFC + call boss_explode_big pascal, 2 mov byte_26719, 0FEh mov al, byte_2671F mov _bullet_clear_trigger, al @@ -40480,8 +40086,7 @@ loc_20619: jl loc_206B6 loc_2062A: - push 1 - call sub_15C7C + call boss_explode_small pascal, 1 inc byte_26719 cmp word_2671A, 1388h jge short loc_20642 @@ -40504,14 +40109,12 @@ loc_2065F: inc word_2671A cmp word_2671A, 10h jnz short loc_2066F - push 4 - call sub_15C7C + call boss_explode_small pascal, 4 loc_2066F: cmp word_2671A, 20h ; ' ' jnz short loc_206B6 - push 3 - call sub_15CFC + call boss_explode_big pascal, 3 mov byte_26719, 0FEh mov al, byte_2671F mov _bullet_clear_trigger, al @@ -41104,7 +40707,7 @@ aBss8_cd2 db 'bss8.cd2',0 aBb0_cdg db 'bb0.cdg',0 aBb1_cdg db 'bb1.cdg',0 db 0 -word_22C18 dw 0 +include th04/boss/explosions_big[data].asm byte_22C1A db 0 db 0 include th04/strings/gameover[data].asm @@ -42218,24 +41821,7 @@ word_255D0 dw ? word_255D2 dw ? word_255D4 dw ? word_255D6 dw ? -byte_255D8 db ? - dd ? ; - dd ? ; - dd ? ; - db ? ; - db ? ; - db ? ; -byte_255E8 db ? - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - db ? ; - db ? ; - db ? ; +include th04/boss/explosions[bss].asm word_25608 dw ? byte_2560A db ? db ? diff --git a/th05/boss/2_explode_big.asm b/th05/boss/2_explode_big.asm new file mode 100644 index 00000000..44921bba --- /dev/null +++ b/th05/boss/2_explode_big.asm @@ -0,0 +1,22 @@ +; void boss2_explode_big(void); +public boss2_explode_big +boss2_explode_big proc near + +@@y = word ptr -4 +@@x = word ptr -2 + + enter 4, 0 + mov ax, _boss_pos.cur.x + mov [bp+@@x], ax + mov ax, _boss_pos.cur.y + mov [bp+@@y], ax + mov eax, _boss2_pos.cur + mov _boss_pos.cur, eax + call boss_explode_big + mov ax, [bp+@@x] + mov _boss_pos.cur.x, ax + mov ax, [bp+@@y] + mov _boss_pos.cur.y, ax + leave + retn +boss2_explode_big endp diff --git a/th05/boss/2_explode_small.asm b/th05/boss/2_explode_small.asm new file mode 100644 index 00000000..4938c7bf --- /dev/null +++ b/th05/boss/2_explode_small.asm @@ -0,0 +1,23 @@ +; void boss2_explode_small(unsigned int type); +public boss2_explode_small +boss2_explode_small proc near + +@@y = word ptr -4 +@@x = word ptr -2 +@@type = word ptr 4 + + enter 4, 0 + mov ax, _boss_pos.cur.x + mov [bp+@@x], ax + mov ax, _boss_pos.cur.y + mov [bp+@@y], ax + mov eax, _boss2_pos.cur + mov _boss_pos.cur, eax + call boss_explode_small pascal, [bp+@@type] + mov ax, [bp+@@x] + mov _boss_pos.cur.x, ax + mov ax, [bp+@@y] + mov _boss_pos.cur.y, ax + leave + retn 2 +boss2_explode_small endp diff --git a/th05/boss/explode_big.asm b/th05/boss/explode_big.asm new file mode 100644 index 00000000..c760f821 --- /dev/null +++ b/th05/boss/explode_big.asm @@ -0,0 +1,25 @@ +; No longer using a type parameter in TH05. + +; void boss_explode_big(void); +public boss_explode_big +boss_explode_big proc near + push bp + mov bp, sp + push si + mov si, offset _explosions_big + mov [si+explosion_t.flag], 1 + mov [si+explosion_t.age], 0 + mov ax, _boss_pos.cur.x + mov [si+explosion_t.center.x], ax + mov ax, _boss_pos.cur.y + mov [si+explosion_t.center.y], ax + mov [si+explosion_t.EXPLOSION_radius_cur.x], 8 + mov [si+explosion_t.EXPLOSION_radius_cur.y], 8 + mov [si+explosion_t.EXPLOSION_radius_delta.x], (12 shl 4) + mov [si+explosion_t.EXPLOSION_radius_delta.y], (12 shl 4) + mov [si+explosion_t.angle_offset], 0 + call snd_se_play pascal, 12 + pop si + pop bp + retn +boss_explode_big endp diff --git a/th05_main.asm b/th05_main.asm index 84ecc097..bf407150 100644 --- a/th05_main.asm +++ b/th05_main.asm @@ -8318,226 +8318,8 @@ loc_F518: retn sub_F4DD endp - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_F520 proc near - -var_7 = byte ptr -7 -var_6 = word ptr -6 -var_4 = word ptr -4 -var_2 = word ptr -2 - - enter 8, 0 - push si - push di - mov ax, GRAM_400 - mov es, ax - assume es:nothing - call _grcg_setmode_rmw_1 - mov si, 0BF5Ch - mov [bp+var_6], 0 - jmp loc_F5D8 -; --------------------------------------------------------------------------- - -loc_F539: - cmp byte ptr [si], 0 - jz loc_F5D2 - xor di, di - mov [bp+var_7], 0 - jmp short loc_F5B5 -; --------------------------------------------------------------------------- - -loc_F548: - push word ptr [si+2] - push word ptr [si+6] - mov al, [bp+var_7] - mov ah, 0 - add ax, ax - mov bx, ax - push _CosTable8[bx] - call vector1_at - mov [bp+var_2], ax - push word ptr [si+4] - push word ptr [si+8] - mov al, [si+0Fh] - add al, [bp+var_7] - mov ah, 0 - add ax, ax - mov bx, ax - push _SinTable8[bx] - call vector1_at - mov [bp+var_4], ax - sar ax, 4 - add ax, 8 - mov dx, ax - mov ax, [bp+var_2] - sar ax, 4 - add ax, 18h - cmp ax, 10h - jbe short loc_F5AC - cmp ax, 1A0h - jnb short loc_F5AC - or dx, dx - jbe short loc_F5AC - cmp dx, 180h - jnb short loc_F5AC - push 0A4h - call z_super_roll_put_tiny - -loc_F5AC: - inc di - mov al, [bp+var_7] - add al, 4 - mov [bp+var_7], al - -loc_F5B5: - cmp di, 40h - jl short loc_F548 - mov ax, [si+0Ah] - add [si+6], ax - mov ax, [si+0Ch] - add [si+8], ax - inc byte ptr [si+1] - cmp byte ptr [si+1], 20h ; ' ' - jb short loc_F5D2 - mov byte ptr [si], 0 - -loc_F5D2: - inc [bp+var_6] - add si, 10h - -loc_F5D8: - cmp [bp+var_6], 2 - jl loc_F539 - GRCG_OFF_CLOBBERING dx - pop di - pop si - leave - retn -sub_F520 endp - - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_F5EA proc near - -var_5 = byte ptr -5 -var_4 = word ptr -4 -var_2 = word ptr -2 - - enter 6, 0 - push si - push di - mov si, 0BF7Ch - cmp byte ptr [si], 0 - jz loc_F6DA - mov [bp+var_2], 0 - mov [bp+var_5], 0 - jmp short loc_F676 -; --------------------------------------------------------------------------- - -loc_F605: - push word ptr [si+2] - push word ptr [si+6] - mov al, [bp+var_5] - mov ah, 0 - add ax, ax - mov bx, ax - push _CosTable8[bx] - call vector1_at - mov di, ax - sar ax, 4 - mov di, ax - push word ptr [si+4] - push word ptr [si+8] - mov al, [si+0Fh] - add al, [bp+var_5] - mov ah, 0 - add ax, ax - mov bx, ax - push _SinTable8[bx] - call vector1_at - mov [bp+var_4], ax - sar ax, 4 - add ax, 0FFF0h - mov [bp+var_4], ax - or di, di - jl short loc_F66B - cmp di, 180h - jg short loc_F66B - cmp [bp+var_4], 0 - jl short loc_F66B - cmp [bp+var_4], 150h - jg short loc_F66B - push di - push ax - push 3 - call super_put - -loc_F66B: - inc [bp+var_2] - mov al, [bp+var_5] - add al, 10h - mov [bp+var_5], al - -loc_F676: - cmp [bp+var_2], 10h - jl short loc_F605 - mov ax, [si+0Ah] - add [si+6], ax - mov ax, [si+0Ch] - add [si+8], ax - inc byte ptr [si+1] - cmp byte ptr [si+1], 20h ; ' ' - jb short loc_F694 - mov byte ptr [si], 0 - -loc_F694: - inc word_22272 - cmp word_22272, 8 - jge short loc_F6AE - test byte ptr word_22272, 1 - jz short loc_F6AE - mov PaletteTone, 96h - jmp short loc_F6CB -; --------------------------------------------------------------------------- - -loc_F6AE: - cmp word_22272, 8 - jl short loc_F6D2 - cmp word_22272, 10h - jge short loc_F6D2 - mov ax, word_22272 - imul ax, 6 - mov dx, 0C4h - sub dx, ax - mov PaletteTone, dx - -loc_F6CB: - mov _palette_changed, 1 - jmp short loc_F6E0 -; --------------------------------------------------------------------------- - -loc_F6D2: - mov PaletteTone, 64h ; 'd' - jmp short loc_F6CB -; --------------------------------------------------------------------------- - -loc_F6DA: - mov word_22272, 0 - -loc_F6E0: - pop di - pop si - leave - retn -sub_F5EA endp - +include th04/boss/explosions_small.asm +include th04/boss/explosions_big.asm ; =============== S U B R O U T I N E ======================================= @@ -10394,8 +10176,8 @@ loc_10989: call super_put_1plane loc_10999: - call sub_F520 - call sub_F5EA + call explosions_small_update_and_render + call explosions_big_update_and_render pop di pop si leave @@ -10539,8 +10321,8 @@ loc_10A84: call super_put_1plane loc_10A94: - call sub_F520 - call sub_F5EA + call explosions_small_update_and_render + call explosions_big_update_and_render pop di pop si leave @@ -10869,8 +10651,8 @@ loc_10D19: call sub_10B1D loc_10D1C: - call sub_F520 - call sub_F5EA + call explosions_small_update_and_render + call explosions_big_update_and_render pop di pop si leave @@ -11026,8 +10808,8 @@ loc_10E19: call sub_10D26 loc_10E1F: - call sub_F520 - call sub_F5EA + call explosions_small_update_and_render + call explosions_big_update_and_render mov byte_26348, 0 mov byte_26360, 0 pop di @@ -11230,8 +11012,8 @@ loc_10F76: call super_put_1plane loc_10F86: - call sub_F520 - call sub_F5EA + call explosions_small_update_and_render + call explosions_big_update_and_render pop di pop si leave @@ -11363,8 +11145,8 @@ loc_11064: mov byte_26348, 0 loc_11069: - call sub_F520 - call sub_F5EA + call explosions_small_update_and_render + call explosions_big_update_and_render pop di pop si leave @@ -11522,8 +11304,8 @@ loc_11175: mov byte_26348, 0 loc_1117A: - call sub_F520 - call sub_F5EA + call explosions_small_update_and_render + call explosions_big_update_and_render pop di pop si leave @@ -12368,8 +12150,8 @@ loc_1183A: call super_put loc_11862: - call sub_F520 - call sub_F5EA + call explosions_small_update_and_render + call explosions_big_update_and_render pop di pop si leave @@ -18305,7 +18087,7 @@ sub_144CB proc near mov _boss_pos.velocity.x, 0 mov _boss_pos.velocity.y, 0 mov byte_26348, 0 - call sub_162BD + call explosions_small_reset mov _boss_phase_timed_out, 1 pop bp retn @@ -20839,169 +20621,11 @@ loc_162B9: retf sub_1607D endp - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_162BD proc far - push bp - mov bp, sp - mov byte_2C93C, 0 - mov byte_2C94C, 0 - pop bp - retf -sub_162BD endp - - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -add_explode_effect_function proc near - -arg_0 = word ptr 4 - - push bp - mov bp, sp - push si - mov si, 0BF5Ch - cmp byte ptr [si], 0 - jz short loc_162DB - add si, 10h - -loc_162DB: - mov byte ptr [si], 1 - mov byte ptr [si+1], 0 - mov ax, _boss_pos.cur.x - mov [si+2], ax - mov ax, _boss_pos.cur.y - mov [si+4], ax - mov word ptr [si+6], 8 - mov word ptr [si+8], 8 - mov word ptr [si+0Ah], 0B0h ; '°' - mov word ptr [si+0Ch], 0B0h ; '°' - mov byte ptr [si+0Fh], 0 - mov bx, [bp+arg_0] - dec bx - cmp bx, 3 - ja short loc_16338 - add bx, bx - jmp cs:off_16344[bx] - -loc_16316: - mov byte ptr [si+0Fh], 20h ; ' ' - jmp short loc_16338 -; --------------------------------------------------------------------------- - -loc_1631C: - mov byte ptr [si+0Fh], 0E0h - jmp short loc_16338 -; --------------------------------------------------------------------------- - -loc_16322: - mov word ptr [si+0Ah], 0D0h - mov word ptr [si+0Ch], 70h ; 'p' - jmp short loc_16338 -; --------------------------------------------------------------------------- - -loc_1632E: - mov word ptr [si+0Ah], 70h ; 'p' - mov word ptr [si+0Ch], 0D0h - -loc_16338: - call snd_se_play pascal, 15 - pop si - pop bp - retn 2 -add_explode_effect_function endp - -; --------------------------------------------------------------------------- -off_16344 dw offset loc_16316 - dw offset loc_1631C - dw offset loc_16322 - dw offset loc_1632E - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -mai_yuki_1634C proc near - -@@y = word ptr -4 -@@x = word ptr -2 -arg_0 = word ptr 4 - - enter 4, 0 - mov ax, _boss_pos.cur.x - mov [bp+@@x], ax - mov ax, _boss_pos.cur.y - mov [bp+@@y], ax - mov eax, _yuki_pos.cur - mov _boss_pos.cur, eax - push [bp+arg_0] - call add_explode_effect_function - mov ax, [bp+@@x] - mov _boss_pos.cur.x, ax - mov ax, [bp+@@y] - mov _boss_pos.cur.y, ax - leave - retn 2 -mai_yuki_1634C endp - - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_1637A proc near - push bp - mov bp, sp - push si - mov si, 0BF7Ch - mov byte ptr [si], 1 - mov byte ptr [si+1], 0 - mov ax, _boss_pos.cur.x - mov [si+2], ax - mov ax, _boss_pos.cur.y - mov [si+4], ax - mov word ptr [si+6], 8 - mov word ptr [si+8], 8 - mov word ptr [si+0Ah], 0C0h - mov word ptr [si+0Ch], 0C0h - mov byte ptr [si+0Fh], 0 - call snd_se_play pascal, 12 - pop si - pop bp - retn -sub_1637A endp - - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -mai_yuki_163B6 proc near - -@@y = word ptr -4 -@@x = word ptr -2 - - enter 4, 0 - mov ax, _boss_pos.cur.x - mov [bp+@@x], ax - mov ax, _boss_pos.cur.y - mov [bp+@@y], ax - mov eax, _yuki_pos.cur - mov _boss_pos.cur, eax - call sub_1637A - mov ax, [bp+@@x] - mov _boss_pos.cur.x, ax - mov ax, [bp+@@y] - mov _boss_pos.cur.y, ax - leave - retn -mai_yuki_163B6 endp - +include th04/boss/explosions_reset.asm +include th04/boss/explode_small.asm +include th05/boss/2_explode_small.asm +include th05/boss/explode_big.asm +include th05/boss/2_explode_big.asm ; =============== S U B R O U T I N E ======================================= @@ -28136,8 +27760,7 @@ loc_1A1F8: mov _bullet_clear_time, 20 loc_1A208: - push 1 - call add_explode_effect_function + call boss_explode_small pascal, 1 inc boss_phase mov boss_phase_frame, 0 mov byte ptr word_2634A+1, 0 @@ -28191,8 +27814,7 @@ loc_1A284: jl loc_1A3B2 push 5 call sub_17416 - push 1 - call add_explode_effect_function + call boss_explode_small pascal, 1 cmp _bullet_clear_time, 20 jnb short loc_1A2D7 mov _bullet_clear_time, 20 @@ -29447,10 +29069,8 @@ loc_1ACF1: loc_1AD0D: call snd_se_play pascal, 15 - push 1 - call add_explode_effect_function - push 2 - call mai_yuki_1634C + call boss_explode_small pascal, 1 + call boss2_explode_small pascal, 2 jmp short loc_1AD29 ; --------------------------------------------------------------------------- @@ -29579,14 +29199,12 @@ loc_1AE4F: jnz short loc_1AE6C cmp byte_26363, 0 jnz short loc_1AE64 - push 4 - call add_explode_effect_function + call boss_explode_small pascal, 4 jmp short loc_1AE69 ; --------------------------------------------------------------------------- loc_1AE64: - push 4 - call mai_yuki_1634C + call boss2_explode_small pascal, 4 loc_1AE69: jmp loc_1AFA7 ; default @@ -29597,14 +29215,14 @@ loc_1AE6C: jnz loc_1AFA7 ; default cmp byte_26363, 0 jnz short loc_1AE8B - call sub_1637A + call boss_explode_big mov _boss_sprite_cur, 4 mov _yuki_sprite, 180 jmp short loc_1AE98 ; --------------------------------------------------------------------------- loc_1AE8B: - call mai_yuki_163B6 + call boss2_explode_big mov _yuki_sprite, 4 mov _boss_sprite_cur, 180 @@ -30989,8 +30607,7 @@ loc_1BAAD: push _boss_pos.cur.x push _boss_pos.cur.y call _circles_add_growing - push 4 - call add_explode_effect_function + call boss_explode_small pascal, 4 mov fp_2CE42, offset sub_1B557 mov _boss_sprite_left, 206 mov _boss_sprite_right, 205 @@ -31196,8 +30813,7 @@ loc_1BCDB: mov byte ptr word_2634A+1, 1 loc_1BCE7: - push 4 - call add_explode_effect_function + call boss_explode_small pascal, 4 mov boss_phase_frame, 0 mov boss_phase, 0FDh call sub_1B3C2 @@ -32188,8 +31804,7 @@ loc_1C5D8: mov boss_phase_frame, 0 mov byte_26349, 1 mov byte ptr word_2634A+1, 0 - push 4 - call add_explode_effect_function + call boss_explode_small pascal, 4 push _boss_pos.cur.x push _boss_pos.cur.y call _circles_add_growing @@ -32405,8 +32020,7 @@ loc_1C7D7: mov byte ptr word_2634A+1, 1 loc_1C7E3: - push 4 - call add_explode_effect_function + call boss_explode_small pascal, 4 mov boss_phase_frame, 0 mov boss_phase, 0FDh call sub_1B3C2 @@ -32962,8 +32576,7 @@ loc_1CC7F: push (52 shl 16) or 52 call select_for_rank mov byte_2D082, al - push 0 - call add_explode_effect_function + call boss_explode_small pascal, 0 cmp _bullet_clear_time, 20 jnb short loc_1CCD0 mov _bullet_clear_time, 20 @@ -33305,8 +32918,7 @@ loc_1D030: push (52 shl 16) or 48 call select_for_rank mov byte_2D082, al - push 0 - call add_explode_effect_function + call boss_explode_small pascal, 0 cmp _bullet_clear_time, 20 jnb short loc_1D081 mov _bullet_clear_time, 20 @@ -33750,8 +33362,7 @@ loc_1D4DD: mov byte ptr word_2634A+1, 1 loc_1D4F4: - push 4 - call add_explode_effect_function + call boss_explode_small pascal, 4 mov boss_phase_frame, 0 mov boss_phase, 0FDh mov _boss_custombullets_render, offset nullsub_2 @@ -34706,8 +34317,7 @@ loc_1DD27: sub _laser_template.coords.origin.x, (64 shl 4) call lasers_new_fixed_and_manual_in_slot pascal, 3 inc word_22852 - push 0 - call add_explode_effect_function + call boss_explode_small pascal, 0 loc_1DD72: mov ax, boss_phase_frame @@ -34940,8 +34550,7 @@ loc_1DFFB: push (16 shl 16) or 12 call select_for_rank mov byte_2D083, al - push 0 - call add_explode_effect_function + call boss_explode_small pascal, 0 locret_1E020: leave @@ -35438,8 +35047,7 @@ loc_1E4F9: mov byte ptr word_2634A+1, 1 loc_1E510: - push 4 - call add_explode_effect_function + call boss_explode_small pascal, 4 mov boss_phase_frame, 0 mov boss_phase, 0FDh jmp short loc_1E527 @@ -37034,8 +36642,7 @@ arg_2 = word ptr 6 mov si, [bp+arg_2] cmp si, 0FFFFh jz short loc_1F25F - push si - call add_explode_effect_function + call boss_explode_small pascal, si cmp _boss_phase_timed_out, 0 jnz short loc_1F25F mov byte_226C0, 1 @@ -37425,8 +37032,7 @@ loc_1F626: mov byte ptr word_2634A+1, 1 loc_1F643: - push 4 - call add_explode_effect_function + call boss_explode_small pascal, 4 mov boss_phase_frame, 0 mov boss_phase, 0FDh mov _boss_custombullets_render, offset nullsub_2 @@ -38149,8 +37755,7 @@ arg_2 = word ptr 6 mov si, [bp+arg_2] cmp si, 0FFFFh jz short loc_1FB94 - push si - call add_explode_effect_function + call boss_explode_small pascal, si cmp _boss_phase_timed_out, 0 jnz short loc_1FB94 cmp _bullet_clear_time, 20 @@ -38192,20 +37797,18 @@ n1000 = word ptr 4 cmp boss_phase_frame, 1 jnz short loc_1FBE1 mov byte_26348, 0;m_bHitThisFrame? - push 0 - call add_explode_effect_function + call boss_explode_small pascal, 0 call snd_se_play pascal, 13 loc_1FBE1: cmp boss_phase_frame, 16 jnz short loc_1FBED - push 4 - call add_explode_effect_function + call boss_explode_small pascal, 4 loc_1FBED: cmp boss_phase_frame, 32 ; ' ' jnz loc_1FD51 - call sub_1637A + call boss_explode_big inc boss_phase mov al, byte ptr word_2634A+1 mov _bullet_clear_trigger, al @@ -38935,7 +38538,7 @@ aSt06_16_bft db 'st06_16.bft',0 aBomb3_bft_0 db 'bomb3.bft',0 aBomb0_bft_0 db 'bomb0.bft',0 db 0 -word_22272 dw 0 +include th04/boss/explosions_big[data].asm byte_22274 db 0 byte_22275 db 0 off_22276 dw offset aBOSS_FINAL_TIMEOUT @@ -46088,24 +45691,7 @@ word_2C934 dw ? word_2C936 dw ? word_2C938 dw ? dw ? -byte_2C93C db ? - dd ? ; - dd ? ; - dd ? ; - db ? ; - db ? ; - db ? ; -byte_2C94C db ? - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - db ? ; - db ? ; - db ? ; +include th04/boss/explosions[bss].asm byte_2C96C db ? db ? _boss_sprite_left dw ?