diff --git a/msvc2003/devilution/comparer-config.toml b/msvc2003/devilution/comparer-config.toml index 686672c6..9beec6fa 100644 --- a/msvc2003/devilution/comparer-config.toml +++ b/msvc2003/devilution/comparer-config.toml @@ -515,6 +515,102 @@ addr = 0x414B20 name = "SetMapping" addr = 0x414B40 +[[func]] +name = "ResetMyCharFlag" +addr = 0x416E20 + +[[func]] +name = "JudgeHitMyCharBlock" +addr = 0x416E30 + +[[func]] +name = "PutlittleStar" +addr = 0x417160 + +[[func]] +name = "JudgeHitMyCharTriangleA" +addr = 0x4171D0 + +[[func]] +name = "JudgeHitMyCharTriangleB" +addr = 0x4172E0 + +[[func]] +name = "JudgeHitMyCharTriangleC" +addr = 0x4173F0 + +[[func]] +name = "JudgeHitMyCharTriangleD" +addr = 0x417500 + +[[func]] +name = "JudgeHitMyCharTriangleE" +addr = 0x417610 + +[[func]] +name = "JudgeHitMyCharTriangleF" +addr = 0x417720 + +[[func]] +name = "JudgeHitMyCharTriangleG" +addr = 0x417830 + +[[func]] +name = "JudgeHitMyCharTriangleH" +addr = 0x417940 + +[[func]] +name = "JudgeHitMyCharWater" +addr = 0x417A50 + +[[func]] +name = "JudgeHitMyCharDamage" +addr = 0x417AE0 + +[[func]] +name = "JudgeHitMyCharDamageW" +addr = 0x417B70 + +[[func]] +name = "JudgeHitMyCharVectLeft" +addr = 0x417C00 + +[[func]] +name = "JudgeHitMyCharVectUp" +addr = 0x417C90 + +[[func]] +name = "JudgeHitMyCharVectRight" +addr = 0x417D20 + +[[func]] +name = "JudgeHitMyCharVectDown" +addr = 0x417DB0 + +[[func]] +name = "HitMyCharMap" +addr = 0x417E40 + +[[func]] +name = "JudgeHitMyCharNPC" +addr = 0x4187F0 + +[[func]] +name = "JudgeHitMyCharNPC3" +addr = 0x418B10 + +[[func]] +name = "JudgeHitMyCharNPC4" +addr = 0x418C20 + +[[func]] +name = "HitMyCharNpChar" +addr = 0x419030 + +[[func]] +name = "HitMyCharBoss" +addr = 0x419450 + [[func]] name = "AddExpMyChar" addr = 0x4196F0 diff --git a/src/MycHit.cpp b/src/MycHit.cpp index 9809051d..1b5a0ab5 100644 --- a/src/MycHit.cpp +++ b/src/MycHit.cpp @@ -36,13 +36,13 @@ int JudgeHitMyCharBlock(int x, int y) int hit = 0; // Left wall - if (gMC.y - gMC.hit.top < (2 * (2 * y + 1) - 1) << 11 - && gMC.y + gMC.hit.bottom > (2 * (2 * y - 1) + 1) << 11 - && gMC.x - gMC.hit.left < (2 * x + 1) << 12 - && gMC.x - gMC.hit.left > x << 13) + if (gMC.y - gMC.hit.top < (y * 0x10 + 4) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 4) * 0x200 + && gMC.x - gMC.hit.left < (x * 0x10 + 8) * 0x200 + && gMC.x - gMC.hit.left > x * 0x10 * 0x200) { // Clip - gMC.x = ((2 * x + 1) << 12) + gMC.hit.left; + gMC.x = ((x * 0x10 + 8) * 0x200) + gMC.hit.left; // Halt momentum if (gMC.xm < -0x180) @@ -55,13 +55,13 @@ int JudgeHitMyCharBlock(int x, int y) } // Right wall - if (gMC.y - gMC.hit.top < (2 * (2 * y + 1) - 1) << 11 - && gMC.y + gMC.hit.bottom > (2 * (2 * y - 1) + 1) << 11 - && gMC.x + gMC.hit.right > (2 * x - 1) << 12 - && gMC.x + gMC.hit.left < x << 13) + if (gMC.y - gMC.hit.top < (y * 0x10 + 4) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 4) * 0x200 + && gMC.x + gMC.hit.right > (x * 0x10 - 8) * 0x200 + && gMC.x + gMC.hit.left < x * 0x10 * 0x200) { // Clip - gMC.x = ((2 * x - 1) << 12) - gMC.hit.right; + gMC.x = ((x * 0x10 - 8) * 0x200) - gMC.hit.right; // Halt momentum if (gMC.xm > 0x180) @@ -74,13 +74,13 @@ int JudgeHitMyCharBlock(int x, int y) } // Ceiling - if (gMC.x - gMC.hit.right < ((2 * x + 1) << 12) - 0x600 - && gMC.x + gMC.hit.right > ((2 * x - 1) << 12) + 0x600 - && gMC.y - gMC.hit.top < (2 * y + 1) << 12 - && gMC.y - gMC.hit.top > y << 13) + if (gMC.x - gMC.hit.right < (x * 0x10 + 5) * 0x200 + && gMC.x + gMC.hit.right > (x * 0x10 - 5) * 0x200 + && gMC.y - gMC.hit.top < (y * 0x10 + 8) * 0x200 + && gMC.y - gMC.hit.top > y * 0x10 * 0x200) { // Clip - gMC.y = ((2 * y + 1) << 12) + gMC.hit.top; + gMC.y = ((y * 0x10 + 8) * 0x200) + gMC.hit.top; // Halt momentum if (!(gMC.cond & 2) && gMC.ym < -0x200) @@ -93,13 +93,13 @@ int JudgeHitMyCharBlock(int x, int y) } // Floor - if (gMC.x - gMC.hit.right < ((2 * x + 1) << 12) - 0x600 - && gMC.x + gMC.hit.right > ((2 * x - 1) << 12) + 0x600 - && gMC.y + gMC.hit.bottom > (2 * y - 1) << 12 - && gMC.y + gMC.hit.bottom < y << 13) + if (gMC.x - gMC.hit.right < (x * 0x10 + 5) * 0x200 + && gMC.x + gMC.hit.right > ((x * 0x10 - 5) * 0x200) + && gMC.y + gMC.hit.bottom > (y * 0x10 - 8) * 0x200 + && gMC.y + gMC.hit.bottom < y * 0x10 * 0x200) { // Clip - gMC.y = ((2 * y - 1) << 12) - gMC.hit.bottom; + gMC.y = ((y * 0x10 - 8) * 0x200) - gMC.hit.bottom; // Halt momentum if (gMC.ym > 0x400) @@ -118,13 +118,13 @@ int JudgeHitMyCharTriangleA(int x, int y) { int hit = 0; - if (gMC.x < (2 * x + 1) << 12 - && gMC.x > (2 * x - 1) << 12 - && gMC.y - gMC.hit.top < (y << 13) - (-0x2000 * x + gMC.x) / 2 + 0x800 - && gMC.y + gMC.hit.bottom > (2 * y - 1) << 12) + if (gMC.x < (x * 0x10 + 8) * 0x200 + && gMC.x > (x * 0x10 - 8) * 0x200 + && gMC.y - gMC.hit.top < (y * 0x10 * 0x200) - (gMC.x - x * 0x10 * 0x200) / 2 + 0x800 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 8) * 0x200) { // Clip - gMC.y = (y << 13) - (-0x2000 * x + gMC.x) / 2 + 0x800 + gMC.hit.top; + gMC.y = (y * 0x10 * 0x200) - ((gMC.x - x * 0x10 * 0x200) / 2) + 0x800 + gMC.hit.top; // Halt momentum if (!(gMC.cond & 2) && gMC.ym < -0x200) @@ -143,13 +143,13 @@ int JudgeHitMyCharTriangleB(int x, int y) { int hit = 0; - if (gMC.x < (2 * x + 1) << 12 - && gMC.x > (2 * x - 1) << 12 - && gMC.y - gMC.hit.top < (y << 13) - (-0x2000 * x + gMC.x) / 2 - 0x800 - && gMC.y + gMC.hit.bottom > (2 * y - 1) << 12) + if (gMC.x < (x * 0x10 + 8) * 0x200 + && gMC.x > (x * 0x10 - 8) * 0x200 + && gMC.y - gMC.hit.top < (y * 0x10 * 0x200) - ((gMC.x - x * 0x10 * 0x200) / 2) - 0x800 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 8) * 0x200) { // Clip - gMC.y = (y << 13) - (-0x2000 * x + gMC.x) / 2 - 0x800 + gMC.hit.top; + gMC.y = (y * 0x10 * 0x200) - ((gMC.x - x * 0x10 * 0x200) / 2) - 0x800 + gMC.hit.top; // Halt momentum if (!(gMC.cond & 2) && gMC.ym < -0x200) @@ -168,13 +168,13 @@ int JudgeHitMyCharTriangleC(int x, int y) { int hit = 0; - if (gMC.x < (2 * x + 1) << 12 - && gMC.x > (2 * x - 1) << 12 - && gMC.y - gMC.hit.top < (y << 13) + (-0x2000 * x + gMC.x) / 2 - 0x800 - && gMC.y + gMC.hit.bottom > (2 * y - 1) << 12) + if (gMC.x < (x * 0x10 + 8) * 0x200 + && gMC.x > (x * 0x10 - 8) * 0x200 + && gMC.y - gMC.hit.top < (y * 0x10 * 0x200) + ((gMC.x - x * 0x10 * 0x200) / 2) - 0x800 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 8) * 0x200) { // Clip - gMC.y = (y << 13) + (-0x2000 * x + gMC.x) / 2 - 0x800 + gMC.hit.top; + gMC.y = (y * 0x10 * 0x200) + ((gMC.x - x * 0x10 * 0x200) / 2) - 0x800 + gMC.hit.top; // Halt momentum if (!(gMC.cond & 2) && gMC.ym < -0x200) @@ -193,13 +193,13 @@ int JudgeHitMyCharTriangleD(int x, int y) { int hit = 0; - if (gMC.x < (2 * x + 1) << 12 - && gMC.x > (2 * x - 1) << 12 - && gMC.y - gMC.hit.top < (y << 13) + (-0x2000 * x + gMC.x) / 2 + 0x800 - && gMC.y + gMC.hit.bottom > (2 * y - 1) << 12) + if (gMC.x < (x * 0x10 + 8) * 0x200 + && gMC.x > (x * 0x10 - 8) * 0x200 + && gMC.y - gMC.hit.top < (y * 0x10 * 0x200) + ((gMC.x - x * 0x10 * 0x200) / 2) + 0x800 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 8) * 0x200) { // Clip - gMC.y = (y << 13) + (-0x2000 * x + gMC.x) / 2 + 0x800 + gMC.hit.top; + gMC.y = (y * 0x10 * 0x200) + ((gMC.x - x * 0x10 * 0x200) / 2) + 0x800 + gMC.hit.top; // Halt momentum if (!(gMC.cond & 2) && gMC.ym < -0x200) @@ -216,15 +216,17 @@ int JudgeHitMyCharTriangleD(int x, int y) int JudgeHitMyCharTriangleE(int x, int y) { - int hit = 0x10000; + int hit = 0; - if (gMC.x < (2 * x + 1) << 12 - && gMC.x > (2 * x - 1) << 12 - && gMC.y + gMC.hit.bottom > (y << 13) + (-0x2000 * x + gMC.x) / 2 - 0x800 - && gMC.y - gMC.hit.top < (2 * y + 1) << 12) + hit |= 0x10000; + + if (gMC.x < (x * 0x10 + 8) * 0x200 + && gMC.x > (x * 0x10 - 8) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 * 0x200) + ((gMC.x - x * 0x10 * 0x200) / 2) - 0x800 + && gMC.y - gMC.hit.top < (y * 0x10 + 8) * 0x200) { // Clip - gMC.y = (y << 13) + (-0x2000 * x + gMC.x) / 2 - 0x800 - gMC.hit.bottom; + gMC.y = (y * 0x10 * 0x200) + ((gMC.x - x * 0x10 * 0x200) / 2) - 0x800 - gMC.hit.bottom; // Halt momentum if (gMC.ym > 0x400) @@ -233,7 +235,7 @@ int JudgeHitMyCharTriangleE(int x, int y) gMC.ym = 0; // Set that hit this slope - hit = 0x10028; + hit |= 0x28; } return hit; @@ -241,15 +243,17 @@ int JudgeHitMyCharTriangleE(int x, int y) int JudgeHitMyCharTriangleF(int x, int y) { - int hit = 0x20000; + int hit = 0; - if (gMC.x < (2 * x + 1) << 12 - && gMC.x > (2 * x - 1) << 12 - && gMC.y + gMC.hit.bottom > (y << 13) + (-0x2000 * x + gMC.x) / 2 + 0x800 - && gMC.y - gMC.hit.top < (2 * y + 1) << 12) + hit |= 0x20000; + + if (gMC.x < (x * 0x10 + 8) * 0x200 + && gMC.x > (x * 0x10 - 8) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 * 0x200) + ((gMC.x - x * 0x10 * 0x200) / 2) + 0x800 + && gMC.y - gMC.hit.top < (y * 0x10 + 8) * 0x200) { // Clip - gMC.y = (y << 13) + (-0x2000 * x + gMC.x) / 2 + 0x800 - gMC.hit.bottom; + gMC.y = (y * 0x10 * 0x200) + ((gMC.x - x * 0x10 * 0x200) / 2) + 0x800 - gMC.hit.bottom; // Halt momentum if (gMC.ym > 0x400) @@ -258,7 +262,7 @@ int JudgeHitMyCharTriangleF(int x, int y) gMC.ym = 0; // Set that hit this slope - hit = 0x20028; + hit |= 0x28; } return hit; @@ -266,15 +270,17 @@ int JudgeHitMyCharTriangleF(int x, int y) int JudgeHitMyCharTriangleG(int x, int y) { - int hit = 0x40000; + int hit = 0; - if (gMC.x < (2 * x + 1) << 12 - && gMC.x > (2 * x - 1) << 12 - && gMC.y + gMC.hit.bottom > (y << 13) - (-0x2000 * x + gMC.x) / 2 + 0x800 - && gMC.y - gMC.hit.top < (2 * y + 1) << 12) + hit |= 0x40000; + + if (gMC.x < (x * 0x10 + 8) * 0x200 + && gMC.x > (x * 0x10 - 8) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 * 0x200) - ((gMC.x - x * 0x10 * 0x200) / 2) + 0x800 + && gMC.y - gMC.hit.top < (y * 0x10 + 8) * 0x200) { // Clip - gMC.y = (y << 13) - (-0x2000 * x + gMC.x) / 2 + 0x800 - gMC.hit.bottom; + gMC.y = (y * 0x10 * 0x200) - ((gMC.x - x * 0x10 * 0x200) / 2) + 0x800 - gMC.hit.bottom; // Halt momentum if (gMC.ym > 0x400) @@ -283,7 +289,7 @@ int JudgeHitMyCharTriangleG(int x, int y) gMC.ym = 0; // Set that hit this slope - hit = 0x40018; + hit |= 0x18; } return hit; @@ -291,15 +297,17 @@ int JudgeHitMyCharTriangleG(int x, int y) int JudgeHitMyCharTriangleH(int x, int y) { - int hit = 0x80000; + int hit = 0; - if (gMC.x < (2 * x + 1) << 12 - && gMC.x > (2 * x - 1) << 12 - && gMC.y + gMC.hit.bottom > (y << 13) - (-0x2000 * x + gMC.x) / 2 - 0x800 - && gMC.y - gMC.hit.top < (2 * y + 1) << 12) + hit |= 0x80000; + + if (gMC.x < (x * 0x10 + 8) * 0x200 + && gMC.x > (x * 0x10 - 8) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 * 0x200) - ((gMC.x - x * 0x10 * 0x200) / 2) - 0x800 + && gMC.y - gMC.hit.top < (y * 0x10 + 8) * 0x200) { // Clip - gMC.y = (y << 13) - (-0x2000 * x + gMC.x) / 2 - 0x800 - gMC.hit.bottom; + gMC.y = (y * 0x10 * 0x200) - ((gMC.x - x * 0x10 * 0x200) / 2) - 0x800 - gMC.hit.bottom; // Halt momentum if (gMC.ym > 0x400) @@ -308,7 +316,7 @@ int JudgeHitMyCharTriangleH(int x, int y) gMC.ym = 0; // Set that hit this slope - hit = 0x80018; + hit |= 0x18; } return hit; @@ -318,11 +326,11 @@ int JudgeHitMyCharWater(int x, int y) { int hit = 0; - if (gMC.x - gMC.hit.right < ((2 * x + 1) << 12) - 0x600 - && gMC.x + gMC.hit.right > ((2 * x - 1) << 12) + 0x600 - && gMC.y - gMC.hit.top < ((2 * y + 1) << 12) - 0x600 - && gMC.y + gMC.hit.bottom > y << 13) - hit = 0x100; + if (gMC.x - gMC.hit.right < (x * 0x10 + 5) * 0x200 + && gMC.x + gMC.hit.right > ((x * 0x10 - 5) * 0x200) + && gMC.y - gMC.hit.top < ((y * 0x10 + 5) * 0x200) + && gMC.y + gMC.hit.bottom > y * 0x10 * 0x200) + hit |= 0x100; return hit; } @@ -331,11 +339,11 @@ int JudgeHitMyCharDamage(int x, int y) { int hit = 0; - if (gMC.x - 0x800 < (4 * x + 1) << 11 - && gMC.x + 0x800 > (4 * x - 1) << 11 - && gMC.y - 0x800 < (y << 13) + 0x600 - && gMC.y + 0x800 > (y << 13) - 0x600) - hit = 0x400; + if (gMC.x - 0x800 < (x * 0x10 + 4) * 0x200 + && gMC.x + 0x800 > (x * 0x10 - 4) * 0x200 + && gMC.y - 0x800 < (y * 0x10 + 3) * 0x200 + && gMC.y + 0x800 > (y * 0x10 - 3) * 0x200) + hit |= 0x400; return hit; } @@ -344,11 +352,11 @@ int JudgeHitMyCharDamageW(int x, int y) { int hit = 0; - if (gMC.x - 0x800 < (4 * x + 1) << 11 - && gMC.x + 0x800 > (4 * x - 1) << 11 - && gMC.y - 0x800 < (y << 13) + 0x600 - && gMC.y + 0x800 > (y << 13) - 0x600) - hit = 0xD00; + if (gMC.x - 0x800 < (x * 0x10 + 4) * 0x200 + && gMC.x + 0x800 > (x * 0x10 - 4) * 0x200 + && gMC.y - 0x800 < (y * 0x10 + 3) * 0x200 + && gMC.y + 0x800 > (y * 0x10 - 3) * 0x200) + hit |= 0xD00; return hit; } @@ -356,11 +364,11 @@ int JudgeHitMyCharDamageW(int x, int y) int JudgeHitMyCharVectLeft(int x, int y) { int hit = 0; - if (gMC.x - gMC.hit.right < (4 * (2 * x + 1) - 1) << 10 - && gMC.x + gMC.hit.right > (4 * (2 * x - 1) + 1) << 10 - && gMC.y - gMC.hit.top < (4 * (2 * y + 1) - 1) << 10 - && gMC.y + gMC.hit.bottom > (4 * (2 * y - 1) + 1) << 10) - hit = 0x1000; + if (gMC.x - gMC.hit.right < (x * 0x10 + 6) * 0x200 + && gMC.x + gMC.hit.right > (x * 0x10 - 6) * 0x200 + && gMC.y - gMC.hit.top < (y * 0x10 + 6) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 6) * 0x200) + hit |= 0x1000; return hit; } @@ -368,11 +376,11 @@ int JudgeHitMyCharVectLeft(int x, int y) int JudgeHitMyCharVectUp(int x, int y) { int hit = 0; - if (gMC.x - gMC.hit.right < (4 * (2 * x + 1) - 1) << 10 - && gMC.x + gMC.hit.right > (4 * (2 * x - 1) + 1) << 10 - && gMC.y - gMC.hit.top < (4 * (2 * y + 1) - 1) << 10 - && gMC.y + gMC.hit.bottom > (4 * (2 * y - 1) + 1) << 10) - hit = 0x2000; + if (gMC.x - gMC.hit.right < (x * 0x10 + 6) * 0x200 + && gMC.x + gMC.hit.right > (x * 0x10 - 6) * 0x200 + && gMC.y - gMC.hit.top < (y * 0x10 + 6) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 6) * 0x200) + hit |= 0x2000; return hit; } @@ -380,11 +388,11 @@ int JudgeHitMyCharVectUp(int x, int y) int JudgeHitMyCharVectRight(int x, int y) { int hit = 0; - if (gMC.x - gMC.hit.right < (4 * (2 * x + 1) - 1) << 10 - && gMC.x + gMC.hit.right > (4 * (2 * x - 1) + 1) << 10 - && gMC.y - gMC.hit.top < (4 * (2 * y + 1) - 1) << 10 - && gMC.y + gMC.hit.bottom > (4 * (2 * y - 1) + 1) << 10) - hit = 0x4000; + if (gMC.x - gMC.hit.right < (x * 0x10 + 6) * 0x200 + && gMC.x + gMC.hit.right > (x * 0x10 - 6) * 0x200 + && gMC.y - gMC.hit.top < (y * 0x10 + 6) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 6) * 0x200) + hit |= 0x4000; return hit; } @@ -392,43 +400,42 @@ int JudgeHitMyCharVectRight(int x, int y) int JudgeHitMyCharVectDown(int x, int y) { int hit = 0; - if (gMC.x - gMC.hit.right < (4 * (2 * x + 1) - 1) << 10 - && gMC.x + gMC.hit.right > (4 * (2 * x - 1) + 1) << 10 - && gMC.y - gMC.hit.top < (4 * (2 * y + 1) - 1) << 10 - && gMC.y + gMC.hit.bottom > (4 * (2 * y - 1) + 1) << 10) - hit = 0x8000; + if (gMC.x - gMC.hit.right < (x * 0x10 + 6) * 0x200 + && gMC.x + gMC.hit.right > (x * 0x10 - 6) * 0x200 + && gMC.y - gMC.hit.top < (y * 0x10 + 6) * 0x200 + && gMC.y + gMC.hit.bottom > (y * 0x10 - 6) * 0x200) + hit |= 0x8000; return hit; } void HitMyCharMap() { - int x = gMC.x / 0x2000; - int y = gMC.y / 0x2000; + int i; + + int x = gMC.x / 0x10 / 0x200; + int y = gMC.y / 0x10 / 0x200; - int offy[4]; int offx[4]; + int offy[4]; + offx[0] = 0; offx[1] = 1; offx[2] = 0; offx[3] = 1; + offy[0] = 0; offy[1] = 0; offy[2] = 1; offy[3] = 1; - uint8_t atrb[4]; - for (int i = 0; i < 4; i++) + unsigned char atrb[4]; + for (i = 0; i < 4; i++) { atrb[i] = GetAttribute(x + offx[i], y + offy[i]); switch (atrb[i]) { - // Water - case 0x02: - gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); - break; - // Block case 0x05: case 0x41: @@ -437,11 +444,6 @@ void HitMyCharMap() gMC.flag |= JudgeHitMyCharBlock(x + offx[i], y + offy[i]); break; - // Spikes - case 0x42: - gMC.flag |= JudgeHitMyCharDamage(x + offx[i], y + offy[i]); - break; - // Slopes case 0x50: gMC.flag |= JudgeHitMyCharTriangleA(x + offx[i], y + offy[i]); @@ -475,6 +477,38 @@ void HitMyCharMap() gMC.flag |= JudgeHitMyCharTriangleH(x + offx[i], y + offy[i]); break; + // Spikes + case 0x42: + gMC.flag |= JudgeHitMyCharDamage(x + offx[i], y + offy[i]); + break; + + // Water spikes + case 0x62: + gMC.flag |= JudgeHitMyCharDamageW(x + offx[i], y + offy[i]); + break; + + // Wind + case 0x80: + gMC.flag |= JudgeHitMyCharVectLeft(x + offx[i], y + offy[i]); + break; + + case 0x81: + gMC.flag |= JudgeHitMyCharVectUp(x + offx[i], y + offy[i]); + break; + + case 0x82: + gMC.flag |= JudgeHitMyCharVectRight(x + offx[i], y + offy[i]); + break; + + case 0x83: + gMC.flag |= JudgeHitMyCharVectDown(x + offx[i], y + offy[i]); + break; + + // Water + case 0x02: + gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); + break; + // Water and water blocks case 0x60: gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); @@ -485,11 +519,6 @@ void HitMyCharMap() gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); break; - // Water spikes - case 0x62: - gMC.flag |= JudgeHitMyCharDamageW(x + offx[i], y + offy[i]); - break; - // Water slopes case 0x70: gMC.flag |= JudgeHitMyCharTriangleA(x + offx[i], y + offy[i]); @@ -531,23 +560,6 @@ void HitMyCharMap() gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); break; - // Wind - case 0x80: - gMC.flag |= JudgeHitMyCharVectLeft(x + offx[i], y + offy[i]); - break; - - case 0x81: - gMC.flag |= JudgeHitMyCharVectUp(x + offx[i], y + offy[i]); - break; - - case 0x82: - gMC.flag |= JudgeHitMyCharVectRight(x + offx[i], y + offy[i]); - break; - - case 0x83: - gMC.flag |= JudgeHitMyCharVectDown(x + offx[i], y + offy[i]); - break; - // Water current case 0xA0: gMC.flag |= JudgeHitMyCharVectLeft(x + offx[i], y + offy[i]); @@ -568,9 +580,6 @@ void HitMyCharMap() gMC.flag |= JudgeHitMyCharVectDown(x + offx[i], y + offy[i]); gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]); break; - - default: - break; } } @@ -633,20 +642,20 @@ int JudgeHitMyCharNPC(NPCHAR *npc) return hit; } -int JudgeHitMyCharNPC3(NPCHAR *npc) +unsigned char JudgeHitMyCharNPC3(NPCHAR *npc) { - if (npc->direct) + if (npc->direct == 0) { - if (gMC.x + 0x400 > npc->x - npc->hit.back - && gMC.x - 0x400 < npc->x + npc->hit.front + if (gMC.x + 0x400 > npc->x - npc->hit.front + && gMC.x - 0x400 < npc->x + npc->hit.back && gMC.y + 0x400 > npc->y - npc->hit.top && gMC.y - 0x400 < npc->y + npc->hit.bottom) return 1; } else { - if (gMC.x + 0x400 > npc->x - npc->hit.front - && gMC.x - 0x400 < npc->x + npc->hit.back + if (gMC.x + 0x400 > npc->x - npc->hit.back + && gMC.x - 0x400 < npc->x + npc->hit.front && gMC.y + 0x400 > npc->y - npc->hit.top && gMC.y - 0x400 < npc->y + npc->hit.bottom) return 1; @@ -658,31 +667,77 @@ int JudgeHitMyCharNPC3(NPCHAR *npc) int JudgeHitMyCharNPC4(NPCHAR *npc) { // TODO: comment this + float fx1; + float fx2; + float fy1; + float fy2; + int hit = 0; - long double v1, v2; - if (npc->x <= gMC.x) - v1 = (long double)(gMC.x - npc->x); + if (npc->x > gMC.x) + fx1 = (float)(npc->x - gMC.x); else - v1 = (long double)(npc->x - gMC.x); + fx1 = (float)(gMC.x - npc->x); - float fx1 = (float)v1; - - if (npc->y <= gMC.y) - v2 = (long double)(gMC.y - npc->y); + if (npc->y > gMC.y) + fy1 = (float)(npc->y - gMC.y); else - v2 = (long double)(npc->y - gMC.y); + fy1 = (float)(gMC.y - npc->y); - float fx2 = (float)npc->hit.back; - if (0.0 == fx1) - fx1 = 1.0; - if (0.0 == fx2) - fx2 = 1.0; + fx2 = (float)npc->hit.back; + fy2 = (float)npc->hit.top; - float fy1 = (float)v2; - float fy2 = (float)npc->hit.top; + if (fx1 == 0.0f) + fx1 = 1.0f; + if (fx2 == 0.0f) + fx2 = 1.0f; - if (fy1 / fx1 <= fy2 / fx2) + if (fy1 / fx1 > fy2 / fx2) + { + if (gMC.x - gMC.hit.right < npc->x + npc->hit.back && gMC.x + gMC.hit.right > npc->x - npc->hit.back) + { + if (gMC.y - gMC.hit.top < npc->y + npc->hit.bottom && gMC.y - gMC.hit.top > npc->y) + { + if (gMC.ym < npc->ym) + { + gMC.y = npc->hit.bottom + npc->y + gMC.hit.top + 0x200; + gMC.ym = npc->ym; + } + else + { + if (gMC.ym < 0) + gMC.ym = 0; + } + + hit |= 2; + } + + if (gMC.y + gMC.hit.bottom > npc->y - npc->hit.top && gMC.hit.bottom + gMC.y < npc->y + 0x600) + { + if (gMC.ym - npc->ym > 0x400) + PlaySoundObject(23, 1); + + if (gMC.unit == 1) + { + gMC.y = npc->y - npc->hit.top - gMC.hit.bottom + 0x200; + hit |= 8; + } + else if (npc->bits & npc_bouncy) + { + gMC.ym = npc->ym - 0x200; + hit |= 8; + } + else if (!(gMC.flag & 8) && gMC.ym > npc->ym) + { + gMC.y = npc->y - npc->hit.top - gMC.hit.bottom + 0x200; + gMC.ym = npc->ym; + gMC.x += npc->xm; + hit |= 8; + } + } + } + } + else { if (gMC.y - gMC.hit.top < npc->y + npc->hit.bottom && gMC.y + gMC.hit.bottom > npc->y - npc->hit.top) { @@ -690,7 +745,9 @@ int JudgeHitMyCharNPC4(NPCHAR *npc) { if (gMC.xm < npc->xm) gMC.xm = npc->xm; + gMC.x = npc->hit.back + npc->x + gMC.hit.right; + hit |= 1; } @@ -698,196 +755,163 @@ int JudgeHitMyCharNPC4(NPCHAR *npc) { if (gMC.xm > npc->xm) gMC.xm = npc->xm; + gMC.x = npc->x - npc->hit.back - gMC.hit.right; + hit |= 4; } } } - else if (gMC.x - gMC.hit.right < npc->x + npc->hit.back && gMC.x + gMC.hit.right > npc->x - npc->hit.back) - { - if (gMC.y - gMC.hit.top < npc->y + npc->hit.bottom && gMC.y - gMC.hit.top > npc->y) - { - if (gMC.ym >= npc->ym) - { - if (gMC.ym < 0) - gMC.ym = 0; - } - else - { - gMC.y = npc->hit.bottom + npc->y + gMC.hit.top + 0x200; - gMC.ym = npc->ym; - } - - hit |= 2; - } - - if (gMC.y + gMC.hit.bottom > npc->y - npc->hit.top && gMC.hit.bottom + gMC.y < npc->y + 0x600) - { - if (gMC.ym - npc->ym > 0x400) - PlaySoundObject(23, 1); - - if (gMC.unit == 1) - { - gMC.y = npc->y - npc->hit.top - gMC.hit.bottom + 0x200; - hit |= 8; - } - else if (npc->bits & npc_bouncy) - { - gMC.ym = npc->ym - 0x200; - hit |= 8; - } - else if (!(gMC.flag & 8) && gMC.ym > npc->ym) - { - gMC.y = npc->y - npc->hit.top - gMC.hit.bottom + 0x200; - gMC.ym = npc->ym; - gMC.x += npc->xm; - hit |= 8; - } - } - } return hit; } void HitMyCharNpChar() { - if ((gMC.cond & 0x80) && !(gMC.cond & 2)) + int i; + + int hit = 0; + + if ((gMC.cond & 0x80) == 0 || (gMC.cond & 2)) + return; + + for (i = 0; i < NPC_MAX; i++) { - int hit; + if ((gNPC[i].cond & 0x80) == 0) + continue; - for (int i = 0; i < NPC_MAX; i++) + hit = 0; + + if (gNPC[i].bits & npc_solidSoft) { - if (gNPC[i].cond & 0x80) + hit = JudgeHitMyCharNPC(&gNPC[i]); + gMC.flag |= hit; + } + else if (gNPC[i].bits & npc_solidHard) + { + hit = JudgeHitMyCharNPC4(&gNPC[i]); + gMC.flag |= hit; + } + else + { + hit = JudgeHitMyCharNPC3(&gNPC[i]); + } + + // Special NPCs (pickups) + if (hit && gNPC[i].code_char == 1) + { + PlaySoundObject(14, 1); + AddExpMyChar(gNPC[i].exp); + gNPC[i].cond = 0; + } + + if (hit && gNPC[i].code_char == 86) + { + PlaySoundObject(42, 1); + AddBulletMyChar(gNPC[i].code_event, gNPC[i].exp); + gNPC[i].cond = 0; + } + + if (hit && gNPC[i].code_char == 87) + { + PlaySoundObject(20, 1); + AddLifeMyChar(gNPC[i].exp); + gNPC[i].cond = 0; + } + + // Run event on contact + if ((g_GameFlags & 4) == 0 && hit && gNPC[i].bits & npc_eventTouch) + StartTextScript(gNPC[i].code_event); + + // NPC damage + if (g_GameFlags & 2 && (gNPC[i].bits & npc_interact) == 0) + { + if (gNPC[i].bits & npc_rearTop) { - if (gNPC[i].bits & npc_solidSoft) - { - hit = JudgeHitMyCharNPC(&gNPC[i]); - gMC.flag |= hit; - } - else if (gNPC[i].bits & npc_solidHard) - { - hit = JudgeHitMyCharNPC4(&gNPC[i]); - gMC.flag |= hit; - } - else - { - hit = JudgeHitMyCharNPC3(&gNPC[i]); - } - - // Special NPCs (pickups) - if (hit && gNPC[i].code_char == 1) - { - PlaySoundObject(14, 1); - AddExpMyChar(gNPC[i].exp); - gNPC[i].cond = 0; - } - - if (hit && gNPC[i].code_char == 86) - { - PlaySoundObject(42, 1); - AddBulletMyChar(gNPC[i].code_event, gNPC[i].exp); - gNPC[i].cond = 0; - } - - if (hit && gNPC[i].code_char == 87) - { - PlaySoundObject(20, 1); - AddLifeMyChar(gNPC[i].exp); - gNPC[i].cond = 0; - } - - // Run event on contact - if (!(g_GameFlags & 4) && hit && gNPC[i].bits & npc_eventTouch) - StartTextScript(gNPC[i].code_event); - - // NPC damage - if (g_GameFlags & 2 && !(gNPC[i].bits & npc_interact)) - { - if (gNPC[i].bits & npc_rearTop) - { - if (hit & 4 && gNPC[i].xm < 0) - DamageMyChar(gNPC[i].damage); - if (hit & 1 && gNPC[i].xm > 0) - DamageMyChar(gNPC[i].damage); - if (hit & 8 && gNPC[i].ym < 0) - DamageMyChar(gNPC[i].damage); - if (hit & 2 && gNPC[i].ym > 0) - DamageMyChar(gNPC[i].damage); - } - else if (hit && gNPC[i].damage && !(g_GameFlags & 4)) - { - DamageMyChar(gNPC[i].damage); - } - } - - // Interaction - if (!(g_GameFlags & 4) && hit && gMC.cond & 1 && gNPC[i].bits & npc_interact) - { - StartTextScript(gNPC[i].code_event); - gMC.xm = 0; - gMC.ques = 0; - } + if (hit & 4 && gNPC[i].xm < 0) + DamageMyChar(gNPC[i].damage); + if (hit & 1 && gNPC[i].xm > 0) + DamageMyChar(gNPC[i].damage); + if (hit & 8 && gNPC[i].ym < 0) + DamageMyChar(gNPC[i].damage); + if (hit & 2 && gNPC[i].ym > 0) + DamageMyChar(gNPC[i].damage); + } + else if (hit && gNPC[i].damage && !(g_GameFlags & 4)) + { + DamageMyChar(gNPC[i].damage); } } - // Create question mark when NPC hasn't been interacted with - if (gMC.ques) - SetCaret(gMC.x, gMC.y, 9, 0); + // Interaction + if ((g_GameFlags & 4) == 0 && hit && gMC.cond & 1 && gNPC[i].bits & npc_interact) + { + StartTextScript(gNPC[i].code_event); + gMC.xm = 0; + gMC.ques = 0; + } } + + // Create question mark when NPC hasn't been interacted with + if (gMC.ques) + SetCaret(gMC.x, gMC.y, 9, 0); } void HitMyCharBoss() { - if ((gMC.cond & 0x80) && !(gMC.cond & 2)) + int hit = 0; + + if ((gMC.cond & 0x80) == 0 || (gMC.cond & 2)) + return; + + for (int b = 0; b < BOSS_MAX; b++) { - for (int b = 0; b < BOSS_MAX; b++) + if ((gBoss[b].cond & 0x80) == 0) + continue; + + hit = 0; + + if (gBoss[b].bits & npc_solidSoft) { - if (gBoss[b].cond & 0x80) - { - int hit; - if (gBoss[b].bits & npc_solidSoft) - { - hit = JudgeHitMyCharNPC(&gBoss[b]); - gMC.flag |= hit; - } - else if (gBoss[b].bits & npc_solidHard) - { - hit = JudgeHitMyCharNPC4(&gBoss[b]); - gMC.flag |= hit; - } - else - { - hit = JudgeHitMyCharNPC3(&gBoss[b]); - } - - if (!(g_GameFlags & 4) && hit && gBoss[b].bits & npc_eventTouch) - { - StartTextScript(gBoss[b].code_event); - gMC.ques = 0; - } - - if (gBoss[b].bits & npc_rearTop) - { - if (hit & 4 && gBoss[b].xm < 0) - DamageMyChar(gBoss[b].damage); - if (hit & 1 && gBoss[b].xm > 0) - DamageMyChar(gBoss[b].damage); - } - else if (hit && gBoss[b].damage && !(g_GameFlags & 4)) - { - DamageMyChar(gBoss[b].damage); - } - - if (!(g_GameFlags & 4) && hit && (gMC.cond & 1) && gBoss[b].bits & npc_interact) - { - StartTextScript(gBoss[b].code_event); - gMC.xm = 0; - gMC.ques = 0; - } - } + hit = JudgeHitMyCharNPC(&gBoss[b]); + gMC.flag |= hit; + } + else if (gBoss[b].bits & npc_solidHard) + { + hit = JudgeHitMyCharNPC4(&gBoss[b]); + gMC.flag |= hit; + } + else + { + hit = JudgeHitMyCharNPC3(&gBoss[b]); } - if (gMC.ques) - SetCaret(gMC.x, gMC.y, 9, 0); + if (!(g_GameFlags & 4) && hit && gBoss[b].bits & npc_eventTouch) + { + StartTextScript(gBoss[b].code_event); + gMC.ques = 0; + } + + if (gBoss[b].bits & npc_rearTop) + { + if (hit & 4 && gBoss[b].xm < 0) + DamageMyChar(gBoss[b].damage); + if (hit & 1 && gBoss[b].xm > 0) + DamageMyChar(gBoss[b].damage); + } + else if (hit && gBoss[b].damage && !(g_GameFlags & 4)) + { + DamageMyChar(gBoss[b].damage); + } + + if (!(g_GameFlags & 4) && hit && (gMC.cond & 1) && gBoss[b].bits & npc_interact) + { + StartTextScript(gBoss[b].code_event); + gMC.xm = 0; + gMC.ques = 0; + } } + + if (gMC.ques) + SetCaret(gMC.x, gMC.y, 9, 0); }