From 5edc4597499a18df5cd213ad92f59e6cd5e59534 Mon Sep 17 00:00:00 2001 From: nmlgc Date: Sun, 24 Apr 2022 03:54:19 +0200 Subject: [PATCH] [Decompilation] [th04/th05] Midbosses: Sprite area invalidation Part of P0192, funded by [Anonymous], nrook, and -Tom-. --- Makefile.mak | 4 ++-- th04/main/enemy/enemy.hpp | 3 --- th04/main/enemy/size.hpp | 5 ++++ th04/main/midboss/funcs[bss].asm | 8 +++---- th04/main/midboss/inv.cpp | 30 ++++++++++++++++++++++++ th04/main/midboss/midboss.hpp | 7 +++++- th04/mb_inv.cpp | 1 + th04_main.asm | 39 +++++++------------------------- th05_main.asm | 38 +++++++------------------------ 9 files changed, 63 insertions(+), 72 deletions(-) create mode 100644 th04/main/enemy/size.hpp create mode 100644 th04/main/midboss/inv.cpp create mode 100644 th04/mb_inv.cpp diff --git a/Makefile.mak b/Makefile.mak index 21eda7bd..52db40e1 100644 --- a/Makefile.mak +++ b/Makefile.mak @@ -126,7 +126,7 @@ bin\th04\op.exe: bin\th04\op.obj th04\m_char.cpp bin\th01\vplanset.obj bin\th02\ $** | -bin\th04\main.exe: bin\th04\main.obj bin\th04\slowdown.obj th04\ems.cpp th04\playfld.cpp th04\f_dialog.cpp th04\dialog.cpp bin\th04\player_p.obj bin\th04\scoreupd.obj th04\hud_ovrl.cpp bin\th04\cfg_lres.obj bin\th04\boss_bd.obj bin\th01\vplanset.obj bin\th03\vector2.obj bin\th02\frmdely1.obj bin\th03\hfliplut.obj th04\mpn_free.cpp bin\th04\input_w.obj th04\mpn_l_i.cpp bin\th04\vector.obj bin\th04\snd_pmdr.obj bin\th04\snd_mmdr.obj bin\th04\snd_kaja.obj bin\th04\snd_mode.obj bin\th04\snd_load.obj bin\th04\cdg_put.obj bin\th04\exit.obj bin\th04\initmain.obj bin\th04\cdg_p_na.obj bin\th04\cdg_p_pr.obj bin\th04\input_s.obj bin\th04\snd_se_r.obj bin\th04\snd_se.obj bin\th04\cdg_load.obj th04\gather.cpp bin\th04\scrolly3.obj bin\th04\motion_3.obj bin\th04\hud_hp.obj th04\mb_dft.cpp bin\th04\it_spl_u.obj th04\boss_4m.cpp th04\bullet_u.cpp th04\bullet_a.cpp th04\boss.cpp th04\boss_4r.cpp th04\boss_x2.cpp +bin\th04\main.exe: bin\th04\main.obj bin\th04\slowdown.obj th04\ems.cpp th04\playfld.cpp th04\f_dialog.cpp th04\dialog.cpp bin\th04\player_p.obj bin\th04\scoreupd.obj th04\hud_ovrl.cpp bin\th04\cfg_lres.obj bin\th04\mb_inv.obj bin\th04\boss_bd.obj bin\th01\vplanset.obj bin\th03\vector2.obj bin\th02\frmdely1.obj bin\th03\hfliplut.obj th04\mpn_free.cpp bin\th04\input_w.obj th04\mpn_l_i.cpp bin\th04\vector.obj bin\th04\snd_pmdr.obj bin\th04\snd_mmdr.obj bin\th04\snd_kaja.obj bin\th04\snd_mode.obj bin\th04\snd_load.obj bin\th04\cdg_put.obj bin\th04\exit.obj bin\th04\initmain.obj bin\th04\cdg_p_na.obj bin\th04\cdg_p_pr.obj bin\th04\input_s.obj bin\th04\snd_se_r.obj bin\th04\snd_se.obj bin\th04\cdg_load.obj th04\gather.cpp bin\th04\scrolly3.obj bin\th04\motion_3.obj bin\th04\hud_hp.obj th04\mb_dft.cpp bin\th04\it_spl_u.obj th04\boss_4m.cpp th04\bullet_u.cpp th04\bullet_a.cpp th04\boss.cpp th04\boss_4r.cpp th04\boss_x2.cpp $(CC) $(CFLAGS) $(LARGE_LFLAGS) -DGAME=4 -DBINARY='M' -3 -Z -nbin\th04\ -eMAIN.EXE @&&| $** | @@ -149,7 +149,7 @@ bin\th05\op.exe: th05\op010.cpp bin\th05\op.obj th05\op011.cpp th05\m_char.cpp b $** | -bin\th05\main.exe: bin\th05\main.obj bin\th04\slowdown.obj th05\ems.cpp bin\th05\cfg_lres.obj th05\main010.cpp th05\f_dialog.cpp th05\dialog.cpp th05\playfld.cpp bin\th04\boss_bd.obj th05\boss_bg.cpp th05\p_common.cpp th05\p_reimu.cpp th05\p_marisa.cpp th05\p_mima.cpp th05\p_yuuka.cpp bin\th05\player.obj bin\th05\hud_bar.obj bin\th05\scoreupd.obj th05\hud_ovrl.cpp bin\th04\player_p.obj th05\player_a.cpp bin\th05\bullet_1.obj th05\bullet_c.cpp bin\th03\vector2.obj bin\th03\hfliplut.obj bin\th04\snd_pmdr.obj bin\th04\snd_mmdr.obj bin\th04\snd_mode.obj bin\th05\bullet.obj th05\bullet_t.cpp bin\th04\cdg_p_na.obj bin\th04\snd_se_r.obj bin\th04\snd_se.obj bin\th05\cdg_put.obj bin\th04\exit.obj bin\th05\vector.obj bin\th05\snd_load.obj bin\th05\snd_kaja.obj bin\th05\initmain.obj bin\th05\input_s.obj bin\th05\inp_h_w.obj bin\th05\frmdelay.obj bin\th04\cdg_load.obj bin\th04\scrolly3.obj bin\th04\motion_3.obj th05\gather.cpp th05\main032.cpp bin\th04\hud_hp.obj th05\mb_dft.cpp th05\laser_sc.cpp th05\cheeto_u.cpp bin\th04\it_spl_u.obj th05\bullet_u.cpp th05\midboss1.cpp th05\main034.cpp th05\boss_6.cpp th05\boss_x.cpp th05\boss.cpp th05\main014.cpp +bin\th05\main.exe: bin\th05\main.obj bin\th04\slowdown.obj th05\ems.cpp bin\th05\cfg_lres.obj th05\main010.cpp th05\f_dialog.cpp th05\dialog.cpp th05\playfld.cpp bin\th04\mb_inv.obj bin\th04\boss_bd.obj th05\boss_bg.cpp th05\p_common.cpp th05\p_reimu.cpp th05\p_marisa.cpp th05\p_mima.cpp th05\p_yuuka.cpp bin\th05\player.obj bin\th05\hud_bar.obj bin\th05\scoreupd.obj th05\hud_ovrl.cpp bin\th04\player_p.obj th05\player_a.cpp bin\th05\bullet_1.obj th05\bullet_c.cpp bin\th03\vector2.obj bin\th03\hfliplut.obj bin\th04\snd_pmdr.obj bin\th04\snd_mmdr.obj bin\th04\snd_mode.obj bin\th05\bullet.obj th05\bullet_t.cpp bin\th04\cdg_p_na.obj bin\th04\snd_se_r.obj bin\th04\snd_se.obj bin\th05\cdg_put.obj bin\th04\exit.obj bin\th05\vector.obj bin\th05\snd_load.obj bin\th05\snd_kaja.obj bin\th05\initmain.obj bin\th05\input_s.obj bin\th05\inp_h_w.obj bin\th05\frmdelay.obj bin\th04\cdg_load.obj bin\th04\scrolly3.obj bin\th04\motion_3.obj th05\gather.cpp th05\main032.cpp bin\th04\hud_hp.obj th05\mb_dft.cpp th05\laser_sc.cpp th05\cheeto_u.cpp bin\th04\it_spl_u.obj th05\bullet_u.cpp th05\midboss1.cpp th05\main034.cpp th05\boss_6.cpp th05\boss_x.cpp th05\boss.cpp th05\main014.cpp $(CC) $(CFLAGS) $(LARGE_LFLAGS) -3 -Z -DGAME=5 -DBINARY='M' -nbin\th05\ -eMAIN.EXE @&&| $** | diff --git a/th04/main/enemy/enemy.hpp b/th04/main/enemy/enemy.hpp index e95c3567..fb492189 100644 --- a/th04/main/enemy/enemy.hpp +++ b/th04/main/enemy/enemy.hpp @@ -1,6 +1,3 @@ -#define ENEMY_W 32 -#define ENEMY_H 32 - enum enemy_flag_t { EF_FREE = 0, EF_ALIVE = 1, diff --git a/th04/main/enemy/size.hpp b/th04/main/enemy/size.hpp new file mode 100644 index 00000000..ae93d164 --- /dev/null +++ b/th04/main/enemy/size.hpp @@ -0,0 +1,5 @@ +#define ENEMY_W 32 +#define ENEMY_H 32 + +static const pixel_t ENEMY_KILL_W = 32; +static const pixel_t ENEMY_KILL_H = 32; diff --git a/th04/main/midboss/funcs[bss].asm b/th04/main/midboss/funcs[bss].asm index 3cdddcaa..9ca016b1 100644 --- a/th04/main/midboss/funcs[bss].asm +++ b/th04/main/midboss/funcs[bss].asm @@ -1,12 +1,10 @@ -; *_func() functions are "activated" by setting the regular function once the -; midboss battle starts. -public _midboss_active, _midboss_invalidate? +public _midboss_active, _midboss_invalidate public _midboss_update, _midboss_update_func public _midboss_render, _midboss_render_func _midboss_active db ? - db ? -_midboss_invalidate? dw ? + evendata +_midboss_invalidate dw ? _midboss_update dd ? _midboss_render dw ? _midboss_update_func dd ? diff --git a/th04/main/midboss/inv.cpp b/th04/main/midboss/inv.cpp new file mode 100644 index 00000000..d9a7077d --- /dev/null +++ b/th04/main/midboss/inv.cpp @@ -0,0 +1,30 @@ +#pragma option -3 + +#include "platform.h" +#include "pc98.h" +#include "master.hpp" +#include "th01/math/subpixel.hpp" +#include "th04/math/motion.hpp" +extern "C" { +#include "th04/main/playfld.hpp" +} +#include "th04/main/phase.hpp" +#include "th04/main/enemy/size.hpp" +#include "th04/main/midboss/midboss.hpp" +#include "th04/main/tile/tile.hpp" + +// See tile.hpp for the reason this declaration is necessary +extern "C" void pascal near tiles_invalidate_around(const SPPoint center); + +void pascal near midboss_invalidate_func(void) +{ + if(midboss.phase < PHASE_EXPLODE_BIG) { + tile_invalidate_box.x = MIDBOSS_W_MAX; + tile_invalidate_box.y = MIDBOSS_H_MAX; + tiles_invalidate_around(midboss.pos.prev); + } else { + tile_invalidate_box.x = (ENEMY_KILL_W * 4); + tile_invalidate_box.y = (ENEMY_KILL_H * 4); + tiles_invalidate_around(midboss.pos.cur); + } +} diff --git a/th04/main/midboss/midboss.hpp b/th04/main/midboss/midboss.hpp index 263afbb2..bf6425b5 100644 --- a/th04/main/midboss/midboss.hpp +++ b/th04/main/midboss/midboss.hpp @@ -1,3 +1,5 @@ +static const pixel_t MIDBOSS_W_MAX = 64; +static const pixel_t MIDBOSS_H_MAX = 64; static const unsigned int MIDBOSS_BONUS_UNIT_VALUE = 1280; typedef struct { @@ -21,11 +23,14 @@ extern bool midboss_active; // new point number popup per unit around the midboss sprite. void pascal near midboss_score_bonus(unsigned int units); -// Callbacks +// Callbacks. *_func() functions are "activated" by setting the regular +// function once the midboss battle starts. +extern nearfunc_t_near midboss_invalidate; extern farfunc_t_near midboss_update_func; extern nearfunc_t_near midboss_render_func; void midboss_reset(void); +void pascal near midboss_invalidate_func(void); // Processes any collision of player shots within a box with the given radius // around the current position of the midboss. Returns the total amount of diff --git a/th04/mb_inv.cpp b/th04/mb_inv.cpp new file mode 100644 index 00000000..07e9f742 --- /dev/null +++ b/th04/mb_inv.cpp @@ -0,0 +1 @@ +#include "th04/main/midboss/inv.cpp" diff --git a/th04_main.asm b/th04_main.asm index 179c4583..3e5a04f5 100644 --- a/th04_main.asm +++ b/th04_main.asm @@ -43,7 +43,7 @@ include th04/main/enemy/enemy.inc extern _tolower:proc extern __ctype:byte -main_01 group SLOWDOWN_TEXT, ma_TEXT, EMS_TEXT, mai_TEXT, PLAYFLD_TEXT, main_TEXT, DIALOG_TEXT, main__TEXT, PLAYER_P_TEXT, main_0_TEXT, HUD_OVRL_TEXT, main_01_TEXT, main_012_TEXT, CFG_LRES_TEXT, main_013_TEXT, BOSS_BD_TEXT, BOSS_BG_TEXT +main_01 group SLOWDOWN_TEXT, ma_TEXT, EMS_TEXT, mai_TEXT, PLAYFLD_TEXT, main_TEXT, DIALOG_TEXT, main__TEXT, PLAYER_P_TEXT, main_0_TEXT, HUD_OVRL_TEXT, main_01_TEXT, main_012_TEXT, CFG_LRES_TEXT, main_013_TEXT, MB_INV_TEXT, BOSS_BD_TEXT, BOSS_BG_TEXT g_SHARED group SHARED, SHARED_ main_03 group GATHER_TEXT, SCROLLY3_TEXT, MOTION_3_TEXT, main_032_TEXT, IT_SPL_U_TEXT, BOSS_4M_TEXT, main_033_TEXT, HUD_HP_TEXT, MB_DFT_TEXT, main_034_TEXT, BULLET_U_TEXT, BULLET_A_TEXT, main_035_TEXT, BOSS_TEXT, main_036_TEXT @@ -1908,7 +1908,7 @@ tiles_render proc near call items_invalidate call _sparks_invalidate call main_01:pointnums_invalidate - call _midboss_invalidate? + call _midboss_invalidate call _stage_invalidate call main_01:tiles_redraw_invalidated pop bp @@ -10120,35 +10120,12 @@ loc_12122: pop di retn sub_12076 endp - - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_12124 proc near - push bp - mov bp, sp - cmp _midboss_phase, PHASE_EXPLODE_BIG - jnb short loc_12141 - mov _tile_invalidate_box.x, 64 - mov _tile_invalidate_box.y, 64 - pushd [_midboss_pos.prev] - jmp short loc_12152 -; --------------------------------------------------------------------------- - -loc_12141: - mov _tile_invalidate_box.x, 128 - mov _tile_invalidate_box.y, 128 - pushd [_midboss_pos.cur] - -loc_12152: - call main_01:tiles_invalidate_around - pop bp - retn -sub_12124 endp main_013_TEXT ends +MB_INV_TEXT segment byte public 'CODE' use16 + @MIDBOSS_INVALIDATE_FUNC$QV procdesc near +MB_INV_TEXT ends + BOSS_BD_TEXT segment byte public 'CODE' use16 @BOSS_BACKDROP_RENDER$QIIC procdesc pascal near \ left_and_top:dword, col:byte @@ -22502,7 +22479,7 @@ public @midboss_reset$qv @midboss_reset$qv proc far push bp mov bp, sp - mov _midboss_invalidate?, offset nullfunc_near + mov _midboss_invalidate, offset nullfunc_near mov _midboss_render, offset nullfunc_near setfarfp _midboss_update, nullfunc_far mov _midboss_active, 0 @@ -22522,7 +22499,7 @@ sub_19EE4 proc far mov ax, _midboss_frames_until cmp ax, _stage_frame jnz short loc_19F14 - mov _midboss_invalidate?, offset sub_12124 + mov _midboss_invalidate, offset @midboss_invalidate_func$qv mov ax, _midboss_render_func mov _midboss_render, ax mov eax, _midboss_update_func diff --git a/th05_main.asm b/th05_main.asm index 6c11afb4..adfae061 100644 --- a/th05_main.asm +++ b/th05_main.asm @@ -37,7 +37,7 @@ include th05/main/enemy/enemy.inc extern _execl:proc extern _strlen:proc -main_01 group SLOWDOWN_TEXT, m_TEXT, EMS_TEXT, ma_TEXT, CFG_LRES_TEXT, mai_TEXT, BOSS_BD_TEXT, BOSS_BG_TEXT, main_TEXT, main__TEXT, PLAYFLD_TEXT, main_0_TEXT, HUD_OVRL_TEXT, DIALOG_TEXT, PLAYER_P_TEXT, main_01_TEXT +main_01 group SLOWDOWN_TEXT, m_TEXT, EMS_TEXT, ma_TEXT, CFG_LRES_TEXT, mai_TEXT, MB_INV_TEXT, BOSS_BD_TEXT, BOSS_BG_TEXT, main_TEXT, main__TEXT, PLAYFLD_TEXT, main_0_TEXT, HUD_OVRL_TEXT, DIALOG_TEXT, PLAYER_P_TEXT, main_01_TEXT g_SHARED group SHARED, SHARED_ main_03 group SCROLLY3_TEXT, MOTION_3_TEXT, main_031_TEXT, BULLET_A_TEXT, main_032_TEXT, main_033_TEXT, HUD_HP_TEXT, MB_DFT_TEXT, LASER_SC_TEXT, CHEETO_U_TEXT, IT_SPL_U_TEXT, BULLET_U_TEXT, MIDBOSS1_TEXT, main_034_TEXT, main_035_TEXT, BOSS_6_TEXT, BOSS_X_TEXT, main_036_TEXT, BOSS_TEXT @@ -1542,7 +1542,7 @@ tiles_render proc near call items_invalidate call _sparks_invalidate call pointnums_invalidate - call _midboss_invalidate? + call _midboss_invalidate call _stage_invalidate call tiles_redraw_invalidated pop bp @@ -2782,34 +2782,12 @@ sub_CFEE proc near sub_CFEE endp include th04/hardware/grcg_fill_rows.asm - -; =============== S U B R O U T I N E ======================================= - -; Attributes: bp-based frame - -sub_D032 proc near - push bp - mov bp, sp - cmp _midboss_phase, PHASE_EXPLODE_BIG - jnb short loc_D04F - mov _tile_invalidate_box.x, 64 - mov _tile_invalidate_box.y, 64 - pushd [_midboss_pos.prev] - jmp short loc_D060 -; --------------------------------------------------------------------------- - -loc_D04F: - mov _tile_invalidate_box.x, 128 - mov _tile_invalidate_box.y, 128 - pushd [_midboss_pos.cur] - -loc_D060: - call tiles_invalidate_around - pop bp - retn -sub_D032 endp mai_TEXT ends +MB_INV_TEXT segment byte public 'CODE' use16 + @MIDBOSS_INVALIDATE_FUNC$QV procdesc near +MB_INV_TEXT ends + BOSS_BD_TEXT segment byte public 'CODE' use16 BOSS_BD_TEXT ends @@ -10332,7 +10310,7 @@ public @midboss_reset$qv @midboss_reset$qv proc far push bp mov bp, sp - mov _midboss_invalidate?, offset nullfunc_near + mov _midboss_invalidate, offset nullfunc_near mov _midboss_render, offset nullfunc_near setfarfp _midboss_update, nullfunc_far mov _midboss_hp, 0 @@ -10351,7 +10329,7 @@ sub_17322 proc far mov ax, _midboss_frames_until cmp ax, _stage_frame jnz short loc_17352 - mov _midboss_invalidate?, offset sub_D032 + mov _midboss_invalidate, offset @midboss_invalidate_func$qv mov ax, _midboss_render_func mov _midboss_render, ax mov eax, _midboss_update_func