about summary refs log tree commit diff
path: root/src/GameTick.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/GameTick.cpp')
-rw-r--r--src/GameTick.cpp155
1 files changed, 87 insertions, 68 deletions
diff --git a/src/GameTick.cpp b/src/GameTick.cpp
index fc5305b..3f42796 100644
--- a/src/GameTick.cpp
+++ b/src/GameTick.cpp
@@ -202,8 +202,8 @@ void click(Game* game, int button, int action, int mods)
 			auto& person = game->person[i];
 			if (person.type == viptype || person.skeleton.free)
 				continue;
-			auto distance = findDistancefast(person.playercoords,
-				player.playercoords + flatfacing);
+			auto distance = sqrlen(player.playercoords + flatfacing
+				- person.playercoords);
 			if (distance > 12 + (weapon == knife) * 10)
 				continue;
 			if (closedistance == 0 || distance < closedistance) {
@@ -233,8 +233,8 @@ void click(Game* game, int button, int action, int mods)
 			auto& person = game->person[i];
 			if (person.skeleton.free || person.whichgun == nogun)
 				continue;
-			auto distance = findDistancefast(person.playercoords,
-				player.playercoords + flatfacing);
+			auto distance = sqrlen(player.playercoords + flatfacing
+				- person.playercoords);
 			if (distance > 12)
 				continue;
 			attacking = true;
@@ -711,9 +711,9 @@ void tackle(Game* game, XYZ flatfacing)
 	auto& player = game->person[0];
 	for (int i = 1; i < game->numpeople; ++i) {
 		auto& person = game->person[i];
-		if (person.skeleton.free > 0
-		    || findDistancefast(person.playercoords,
-		                        player.playercoords + flatfacing) > 22)
+		if (person.skeleton.free
+		    || sqrlen(player.playercoords + flatfacing
+		              - person.playercoords) > 22)
 			continue;
 
 		float gLoc[] {
@@ -858,7 +858,7 @@ void controlZombie(Game* game, size_t i)
 	if (zombie.type != zombietype)
 		return;
 	auto& vip = game->person[1];
-	if (findDistancefast(zombie.playercoords, vip.playercoords) > 20000
+	if (sqrlen(zombie.playercoords - vip.playercoords) > 20000
 	    || zombie.speedmult < 0.7f) {
 		zombie.killtarget = -1;
 		return;
@@ -968,12 +968,12 @@ void renderLaser(Game* game)
 	int whichhit = -1;
 	for (auto i = 1; i < game->numpeople; ++i) {
 		auto& person = game->person[i];
-		if (findDistancefast(coords, person.playercoords) > 20000)
+		if (sqrlen(coords -  person.playercoords) > 20000)
 			continue;
 		auto hit = person.BulletCollideWithPlayer(i, start, end);
 		if (!hit.collision)
 			continue;
-		auto distance = findDistancefast(start, hit.hitlocation);
+		auto distance = sqrlen(start - hit.hitlocation);
 		if (distance < olddistance || whichhit == -1) {
 			olddistance = distance;
 			whichhit = i;
@@ -1058,11 +1058,8 @@ void Game::Tick()
 				// Realcheck tells us
 				// a) we've got close to the end of our path or
 				// b) we're moving away from our target
-				auto moving_away
-					= findDistancefast(person[i].pathtarget,
-						person[i].playercoords)
-					> findDistancefast(person[i].pathtarget,
-						person[i].oldplayercoords);
+				auto moving_away = sqrlen(person[i].pathtarget - person[i].playercoords)
+					> sqrlen(person[i].pathtarget - person[i].oldplayercoords);
 				realcheck = (abs(person[i].playercoords.x
 						- person[i].pathtarget.x) < 1
 					&& abs(person[i].playercoords.z
@@ -1091,9 +1088,12 @@ void Game::Tick()
 							person[i].pathtarget.x += person[i].whichblockx*block_spacing;
 							person[i].pathtarget.z += person[i].whichblocky*block_spacing;
 
-							if(findDistancefast(person[i].playercoords,person[i].pathtarget)<leastdistance&&j!=1&&j!=person[i].oldpathnum&&j!=person[i].oldoldpathnum&&j!=person[i].oldoldoldpathnum){
-								leastdistance=findDistancefast(person[i].playercoords,person[i].pathtarget);
-								closesttarget=j;
+							if (sqrlen(person[i].playercoords - person[i].pathtarget) < leastdistance
+							    && j != 1 && j != person[i].oldpathnum
+							    && j != person[i].oldoldpathnum
+							    && j != person[i].oldoldoldpathnum){
+								leastdistance = sqrlen(person[i].playercoords - person[i].pathtarget);
+								closesttarget = j;
 							}
 						}
 
@@ -1151,9 +1151,12 @@ void Game::Tick()
 										person[i].pathtarget.x+=l*block_spacing;
 										person[i].pathtarget.z+=m*block_spacing;
 
-										if(findDistancefast(person[i].playercoords,person[i].pathtarget)<leastdistance&&findDistancefast(person[i].pathtarget,person[person[i].killtarget].playercoords)>findDistancefast(person[i].playercoords,person[person[i].killtarget].playercoords)&&j!=1&&blocksimple.LineCheck2(person[i].playercoords,person[i].pathtarget,&blah,move,cityrotation[person[i].whichblockx][person[i].whichblocky])==-1&&blocksimple.LineCheck2(person[i].playercoords,person[i].pathtarget,&blah,move,cityrotation[l][m])==-1){
-											person[i].lastdistancevictim=findDistancefast(person[i].pathtarget,person[person[i].killtarget].playercoords);
-											leastdistance=findDistancefast(person[i].playercoords,person[i].pathtarget);
+										if (sqrlen(person[i].playercoords - person[i].pathtarget) < leastdistance
+										    && sqrlen(person[i].pathtarget - person[person[i].killtarget].playercoords) > sqrlen(person[i].playercoords - person[person[i].killtarget].playercoords)
+										    && j != 1 && blocksimple.LineCheck2(person[i].playercoords, person[i].pathtarget, &blah, move, cityrotation[person[i].whichblockx][person[i].whichblocky]) == -1
+										    && blocksimple.LineCheck2(person[i].playercoords, person[i].pathtarget, &blah, move, cityrotation[l][m]) == -1) {
+											person[i].lastdistancevictim = sqrlen(person[i].pathtarget - person[person[i].killtarget].playercoords);
+											leastdistance - sqrlen(person[i].playercoords - person[i].pathtarget);
 											closesttarget=j;
 											finaltarget=person[i].pathtarget;
 											person[i].whichblockx=l;
@@ -1223,9 +1226,11 @@ void Game::Tick()
 							person[i].pathtarget.x+=person[i].whichblockx*block_spacing;
 							person[i].pathtarget.z+=person[i].whichblocky*block_spacing;
 
-							if(findDistancefast(person[i].playercoords,person[i].pathtarget)<leastdistance&&findDistancefast(person[i].pathtarget,person[person[i].killtarget].playercoords)<person[i].lastdistancevictim&&j!=1&&blocksimple.LineCheck2(person[i].playercoords,person[i].pathtarget,&blah,move,cityrotation[person[i].whichblockx][person[i].whichblocky])==-1){
-								leastdistance=findDistancefast(person[i].playercoords,person[i].pathtarget);
-								person[i].lastdistancevictim=findDistancefast(person[i].pathtarget,person[person[i].killtarget].playercoords);
+							if (sqrlen(person[i].playercoords - person[i].pathtarget) < leastdistance
+							    && sqrlen(person[i].pathtarget - person[person[i].killtarget].playercoords) < person[i].lastdistancevictim
+							    && j != 1 && blocksimple.LineCheck2(person[i].playercoords, person[i].pathtarget, &blah, move, cityrotation[person[i].whichblockx][person[i].whichblocky]) == -1) {
+								leastdistance = sqrlen(person[i].playercoords - person[i].pathtarget);
+								person[i].lastdistancevictim = sqrlen(person[i].pathtarget - person[person[i].killtarget].playercoords);
 								closesttarget=j;
 								finaltarget=person[i].pathtarget;
 							}
@@ -1240,9 +1245,11 @@ void Game::Tick()
 							person[i].pathtarget.x+=person[i].whichblockx*block_spacing;
 							person[i].pathtarget.z+=person[i].whichblocky*block_spacing;
 
-							if(findDistancefast(person[i].playercoords,person[i].pathtarget)<leastdistance&&findDistancefast(person[i].pathtarget,person[person[i].killtarget].playercoords)<person[i].lastdistancevictim&&j!=1&&blocksimple.LineCheck2(person[i].playercoords,person[i].pathtarget,&blah,move,cityrotation[person[i].whichblockx][person[i].whichblocky])==-1){
-								leastdistance=findDistancefast(person[i].playercoords,person[i].pathtarget);
-								person[i].lastdistancevictim=findDistancefast(person[i].pathtarget,person[person[i].killtarget].playercoords);
+							if (sqrlen(person[i].playercoords - person[i].pathtarget) < leastdistance
+							    && sqrlen(person[i].pathtarget - person[person[i].killtarget].playercoords) < person[i].lastdistancevictim
+							    && j != 1 && blocksimple.LineCheck2(person[i].playercoords, person[i].pathtarget, &blah, move, cityrotation[person[i].whichblockx][person[i].whichblocky]) == -1) {
+								leastdistance = sqrlen(person[i].playercoords - person[i].pathtarget);
+								person[i].lastdistancevictim = sqrlen(person[i].pathtarget - person[person[i].killtarget].playercoords);
 								closesttarget=j;
 								finaltarget=person[i].pathtarget;
 							}
@@ -1272,8 +1279,11 @@ void Game::Tick()
 										person[i].pathtarget.x+=l*block_spacing;
 										person[i].pathtarget.z+=m*block_spacing;
 
-										if(findDistancefast(person[i].playercoords,person[i].pathtarget)<leastdistance&&findDistancefast(person[i].pathtarget,person[person[i].killtarget].playercoords)<findDistancefast(person[i].playercoords,person[person[i].killtarget].playercoords)&&j!=1&&blocksimple.LineCheck2(person[i].playercoords,person[i].pathtarget,&blah,move,cityrotation[l][m])==-1&&blocksimple.LineCheck2(person[i].playercoords,person[i].pathtarget,&blah,move,cityrotation[person[i].whichblockx][person[i].whichblocky])==-1){
-											leastdistance=findDistancefast(person[i].playercoords,person[i].pathtarget);
+										if (sqrlen(person[i].playercoords - person[i].pathtarget) < leastdistance
+										    && sqrlen(person[i].pathtarget - person[person[i].killtarget].playercoords) < sqrlen(person[i].playercoords - person[person[i].killtarget].playercoords)
+										    && j != 1 && blocksimple.LineCheck2(person[i].playercoords, person[i].pathtarget, &blah, move, cityrotation[l][m]) == -1
+										    && blocksimple.LineCheck2(person[i].playercoords, person[i].pathtarget, &blah, move, cityrotation[person[i].whichblockx][person[i].whichblocky]) == -1) {
+											leastdistance = sqrlen(person[i].playercoords - person[i].pathtarget);
 											closesttarget=j;
 											finaltarget=person[i].pathtarget;
 											person[i].whichblockx=l;
@@ -1297,7 +1307,9 @@ void Game::Tick()
 
 						if(person[person[i].killtarget].health<=0)person[i].killtargetvisible=0;
 
-						if(closesttarget!=-1&&findDistancefast(person[i].playercoords, person[person[i].killtarget].playercoords)>30000)person[i].killtargetvisible=0;
+						if (closesttarget != -1
+						    && sqrlen(person[i].playercoords - person[person[i].killtarget].playercoords) > 30000)
+							person[i].killtargetvisible = 0;
 
 						if(person[i].killtarget==0&&visions==1)person[i].killtargetvisible=0;
 
@@ -1379,10 +1391,15 @@ void Game::Tick()
 										toofar=20000;
 									}
 
-									if(findDistancefast(person[i].playercoords, person[person[i].killtarget].playercoords)>toofar)
+									if (sqrlen(person[i].playercoords - person[person[i].killtarget].playercoords) > toofar)
 										person[i].targetanimation=joganim;
 
-									if((findDistancefast(person[i].playercoords, person[person[i].killtarget].playercoords)<=tooclose&&person[person[i].killtarget].skeleton.free==0)||(tooclose>200&&findDistancefast(person[i].playercoords, person[person[i].killtarget].playercoords)<=200)||(tooclose<=200&&findDistancefast(person[i].playercoords, person[person[i].killtarget].playercoords)<tooclose)){
+									if ((sqrlen(person[i].playercoords - person[person[i].killtarget].playercoords) <= tooclose
+									     && person[person[i].killtarget].skeleton.free == 0)
+									    || (tooclose > 200
+									        && sqrlen(person[i].playercoords - person[person[i].killtarget].playercoords) <= 200)
+									    || (tooclose <= 200
+									        && sqrlen(person[i].playercoords - person[person[i].killtarget].playercoords) < tooclose)) {
 										if(person[i].targetanimation!=idleanim){
 											person[i].targetanimation=idleanim;
 											person[i].targetframe=0;
@@ -1431,20 +1448,19 @@ void Game::Tick()
 
 									if(person[i].aiming==0)person[i].shotdelay=shotdelayamount/difficulty;
 
-									if(findDistancefast(person[i].playercoords, person[person[i].killtarget].playercoords)>20||person[i].targetanimation!=idleanim)
-										person[i].targetanimation=zombiejoganim;
-
-									if(findDistancefast(person[i].playercoords, person[person[i].killtarget].playercoords)<=20){
+									if (sqrlen(person[i].playercoords - person[person[i].killtarget].playercoords) <= 20) {
 										murderer=i;
 										person[person[i].killtarget].health=0;
 										person[person[i].killtarget].eaten=i;
-									}
+									} else if (person[i].targetanimation != idleanim)
+										person[i].targetanimation = zombiejoganim;
 									finaltarget=person[person[i].killtarget].playercoords;
 								 }
 							}
 
 						 if(person[i].killtargetvisible||realcheck)person[i].pathtarget=finaltarget;
-						 if(realcheck)person[i].lastdistancevictim=findDistancefast(person[i].pathtarget,person[person[i].killtarget].playercoords);
+						if (realcheck)
+							person[i].lastdistancevictim = sqrlen(person[i].pathtarget - person[person[i].killtarget].playercoords);
 						}
 					}
 
@@ -1503,7 +1519,8 @@ void Game::Tick()
 			person[i].averageloc /= max_joints;
 			person[i].playercoords=person[i].averageloc;
 			if(person[i].longdead<multiplier/2&&person[i].longdead>0)person[i].DrawSkeleton(i);
-			if(findDistancefast(person[i].averageloc,person[i].oldaverageloc)<.2*multiplier)person[i].longdead-=multiplier/2;
+			if (sqrlen(person[i].averageloc - person[i].oldaverageloc) < 0.2 * multiplier)
+				person[i].longdead -= multiplier / 2;
 		}
 
 		if(person[i].skeleton.free==1&&person[i].longdead<=0&&person[i].health>0&&person[i].longdead!=-1){
@@ -1725,25 +1742,15 @@ void Game::Tick()
 						temphitstruct=person[i].BulletCollideWithPlayer(i, start, end);
 
 						if(temphitstruct.collision){
-
-							distance=findDistancefast(start,temphitstruct.hitlocation);
-
+							distance = sqrlen(start - temphitstruct.hitlocation);
 							if(distance<olddistance||whichhit==-1){
-
 								end=temphitstruct.hitlocation;
-
 								olddistance=distance;
-
 								hitstruct=temphitstruct;
-
 								whichhit=i;
-
 							}
-
 						}
-
 					}
-
 				}
 
 				// Blocks
@@ -1956,7 +1963,7 @@ void Game::Tick()
 						}
 
 						for (auto& joint : person[whichhit].skeleton.joints) {
-							auto distance = findDistancefast(joint.position, hitstruct.hitlocation);
+							auto distance = sqrlen(joint.position - hitstruct.hitlocation);
 							if (distance < 200) {
 								totalarea += 200 / distance;
 								joint.velocity += aim * 200 / distance / totalarea * 200;
@@ -1993,13 +2000,15 @@ void Game::Tick()
 						person[whichhit].skeleton.offset=1;
 
 						for (auto& joint : person[whichhit].skeleton.joints) {
-							auto distance = findDistancefast(DoRotation(joint.position, 0, person[whichhit].playerrotation, 0) + person[whichhit].playercoords, hitstruct.hitlocation);
+							auto distance = sqrlen(DoRotation(joint.position, 0, person[whichhit].playerrotation, 0)
+								+ person[whichhit].playercoords
+								- hitstruct.hitlocation);
 							if(distance < 200) {
 								totalarea += 200 / distance;
 								joint.offset += DoRotation(aim * 200 / distance / totalarea * 10,
 									0, -person[whichhit].playerrotation, 0);
 							}
-							if (findLengthfast(joint.offset) > 36)
+							if (sqrlen(joint.offset) > 36)
 								joint.offset = normalize(joint.offset) * 6;
 						}
 					}
@@ -2167,7 +2176,7 @@ void Game::Tick()
 				}
 
 				if (nearest.x
-				    && findDistancefast(nearest, camera.position) < 10
+				    && sqrlen(nearest - camera.position) < 10
 				    && (thirdperson == 2 || j != 0)) {
 					auto nearsound = nearest - camera.position;
 					playSound(gSourceID[nearbulletsound],
@@ -2217,7 +2226,7 @@ void Game::Tick()
 		}
 
 		bool impact = false;
-		if(findLengthfast(sprites.velocity[i])>0){
+		if (sqrlen(sprites.velocity[i]) > 0) {
 			int wherex = sprites.location[i].x / block_spacing + 0.5f;
 			int wherey = sprites.location[i].z / block_spacing + 0.5f;
 			move = {(float) wherex * block_spacing, 0.0f, (float) wherey * block_spacing};
@@ -2234,7 +2243,7 @@ void Game::Tick()
 
 				if (sprites.type[i] == grenadesprite && sprites.size[i] <= 1) {
 					auto soundpos = sprites.location[i] - camera.position;
-					auto v = findLengthfast(sprites.velocity[i]) * 0.2f;
+					auto v = sqrlen(sprites.velocity[i]) * 0.2f;
 					ALfloat gLoc[] {
 						soundpos.x / v / soundscalefactor,
 						soundpos.y / v / soundscalefactor,
@@ -2245,7 +2254,7 @@ void Game::Tick()
 					alSourcePlay(gSourceID[whichsound]);
 				}
 
-				if (findLengthfast(sprites.velocity[i]) <= 10)
+				if (sqrlen(sprites.velocity[i]) <= 10)
 					sprites.velocity[i] = {};
 			}
 
@@ -2264,7 +2273,7 @@ void Game::Tick()
 					}
 
 					auto soundpos = sprites.location[i] - camera.position;
-					auto v = findLengthfast(sprites.velocity[i]) * 0.2f;
+					auto v = sqrlen(sprites.velocity[i]) * 0.2f;
 					ALfloat gLoc[] {
 						soundpos.x / v / soundscalefactor,
 						soundpos.y / v / soundscalefactor,
@@ -2277,11 +2286,12 @@ void Game::Tick()
 
 				}
 
-				if (findLengthfast(sprites.velocity[i]) <= 10)
+				if (sqrlen(sprites.velocity[i]) <= 10)
 					sprites.velocity[i] = {};
 			}
 
-			if(sprites.type[i]==grenadesprite&&findLengthfast(sprites.velocity[i])>20){
+			if (sprites.type[i] == grenadesprite
+			    && sqrlen(sprites.velocity[i]) > 20) {
 				for (int j = 0; j < numpeople; ++j) {
 					if (j == 0 && sprites.brightness[i] > 0.9f || !person[j].existing)
 						continue;
@@ -2291,7 +2301,7 @@ void Game::Tick()
 					impact = true;
 					sprites.location[i] = hitstruct.hitlocation;
 					auto landpos = sprites.location[i] - camera.position;
-					auto v = findLengthfast(sprites.velocity[i]) * 0.2f;
+					auto v = sqrlen(sprites.velocity[i]) * 0.2f;
 					ALfloat gLoc[] {
 						landpos.x / v / soundscalefactor,
 						landpos.y / v / soundscalefactor,
@@ -2332,12 +2342,14 @@ void Game::Tick()
 						person[j].skeleton.offset=1;
 
 						for (auto& joint : person[j].skeleton.joints) {
-							auto distance = findDistancefast(DoRotation(joint.position, 0, person[j].playerrotation, 0) + person[j].playercoords, hitstruct.hitlocation);
+							auto distance = sqrlen(DoRotation(joint.position, 0, person[j].playerrotation, 0)
+								+ person[j].playercoords
+								- hitstruct.hitlocation);
 							if (distance < 200) {
 								totalarea += 200 / distance;
 								joint.offset += DoRotation(sprites.velocity[i] * 0.1 * 200 / distance / totalarea * 10, 0, -person[j].playerrotation, 0);
 							}
-							if (findLengthfast(joint.offset) > 9) {
+							if (sqrlen(joint.offset) > 9) {
 								joint.offset = normalize(joint.offset) * 3;
 							}
 						}
@@ -2391,9 +2403,12 @@ void Game::Tick()
 
 			for(int k=0;k<numpeople;k++){
 				if (!person[k].existing
-				    || person[k].longdead == -1 && person[k].skeleton.free
-				    || (findDistancefast(person[k].playercoords,sprites.location[i]) > 700 || person[k].skeleton.free)
-				       && (findDistancefast(person[k].averageloc,sprites.location[i]) > 700 || !person[k].skeleton.free))
+				    || (person[k].longdead == -1
+				        && person[k].skeleton.free)
+				    || ((sqrlen(person[k].playercoords - sprites.location[i]) > 700
+				         || person[k].skeleton.free)
+				        && (sqrlen(person[k].averageloc - sprites.location[i]) > 700
+				            || !person[k].skeleton.free)))
 					continue;
 				if(person[k].skeleton.free!=1){
 					if(person[k].type==civiliantype)civkills++;
@@ -2402,7 +2417,11 @@ void Game::Tick()
 					person[k].skeleton.free=1;
 					person[k].killtargetvisible=0;
 
-					if((findDistancefast(person[k].playercoords,sprites.location[i])<600&&person[k].skeleton.free<1)||(findDistancefast(person[k].averageloc,sprites.location[i])<600&&person[k].skeleton.free>=1)||person[k].type==playertype){
+					if ((sqrlen(person[k].playercoords - sprites.location[i]) < 600
+					     && person[k].skeleton.free < 1)
+					    || (sqrlen(person[k].averageloc - sprites.location[i]) < 600
+					        && person[k].skeleton.free >= 1)
+					    || person[k].type == playertype) {
 						person[k].health-=100;
 						person[k].bleeding=1;
 					}
@@ -2436,7 +2455,7 @@ void Game::Tick()
 						joint.velocity += relation * 300;
 
 					// Sever stuff
-					if (findLengthfast(joint.velocity) > 1500
+					if (sqrlen(joint.velocity) > 1500
 					    && joint.existing && randUint(5)) {
 						sprites.MakeSprite(bloodspritedown, 0.8, 1, 0.2, 0.2, joint.position, joint.velocity / 3, 9);
 						person[k].skeleton.DeleteJoint(&joint