shithub: cstory

Download patch

ref: a8c4955b75a16fae40fe051b942cf9816ce3b358
parent: dea995ffe6e935cbfc325b09d158e3374e7dcb50
author: Clownacy <Clownacy@users.noreply.github.com>
date: Sun May 5 20:00:10 EDT 2019

Made BulHit.cpp ASM-accurate

--- a/msvc2003/devilution/comparer-config.toml
+++ b/msvc2003/devilution/comparer-config.toml
@@ -16,6 +16,50 @@
 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
 
--- a/src/BulHit.cpp
+++ b/src/BulHit.cpp
@@ -23,12 +23,13 @@
 
 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 @@
 			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 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 @@
 		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,16 +104,17 @@
 		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])
 	{
@@ -107,14 +121,15 @@
 		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 @@
 		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 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 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 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 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 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 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 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,16 +291,16 @@
 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;
 }
@@ -291,89 +307,97 @@
 
 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]);
 		}
 	}
 }