From a8c4955b75a16fae40fe051b942cf9816ce3b358 Mon Sep 17 00:00:00 2001 From: Clownacy Date: Mon, 6 May 2019 00:00:10 +0100 Subject: [PATCH] Made BulHit.cpp ASM-accurate --- msvc2003/devilution/comparer-config.toml | 44 +++ src/BulHit.cpp | 334 ++++++++++++----------- 2 files changed, 223 insertions(+), 155 deletions(-) diff --git a/msvc2003/devilution/comparer-config.toml b/msvc2003/devilution/comparer-config.toml index 7b02a88b..1be2088f 100644 --- a/msvc2003/devilution/comparer-config.toml +++ b/msvc2003/devilution/comparer-config.toml @@ -15,6 +15,50 @@ size = 0x100 name = "PutFront" addr = 0x402830 +[[func]] +name = "JudgeHitBulletBlock" +addr = 0x4029B0 + +[[func]] +name = "JudgeHitBulletBlock2" +addr = 0x402B30 + +[[func]] +name = "JudgeHitBulletTriangleA" +addr = 0x402FC0 + +[[func]] +name = "JudgeHitBulletTriangleB" +addr = 0x4030B0 + +[[func]] +name = "JudgeHitBulletTriangleC" +addr = 0x4031A0 + +[[func]] +name = "JudgeHitBulletTriangleD" +addr = 0x403290 + +[[func]] +name = "JudgeHitBulletTriangleE" +addr = 0x403380 + +[[func]] +name = "JudgeHitBulletTriangleF" +addr = 0x403470 + +[[func]] +name = "JudgeHitBulletTriangleG" +addr = 0x403560 + +[[func]] +name = "JudgeHitBulletTriangleH" +addr = 0x403650 + +[[func]] +name = "HitBulletMap" +addr = 0x403740 + [[func]] name = "Call_Escape" addr = 0x40DD70 diff --git a/src/BulHit.cpp b/src/BulHit.cpp index 3d7fe199..256002f5 100644 --- a/src/BulHit.cpp +++ b/src/BulHit.cpp @@ -23,12 +23,13 @@ void Vanish(BULLET *bul) int JudgeHitBulletBlock(int x, int y, BULLET *bul) { + int i; int hit = 0; - if (bul->x - bul->blockXL < (2 * x + 1) << 12 - && bul->blockXL + bul->x > (2 * x - 1) << 12 - && bul->y - bul->blockYL < (2 * y + 1) << 12 - && bul->blockYL + bul->y > (2 * y - 1) << 12) - hit = 0x200; + if (bul->x - bul->blockXL < (0x10 * x + 8) * 0x200 + && bul->x + bul->blockXL > (0x10 * x - 8) * 0x200 + && bul->y - bul->blockYL < (0x10 * y + 8) * 0x200 + && bul->y + bul->blockYL> (0x10 * y - 8) * 0x200) + hit |= 0x200; if (hit && (bul->bbits & 0x60) && GetAttribute(x, y) == 0x43) { @@ -36,8 +37,8 @@ int JudgeHitBulletBlock(int x, int y, BULLET *bul) bul->cond = 0; SetCaret(bul->x, bul->y, 2, 0); PlaySoundObject(12, 1); - for (int i = 0; i < 4; i++) - SetNpChar(4, x << 13, y << 13, Random(-0x200, 0x200), Random(-0x200, 0x200), 0, 0, 256); + for (i = 0; i < 4; i++) + SetNpChar(4, x * 0x200 * 0x10, y * 0x200 * 0x10, Random(-0x200, 0x200), Random(-0x200, 0x200), 0, 0, 256); ShiftMapParts(x, y); } @@ -46,28 +47,39 @@ int JudgeHitBulletBlock(int x, int y, BULLET *bul) int JudgeHitBulletBlock2(int x, int y, uint8_t *atrb, BULLET *bul) { + int i; + int workX; + int workY; int hit = 0; int block[4]; if (bul->bbits & 0x40) { - for (int i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { - block[i] = *atrb == 0x41 || *atrb == 0x61; + if (*atrb == 0x41 || *atrb == 0x61) + block[i] = 1; + else + block[i] = 0; + ++atrb; } } else { - for (int i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { - block[i] = *atrb == 0x41 || *atrb == 0x43 || *atrb == 0x61; + if (*atrb == 0x41 || *atrb == 0x43 || *atrb == 0x61) + block[i] = 1; + else + block[i] = 0; + ++atrb; } } - int workX = (2 * x + 1) << 12; - int workY = (2 * y + 1) << 12; + workX = (0x10 * x + 8) * 0x200; + workY = (0x10 * y + 8) * 0x200; //Left wall if (block[0] && block[2]) @@ -75,14 +87,15 @@ int JudgeHitBulletBlock2(int x, int y, uint8_t *atrb, BULLET *bul) if (bul->x - bul->blockXL < workX) hit |= 1; } - else if (!block[0] || block[2]) + else if (block[0] && !block[2]) { - if (!block[0] && block[2] && bul->x - bul->blockXL < workX && bul->blockYL + bul->y > workY + 0x600) + if (bul->x - bul->blockXL < workX && bul->y - bul->blockYL < workY - 0x600) hit |= 1; } - else if (bul->x - bul->blockXL < workX && bul->y - bul->blockYL < workY - 0x600) + else if (!block[0] && block[2]) { - hit |= 1; + if (bul->x - bul->blockXL < workX && bul->y + bul->blockYL > workY + 0x600) + hit |= 1; } //Right wall @@ -91,30 +104,32 @@ int JudgeHitBulletBlock2(int x, int y, uint8_t *atrb, BULLET *bul) if (bul->x + bul->blockXL > workX) hit |= 4; } - else if (!block[1] || block[3]) + else if (block[1] && !block[3]) { - if (!block[1] && block[3] && bul->x + bul->blockXL > workX && bul->blockYL + bul->y > workY + 0x600) + if (bul->x + bul->blockXL > workX && bul->y - bul->blockYL < workY - 0x600) hit |= 4; } - else if (bul->x + bul->blockXL > workX && bul->y - bul->blockYL < workY - 0x600) + else if (!block[1] && block[3]) { - hit |= 4; + if (bul->x + bul->blockXL > workX && bul->y + bul->blockYL > workY + 0x600) + hit |= 4; } - + //Ceiling if (block[0] && block[1]) { if (bul->y - bul->blockYL < workY) hit |= 2; } - else if (!block[0] || block[1]) + else if (block[0] && !block[1]) { - if (!block[0] && block[1] && bul->y - bul->blockYL < workY && bul->blockXL + bul->x > workX + 0x600) + if (bul->y - bul->blockYL < workY && bul->x - bul->blockXL < workX - 0x600) hit |= 2; } - else if (bul->y - bul->blockYL < workY && bul->x - bul->blockXL < workX - 0x600) + else if (!block[0] && block[1]) { - hit |= 2; + if (bul->y - bul->blockYL < workY && bul->x + bul->blockXL > workX + 0x600) + hit |= 2; } //Ground @@ -123,14 +138,15 @@ int JudgeHitBulletBlock2(int x, int y, uint8_t *atrb, BULLET *bul) if (bul->y + bul->blockYL > workY) hit |= 8; } - else if (!block[2] || block[3]) + else if (block[2] && !block[3]) { - if (!block[2] && block[3] && bul->y + bul->blockYL > workY && bul->blockXL + bul->x > workX + 0x600) + if (bul->y + bul->blockYL > workY && bul->x - bul->blockXL < workX - 0x600) hit |= 8; } - else if (bul->y + bul->blockYL > workY && bul->x - bul->blockXL < workX - 0x600) + else if (!block[2] && block[3]) { - hit |= 8; + if (bul->y + bul->blockYL > workY && bul->x + bul->blockXL > workX + 0x600) + hit |= 8; } //Clip @@ -156,16 +172,16 @@ int JudgeHitBulletBlock2(int x, int y, uint8_t *atrb, BULLET *bul) int JudgeHitBulletTriangleA(int x, int y, BULLET *bul) { int hit = 0; - if (bul->x < (2 * x + 1) << 12 - && bul->x > (2 * x - 1) << 12 - && bul->y - 0x400 < (y << 13) - (-0x2000 * x + bul->x) / 2 + 0x800 - && bul->y + 0x400 > (2 * y - 1) << 12) + if (bul->x < (0x10 * x + 8) * 0x200 + && bul->x > (0x10 * x - 8) * 0x200 + && bul->y - 0x400 < (y * 0x10 * 0x200) - (bul->x - x * 0x10 * 0x200) / 2 + 0x800 + && bul->y + 0x400 > (0x10 * y - 8) * 0x200) { if (bul->bbits & 8) - bul->y = (y << 13) - (-0x2000 * x + bul->x) / 2 + 0xC00; + bul->y = (y * 0x10 * 0x200) - (bul->x - x * 0x10 * 0x200) / 2 + 0xC00; else Vanish(bul); - hit = 0x82; + hit |= 0x82; } return hit; } @@ -173,16 +189,16 @@ int JudgeHitBulletTriangleA(int x, int y, BULLET *bul) int JudgeHitBulletTriangleB(int x, int y, BULLET *bul) { int hit = 0; - if (bul->x < (2 * x + 1) << 12 - && bul->x > (2 * x - 1) << 12 - && bul->y - 0x400 < (y << 13) - (-0x2000 * x + bul->x) / 2 - 0x800 - && bul->y + 0x400 > (2 * y - 1) << 12) + if (bul->x < (0x10 * x + 8) * 0x200 + && bul->x > (0x10 * x - 8) * 0x200 + && bul->y - 0x400 < (y * 0x10 * 0x200) - (bul->x - x * 0x10 * 0x200) / 2 - 0x800 + && bul->y + 0x400 > (0x10 * y - 8) * 0x200) { if (bul->bbits & 8) - bul->y = (y << 13) - (-0x2000 * x + bul->x) / 2 - 0x400; + bul->y = (y * 0x10 * 0x200) - (bul->x - x * 0x10 * 0x200) / 2 - 0x400; else Vanish(bul); - hit = 0x82; + hit |= 0x82; } return hit; } @@ -190,16 +206,16 @@ int JudgeHitBulletTriangleB(int x, int y, BULLET *bul) int JudgeHitBulletTriangleC(int x, int y, BULLET *bul) { int hit = 0; - if (bul->x < (2 * x + 1) << 12 - && bul->x > (2 * x - 1) << 12 - && bul->y - 0x400 < (y << 13) + (-0x2000 * x + bul->x) / 2 - 0x800 - && bul->y + 0x400 > (2 * y - 1) << 12) + if (bul->x < (0x10 * x + 8) * 0x200 + && bul->x > (0x10 * x - 8) * 0x200 + && bul->y - 0x400 < (y * 0x10 * 0x200) + (bul->x - x * 0x10 * 0x200) / 2 - 0x800 + && bul->y + 0x400 > (0x10 * y - 8) * 0x200) { if (bul->bbits & 8) - bul->y = (y << 13) + (-0x2000 * x + bul->x) / 2 - 0x400; + bul->y = (y * 0x10 * 0x200) + (bul->x - x * 0x10 * 0x200) / 2 - 0x400; else Vanish(bul); - hit = 0x82; + hit |= 0x42; } return hit; } @@ -207,16 +223,16 @@ int JudgeHitBulletTriangleC(int x, int y, BULLET *bul) int JudgeHitBulletTriangleD(int x, int y, BULLET *bul) { int hit = 0; - if (bul->x < (2 * x + 1) << 12 - && bul->x > (2 * x - 1) << 12 - && bul->y - 0x400 < (y << 13) + (-0x2000 * x + bul->x) / 2 + 0x800 - && bul->y + 0x400 > (2 * y - 1) << 12) + if (bul->x < (0x10 * x + 8) * 0x200 + && bul->x > (0x10 * x - 8) * 0x200 + && bul->y - 0x400 < (y * 0x10 * 0x200) + (bul->x - x * 0x10 * 0x200) / 2 + 0x800 + && bul->y + 0x400 > (0x10 * y - 8) * 0x200) { if (bul->bbits & 8) - bul->y = (y << 13) + (-0x2000 * x + bul->x) / 2 + 0xC00; + bul->y = (y * 0x10 * 0x200) + (bul->x - x * 0x10 * 0x200) / 2 + 0xC00; else Vanish(bul); - hit = 0x82; + hit |= 0x42; } return hit; } @@ -224,16 +240,16 @@ int JudgeHitBulletTriangleD(int x, int y, BULLET *bul) int JudgeHitBulletTriangleE(int x, int y, BULLET *bul) { int hit = 0; - if (bul->x < (2 * x + 1) << 12 - && bul->x - 0x200 > (2 * x - 1) << 12 - && bul->y + 0x400 > (y << 13) + (-0x2000 * x + bul->x) / 2 - 0x800 - && bul->y - 0x400 < (2 * y + 1) << 12 ) + if (bul->x < (0x10 * x + 8) * 0x200 + && bul->x - 0x200 > (0x10 * x - 8) * 0x200 + && bul->y + 0x400 > (y * 0x10 * 0x200) + (bul->x - x * 0x10 * 0x200) / 2 - 0x800 + && bul->y - 0x400 < (0x10 * y + 8) * 0x200) { if (bul->bbits & 8) - bul->y = (y << 13) + (-0x2000 * x + bul->x) / 2 - 0xC00; + bul->y = (y * 0x10 * 0x200) + (bul->x - x * 0x10 * 0x200) / 2 - 0xC00; else Vanish(bul); - hit = 0x28; + hit |= 0x28; } return hit; } @@ -241,16 +257,16 @@ int JudgeHitBulletTriangleE(int x, int y, BULLET *bul) int JudgeHitBulletTriangleF(int x, int y, BULLET *bul) { int hit = 0; - if (bul->x < (2 * x + 1) << 12 - && bul->x > (2 * x - 1) << 12 - && bul->y + 0x400 > (y << 13) + (-0x2000 * x + bul->x) / 2 + 0x800 - && bul->y - 0x400 < (2 * y + 1) << 12) + if (bul->x < (0x10 * x + 8) * 0x200 + && bul->x > (0x10 * x - 8) * 0x200 + && bul->y + 0x400 > (y * 0x10 * 0x200) + (bul->x - x * 0x10 * 0x200) / 2 + 0x800 + && bul->y - 0x400 < (0x10 * y + 8) * 0x200) { if (bul->bbits & 8) - bul->y = (y << 13) + (-0x2000 * x + bul->x) / 2 + 0x400; + bul->y = (y * 0x10 * 0x200) + (bul->x - x * 0x10 * 0x200) / 2 + 0x400; else Vanish(bul); - hit = 0x28; + hit |= 0x28; } return hit; } @@ -258,16 +274,16 @@ int JudgeHitBulletTriangleF(int x, int y, BULLET *bul) int JudgeHitBulletTriangleG(int x, int y, BULLET *bul) { int hit = 0; - if (bul->x < (2 * x + 1) << 12 - && bul->x > (2 * x - 1) << 12 - && bul->y + 0x400 > (y << 13) - (-0x2000 * x + bul->x) / 2 + 0x800 - && bul->y - 0x400 < (2 * y + 1) << 12) + if (bul->x < (0x10 * x + 8) * 0x200 + && bul->x > (0x10 * x - 8) * 0x200 + && bul->y + 0x400 > (y * 0x10 * 0x200) - (bul->x - x * 0x10 * 0x200) / 2 + 0x800 + && bul->y - 0x400 < (0x10 * y + 8) * 0x200) { if (bul->bbits & 8) - bul->y = (y << 13) - (-0x2000 * x + bul->x) / 2 + 0x400; + bul->y = (y * 0x10 * 0x200) - (bul->x - x * 0x10 * 0x200) / 2 + 0x400; else Vanish(bul); - hit = 0x18; + hit |= 0x18; } return hit; } @@ -275,105 +291,113 @@ int JudgeHitBulletTriangleG(int x, int y, BULLET *bul) int JudgeHitBulletTriangleH(int x, int y, BULLET *bul) { int hit = 0; - if (bul->x < (2 * x + 1) << 12 - && bul->x > (2 * x - 1) << 12 - && bul->y + 0x400 > (y << 13) - (-0x2000 * x + bul->x) / 2 - 0x800 - && bul->y - 0x400 < (2 * y + 1) << 12 ) + if (bul->x < (0x10 * x + 8) * 0x200 + && bul->x > (0x10 * x - 8) * 0x200 + && bul->y + 0x400 > (y * 0x10 * 0x200) - (bul->x - x * 0x10 * 0x200) / 2 - 0x800 + && bul->y - 0x400 < (0x10 * y + 8) * 0x200) { if (bul->bbits & 8) - bul->y = (y << 13) - (-0x2000 * x + bul->x) / 2 - 0xC00; + bul->y = (y * 0x10 * 0x200) - (bul->x - x * 0x10 * 0x200) / 2 - 0xC00; else Vanish(bul); - hit = 0x18; + hit |= 0x18; } return hit; } void HitBulletMap() { - for (int i = 0; i < BULLET_MAX; i++) + int i; + int j; + int x; + int y; + unsigned char atrb[4]; + + for (i = 0; i < BULLET_MAX; i++) { - if (gBul[i].cond & 0x80) + int offx[4]; + int offy[4]; + + if ((gBul[i].cond & 0x80) == 0) + continue; + + x = gBul[i].x / 0x10 / 0x200; + y = gBul[i].y / 0x10 / 0x200; + + //Get surrounding tiles + offx[0] = 0; + offx[1] = 1; + offx[2] = 0; + offx[3] = 1; + offy[0] = 0; + offy[1] = 0; + offy[2] = 1; + offy[3] = 1; + + atrb[0] = GetAttribute(x, y); + atrb[1] = GetAttribute(x + 1, y); + atrb[2] = GetAttribute(x, y + 1); + atrb[3] = GetAttribute(x + 1, y + 1); + + //Clear hit tiles + gBul[i].flag = 0; + + if (gBul[i].bbits & 4) { - int x = gBul[i].x / 0x2000; - int y = gBul[i].y / 0x2000; - - //Get surrounding tiles - int offy[4]; - int offx[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]; - atrb[0] = GetAttribute(x, y); - atrb[1] = GetAttribute(x + 1, y); - atrb[2] = GetAttribute(x, y + 1); - atrb[3] = GetAttribute(x + 1, y + 1); - - //Clear hit tiles - gBul[i].flag = 0; - - if (!(gBul[i].bbits & 4)) + // For some reason a 'continue' just doesn't produce the same assembly + } + else + { + for (j = 0; j < 4; j++) { - for (int j = 0; j < 4; j++) + if ((gBul[i].cond & 0x80) == 0) + continue; + + switch (atrb[j]) { - if (gBul[i].cond & 0x80) - { - switch (atrb[j]) - { - case 0x41: - case 0x43: - case 0x44: - case 0x61: - case 0x64: - gBul[i].flag |= JudgeHitBulletBlock(x + offx[j], y + offy[j], &gBul[i]); - break; - case 0x50: - case 0x70: - gBul[i].flag |= JudgeHitBulletTriangleA(x + offx[j], y + offy[j], &gBul[i]); - break; - case 0x51: - case 0x71: - gBul[i].flag |= JudgeHitBulletTriangleB(x + offx[j], y + offy[j], &gBul[i]); - break; - case 0x52: - case 0x72: - gBul[i].flag |= JudgeHitBulletTriangleC(x + offx[j], y + offy[j], &gBul[i]); - break; - case 0x53: - case 0x73: - gBul[i].flag |= JudgeHitBulletTriangleD(x + offx[j], y + offy[j], &gBul[i]); - break; - case 0x54: - case 0x74: - gBul[i].flag |= JudgeHitBulletTriangleE(x + offx[j], y + offy[j], &gBul[i]); - break; - case 0x55: - case 0x75: - gBul[i].flag |= JudgeHitBulletTriangleF(x + offx[j], y + offy[j], &gBul[i]); - break; - case 0x56: - case 0x76: - gBul[i].flag |= JudgeHitBulletTriangleG(x + offx[j], y + offy[j], &gBul[i]); - break; - case 0x57: - case 0x77: - gBul[i].flag |= JudgeHitBulletTriangleH(x + offx[j], y + offy[j], &gBul[i]); - break; - default: - break; - } - } + case 0x41: + case 0x43: + case 0x44: + case 0x61: + case 0x64: + gBul[i].flag |= JudgeHitBulletBlock(x + offx[j], y + offy[j], &gBul[i]); + break; + case 0x50: + case 0x70: + gBul[i].flag |= JudgeHitBulletTriangleA(x + offx[j], y + offy[j], &gBul[i]); + break; + case 0x51: + case 0x71: + gBul[i].flag |= JudgeHitBulletTriangleB(x + offx[j], y + offy[j], &gBul[i]); + break; + case 0x52: + case 0x72: + gBul[i].flag |= JudgeHitBulletTriangleC(x + offx[j], y + offy[j], &gBul[i]); + break; + case 0x53: + case 0x73: + gBul[i].flag |= JudgeHitBulletTriangleD(x + offx[j], y + offy[j], &gBul[i]); + break; + case 0x54: + case 0x74: + gBul[i].flag |= JudgeHitBulletTriangleE(x + offx[j], y + offy[j], &gBul[i]); + break; + case 0x55: + case 0x75: + gBul[i].flag |= JudgeHitBulletTriangleF(x + offx[j], y + offy[j], &gBul[i]); + break; + case 0x56: + case 0x76: + gBul[i].flag |= JudgeHitBulletTriangleG(x + offx[j], y + offy[j], &gBul[i]); + break; + case 0x57: + case 0x77: + gBul[i].flag |= JudgeHitBulletTriangleH(x + offx[j], y + offy[j], &gBul[i]); + break; } - - gBul[i].flag |= JudgeHitBulletBlock2(x, y, atrb, &gBul[i]); } + + gBul[i].flag |= JudgeHitBulletBlock2(x, y, atrb, &gBul[i]); } } }