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 df84e3d..538471d 100644 Binary files a/test/testSA.ALD and b/test/testSA.ALD differ