[Decompilation] [th02] Dialog: Displaying full boxes of text

Part of P0260, funded by Yanga.
This commit is contained in:
nmlgc 2023-10-26 16:44:31 +02:00
parent d38f2a675d
commit c6812766b6
2 changed files with 91 additions and 139 deletions

View File

@ -8,6 +8,7 @@
#include "platform/array.hpp"
extern "C" {
#include "th02/hardware/frmdelay.h"
#include "th02/hardware/input.hpp"
}
#include "th02/hardware/pages.hpp"
#include "th02/formats/dialog.hpp"
@ -332,3 +333,62 @@ void pascal near dialog_text_put(
text_putsa(TEXT_TRAM_LEFT, (TEXT_TRAM_TOP + line), buf.data(), atrb);
}
inline void near dialog_box_wipe(void) {
extern const char near* LINE_BLANK;
static_assert(DIALOG_BOX_LINES == 2);
text_putsa(TEXT_TRAM_LEFT, (TEXT_TRAM_TOP + 0), LINE_BLANK, TX_WHITE);
text_putsa(TEXT_TRAM_LEFT, (TEXT_TRAM_TOP + 1), LINE_BLANK, TX_WHITE);
}
// Shows a single dialog box in a blocking way, then advances [box_cur].
void pascal near dialog_box_animate_and_advance(
int face_topleft_id // ACTUAL TYPE: face_topleft_id_t
)
{
dialog_box_wipe();
// ZUN quirk: Assumes that the box starts with a 6-byte character name and
// colon, and prints that all at once in the first frame. This assumption
// breaks with "魔梨沙:" in Stage 3, which is 8 bytes.
shiftjis_ank_amount_t box_cursor = 6;
int loop_count = 0;
int delay_per_kanji;
int box = dialog_box_cur;
while(box_cursor <= ((DIALOG_BOX_LINES * DIALOG_LINE_LENGTH) + 8)) {
input_sense();
dialog_face_put(face_topleft_id); // ZUN bloat: Every frame?
static_assert(DIALOG_BOX_LINES == 2);
if(box_cursor <= (DIALOG_LINE_LENGTH * 1)) {
dialog_text_put(
0,
dialog_text[box][0],
TX_WHITE,
(box_cursor - (DIALOG_LINE_LENGTH * 0))
);
} else if(box_cursor <= (DIALOG_LINE_LENGTH * 2)) {
dialog_text_put(
1,
dialog_text[box][1],
TX_WHITE,
(box_cursor - (DIALOG_LINE_LENGTH * 1))
);
}
loop_count++;
if(key_det) {
delay_per_kanji = 1;
} else {
delay_per_kanji = 3;
frame_delay(1);
}
if((loop_count % delay_per_kanji) == 0) {
box_cursor += static_cast<int>(sizeof(shiftjis_kanji_t));
}
}
key_delay();
dialog_box_cur++;
}

View File

@ -12392,101 +12392,12 @@ sub_12B9E endp
extern @dialog_load_and_init$qv:proc
@dialog_pre$qv procdesc near
@dialog_post$qv procdesc near
@DIALOG_FACE_PUT$QI procdesc pascal near \
topleft_id:word
@DIALOG_TEXT_PUT$QINXUCUII procdesc pascal near \
line:word, str:dword, atrb:word, n:word
@DIALOG_BOX_ANIMATE_AND_ADVANCE$QI procdesc pascal near \
face_topleft_id:word
DIALOG_TEXT ends
main_03__TEXT segment byte public 'CODE' use16
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
sub_13055 proc near
@@box = word ptr -4
var_2 = word ptr -2
@@topleft_id = word ptr 4
enter 4, 0
push si
push di
call text_putsa pascal, (14 shl 16) + 21, ds, word_1EB96, TX_WHITE
call text_putsa pascal, (14 shl 16) + 22, ds, word_1EB96, TX_WHITE
mov si, 6
xor di, di
mov al, _dialog_box_cur
mov ah, 0
mov [bp+@@box], ax
jmp short loc_130F7
; ---------------------------------------------------------------------------
loc_13090:
call _input_sense
call @dialog_face_put$qi pascal, [bp+@@topleft_id]
cmp si, 24h ; '$'
jg short loc_130B3
push 0 ; line
push ds ; str (segment)
mov ax, [bp+@@box]
imul ax, (DIALOG_BOX_LINES * DIALOG_LINE_SIZE)
add ax, offset (_dialog_text + (0 * DIALOG_LINE_SIZE))
push ax ; str (offset)
push TX_WHITE ; atrb
push si ; n
jmp short loc_130CC
; ---------------------------------------------------------------------------
loc_130B3:
cmp si, 48h ; 'H'
jg short loc_130CF
push 1 ; line
push ds ; str (segment)
mov ax, [bp+@@box]
imul ax, (DIALOG_BOX_LINES * DIALOG_LINE_SIZE)
add ax, offset (_dialog_text + (1 * DIALOG_LINE_SIZE))
push ax ; str (offset)
push TX_WHITE ; atrb
lea ax, [si-36] ; n
push ax
loc_130CC:
call @dialog_text_put$qinxucuii
loc_130CF:
inc di
cmp _key_det, 0
jz short loc_130DE
mov [bp+var_2], 1
jmp short loc_130EA
; ---------------------------------------------------------------------------
loc_130DE:
mov [bp+var_2], 3
call frame_delay pascal, 1
loc_130EA:
mov ax, di
cwd
idiv [bp+var_2]
or dx, dx
jnz short loc_130F7
add si, 2
loc_130F7:
cmp si, 50h ; 'P'
jle short loc_13090
call _key_delay
inc _dialog_box_cur
pop di
pop si
leave
retn 2
sub_13055 endp
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
@ -12514,7 +12425,7 @@ loc_13123:
imul bx, 16h
mov al, [bx+si+115Ch]
mov ah, 0
call sub_13055 pascal, ax
call @dialog_box_animate_and_advance$qi pascal, ax
inc si
loc_13134:
@ -12540,8 +12451,8 @@ sub_1310B endp
sub_1314C proc near
push bp
mov bp, sp
call sub_13055 pascal, 0
call sub_13055 pascal, 96
call @dialog_box_animate_and_advance$qi pascal, FACE_REIMU_NEUTRAL
call @dialog_box_animate_and_advance$qi pascal, FACE_GENJII
pop bp
retn
sub_1314C endp
@ -12571,7 +12482,7 @@ var_8 = byte ptr -8
loc_13175:
mov al, [bp+si+var_8]
mov ah, 0
call sub_13055 pascal, ax
call @dialog_box_animate_and_advance$qi pascal, ax
inc si
loc_1317F:
@ -12607,14 +12518,14 @@ var_C = byte ptr -0Ch
loc_131A1:
mov al, [bp+si+var_C]
mov ah, 0
call sub_13055 pascal, ax
call @dialog_box_animate_and_advance$qi pascal, ax
inc si
loc_131AB:
cmp si, 0Bh
jl short loc_131A1
call text_putsa pascal, (14 shl 16) + 21, ds, word_1EB96, TX_WHITE
call text_putsa pascal, (14 shl 16) + 22, ds, word_1EB96, TX_WHITE
call text_putsa pascal, (14 shl 16) + 21, ds, _LINE_BLANK, TX_WHITE
call text_putsa pascal, (14 shl 16) + 22, ds, _LINE_BLANK, TX_WHITE
pop si
leave
retn
@ -12676,7 +12587,7 @@ loc_13238:
add bx, bx
lea ax, [bp+var_6]
add bx, ax
call sub_13055 pascal, word ptr ss:[bx]
call @dialog_box_animate_and_advance$qi pascal, word ptr ss:[bx]
inc si
loc_13248:
@ -12751,7 +12662,7 @@ loc_132ED:
add bx, bx
lea ax, [bp+var_10]
add bx, ax
call sub_13055 pascal, word ptr ss:[bx]
call @dialog_box_animate_and_advance$qi pascal, word ptr ss:[bx]
inc si
loc_132FD:
@ -12773,7 +12684,7 @@ loc_13310:
add bx, bx
lea ax, [bp+var_1A]
add bx, ax
call sub_13055 pascal, word ptr ss:[bx]
call @dialog_box_animate_and_advance$qi pascal, word ptr ss:[bx]
inc si
loc_13320:
@ -12794,8 +12705,8 @@ sub_131D9 endp
sub_13328 proc near
push bp
mov bp, sp
call sub_13055 pascal, 6
call sub_13055 pascal, 105
call @dialog_box_animate_and_advance$qi pascal, FACE_REIMU_ANGRY
call @dialog_box_animate_and_advance$qi pascal, FACE_MIMA_SMILE
pop bp
retn
sub_13328 endp
@ -12826,8 +12737,8 @@ var_16 = byte ptr -16h
push offset unk_1ED2C
mov cx, 11h
call SCOPY@
call sub_13055 pascal, 6
call sub_13055 pascal, 105
call @dialog_box_animate_and_advance$qi pascal, FACE_REIMU_ANGRY
call @dialog_box_animate_and_advance$qi pascal, FACE_MIMA_SMILE
les bx, _resident
cmp es:[bx+mikoconfig_t.continues_used], 0
jz short loc_13390
@ -12838,7 +12749,7 @@ var_16 = byte ptr -16h
loc_13377:
mov al, [bp+si+var_16]
mov ah, 0
call sub_13055 pascal, ax
call @dialog_box_animate_and_advance$qi pascal, ax
inc si
loc_13381:
@ -12861,7 +12772,7 @@ loc_13390:
loc_1339C:
mov al, [bp+si+var_28]
mov ah, 0
call sub_13055 pascal, ax
call @dialog_box_animate_and_advance$qi pascal, ax
inc si
loc_133A6:
@ -12882,7 +12793,7 @@ sub_13337 endp
sub_133AE proc near
push bp
mov bp, sp
call sub_13055 pascal, 105
call @dialog_box_animate_and_advance$qi pascal, FACE_MIMA_SMILE
pop bp
retn
sub_133AE endp
@ -12918,7 +12829,7 @@ var_6 = byte ptr -6
loc_133E5:
mov al, [bp+si+var_6]
mov ah, 0
call sub_13055 pascal, ax
call @dialog_box_animate_and_advance$qi pascal, ax
inc si
loc_133EF:
@ -12938,7 +12849,7 @@ loc_133F6:
loc_13402:
mov al, byte ptr [bp+si+var_A]
mov ah, 0
call sub_13055 pascal, ax
call @dialog_box_animate_and_advance$qi pascal, ax
inc si
loc_1340C:
@ -12982,16 +12893,16 @@ sub_13439 proc near
nopcall @overlay_wipe$qv
kajacall KAJA_SONG_STOP
pop cx
call sub_13055 pascal, 105
call @dialog_box_animate_and_advance$qi pascal, FACE_MIMA_SMILE
call sub_13414
call frame_delay pascal, 10
call sub_13055 pascal, 105
call @dialog_box_animate_and_advance$qi pascal, FACE_MIMA_SMILE
call frame_delay pascal, 30
call sub_13414
call frame_delay pascal, 20
call sub_13055 pascal, 105
call @dialog_box_animate_and_advance$qi pascal, FACE_MIMA_SMILE
call frame_delay pascal, 20
call sub_13055 pascal, 105
call @dialog_box_animate_and_advance$qi pascal, FACE_MIMA_SMILE
call sub_13414
call frame_delay pascal, 20
call sub_13414
@ -13011,9 +12922,9 @@ sub_13439 endp
sub_134A0 proc near
push bp
mov bp, sp
call sub_13055 pascal, 255
call sub_13055 pascal, 0
call sub_13055 pascal, 255
call @dialog_box_animate_and_advance$qi pascal, FACE_COL_0
call @dialog_box_animate_and_advance$qi pascal, FACE_REIMU_NEUTRAL
call @dialog_box_animate_and_advance$qi pascal, FACE_COL_0
pop bp
retn
sub_134A0 endp
@ -30579,8 +30490,8 @@ byte_1EB88 db 1
db 0
aStage_dt1 db 'STAGE .DT1',0
db 0
word_1EB96 dw 12D6h
public _clear_bytes
public _LINE_BLANK, _clear_bytes
_LINE_BLANK dw aLINE_BLANK
_clear_bytes db DIALOG_LINE_SIZE dup(0)
db 10h
db 8
@ -30969,26 +30880,7 @@ unk_1ED3D db 69h ; i
db 69h ; i
db 39h ; 9
dword_1ED42 dd 0C6C066Ch
db 81h
db 40h
db 81h
db 40h
db 81h
db 40h
db 81h
db 40h
db 81h
db 40h
db 81h
db 40h
db 81h
db 40h
db 81h
db 40h
db 81h
db 40h
dw 4081h
aB@b@b@b@b@b@b@ db '<27>@<40>@<40>@<40>@<40>@<40>@<40>@<40>@',0
aLINE_BLANK db '                  ', 0
public _dialog_fn
_dialog_fn db 'stage .txt',0
aVo db 'O',0