aboutsummaryrefslogtreecommitdiff
path: root/src/GameTick.cpp
diff options
context:
space:
mode:
authorNguyễn Gia Phong <mcsinyx@disroot.org>2023-03-25 22:14:03 +0900
committerNguyễn Gia Phong <mcsinyx@disroot.org>2023-03-25 22:14:03 +0900
commit968d8a86f5a7e08f71bd449a466cc467efb11e3d (patch)
treebfd82936edd7439e48412a43892340ea25b5a672 /src/GameTick.cpp
parentd7f9a74f75ba0ce2167fa0e529a009becdcee7e3 (diff)
downloadblackshades-968d8a86f5a7e08f71bd449a466cc467efb11e3d.tar.gz
Convert square of norm calculation to Zig
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