Match the original engine's patchEC behavior

The patchEC flag is default off, and EC 0 goes through the same
width/height adjustment as EC with a registered rectangle.
This commit is contained in:
kichikuou
2026-09-05 12:23:09 +09:00
parent dd45e566f6
commit 5ce1494b59
10 changed files with 102 additions and 16 deletions
+3 -3
View File
@@ -562,7 +562,7 @@ void commands2F52() {
void commands2F53() {
int eFlag = getCaliValue();
nact->patch_ec = eFlag;
nact->patch_ec = (eFlag == 1);
TRACE("patchEC %d:", eFlag);
}
@@ -936,7 +936,7 @@ void commands2F6F() {
void commands2F70() {
int eFlag = getCaliValue();
nact->patch_emen = eFlag;
nact->patch_emen = (eFlag == 1);
TRACE("patchEMEN %d:", eFlag);
}
@@ -1152,7 +1152,7 @@ void commands2F85() {
void commands2F86() {
int eFlag = getCaliValue();
nact->patch_g0 = eFlag;
nact->patch_g0 = (eFlag == 1);
TRACE("patchG0 %d:", eFlag);
}
+5 -5
View File
@@ -55,13 +55,13 @@ void commandEC() {
int num = getCaliValue();
Ecomtbl *e;
SDL_Rect *r;
int adj = nact->patch_ec ? 0 : -1;
if (num == 0) {
r = &nact->ags.view_area;
ags_fillRectangle(r->x, r->y, r->w, r->h, 0);
ags_updateArea(r->x, r->y, r->w, r->h);
ags_fillRectangle(r->x, r->y, r->w + adj, r->h + adj, 0);
ags_updateArea(r->x, r->y, r->w + adj, r->h + adj);
} else {
int adj = (nact->patch_ec == 0) ? -1 : 0;
e = &tbl[num - 1];
ags_fillRectangle(e->r.x, e->r.y, e->r.w + adj, e->r.h + adj, e->pal);
ags_updateArea(e->r.x, e->r.y, e->r.w + adj, e->r.h + adj);
@@ -92,7 +92,7 @@ void commandEM() {
SDL_Point p = {x, y};
SDL_Rect r = tbl[num - 1].r;
if (nact->patch_emen == 0) {
if (!nact->patch_emen) {
r.w -= 1;
r.h -= 1;
}
@@ -112,7 +112,7 @@ void commandEN() {
for (int i = min; i <= max; i++) {
SDL_Rect r = tbl[i - 1].r;
if (nact->patch_emen == 0) {
if (!nact->patch_emen) {
r.w -= 1;
r.h -= 1;
}
+1 -1
View File
@@ -146,7 +146,7 @@ void commandY() {
}
break;
case 1900:
nact->patch_ec = p2;
nact->patch_ec = (p2 == 1);
// We're sure this game was built for System3.9 v5.50, which by default
// routes CD-DA commands to DRIFILE_WAVE.
muscd_init_bgm(DRIFILE_WAVE, 999);
+3 -3
View File
@@ -167,9 +167,9 @@ void nact_init() {
sel_init();
nact->patch_ec = 1; // TODO: revisit
nact->patch_emen = 0;
nact->patch_g0 = 0;
nact->patch_ec = false;
nact->patch_emen = false;
nact->patch_g0 = false;
msg_msgHankakuMode = 0;
}
+4 -4
View File
@@ -97,10 +97,10 @@ typedef struct {
/* 選択肢関連 */
sel_t sel;
/* patch 関連 */
int patch_ec; /* see patch_ec command */
int patch_emen; /* see patch_emen command */
int patch_g0; /* see patch g0 command */
/* patch flags */
bool patch_ec;
bool patch_emen;
bool patch_g0;
/* ain 関連 */
S39AIN ain;
+46
View File
@@ -0,0 +1,46 @@
MS FILE,"patchec.adv":
; --- EC with a registered rectangle ---
; patchEC defaults to off, so EC clears a region 1px narrower and
; shorter than the rectangle registered by ES.
CF 100,100,40,30,7:
ES 1,3,100,100,40,30:
EC 1:
PT0 RND,120,115: ~AssertEquals RND,3,__LINE__:
PT0 RND,138,128: ~AssertEquals RND,3,__LINE__:
PT0 RND,139,115: ~AssertEquals RND,7,__LINE__:
PT0 RND,120,129: ~AssertEquals RND,7,__LINE__:
; patchEC 1 disables the adjustment, so EC clears the whole rectangle.
CF 100,100,40,30,7:
patchEC 1:
EC 1:
PT0 RND,139,115: ~AssertEquals RND,3,__LINE__:
PT0 RND,120,129: ~AssertEquals RND,3,__LINE__:
; Only eFlag == 1 turns the patch on; any other value restores the bug.
CF 100,100,40,30,7:
patchEC 2:
EC 1:
PT0 RND,139,115: ~AssertEquals RND,7,__LINE__:
patchEC 0:
; --- EC 0 clears the current view area, now with the same adjustment ---
ZZ5 D18:
WV 100,100,50,40:
CF 100,100,50,40,7:
EC 0:
PT0 RND,120,120: ~AssertEquals RND,0,__LINE__:
PT0 RND,148,138: ~AssertEquals RND,0,__LINE__:
PT0 RND,149,120: ~AssertEquals RND,7,__LINE__:
PT0 RND,120,139: ~AssertEquals RND,7,__LINE__:
CF 100,100,50,40,7:
patchEC 1:
EC 0:
PT0 RND,149,120: ~AssertEquals RND,0,__LINE__:
PT0 RND,120,139: ~AssertEquals RND,0,__LINE__:
patchEC 0:
WV 0,0,D18,D19:
%0:
+36
View File
@@ -0,0 +1,36 @@
MS FILE,"patchemen.adv":
ES 1,0,10,10,20,20:
ES 2,0,20,20,20,20:
; --- EM: point-in-rectangle test ---
; patchEMEN defaults to off, so the rectangle is treated as 1px
; narrower and shorter than registered by ES.
EM 1,RND,10,10: ~AssertEquals RND,1,__LINE__:
EM 1,RND,28,28: ~AssertEquals RND,1,__LINE__:
EM 1,RND,29,20: ~AssertEquals RND,0,__LINE__:
EM 1,RND,20,29: ~AssertEquals RND,0,__LINE__:
EM 1,RND,9,10: ~AssertEquals RND,0,__LINE__:
; patchEMEN 1 disables the adjustment.
patchEMEN 1:
EM 1,RND,29,29: ~AssertEquals RND,1,__LINE__:
EM 1,RND,30,20: ~AssertEquals RND,0,__LINE__:
; Only eFlag == 1 turns the patch on; any other value restores the bug.
patchEMEN 2:
EM 1,RND,29,29: ~AssertEquals RND,0,__LINE__:
patchEMEN 0:
; --- EN: number of the rectangle containing the point ---
EN RND,1,2,15,15: ~AssertEquals RND,1,__LINE__:
EN RND,1,2,25,25: ~AssertEquals RND,2,__LINE__:
EN RND,1,2,5,5: ~AssertEquals RND,0,__LINE__:
; The patch flag also applies to EN's edge handling.
EN RND,1,1,29,29: ~AssertEquals RND,0,__LINE__:
patchEMEN 1:
EN RND,1,1,29,29: ~AssertEquals RND,1,__LINE__:
patchEMEN 0:
%0:
+2
View File
@@ -16,6 +16,8 @@
%#math.adv:
%#variable.adv:
%#unitmap.adv:
%#patchec.adv:
%#patchemen.adv:
HH0,tests_passed: ' tests passed' R
HH0,tests_failed: ' tests failed' R
+2
View File
@@ -8,6 +8,8 @@ stack.adv
math.adv
variable.adv
unitmap.adv
patchec.adv
patchemen.adv
#DLLHeader
ShString.HEL
BIN
View File
Binary file not shown.