Clean-up BulHit.cpp

This commit is contained in:
Clownacy 2019-11-16 00:33:25 +00:00
parent 16c03115c9
commit 93e5812e6c
2 changed files with 102 additions and 75 deletions

View file

@ -13,6 +13,7 @@ void Vanish(BULLET *bul)
PlaySoundObject(28, 1); PlaySoundObject(28, 1);
else else
SetCaret(bul->x, bul->y, 2, 1); SetCaret(bul->x, bul->y, 2, 1);
bul->cond = 0; bul->cond = 0;
SetCaret(bul->x, bul->y, 2, 2); SetCaret(bul->x, bul->y, 2, 2);
} }
@ -21,20 +22,23 @@ int JudgeHitBulletBlock(int x, int y, BULLET *bul)
{ {
int i; int i;
int hit = 0; int hit = 0;
if (bul->x - bul->blockXL < (0x10 * x + 8) * 0x200 if (bul->x - bul->blockXL < ((x * 16) + 8) * 0x200
&& bul->x + bul->blockXL > (0x10 * x - 8) * 0x200 && bul->x + bul->blockXL > ((x * 16) - 8) * 0x200
&& bul->y - bul->blockYL < (0x10 * y + 8) * 0x200 && bul->y - bul->blockYL < ((y * 16) + 8) * 0x200
&& bul->y + bul->blockYL > (0x10 * y - 8) * 0x200) && bul->y + bul->blockYL > ((y * 16) - 8) * 0x200)
hit |= 0x200; hit |= 0x200;
if (hit && (bul->bbits & 0x60) && GetAttribute(x, y) == 0x43) if (hit && bul->bbits & 0x60 && GetAttribute(x, y) == 0x43)
{ {
if (!(bul->bbits & 0x40)) if (!(bul->bbits & 0x40))
bul->cond = 0; bul->cond = 0;
SetCaret(bul->x, bul->y, 2, 0); SetCaret(bul->x, bul->y, 2, 0);
PlaySoundObject(12, 1); PlaySoundObject(12, 1);
for (i = 0; i < 4; i++)
SetNpChar(4, x * 0x200 * 0x10, y * 0x200 * 0x10, 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, NULL, 0x100);
ShiftMapParts(x, y); ShiftMapParts(x, y);
} }
@ -48,34 +52,34 @@ int JudgeHitBulletBlock2(int x, int y, unsigned char *atrb, BULLET *bul)
int workY; int workY;
int hit = 0; int hit = 0;
int block[4]; BOOL block[4];
if (bul->bbits & 0x40) if (bul->bbits & 0x40)
{ {
for (i = 0; i < 4; i++) for (i = 0; i < 4; ++i)
{ {
if (*atrb == 0x41 || *atrb == 0x61) if (*atrb == 0x41 || *atrb == 0x61)
block[i] = 1; block[i] = TRUE;
else else
block[i] = 0; block[i] = FALSE;
++atrb; ++atrb;
} }
} }
else else
{ {
for (i = 0; i < 4; i++) for (i = 0; i < 4; ++i)
{ {
if (*atrb == 0x41 || *atrb == 0x43 || *atrb == 0x61) if (*atrb == 0x41 || *atrb == 0x43 || *atrb == 0x61)
block[i] = 1; block[i] = TRUE;
else else
block[i] = 0; block[i] = FALSE;
++atrb; ++atrb;
} }
} }
workX = (0x10 * x + 8) * 0x200; workX = ((x * 16) + 8) * 0x200;
workY = (0x10 * y + 8) * 0x200; workY = ((y * 16) + 8) * 0x200;
// Left wall // Left wall
if (block[0] && block[2]) if (block[0] && block[2])
@ -85,12 +89,12 @@ int JudgeHitBulletBlock2(int x, int y, unsigned char *atrb, BULLET *bul)
} }
else if (block[0] && !block[2]) else if (block[0] && !block[2])
{ {
if (bul->x - bul->blockXL < workX && bul->y - bul->blockYL < workY - 0x600) if (bul->x - bul->blockXL < workX && bul->y - bul->blockYL < workY - (3 * 0x200))
hit |= 1; hit |= 1;
} }
else if (!block[0] && block[2]) else if (!block[0] && block[2])
{ {
if (bul->x - bul->blockXL < workX && bul->y + bul->blockYL > workY + 0x600) if (bul->x - bul->blockXL < workX && bul->y + bul->blockYL > workY + (3 * 0x200))
hit |= 1; hit |= 1;
} }
@ -102,12 +106,12 @@ int JudgeHitBulletBlock2(int x, int y, unsigned char *atrb, BULLET *bul)
} }
else if (block[1] && !block[3]) else if (block[1] && !block[3])
{ {
if (bul->x + bul->blockXL > workX && bul->y - bul->blockYL < workY - 0x600) if (bul->x + bul->blockXL > workX && bul->y - bul->blockYL < workY - (3 * 0x200))
hit |= 4; hit |= 4;
} }
else if (!block[1] && block[3]) else if (!block[1] && block[3])
{ {
if (bul->x + bul->blockXL > workX && bul->y + bul->blockYL > workY + 0x600) if (bul->x + bul->blockXL > workX && bul->y + bul->blockYL > workY + (3 * 0x200))
hit |= 4; hit |= 4;
} }
@ -119,12 +123,12 @@ int JudgeHitBulletBlock2(int x, int y, unsigned char *atrb, BULLET *bul)
} }
else if (block[0] && !block[1]) else if (block[0] && !block[1])
{ {
if (bul->y - bul->blockYL < workY && bul->x - bul->blockXL < workX - 0x600) if (bul->y - bul->blockYL < workY && bul->x - bul->blockXL < workX - (3 * 0x200))
hit |= 2; hit |= 2;
} }
else if (!block[0] && block[1]) else if (!block[0] && block[1])
{ {
if (bul->y - bul->blockYL < workY && bul->x + bul->blockXL > workX + 0x600) if (bul->y - bul->blockYL < workY && bul->x + bul->blockXL > workX + (3 * 0x200))
hit |= 2; hit |= 2;
} }
@ -136,12 +140,12 @@ int JudgeHitBulletBlock2(int x, int y, unsigned char *atrb, BULLET *bul)
} }
else if (block[2] && !block[3]) else if (block[2] && !block[3])
{ {
if (bul->y + bul->blockYL > workY && bul->x - bul->blockXL < workX - 0x600) if (bul->y + bul->blockYL > workY && bul->x - bul->blockXL < workX - (3 * 0x200))
hit |= 8; hit |= 8;
} }
else if (!block[2] && block[3]) else if (!block[2] && block[3])
{ {
if (bul->y + bul->blockYL > workY && bul->x + bul->blockXL > workX + 0x600) if (bul->y + bul->blockYL > workY && bul->x + bul->blockXL > workX + (3 * 0x200))
hit |= 8; hit |= 8;
} }
@ -157,9 +161,10 @@ int JudgeHitBulletBlock2(int x, int y, unsigned char *atrb, BULLET *bul)
else if (hit & 8) else if (hit & 8)
bul->y = workY - bul->blockYL; bul->y = workY - bul->blockYL;
} }
else if (hit & 0xF) else
{ {
Vanish(bul); if (hit & 0xF)
Vanish(bul);
} }
return hit; return hit;
@ -168,140 +173,156 @@ int JudgeHitBulletBlock2(int x, int y, unsigned char *atrb, BULLET *bul)
int JudgeHitBulletTriangleA(int x, int y, BULLET *bul) int JudgeHitBulletTriangleA(int x, int y, BULLET *bul)
{ {
int hit = 0; int hit = 0;
if (bul->x < (0x10 * x + 8) * 0x200 if (bul->x < ((x * 16) + 8) * 0x200
&& bul->x > (0x10 * x - 8) * 0x200 && bul->x > ((x * 16) - 8) * 0x200
&& bul->y - 0x400 < (y * 0x10 * 0x200) - (bul->x - x * 0x10 * 0x200) / 2 + 0x800 && bul->y - (2 * 0x200) < ((y * 16) * 0x200) - ((bul->x - ((x * 16) * 0x200)) / 2) + (4 * 0x200)
&& bul->y + 0x400 > (0x10 * y - 8) * 0x200) && bul->y + (2 * 0x200) > ((y * 16) - 8) * 0x200)
{ {
if (bul->bbits & 8) if (bul->bbits & 8)
bul->y = (y * 0x10 * 0x200) - (bul->x - x * 0x10 * 0x200) / 2 + 0xC00; bul->y = ((y * 16) * 0x200) - ((bul->x - ((x * 16) * 0x200)) / 2) + (6 * 0x200);
else else
Vanish(bul); Vanish(bul);
hit |= 0x82; hit |= 0x82;
} }
return hit; return hit;
} }
int JudgeHitBulletTriangleB(int x, int y, BULLET *bul) int JudgeHitBulletTriangleB(int x, int y, BULLET *bul)
{ {
int hit = 0; int hit = 0;
if (bul->x < (0x10 * x + 8) * 0x200 if (bul->x < ((x * 16) + 8) * 0x200
&& bul->x > (0x10 * x - 8) * 0x200 && bul->x > ((x * 16) - 8) * 0x200
&& bul->y - 0x400 < (y * 0x10 * 0x200) - (bul->x - x * 0x10 * 0x200) / 2 - 0x800 && bul->y - (2 * 0x200) < ((y * 16) * 0x200) - ((bul->x - ((x * 16) * 0x200)) / 2) - (4 * 0x200)
&& bul->y + 0x400 > (0x10 * y - 8) * 0x200) && bul->y + (2 * 0x200) > ((y * 16) - 8) * 0x200)
{ {
if (bul->bbits & 8) if (bul->bbits & 8)
bul->y = (y * 0x10 * 0x200) - (bul->x - x * 0x10 * 0x200) / 2 - 0x400; bul->y = ((y * 16) * 0x200) - ((bul->x - ((x * 16) * 0x200)) / 2) - (2 * 0x200);
else else
Vanish(bul); Vanish(bul);
hit |= 0x82; hit |= 0x82;
} }
return hit; return hit;
} }
int JudgeHitBulletTriangleC(int x, int y, BULLET *bul) int JudgeHitBulletTriangleC(int x, int y, BULLET *bul)
{ {
int hit = 0; int hit = 0;
if (bul->x < (0x10 * x + 8) * 0x200 if (bul->x < ((x * 16) + 8) * 0x200
&& bul->x > (0x10 * x - 8) * 0x200 && bul->x > ((x * 16) - 8) * 0x200
&& bul->y - 0x400 < (y * 0x10 * 0x200) + (bul->x - x * 0x10 * 0x200) / 2 - 0x800 && bul->y - (2 * 0x200) < ((y * 16) * 0x200) + ((bul->x - ((x * 16) * 0x200)) / 2) - (4 * 0x200)
&& bul->y + 0x400 > (0x10 * y - 8) * 0x200) && bul->y + (2 * 0x200) > ((y * 16) - 8) * 0x200)
{ {
if (bul->bbits & 8) if (bul->bbits & 8)
bul->y = (y * 0x10 * 0x200) + (bul->x - x * 0x10 * 0x200) / 2 - 0x400; bul->y = ((y * 16) * 0x200) + ((bul->x - ((x * 16) * 0x200)) / 2) - (2 * 0x200);
else else
Vanish(bul); Vanish(bul);
hit |= 0x42; hit |= 0x42;
} }
return hit; return hit;
} }
int JudgeHitBulletTriangleD(int x, int y, BULLET *bul) int JudgeHitBulletTriangleD(int x, int y, BULLET *bul)
{ {
int hit = 0; int hit = 0;
if (bul->x < (0x10 * x + 8) * 0x200 if (bul->x < ((x * 16) + 8) * 0x200
&& bul->x > (0x10 * x - 8) * 0x200 && bul->x > ((x * 16) - 8) * 0x200
&& bul->y - 0x400 < (y * 0x10 * 0x200) + (bul->x - x * 0x10 * 0x200) / 2 + 0x800 && bul->y - (2 * 0x200) < ((y * 16) * 0x200) + ((bul->x - ((x * 16) * 0x200)) / 2) + (4 * 0x200)
&& bul->y + 0x400 > (0x10 * y - 8) * 0x200) && bul->y + (2 * 0x200) > ((y * 16) - 8) * 0x200)
{ {
if (bul->bbits & 8) if (bul->bbits & 8)
bul->y = (y * 0x10 * 0x200) + (bul->x - x * 0x10 * 0x200) / 2 + 0xC00; bul->y = ((y * 16) * 0x200) + ((bul->x - ((x * 16) * 0x200)) / 2) + (6 * 0x200);
else else
Vanish(bul); Vanish(bul);
hit |= 0x42; hit |= 0x42;
} }
return hit; return hit;
} }
int JudgeHitBulletTriangleE(int x, int y, BULLET *bul) int JudgeHitBulletTriangleE(int x, int y, BULLET *bul)
{ {
int hit = 0; int hit = 0;
if (bul->x < (0x10 * x + 8) * 0x200 if (bul->x < ((x * 16) + 8) * 0x200
&& bul->x - 0x200 > (0x10 * x - 8) * 0x200 && bul->x - (1 * 0x200) > ((x * 16) - 8) * 0x200
&& bul->y + 0x400 > (y * 0x10 * 0x200) + (bul->x - x * 0x10 * 0x200) / 2 - 0x800 && bul->y + (2 * 0x200) > ((y * 16) * 0x200) + ((bul->x - ((x * 16) * 0x200)) / 2) - (4 * 0x200)
&& bul->y - 0x400 < (0x10 * y + 8) * 0x200) && bul->y - (2 * 0x200) < ((y * 16) + 8) * 0x200)
{ {
if (bul->bbits & 8) if (bul->bbits & 8)
bul->y = (y * 0x10 * 0x200) + (bul->x - x * 0x10 * 0x200) / 2 - 0xC00; bul->y = ((y * 16) * 0x200) + ((bul->x - ((x * 16) * 0x200)) / 2) - (6 * 0x200);
else else
Vanish(bul); Vanish(bul);
hit |= 0x28; hit |= 0x28;
} }
return hit; return hit;
} }
int JudgeHitBulletTriangleF(int x, int y, BULLET *bul) int JudgeHitBulletTriangleF(int x, int y, BULLET *bul)
{ {
int hit = 0; int hit = 0;
if (bul->x < (0x10 * x + 8) * 0x200 if (bul->x < ((x * 16) + 8) * 0x200
&& bul->x > (0x10 * x - 8) * 0x200 && bul->x > ((x * 16) - 8) * 0x200
&& bul->y + 0x400 > (y * 0x10 * 0x200) + (bul->x - x * 0x10 * 0x200) / 2 + 0x800 && bul->y + (2 * 0x200) > ((y * 16) * 0x200) + ((bul->x - ((x * 16) * 0x200)) / 2) + (4 * 0x200)
&& bul->y - 0x400 < (0x10 * y + 8) * 0x200) && bul->y - (2 * 0x200) < ((y * 16) + 8) * 0x200)
{ {
if (bul->bbits & 8) if (bul->bbits & 8)
bul->y = (y * 0x10 * 0x200) + (bul->x - x * 0x10 * 0x200) / 2 + 0x400; bul->y = ((y * 16) * 0x200) + ((bul->x - ((x * 16) * 0x200)) / 2) + (2 * 0x200);
else else
Vanish(bul); Vanish(bul);
hit |= 0x28; hit |= 0x28;
} }
return hit; return hit;
} }
int JudgeHitBulletTriangleG(int x, int y, BULLET *bul) int JudgeHitBulletTriangleG(int x, int y, BULLET *bul)
{ {
int hit = 0; int hit = 0;
if (bul->x < (0x10 * x + 8) * 0x200 if (bul->x < ((x * 16) + 8) * 0x200
&& bul->x > (0x10 * x - 8) * 0x200 && bul->x > ((x * 16) - 8) * 0x200
&& bul->y + 0x400 > (y * 0x10 * 0x200) - (bul->x - x * 0x10 * 0x200) / 2 + 0x800 && bul->y + (2 * 0x200) > ((y * 16) * 0x200) - ((bul->x - ((x * 16) * 0x200)) / 2) + (4 * 0x200)
&& bul->y - 0x400 < (0x10 * y + 8) * 0x200) && bul->y - (2 * 0x200) < ((y * 16) + 8) * 0x200)
{ {
if (bul->bbits & 8) if (bul->bbits & 8)
bul->y = (y * 0x10 * 0x200) - (bul->x - x * 0x10 * 0x200) / 2 + 0x400; bul->y = ((y * 16) * 0x200) - ((bul->x - ((x * 16) * 0x200)) / 2) + (2 * 0x200);
else else
Vanish(bul); Vanish(bul);
hit |= 0x18; hit |= 0x18;
} }
return hit; return hit;
} }
int JudgeHitBulletTriangleH(int x, int y, BULLET *bul) int JudgeHitBulletTriangleH(int x, int y, BULLET *bul)
{ {
int hit = 0; int hit = 0;
if (bul->x < (0x10 * x + 8) * 0x200 if (bul->x < ((x * 16) + 8) * 0x200
&& bul->x > (0x10 * x - 8) * 0x200 && bul->x > ((x * 16) - 8) * 0x200
&& bul->y + 0x400 > (y * 0x10 * 0x200) - (bul->x - x * 0x10 * 0x200) / 2 - 0x800 && bul->y + (2 * 0x200) > ((y * 16) * 0x200) - ((bul->x - ((x * 16) * 0x200)) / 2) - (4 * 0x200)
&& bul->y - 0x400 < (0x10 * y + 8) * 0x200) && bul->y - (2 * 0x200) < ((y * 16) + 8) * 0x200)
{ {
if (bul->bbits & 8) if (bul->bbits & 8)
bul->y = (y * 0x10 * 0x200) - (bul->x - x * 0x10 * 0x200) / 2 - 0xC00; bul->y = ((y * 16) * 0x200) - ((bul->x - ((x * 16) * 0x200)) / 2) - (6 * 0x200);
else else
Vanish(bul); Vanish(bul);
hit |= 0x18; hit |= 0x18;
} }
return hit; return hit;
} }
void HitBulletMap() void HitBulletMap(void)
{ {
int i; int i;
int j; int j;
@ -309,12 +330,12 @@ void HitBulletMap()
int y; int y;
unsigned char atrb[4]; unsigned char atrb[4];
for (i = 0; i < BULLET_MAX; i++) for (i = 0; i < BULLET_MAX; ++i)
{ {
int offx[4]; int offx[4];
int offy[4]; int offy[4];
if ((gBul[i].cond & 0x80) == 0) if (!(gBul[i].cond & 0x80))
continue; continue;
x = gBul[i].x / 0x10 / 0x200; x = gBul[i].x / 0x10 / 0x200;
@ -340,14 +361,13 @@ void HitBulletMap()
if (gBul[i].bbits & 4) if (gBul[i].bbits & 4)
{ {
// Using "continue" here doesn't produce accurate assembly // There probably used to be commented-out code here
// TODO Figure out what Pixel actually did (it's unlikely he left the brackets empty)
} }
else else
{ {
for (j = 0; j < 4; j++) for (j = 0; j < 4; ++j)
{ {
if ((gBul[i].cond & 0x80) == 0) if (!(gBul[i].cond & 0x80))
continue; continue;
switch (atrb[j]) switch (atrb[j])
@ -359,34 +379,42 @@ void HitBulletMap()
case 0x64: case 0x64:
gBul[i].flag |= JudgeHitBulletBlock(x + offx[j], y + offy[j], &gBul[i]); gBul[i].flag |= JudgeHitBulletBlock(x + offx[j], y + offy[j], &gBul[i]);
break; break;
case 0x50: case 0x50:
case 0x70: case 0x70:
gBul[i].flag |= JudgeHitBulletTriangleA(x + offx[j], y + offy[j], &gBul[i]); gBul[i].flag |= JudgeHitBulletTriangleA(x + offx[j], y + offy[j], &gBul[i]);
break; break;
case 0x51: case 0x51:
case 0x71: case 0x71:
gBul[i].flag |= JudgeHitBulletTriangleB(x + offx[j], y + offy[j], &gBul[i]); gBul[i].flag |= JudgeHitBulletTriangleB(x + offx[j], y + offy[j], &gBul[i]);
break; break;
case 0x52: case 0x52:
case 0x72: case 0x72:
gBul[i].flag |= JudgeHitBulletTriangleC(x + offx[j], y + offy[j], &gBul[i]); gBul[i].flag |= JudgeHitBulletTriangleC(x + offx[j], y + offy[j], &gBul[i]);
break; break;
case 0x53: case 0x53:
case 0x73: case 0x73:
gBul[i].flag |= JudgeHitBulletTriangleD(x + offx[j], y + offy[j], &gBul[i]); gBul[i].flag |= JudgeHitBulletTriangleD(x + offx[j], y + offy[j], &gBul[i]);
break; break;
case 0x54: case 0x54:
case 0x74: case 0x74:
gBul[i].flag |= JudgeHitBulletTriangleE(x + offx[j], y + offy[j], &gBul[i]); gBul[i].flag |= JudgeHitBulletTriangleE(x + offx[j], y + offy[j], &gBul[i]);
break; break;
case 0x55: case 0x55:
case 0x75: case 0x75:
gBul[i].flag |= JudgeHitBulletTriangleF(x + offx[j], y + offy[j], &gBul[i]); gBul[i].flag |= JudgeHitBulletTriangleF(x + offx[j], y + offy[j], &gBul[i]);
break; break;
case 0x56: case 0x56:
case 0x76: case 0x76:
gBul[i].flag |= JudgeHitBulletTriangleG(x + offx[j], y + offy[j], &gBul[i]); gBul[i].flag |= JudgeHitBulletTriangleG(x + offx[j], y + offy[j], &gBul[i]);
break; break;
case 0x57: case 0x57:
case 0x77: case 0x77:
gBul[i].flag |= JudgeHitBulletTriangleH(x + offx[j], y + offy[j], &gBul[i]); gBul[i].flag |= JudgeHitBulletTriangleH(x + offx[j], y + offy[j], &gBul[i]);
@ -398,4 +426,3 @@ void HitBulletMap()
} }
} }
} }

View file

@ -1,3 +1,3 @@
#pragma once #pragma once
void HitBulletMap(); void HitBulletMap(void);