shithub: cstory

Download patch

ref: d4d82d0ba8f15bef00b3a3b8b0d50f10f7fb7fa8
parent: 3bccba62364dc15ee3ae5a5c657e48d189130a17
author: Clownacy <Clownacy@users.noreply.github.com>
date: Mon May 13 08:19:04 EDT 2019

Made MycHit.cpp ASM-accurate

--- a/msvc2003/devilution/comparer-config.toml
+++ b/msvc2003/devilution/comparer-config.toml
@@ -516,6 +516,102 @@
 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
 
--- a/src/MycHit.cpp
+++ b/src/MycHit.cpp
@@ -36,13 +36,13 @@
 	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 @@
 	}
 
 	// 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 @@
 	}
 
 	// 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 @@
 	}
 
 	// 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 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 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 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 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 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 @@
 			gMC.ym = 0;
 
 		// Set that hit this slope
-		hit = 0x10028;
+		hit |= 0x28;
 	}
 
 	return hit;
@@ -241,15 +243,17 @@
 
 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 @@
 			gMC.ym = 0;
 
 		// Set that hit this slope
-		hit = 0x20028;
+		hit |= 0x28;
 	}
 
 	return hit;
@@ -266,15 +270,17 @@
 
 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 @@
 			gMC.ym = 0;
 
 		// Set that hit this slope
-		hit = 0x40018;
+		hit |= 0x18;
 	}
 
 	return hit;
@@ -291,15 +297,17 @@
 
 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 @@
 			gMC.ym = 0;
 
 		// Set that hit this slope
-		hit = 0x80018;
+		hit |= 0x18;
 	}
 
 	return hit;
@@ -318,11 +326,11 @@
 {
 	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 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 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 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 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 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,11 +400,11 @@
 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;
 }
@@ -403,32 +411,31 @@
 
 void HitMyCharMap()
 {
-	int x = gMC.x / 0x2000;
-	int y = gMC.y / 0x2000;
+	int i;
 
-	int offy[4];
+	int x = gMC.x / 0x10 / 0x200;
+	int y = gMC.y / 0x10 / 0x200;
+
 	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 @@
 				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 @@
 				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 @@
 				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 @@
 				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 @@
 				gMC.flag |= JudgeHitMyCharVectDown(x + offx[i], y + offy[i]);
 				gMC.flag |= JudgeHitMyCharWater(x + offx[i], y + offy[i]);
 				break;
-
-			default:
-				break;
 		}
 	}
 
@@ -633,12 +642,12 @@
 	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;
@@ -645,8 +654,8 @@
 	}
 	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,32 +667,78 @@
 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)
 		{
 			if (gMC.x - gMC.hit.right < npc->x + npc->hit.back && gMC.x - gMC.hit.right > npc->x)
@@ -690,7 +745,9 @@
 			{
 				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 @@
 			{
 				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)
-			{
-				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]);
-				}
+			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;
-				}
+		// 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 == 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;
-				}
+		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);
+		// 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))
-				{
-					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;
-				}
+		// NPC damage
+		if (g_GameFlags & 2 && (gNPC[i].bits & npc_interact) == 0)
+		{
+			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);
+			}
 		}
 
-		// 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)
-			{
-				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 ((gBoss[b].cond & 0x80) == 0)
+			continue;
 
-				if (!(g_GameFlags & 4) && hit && gBoss[b].bits & npc_eventTouch)
-				{
-					StartTextScript(gBoss[b].code_event);
-					gMC.ques = 0;
-				}
+		hit = 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 (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 && (gMC.cond & 1) && gBoss[b].bits & npc_interact)
-				{
-					StartTextScript(gBoss[b].code_event);
-					gMC.xm = 0;
-					gMC.ques = 0;
-				}
-			}
+		if (!(g_GameFlags & 4) && hit && gBoss[b].bits & npc_eventTouch)
+		{
+			StartTextScript(gBoss[b].code_event);
+			gMC.ques = 0;
 		}
 
-		if (gMC.ques)
-			SetCaret(gMC.x, gMC.y, 9, 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);
 }