diff options
Diffstat (limited to 'src/GameTick.cpp')
| -rw-r--r-- | src/GameTick.cpp | 155 |
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 |
