From 5ce1494b59676e25572c7abccd6c5edc2fdd5b8a Mon Sep 17 00:00:00 2001 From: kichikuou Date: Fri, 4 Sep 2026 13:35:54 +0900 Subject: [PATCH] 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. --- src/cmd2F.c | 6 +++--- src/cmde.c | 10 +++++----- src/cmdy.c | 2 +- src/nact.c | 6 +++--- src/nact.h | 8 ++++---- test/patchec.adv | 46 +++++++++++++++++++++++++++++++++++++++++++++ test/patchemen.adv | 36 +++++++++++++++++++++++++++++++++++ test/test.adv | 2 ++ test/test.hed | 2 ++ test/testSA.ALD | Bin 9232 -> 10768 bytes 10 files changed, 102 insertions(+), 16 deletions(-) create mode 100644 test/patchec.adv create mode 100644 test/patchemen.adv diff --git a/src/cmd2F.c b/src/cmd2F.c index 735b8ab..3271ba4 100644 --- a/src/cmd2F.c +++ b/src/cmd2F.c @@ -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); } diff --git a/src/cmde.c b/src/cmde.c index b119e76..9d2f6f2 100644 --- a/src/cmde.c +++ b/src/cmde.c @@ -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; } diff --git a/src/cmdy.c b/src/cmdy.c index 048470d..aa6aab5 100644 --- a/src/cmdy.c +++ b/src/cmdy.c @@ -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); diff --git a/src/nact.c b/src/nact.c index 98eb281..9be7a1d 100644 --- a/src/nact.c +++ b/src/nact.c @@ -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; } diff --git a/src/nact.h b/src/nact.h index 18f932d..4736fd0 100644 --- a/src/nact.h +++ b/src/nact.h @@ -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; diff --git a/test/patchec.adv b/test/patchec.adv new file mode 100644 index 0000000..2ee3107 --- /dev/null +++ b/test/patchec.adv @@ -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: diff --git a/test/patchemen.adv b/test/patchemen.adv new file mode 100644 index 0000000..78640b9 --- /dev/null +++ b/test/patchemen.adv @@ -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: diff --git a/test/test.adv b/test/test.adv index e428312..b88332b 100644 --- a/test/test.adv +++ b/test/test.adv @@ -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 diff --git a/test/test.hed b/test/test.hed index 3ac2c81..2627d35 100644 --- a/test/test.hed +++ b/test/test.hed @@ -8,6 +8,8 @@ stack.adv math.adv variable.adv unitmap.adv +patchec.adv +patchemen.adv #DLLHeader ShString.HEL diff --git a/test/testSA.ALD b/test/testSA.ALD index df84e3d746cfd6b607d968327a0d1cee789d7d30..538471dc4903cc6612ed25ba73184b6813aafc79 100644 GIT binary patch delta 1343 zcmZ9LOK;Oa5XaZX29l_iIKZK(QWsGbRR~Ao!hwUG$dm-iqmEJ~B&kADsUT4zicn9C zxwe-veg+JMz&_*1W5`HR@G=~wz+q1zSVO6fE(N@kpM zvS>saFE2(Hcv+5gUM@tJd3h}hSjqyHBZC8O{MG{9fGwRhoobWe`_bO+=+43DEp7_o z-Mv>`!8^s2@LmxdF&uxuXKT%Y{7(IW7z2LyU;rE7dJfd-G1+nJ4m@iKAH*Su1CZZ* zkaLWX-y85z7q_vX!bgBX3KMM>>2a34f%H+4V(CvwF44zKi_$EVrsPm7kt<0Jw>T+P z%O#0=OwX6BB_+>QBpDsfu{;~!s~Ny{TMY)@;k39Ct#NL3JDbyCau^${47rNZ^%=xb zj=n6?FEnN~L{cy+QXJE9O!wuS@R)H?ikcJ4$(1BIuQ(?ilPW3aL|-$dBX75Dupxjj zlve|C-LLeYz^;3`79v?dM!*XDF;{G1~c z926R-rnDw#v{-h((7esr*2D()i4P9c;3;0&xw{;a@(y$oUPA#dm~*-dZteuVB6hGn k%cs%oFs1{l3i%K^Av@R*C=$JJHmfcNH%pf)_?q$aACV5CcK`qY delta 163 zcmbObGQnel;$&gX`;!=@Cktsloy5e#^`8L<6!tdjD^2EOl4APLFjiSIArwd<6v+N&fhkb> P#5hTdlbsXf3