mirror of https://github.com/nmlgc/ReC98.git
[Decompilation] [th04/th05] Dialog: Blocking main function
Part of P0259, funded by Splashman and Yanga.
This commit is contained in:
parent
0f45a5a89f
commit
63e9257279
|
@ -1,11 +1,10 @@
|
||||||
// Properly declared, DEMO?.REC uses this structure:
|
// Properly declared, DEMO?.REC uses this structure:
|
||||||
//
|
template <size_t Frames> struct REC {
|
||||||
// template <size_t Frames> struct REC {
|
input_replay_t input[Frames];
|
||||||
// input_replay_t input[Frames];
|
bool shift[Frames];
|
||||||
// bool shift[Frames];
|
};
|
||||||
// };
|
|
||||||
//
|
// The above declaration would also work with the overly long TH05 Extra Stage
|
||||||
// This declaration would also work with the overly large TH05 Extra Stage
|
|
||||||
// Clear replay. However, ZUN not only uses the same pointer for both that
|
// Clear replay. However, ZUN not only uses the same pointer for both that
|
||||||
// replay and regular ones, he also only accesses the [shift] flag via adding
|
// replay and regular ones, he also only accesses the [shift] flag via adding
|
||||||
// either DEMO_N or DEMO_N_EXTRA to the stage frame index. TH05 calculates that
|
// either DEMO_N or DEMO_N_EXTRA to the stage frame index. TH05 calculates that
|
||||||
|
|
|
@ -227,3 +227,23 @@ void near dialog_run(void)
|
||||||
}
|
}
|
||||||
overlay_wipe();
|
overlay_wipe();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dialog_animate(void)
|
||||||
|
{
|
||||||
|
dialog_init();
|
||||||
|
dialog_pre();
|
||||||
|
dialog_run();
|
||||||
|
|
||||||
|
/* TODO: Replace with the decompiled call
|
||||||
|
* tiles_activate_and_render_all_for_next_N_frames(2);
|
||||||
|
* once that function is part of the same segment */
|
||||||
|
_asm {
|
||||||
|
push 2;
|
||||||
|
nop;
|
||||||
|
push cs;
|
||||||
|
call near ptr tiles_activate_and_render_all_for_next_N_frames;
|
||||||
|
}
|
||||||
|
|
||||||
|
dialog_exit();
|
||||||
|
dialog_post();
|
||||||
|
}
|
||||||
|
|
|
@ -27,14 +27,7 @@ bool near std_update_frames_then_animate_dialog_and_activate_boss_if_done(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* TODO: Replace with the decompiled call
|
dialog_animate();
|
||||||
* dialog_animate();
|
|
||||||
* once that function is part of this translation unit */
|
|
||||||
_asm {
|
|
||||||
nop;
|
|
||||||
push cs;
|
|
||||||
call near ptr dialog_animate;
|
|
||||||
}
|
|
||||||
|
|
||||||
std_update = std_update_done;
|
std_update = std_update_done;
|
||||||
bg_render_not_bombing = boss_bg_render_func;
|
bg_render_not_bombing = boss_bg_render_func;
|
||||||
|
|
|
@ -167,6 +167,19 @@ inline void dialog_text_put(shiftjis_t* const& text) {
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void dialog_pre(void) {
|
||||||
|
overlay_wipe();
|
||||||
|
palette_settone(100);
|
||||||
|
graph_accesspage(page_front);
|
||||||
|
dialog_box_fade_in_animate();
|
||||||
|
playfield_copy_front_to_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void dialog_post(void) {
|
||||||
|
graph_accesspage(page_back);
|
||||||
|
frame_delay(1);
|
||||||
|
}
|
||||||
|
|
||||||
// Script commands
|
// Script commands
|
||||||
// ---------------
|
// ---------------
|
||||||
|
|
||||||
|
|
|
@ -1764,7 +1764,6 @@ public @TILES_RENDER$QV
|
||||||
@tiles_render$qv endp
|
@tiles_render$qv endp
|
||||||
|
|
||||||
extern @tiles_activate$qv:proc
|
extern @tiles_activate$qv:proc
|
||||||
extern @TILES_ACTIVATE_AND_RENDER_ALL_FO$QUC:proc
|
|
||||||
TILE_TEXT ends
|
TILE_TEXT ends
|
||||||
|
|
||||||
mai_TEXT segment word public 'CODE' use16
|
mai_TEXT segment word public 'CODE' use16
|
||||||
|
@ -1905,37 +1904,7 @@ DIALOG_TEXT segment byte public 'CODE' use16
|
||||||
extern @dialog_load_yuuka5_defeat_bad$qv:proc
|
extern @dialog_load_yuuka5_defeat_bad$qv:proc
|
||||||
@dialog_free$qv procdesc near
|
@dialog_free$qv procdesc near
|
||||||
@std_update_frames_then_animate_d$qv procdesc near
|
@std_update_frames_then_animate_d$qv procdesc near
|
||||||
@playfield_copy_front_to_back$qv procdesc near
|
extern @dialog_animate$qv:proc
|
||||||
@dialog_box_fade_in_animate$qv procdesc near
|
|
||||||
@dialog_run$qv procdesc pascal near
|
|
||||||
|
|
||||||
; =============== S U B R O U T I N E =======================================
|
|
||||||
|
|
||||||
; Attributes: bp-based frame
|
|
||||||
public @dialog_animate$qv
|
|
||||||
@dialog_animate$qv proc far
|
|
||||||
push bp
|
|
||||||
mov bp, sp
|
|
||||||
call @dialog_init$qv
|
|
||||||
call @overlay_wipe$qv
|
|
||||||
mov PaletteTone, 100
|
|
||||||
call far ptr palette_show
|
|
||||||
graph_accesspage _page_front
|
|
||||||
call @dialog_box_fade_in_animate$qv
|
|
||||||
call @playfield_copy_front_to_back$qv
|
|
||||||
call @dialog_run$qv
|
|
||||||
push 2
|
|
||||||
nopcall @tiles_activate_and_render_all_fo$quc
|
|
||||||
call @dialog_exit$qv
|
|
||||||
graph_accesspage _page_back
|
|
||||||
push 1
|
|
||||||
call frame_delay
|
|
||||||
pop bp
|
|
||||||
retf
|
|
||||||
@dialog_animate$qv endp
|
|
||||||
|
|
||||||
@dialog_init$qv procdesc near
|
|
||||||
@dialog_exit$qv procdesc near
|
|
||||||
DIALOG_TEXT ends
|
DIALOG_TEXT ends
|
||||||
|
|
||||||
BOSS_EXP_TEXT segment byte public 'CODE' use16
|
BOSS_EXP_TEXT segment byte public 'CODE' use16
|
||||||
|
|
|
@ -8,8 +8,13 @@ void near main_pat_exalice_override_and_super_clean_stage(void);
|
||||||
// -----------------------
|
// -----------------------
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include "th02/main/execl.hpp"
|
||||||
#include "th04/main/dialog/shared.cpp"
|
#include "th04/main/dialog/shared.cpp"
|
||||||
|
#include "th04/main/demo.hpp"
|
||||||
|
#include "th04/score.h"
|
||||||
|
#include "th05/mem.h"
|
||||||
#include "th05/playchar.h"
|
#include "th05/playchar.h"
|
||||||
|
#include "th05/resident.hpp"
|
||||||
#include "th05/formats/dialog.hpp"
|
#include "th05/formats/dialog.hpp"
|
||||||
#include "th05/main/dialog/dialog.hpp"
|
#include "th05/main/dialog/dialog.hpp"
|
||||||
#include "th05/sprites/main_pat.h"
|
#include "th05/sprites/main_pat.h"
|
||||||
|
@ -225,3 +230,58 @@ void near dialog_run(void)
|
||||||
}
|
}
|
||||||
overlay_wipe();
|
overlay_wipe();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dialog_animate(void)
|
||||||
|
{
|
||||||
|
// If we get here during a replay, we assume it's the hidden Extra Stage
|
||||||
|
// one because it's the only one that's long enough, and then skip the
|
||||||
|
// dialog.
|
||||||
|
// You might argue that this is gross and ZUN should have just added a
|
||||||
|
// proper skip feature that would still run through the script for its side
|
||||||
|
// effects, but the only bad aspect I can see is that this happens here and
|
||||||
|
// not at the call site. In regular gameplay, the (hardcoded) boss render
|
||||||
|
// functions rely on the dialog scripts for loading their sprites at the
|
||||||
|
// intended patnums, so it would have made much more sense to hardcode all
|
||||||
|
// of these load calls and completely remove the dependency on game data.
|
||||||
|
if(resident->demo_num != 0) {
|
||||||
|
extern int8_t dialog_sequence_id;
|
||||||
|
if(dialog_sequence_id == 0) {
|
||||||
|
// Pre-boss. Replicate all asset load calls that would be done if
|
||||||
|
// `_DM06.TX2` would run normally, ...
|
||||||
|
#undef BGM_EXTRA_BOSS_FN
|
||||||
|
#undef DEMO_EXTRA_PART_2_FN
|
||||||
|
extern const char st06_bb1[];
|
||||||
|
extern const char st06_bb2[];
|
||||||
|
extern const char BGM_EXTRA_BOSS_FN[];
|
||||||
|
extern const char DEMO_EXTRA_PART_2_FN[];
|
||||||
|
|
||||||
|
main_pat_exalice_override_and_super_clean_stage();
|
||||||
|
super_entry_bfnt(st06_bb1);
|
||||||
|
super_entry_bfnt(st06_bb2);
|
||||||
|
snd_load(BGM_EXTRA_BOSS_FN, SND_LOAD_SONG);
|
||||||
|
snd_kaja_func(KAJA_SONG_PLAY, 0);
|
||||||
|
|
||||||
|
// ... then load the second half of the replay.
|
||||||
|
// ZUN bloat: This could have definitely been integrated into
|
||||||
|
// demo_load(), including the avoided reallocation.
|
||||||
|
file_ropen(DEMO_EXTRA_PART_2_FN);
|
||||||
|
file_read(DemoBuf, (DEMO_N_EXTRA * sizeof(REC<1>)));
|
||||||
|
file_close();
|
||||||
|
stage_frame = 0; // This is actually the index into [DemoBuf].
|
||||||
|
dialog_sequence_id++;
|
||||||
|
} else {
|
||||||
|
// Post-boss. Just return to the title screen.
|
||||||
|
#undef BINARY_OP
|
||||||
|
#define BINARY_OP DIALOG_BINARY_OP
|
||||||
|
extern const char BINARY_OP[];
|
||||||
|
demo_end();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cdg_free(CDG_BG_PLAYCHAR_BOMB); // "dialog_init()"
|
||||||
|
dialog_pre();
|
||||||
|
dialog_run();
|
||||||
|
dialog_exit();
|
||||||
|
dialog_post();
|
||||||
|
}
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
#define BINARY_OP "op"
|
||||||
|
|
||||||
|
#define BGM_EXTRA_BOSS_FN "st06b"
|
||||||
|
|
||||||
|
#define DEMO_EXTRA_PART_2_FN "DEMO5.REC"
|
||||||
|
|
||||||
#define EYECATCH_FN "eye.cdg"
|
#define EYECATCH_FN "eye.cdg"
|
||||||
|
|
||||||
#define FACESET_PLAYCHAR_FORMAT "KaO0.cD2"
|
#define FACESET_PLAYCHAR_FORMAT "KaO0.cD2"
|
||||||
|
|
|
@ -3183,69 +3183,7 @@ DIALOG_TEXT segment byte public 'CODE' use16
|
||||||
@dialog_load$qv procdesc near
|
@dialog_load$qv procdesc near
|
||||||
@dialog_free$qv procdesc near
|
@dialog_free$qv procdesc near
|
||||||
@std_update_frames_then_animate_d$qv procdesc near
|
@std_update_frames_then_animate_d$qv procdesc near
|
||||||
@playfield_copy_front_to_back$qv procdesc near
|
extern @dialog_animate$qv:proc
|
||||||
@dialog_box_fade_in_animate$qv procdesc near
|
|
||||||
@dialog_run$qv procdesc near
|
|
||||||
|
|
||||||
; =============== S U B R O U T I N E =======================================
|
|
||||||
|
|
||||||
; Attributes: bp-based frame
|
|
||||||
public @dialog_animate$qv
|
|
||||||
@dialog_animate$qv proc far
|
|
||||||
push bp
|
|
||||||
mov bp, sp
|
|
||||||
les bx, _resident
|
|
||||||
cmp es:[bx+resident_t.demo_num], 0
|
|
||||||
jz short loc_F333
|
|
||||||
cmp byte_221EC, 0
|
|
||||||
jnz short loc_F318
|
|
||||||
call @main_pat_exalice_override_and_su$qv
|
|
||||||
call super_entry_bfnt pascal, ds, offset aSt06_bb1 ; "st06.bb1"
|
|
||||||
call super_entry_bfnt pascal, ds, offset aSt06_bb2 ; "st06.bb2"
|
|
||||||
call snd_load pascal, ds, offset aSt06b, SND_LOAD_SONG
|
|
||||||
kajacall KAJA_SONG_PLAY
|
|
||||||
push ds
|
|
||||||
push offset aDemo5_rec ; "DEMO5.REC"
|
|
||||||
call file_ropen
|
|
||||||
call file_read pascal, large [_DemoBuf], (DEMO_N * 4) * 2
|
|
||||||
call file_close
|
|
||||||
mov _stage_frame, 0
|
|
||||||
inc byte_221EC
|
|
||||||
pop bp
|
|
||||||
retf
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_F318:
|
|
||||||
push word ptr _DemoBuf+2
|
|
||||||
call hmem_free
|
|
||||||
push 8
|
|
||||||
call palette_black_out
|
|
||||||
push ds
|
|
||||||
push offset aOp_0 ; "op"
|
|
||||||
nopcall @GameExecl$qnxc
|
|
||||||
pop bp
|
|
||||||
retf
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_F333:
|
|
||||||
call cdg_free pascal, CDG_BG_PLAYCHAR_BOMB
|
|
||||||
call @overlay_wipe$qv
|
|
||||||
mov PaletteTone, 100
|
|
||||||
call far ptr palette_show
|
|
||||||
graph_accesspage _page_front
|
|
||||||
call @dialog_box_fade_in_animate$qv
|
|
||||||
call @playfield_copy_front_to_back$qv
|
|
||||||
call @dialog_run$qv
|
|
||||||
call @dialog_exit$qv
|
|
||||||
graph_accesspage _page_back
|
|
||||||
push 1
|
|
||||||
call frame_delay
|
|
||||||
pop bp
|
|
||||||
retf
|
|
||||||
@dialog_animate$qv endp
|
|
||||||
|
|
||||||
@dialog_exit$qv procdesc near
|
|
||||||
@main_pat_exalice_override_and_su$qv procdesc near
|
|
||||||
DIALOG_TEXT ends
|
DIALOG_TEXT ends
|
||||||
|
|
||||||
BOSS_EXP_TEXT segment byte public 'CODE' use16
|
BOSS_EXP_TEXT segment byte public 'CODE' use16
|
||||||
|
@ -19882,16 +19820,19 @@ include th04/main/frames[data].asm
|
||||||
public _dialog_fn
|
public _dialog_fn
|
||||||
_dialog_fn dd a_dm00_tx2
|
_dialog_fn dd a_dm00_tx2
|
||||||
include th04/main/dialog/dialog[data].asm
|
include th04/main/dialog/dialog[data].asm
|
||||||
byte_221EC db 0
|
public _dialog_sequence_id
|
||||||
|
_dialog_sequence_id db 0
|
||||||
a_dm00_tx2 db '_DM00.TX2',0
|
a_dm00_tx2 db '_DM00.TX2',0
|
||||||
public _dialog_kanji_buf
|
|
||||||
|
public _dialog_kanji_buf, _st06_bb1, _st06_bb2, _BGM_EXTRA_BOSS_FN
|
||||||
|
public _DEMO_EXTRA_PART_2_FN, _DIALOG_BINARY_OP
|
||||||
_dialog_kanji_buf db ' ',0
|
_dialog_kanji_buf db ' ',0
|
||||||
aSt06_bb1 db 'st06.bb1',0
|
_st06_bb1 db 'st06.bb1',0
|
||||||
aSt06_bb2 db 'st06.bb2',0
|
_st06_bb2 db 'st06.bb2',0
|
||||||
aSt06b db 'st06b',0
|
_BGM_EXTRA_BOSS_FN db 'st06b',0
|
||||||
aDemo5_rec db 'DEMO5.REC',0
|
_DEMO_EXTRA_PART_2_FN db 'DEMO5.REC',0
|
||||||
; char aOp_0[]
|
_DIALOG_BINARY_OP db 'op',0
|
||||||
aOp_0 db 'op',0
|
|
||||||
public _faceset_boss_format, _faceset_playchar_format
|
public _faceset_boss_format, _faceset_playchar_format
|
||||||
public _BOMB_BG_REIMU_FN, _BOMB_BG_MARISA_FN, _BOMB_BG_MIMA_FN
|
public _BOMB_BG_REIMU_FN, _BOMB_BG_MARISA_FN, _BOMB_BG_MIMA_FN
|
||||||
public _BOMB_BG_YUUKA_FN, _MIKO16_EXALICE_FN
|
public _BOMB_BG_YUUKA_FN, _MIKO16_EXALICE_FN
|
||||||
|
|
Loading…
Reference in New Issue