[Decompilation] [th03/th04/th05] Cutscenes: Script loading and freeing

Part of P0223, funded by Blue Bolt and rosenrose.
This commit is contained in:
nmlgc 2022-11-09 19:24:52 +01:00
parent 576f49129a
commit 023cdacc36
9 changed files with 87 additions and 159 deletions

View File

@ -103,7 +103,7 @@ bin\th03\main.exe: bin\th03\main.obj th03\main_010.cpp th03\main_011.cpp bin\th0
$**
|
bin\th03\mainl.exe: bin\th03\mainl.obj bin\th03\cfg_lres.obj bin\th03\scoredat.obj th03\regist.cpp bin\th01\vplanset.obj bin\th02\snd_mode.obj bin\th02\snd_pmdr.obj bin\th02\snd_dlyv.obj bin\th02\snd_load.obj bin\th03\vector2.obj bin\th03\exit.obj bin\th03\cdg_put.obj bin\th02\frmdely1.obj bin\th03\input_s.obj bin\th03\pi_put.obj bin\th03\pi_put_i.obj bin\th02\snd_se_r.obj bin\th03\snd_se.obj bin\th03\snd_kaja.obj bin\th03\initmain.obj bin\th03\cdg_load.obj th03\exitmain.cpp bin\th03\grppsafx.obj bin\th03\snd_dlym.obj bin\th03\inp_wait.obj bin\th03\pi_load.obj bin\th03\pi_put_q.obj bin\th03\inp_m_w.obj bin\th03\cdg_p_na.obj bin\th03\hfliplut.obj
bin\th03\mainl.exe: bin\th03\mainl.obj th03\cutscene.cpp bin\th03\cfg_lres.obj bin\th03\scoredat.obj th03\regist.cpp bin\th01\vplanset.obj bin\th02\snd_mode.obj bin\th02\snd_pmdr.obj bin\th02\snd_dlyv.obj bin\th02\snd_load.obj bin\th03\vector2.obj bin\th03\exit.obj bin\th03\cdg_put.obj bin\th02\frmdely1.obj bin\th03\input_s.obj bin\th03\pi_put.obj bin\th03\pi_put_i.obj bin\th02\snd_se_r.obj bin\th03\snd_se.obj bin\th03\snd_kaja.obj bin\th03\initmain.obj bin\th03\cdg_load.obj th03\exitmain.cpp bin\th03\grppsafx.obj bin\th03\snd_dlym.obj bin\th03\inp_wait.obj bin\th03\pi_load.obj bin\th03\pi_put_q.obj bin\th03\inp_m_w.obj bin\th03\cdg_p_na.obj bin\th03\hfliplut.obj
$(CC) $(CFLAGS) $(LARGE_LFLAGS) -3 -Z -DGAME=3 -DBINARY='L' -nbin\th03\ -eMAINL.EXE @&&|
$**
|
@ -131,8 +131,8 @@ bin\th04\main.exe: bin\th04\main.obj bin\th04\slowdown.obj th04\demo.cpp th04\em
$**
|
bin\th04\maine.exe: bin\th04\maine.obj bin\th04\cfg_lres.obj th04\maine011.cpp bin\th01\vplanset.obj bin\th02\frmdely1.obj bin\th03\pi_put.obj bin\th04\cdg_put.obj bin\th04\exit.obj bin\th04\initmain.obj bin\th04\input_s.obj bin\th04\snd_se_r.obj bin\th04\snd_se.obj bin\th04\bgimage.obj bin\th04\bgimager.obj bin\th03\pi_load.obj bin\th03\pi_put_q.obj bin\th04\cdg_load.obj bin\th03\hfliplut.obj bin\th04\input_w.obj 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_dlym.obj bin\th04\cdg_p_pl.obj bin\th04\snd_load.obj
$(CC) $(CFLAGS) $(LARGE_LFLAGS) -DGAME=4 -DBINARY='E' -Z -nbin\th04\ -eMAINE.EXE @&&|
bin\th04\maine.exe: bin\th04\maine.obj bin\th04\cfg_lres.obj th04\cutscene.cpp th04\maine011.cpp bin\th01\vplanset.obj bin\th02\frmdely1.obj bin\th03\pi_put.obj bin\th04\cdg_put.obj bin\th04\exit.obj bin\th04\initmain.obj bin\th04\input_s.obj bin\th04\snd_se_r.obj bin\th04\snd_se.obj bin\th04\bgimage.obj bin\th04\bgimager.obj bin\th03\pi_load.obj bin\th03\pi_put_q.obj bin\th04\cdg_load.obj bin\th03\hfliplut.obj bin\th04\input_w.obj 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_dlym.obj bin\th04\cdg_p_pl.obj bin\th04\snd_load.obj
$(CC) $(CFLAGS) $(LARGE_LFLAGS) -DGAME=4 -DBINARY='E' -3 -Z -nbin\th04\ -eMAINE.EXE @&&|
$**
|
@ -154,7 +154,7 @@ bin\th05\main.exe: bin\th05\main.obj bin\th04\slowdown.obj th05\demo.cpp th05\em
$**
|
bin\th05\maine.exe: bin\th05\maine.obj bin\th04\cfg_lres.obj th05\maine011.cpp th05\regist.cpp th05\staff.cpp bin\th04\cdg_p_na.obj bin\th04\snd_se_r.obj bin\th04\snd_se.obj bin\th04\bgimage.obj bin\th04\exit.obj bin\th05\vector.obj bin\th05\bgimager.obj bin\th05\snd_load.obj bin\th05\snd_kaja.obj bin\th05\pi_cpp_1.obj bin\th05\pi_asm_1.obj bin\th05\pi_cpp_2.obj bin\th05\pi_asm_2.obj bin\th05\initmain.obj bin\th05\input_s.obj bin\th05\inp_h_w.obj bin\th05\snd_dlym.obj bin\th05\frmdelay.obj bin\th04\cdg_load.obj bin\th05\egcrect.obj bin\th03\hfliplut.obj bin\th04\snd_pmdr.obj bin\th04\snd_mmdr.obj bin\th04\snd_mode.obj
bin\th05\maine.exe: bin\th05\maine.obj th05\cutscene.cpp bin\th04\cfg_lres.obj th05\maine011.cpp th05\regist.cpp th05\staff.cpp bin\th04\cdg_p_na.obj bin\th04\snd_se_r.obj bin\th04\snd_se.obj bin\th04\bgimage.obj bin\th04\exit.obj bin\th05\vector.obj bin\th05\bgimager.obj bin\th05\snd_load.obj bin\th05\snd_kaja.obj bin\th05\pi_cpp_1.obj bin\th05\pi_asm_1.obj bin\th05\pi_cpp_2.obj bin\th05\pi_asm_2.obj bin\th05\initmain.obj bin\th05\input_s.obj bin\th05\inp_h_w.obj bin\th05\snd_dlym.obj bin\th05\frmdelay.obj bin\th04\cdg_load.obj bin\th05\egcrect.obj bin\th03\hfliplut.obj bin\th04\snd_pmdr.obj bin\th04\snd_mmdr.obj bin\th04\snd_mode.obj
$(CC) $(CFLAGS) $(LARGE_LFLAGS) -DGAME=5 -DBINARY='E' -3 -Z -nbin\th05\ -eMAINE.EXE @&&|
$**
|

1
th03/cutscene.cpp Normal file
View File

@ -0,0 +1 @@
#include "th03/cutscene/cutscene.cpp"

View File

@ -4,11 +4,16 @@
// 1) TH03 and TH04 allocate dedicated memory for backing up the text box area
// in VRAM ([box_bg]), TH05 uses the bgimage system instead.
#include <stddef.h>
#include "platform.h"
#include "pc98.h"
#include "planar.h"
#include "shiftjis.hpp"
#include "master.hpp"
extern "C" {
#include "th02/hardware/frmdelay.h"
}
#include "th03/cutscene/cutscene.hpp"
// State
// -----
@ -46,3 +51,35 @@ extern int script_number_param_default;
void near box_1_to_0_animate(void);
#endif
// -----------------------
bool16 pascal near cutscene_script_load(const char* fn)
{
cutscene_script_free();
if(!file_ropen(fn)) {
return true;
}
size_t size = file_size();
#if (GAME >= 4)
// PORTERS: Required for TH03 on flat memory models as well.
// ZUN bug: Missing an error check if [size] >= sizeof(script);
script_p = static_cast<unsigned char near *>(script);
#else
script = reinterpret_cast<unsigned char far *>(hmem_allocbyte(size));
#endif
file_read(script_p, size);
file_close();
return false;
}
#if (GAME <= 4)
void near cutscene_script_free(void)
{
#if (GAME == 3)
if(script) {
HMem<unsigned char>::free(script);
script = nullptr;
}
#endif
}
#endif

View File

@ -37,6 +37,20 @@ extern screen_point_t cursor;
extern int text_interval;
// Loads the cutscene script from the given file, returning `false` on success.
// TH03 frees the previously loaded script and allocates a new one with [fn]'s
// file size before loading it from the file.
bool16 pascal near cutscene_script_load(const char *fn);
// Frees the cutscene script. No-op in TH04 and TH05, where it's statically
// allocated.
#if (GAME == 5)
inline void cutscene_script_free() {
}
#else
void near cutscene_script_free();
#endif
// ZUN quirk: The cutscene system features both
// 1) a top-level input sensing mechanism (for updating the fast-forward flag),
// and

View File

@ -27,7 +27,7 @@ include th03/formats/scoredat.inc
extern _execl:proc
extern _tolower:proc
group_01 group CFG_LRES_TEXT, mainl_01_TEXT, SCOREDAT_TEXT, REGIST_TEXT, mainl_03_TEXT
group_01 group CFG_LRES_TEXT, CUTSCENE_TEXT, mainl_01_TEXT, SCOREDAT_TEXT, REGIST_TEXT, mainl_03_TEXT
; ===========================================================================
@ -135,7 +135,7 @@ CFG_LRES_TEXT segment byte public 'CODE' use16
CFG_LRES_TEXT ends
; Segment type: Pure code
mainl_01_TEXT segment byte public 'CODE' use16
CUTSCENE_TEXT segment byte public 'CODE' use16
assume cs:group_01
;org 3
assume es:nothing, ss:nothing, ds:_DATA, fs:nothing, gs:nothing
@ -998,10 +998,9 @@ loc_9EF1:
graph_showpage al
call graph_clear
call graph_show
pushd [off_E4B6]
call sub_A12E
call @cutscene_script_load$qnxc pascal, [off_E4B6]
call sub_AC6E
call sub_A174
call @cutscene_script_free$qv
call sub_990C
call sub_9A2C
call gaiji_restore
@ -1197,66 +1196,12 @@ loc_A12A:
retn
sub_9F8D endp
@CUTSCENE_SCRIPT_LOAD$QNXC procdesc pascal near \
fn:dword
@cutscene_script_free$qv procdesc near
CUTSCENE_TEXT ends
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
sub_A12E proc near
arg_0 = dword ptr 4
push bp
mov bp, sp
push si
call sub_A174
pushd [bp+arg_0]
call file_ropen
or ax, ax
jnz short loc_A147
mov ax, 1
jmp short loc_A16F
; ---------------------------------------------------------------------------
loc_A147:
call file_size
mov si, ax
push ax
call hmem_allocbyte
mov word ptr _script+2, ax
mov word ptr _script, 0
push ax
push word ptr _script
push si
call file_read
call file_close
xor ax, ax
loc_A16F:
pop si
pop bp
retn 4
sub_A12E endp
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
sub_A174 proc near
push bp
mov bp, sp
cmp _script, 0
jz short loc_A191
push word ptr _script+2
call hmem_free
mov _script, 0
loc_A191:
pop bp
retn
sub_A174 endp
mainl_01_TEXT segment byte public 'CODE' use16
EGC_START_COPY_DEF 1, near
; =============== S U B R O U T I N E =======================================
@ -2878,10 +2823,9 @@ loc_B9DD:
graph_showpage al
call graph_clear
call graph_show
pushd [off_EE4E]
call sub_A12E
call @cutscene_script_load$qnxc pascal, [off_EE4E]
call sub_AC6E
call sub_A174
call @cutscene_script_free$qv
call sub_C40D
les bx, _resident
mov es:[bx+resident_t.story_stage], STAGE_ALL
@ -2898,9 +2842,9 @@ loc_B9DD:
graph_showpage 0
push ds
push offset a@99ed_txt ; "@99ED.TXT"
call sub_A12E
call @cutscene_script_load$qnxc
call sub_AC6E
call sub_A174
call @cutscene_script_free$qv
loc_BA66:
call text_clear

1
th04/cutscene.cpp Normal file
View File

@ -0,0 +1 @@
#include "th03/cutscene/cutscene.cpp"

View File

@ -26,7 +26,7 @@ include th04/hardware/grppsafx.inc
extern _tolower:proc
extern __ctype:byte
maine_01 group CFG_LRES_TEXT, maine_01_TEXT, maine_01__TEXT
maine_01 group CFG_LRES_TEXT, CUTSCENE_TEXT, maine_01_TEXT, maine_01__TEXT
g_SHARED group SHARED, SHARED_
; ===========================================================================
@ -152,7 +152,7 @@ CFG_LRES_TEXT segment byte public 'CODE' use16
CFG_LRES_TEXT ends
; Segment type: Pure code
maine_01_TEXT segment byte public 'CODE' use16
CUTSCENE_TEXT segment byte public 'CODE' use16
assume cs:maine_01
;org 9
assume es:nothing, ss:nothing, ds:_DATA, fs:nothing, gs:nothing
@ -205,9 +205,9 @@ sub_A0BD proc near
mov es:[bx+5], al
push word ptr off_E5C0+2
push bx
call sub_A292
call @cutscene_script_load$qnxc
call sub_ADFC
call sub_A2D1
call @cutscene_script_free$qv
pop bp
retn
sub_A0BD endp
@ -333,53 +333,12 @@ locret_A290:
retf
_main endp
@CUTSCENE_SCRIPT_LOAD$QNXC procdesc pascal near \
fn:dword
@cutscene_script_free$qv procdesc near
CUTSCENE_TEXT ends
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
sub_A292 proc near
var_2 = word ptr -2
arg_0 = dword ptr 4
enter 2, 0
call sub_A2D1
pushd [bp+arg_0]
call file_ropen
or ax, ax
jnz short loc_A2AD
mov ax, 1
leave
retn 4
; ---------------------------------------------------------------------------
loc_A2AD:
call file_size
mov [bp+var_2], ax
mov _script_p, offset _script
push ds
push _script_p
push ax
call file_read
call file_close
xor ax, ax
leave
retn 4
sub_A292 endp
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
sub_A2D1 proc near
push bp
mov bp, sp
pop bp
retn
sub_A2D1 endp
maine_01_TEXT segment byte public 'CODE' use16
EGC_START_COPY_DEF 1, near
; =============== S U B R O U T I N E =======================================

1
th05/cutscene.cpp Normal file
View File

@ -0,0 +1 @@
#include "th03/cutscene/cutscene.cpp"

View File

@ -27,7 +27,7 @@ include th04/hardware/grppsafx.inc
extern _tolower:proc
extern __ctype:byte
maine_01 group CFG_LRES_TEXT, maine_01_TEXT, maine_01__TEXT, maine_01___TEXT
maine_01 group CFG_LRES_TEXT, CUTSCENE_TEXT, maine_01_TEXT, maine_01__TEXT, maine_01___TEXT
g_SHARED group SHARED, SHARED_
; ===========================================================================
@ -159,7 +159,7 @@ CFG_LRES_TEXT segment byte public 'CODE' use16
CFG_LRES_TEXT ends
; Segment type: Pure code
maine_01_TEXT segment byte public 'CODE' use16
CUTSCENE_TEXT segment byte public 'CODE' use16
assume cs:maine_01
;org 5
assume es:nothing, ss:nothing, ds:_DATA, fs:nothing, gs:nothing
@ -225,7 +225,7 @@ loc_A5DC:
mov es:[bx+4], al
push word ptr off_10190+2
push bx
call sub_A695
call @cutscene_script_load$qnxc
call sub_AFD6
pop bp
retn
@ -301,40 +301,11 @@ loc_A693:
retf
_main endp
@CUTSCENE_SCRIPT_LOAD$QNXC procdesc pascal near \
fn:dword
CUTSCENE_TEXT ends
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
sub_A695 proc near
var_2 = word ptr -2
arg_0 = dword ptr 4
enter 2, 0
pushd [bp+arg_0]
call file_ropen
or ax, ax
jnz short loc_A6AD
mov ax, 1
leave
retn 4
; ---------------------------------------------------------------------------
loc_A6AD:
call file_size
mov [bp+var_2], ax
mov _script_p, offset _script
push ds
push _script_p
push ax
call file_read
call file_close
xor ax, ax
leave
retn 4
sub_A695 endp
maine_01_TEXT segment byte public 'CODE' use16
EGC_START_COPY_DEF 1, near
; =============== S U B R O U T I N E =======================================