aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Game.h3
-rw-r--r--src/GameTick.cpp309
2 files changed, 115 insertions, 197 deletions
diff --git a/src/Game.h b/src/Game.h
index e652303..cdc05c8 100644
--- a/src/Game.h
+++ b/src/Game.h
@@ -57,7 +57,8 @@ class Game {
void handleMenu(unsigned char*);
void handleToggles(unsigned char*);
void mouseLook();
- XYZ fluidAim(int&);
+ XYZ aimPlayer();
+ XYZ aimBot(int);
void setListener(XYZ&);
public:
// Event loop
diff --git a/src/GameTick.cpp b/src/GameTick.cpp
index ccf1a5c..16f00bc 100644
--- a/src/GameTick.cpp
+++ b/src/GameTick.cpp
@@ -329,14 +329,15 @@ void Game::setListener(XYZ& facing)
alListenerfv(AL_ORIENTATION, ori);
}
-XYZ Game::fluidAim(int& j)
+XYZ Game::aimPlayer()
{
- auto& joints = person[j].skeleton.joints;
- auto& jointlabels = person[j].skeleton.jointlabels;
+ auto& joints = person[0].skeleton.joints;
+ auto& jointlabels = person[0].skeleton.jointlabels;
auto point = joints[jointlabels[lefthand]].position
- joints[jointlabels[righthand]].position;
float aimrot = 0.0f, aimrot2 = 0.0f;
- switch (person[j].whichgun) {
+
+ switch (person[0].whichgun) {
case assaultrifle:
aimrot = -2.5f;
break;
@@ -350,18 +351,19 @@ XYZ Game::fluidAim(int& j)
case handgun1:
case handgun2:
aimrot = -0.9f;
+ auto k = thirdperson ? 0.35 : 0.65;
point = joints[jointlabels[righthand]].position
- - joints[jointlabels[head]].position * 0.35f
- - joints[jointlabels[neck]].position * 0.65f;
+ - joints[jointlabels[head]].position * k
+ - joints[jointlabels[neck]].position * (1 - k);
break;
}
- XYZ aim = DoRotation(point, aimrot2,
- person[j].playerrotation + aimrot, 0);
-
- if(j!=0&&person[person[j].killtarget].skeleton.free==0)aim=(DoRotation(person[person[j].killtarget].skeleton.joints[person[person[j].killtarget].skeleton.jointlabels[abdomen]].position,0,person[person[j].killtarget].playerrotation,0)+person[person[j].killtarget].playercoords)-(DoRotation(person[j].skeleton.joints[person[j].skeleton.jointlabels[lefthand]].position,0,person[j].playerrotation,0)+person[j].playercoords);
- if(j!=0&&person[person[j].killtarget].skeleton.free!=0)aim=person[person[j].killtarget].skeleton.joints[person[person[j].killtarget].skeleton.jointlabels[abdomen]].position-(DoRotation(person[j].skeleton.joints[person[j].skeleton.jointlabels[lefthand]].position,0,person[j].playerrotation,0)+person[j].playercoords);
+ return DoRotation(point, aimrot2,
+ person[0].playerrotation + aimrot, 0);
+}
+XYZ Game::aimBot(int j)
+{
float inaccuracy = 0.0f;
switch (person[j].whichgun) {
case handgun1:
@@ -376,12 +378,28 @@ XYZ Game::fluidAim(int& j)
inaccuracy = 2.0f;
break;
}
- if (person[person[j].killtarget].skeleton.free == 1)
+ if (person[person[j].killtarget].skeleton.free)
inaccuracy *= 3;
- if(j!=0)aim=DoRotation(DoRotation(DoRotation(aim,0,-person[j].playerrotation,0),(float)(abs(Random()%2000))/2000*inaccuracy-inaccuracy/2,(float)(abs(Random()%2000))/2000*inaccuracy-inaccuracy/2,0),0,person[j].playerrotation,0);
- Normalise(&aim);
- return std::move(aim);
+ auto& target = person[person[j].killtarget];
+ auto& joints = target.skeleton.joints;
+ auto& jointlabels = target.skeleton.jointlabels;
+ XYZ aim = joints[jointlabels[abdomen]].position;
+ if (target.skeleton.free)
+ inaccuracy *= 3;
+ else
+ aim = DoRotation(aim, 0, target.playerrotation, 0)
+ + target.playercoords;
+
+ auto& lefthandpos = joints[jointlabels[lefthand]].position;
+ aim -= person[j].playercoords
+ + DoRotation(lefthandpos, 0, person[j].playerrotation, 0);
+ return DoRotation(
+ DoRotation(
+ DoRotation(aim, 0, -person[j].playerrotation, 0),
+ (abs(Random() % 2000) / 2000.0 - 0.5) * inaccuracy,
+ (abs(Random() % 2000) / 2000.0 - 0.5) * inaccuracy, 0),
+ 0, person[j].playerrotation, 0);
}
void Game::Tick()
@@ -1455,10 +1473,12 @@ void Game::Tick()
person[i].attacktarget=0;
person[i].attackframe=0;
- float gLoc[3];
- gLoc[0]=(camera.position.x+((person[i].playercoords.x+flatfacing.x)-camera.position.x)/2)/soundscalefactor;
- gLoc[1]=(camera.position.y+((person[i].playercoords.y+flatfacing.y)-camera.position.y)/2)/soundscalefactor;
- gLoc[2]=(camera.position.z+((person[i].playercoords.z+flatfacing.z)-camera.position.z)/2)/soundscalefactor;
+ auto stabpos = person[i].playercoords + flatfacing - camera.position;
+ ALfloat gLoc[] {
+ stabpos.x / 2 / soundscalefactor,
+ stabpos.y / 2 / soundscalefactor,
+ stabpos.z / 2 / soundscalefactor,
+ };
if(person[person[i].killtarget].type!=zombietype)
{
@@ -1810,185 +1830,109 @@ void Game::Tick()
if(person[0].attackframe>1||(person[0].attackframe>=0&&person[0].currentanimation==joganim)){
if(person[person[0].killtarget].skeleton.free<1&&person[0].killtarget!=0&&(person[0].aiming<1||person[0].whichgun==nogun||person[0].whichgun==knife||person[0].targetanimation==joganim)){
+ auto soundpos = person[0].playercoords + flatfacing
+ - camera.position;
+ float gLoc[] {
+ soundpos.x / 2 / soundscalefactor,
+ soundpos.y / 2 / soundscalefactor,
+ soundpos.z / 2 / soundscalefactor,
+ };
- float gLoc[3];
-
- gLoc[0]=(camera.position.x+((person[0].playercoords.x+flatfacing.x)-camera.position.x)/2)/soundscalefactor;
-
- gLoc[1]=(camera.position.y+((person[0].playercoords.y+flatfacing.y)-camera.position.y)/2)/soundscalefactor;
-
- gLoc[2]=(camera.position.z+((person[0].playercoords.z+flatfacing.z)-camera.position.z)/2)/soundscalefactor;
-
- if(person[person[0].killtarget].type!=zombietype)
-
- {
-
- if(person[0].whichgun!=knife){
-
+ if (person[person[0].killtarget].type != zombietype) {
+ if (person[0].whichgun != knife) {
alSourcefv(gSourceID[headwhacksound], AL_POSITION, gLoc);
-
alSourcePlay(gSourceID[headwhacksound]);
-
- }
-
- if(person[0].whichgun==knife){
-
+ } else {
alSourcefv(gSourceID[knifeslashsound], AL_POSITION, gLoc);
-
alSourcePlay(gSourceID[knifeslashsound]);
person[person[0].killtarget].bjoint1=&person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]];
-
person[person[0].killtarget].bjoint2=&person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]];
-
person[person[0].killtarget].bleeding=1;
-
person[person[0].killtarget].bleeddelay=1;
-
person[0].bjoint1=&person[0].skeleton.joints[person[0].skeleton.jointlabels[righthand]];
-
person[0].bjoint2=&person[0].skeleton.joints[person[0].skeleton.jointlabels[righthand]];
person[0].bleeding=1;
-
person[0].bleeddelay=1;
velocity=DoRotation(flatfacing,0,70,0)*50+person[0].velocity*2;
-
velocity.y+=30;
-
sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,DoRotation(person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]].position,0,person[person[0].killtarget].playerrotation,0)+person[person[0].killtarget].playercoords, velocity*.3, 2);
-
sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,DoRotation(person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]].position,0,person[person[0].killtarget].playerrotation,0)+person[person[0].killtarget].playercoords, velocity*.2, 3);
-
sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,DoRotation(person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]].position,0,person[person[0].killtarget].playerrotation,0)+person[person[0].killtarget].playercoords, velocity*.1, 4);
-
}
person[person[0].killtarget].health-=100;
-
person[person[0].killtarget].skeleton.free=1;
-
person[person[0].killtarget].longdead=1;
for(int j=0;j<person[person[0].killtarget].skeleton.num_joints;j++){
-
person[person[0].killtarget].skeleton.joints[j].position=DoRotation(person[person[0].killtarget].skeleton.joints[j].position,0,person[person[0].killtarget].playerrotation,0);
-
person[person[0].killtarget].skeleton.joints[j].position+=person[person[0].killtarget].playercoords;
-
person[person[0].killtarget].skeleton.joints[j].realoldposition=person[person[0].killtarget].skeleton.joints[j].position;
-
person[person[0].killtarget].skeleton.joints[j].velocity=person[person[0].killtarget].velocity;
-
person[person[0].killtarget].skeleton.joints[j].velocity.x+=abs(Random()%10)-5;
-
person[person[0].killtarget].skeleton.joints[j].velocity.y+=abs(Random()%10)-5;
-
person[person[0].killtarget].skeleton.joints[j].velocity.z+=abs(Random()%10)-5;
-
}
if(person[0].whichgun!=knife){
-
person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[head]].velocity+=DoRotation(flatfacing,0,40,0)*50;
-
person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[head]].velocity+=person[0].velocity*2;
-
}
-
- }
-
- else
-
- {
-
+ } else {
if(whacked==0){
-
whacked=1;
-
- if(person[0].whichgun!=knife){
-
+ if (person[0].whichgun!=knife) {
alSourcefv(gSourceID[headwhacksound], AL_POSITION, gLoc);
-
alSourcePlay(gSourceID[headwhacksound]);
-
- }
-
- if(person[0].whichgun==knife){
-
+ } else {
alSourcefv(gSourceID[knifeslashsound], AL_POSITION, gLoc);
-
alSourcePlay(gSourceID[knifeslashsound]);
person[person[0].killtarget].bjoint1=&person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]];
-
person[person[0].killtarget].bjoint2=&person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]];
- person[person[0].killtarget].bleeding=1;
-
person[person[0].killtarget].bleeddelay=1;
person[0].bjoint1=&person[0].skeleton.joints[person[0].skeleton.jointlabels[righthand]];
-
person[0].bjoint2=&person[0].skeleton.joints[person[0].skeleton.jointlabels[righthand]];
person[0].bleeding=1;
-
person[0].bleeddelay=1;
velocity=DoRotation(flatfacing,0,70,0)*50+person[0].velocity*2;
-
velocity.y+=30;
sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,DoRotation(person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]].position,0,person[person[0].killtarget].playerrotation,0)+person[person[0].killtarget].playercoords, velocity*.3, 2);
-
sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,DoRotation(person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]].position,0,person[person[0].killtarget].playerrotation,0)+person[person[0].killtarget].playercoords, velocity*.2, 3);
-
sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,DoRotation(person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]].position,0,person[person[0].killtarget].playerrotation,0)+person[person[0].killtarget].playercoords, velocity*.1, 4);
-
}
person[person[0].killtarget].health-=200;
-
person[person[0].killtarget].maxhealth-=20;
-
person[person[0].killtarget].skeleton.free=1;
-
person[person[0].killtarget].longdead=1;
for(int j=0;j<person[person[0].killtarget].skeleton.num_joints;j++){
-
person[person[0].killtarget].skeleton.joints[j].position=DoRotation(person[person[0].killtarget].skeleton.joints[j].position,0,person[person[0].killtarget].playerrotation,0);
-
person[person[0].killtarget].skeleton.joints[j].position+=person[person[0].killtarget].playercoords;
-
person[person[0].killtarget].skeleton.joints[j].realoldposition=person[person[0].killtarget].skeleton.joints[j].position;
-
person[person[0].killtarget].skeleton.joints[j].velocity=person[person[0].killtarget].velocity;
person[person[0].killtarget].skeleton.joints[j].velocity.x+=abs(Random()%10)-5;
-
person[person[0].killtarget].skeleton.joints[j].velocity.y+=abs(Random()%10)-5;
-
person[person[0].killtarget].skeleton.joints[j].velocity.z+=abs(Random()%10)-5;
-
}
if(person[0].whichgun!=knife){
-
person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[head]].velocity+=DoRotation(flatfacing,0,40,0)*50;
-
person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[head]].velocity+=person[0].velocity*2;
-
}
-
}
-
}
-
}
-
}
//Tackle
@@ -2001,9 +1945,9 @@ void Game::Tick()
continue;
float gLoc[] {
- flatfacing.x / soundscalefactor,
- flatfacing.y / soundscalefactor,
- flatfacing.z / soundscalefactor,
+ flatfacing.x / soundscalefactor / 2,
+ flatfacing.y / soundscalefactor / 2,
+ flatfacing.z / soundscalefactor / 2,
};
alSourcefv(gSourceID[headwhacksound],
@@ -2114,7 +2058,15 @@ void Game::Tick()
person[j].ammo--;
for (int p = 0; p < numshots; p++) {
- XYZ aim = (zoom && j == 0) ? facing : fluidAim(j);
+ XYZ aim;
+ if (j)
+ aim = aimBot(j);
+ else if (!zoom)
+ aim = aimPlayer();
+ else
+ aim = facing;
+ Normalise(&aim);
+
if(person[j].whichgun==sniperrifle){
start=person[j].playercoords+DoRotation(person[j].skeleton.joints[(person[j].skeleton.jointlabels[lefthand])].position,0,person[j].playerrotation,0);
@@ -2743,45 +2695,24 @@ void Game::Tick()
}
person[whichhit].bjoint1=hitstruct.joint1;
-
person[whichhit].bjoint2=hitstruct.joint2;
-
person[whichhit].bleeding=1;
-
person[whichhit].bleeddelay=1;
- float gLoc[3];
-
- gLoc[0]=(camera.position.x+(hitstruct.hitlocation.x-camera.position.x)/4)/soundscalefactor;
-
- gLoc[1]=(camera.position.y+(hitstruct.hitlocation.y-camera.position.y)/4)/soundscalefactor;
-
- gLoc[2]=(camera.position.z+(hitstruct.hitlocation.z-camera.position.z)/4)/soundscalefactor;
-
- if(!hitstruct.joint1->modelnum==headmodel){
-
- if(!thirdperson)alSourcef(gSourceID[bodyhitsound], AL_MIN_GAIN, 1);
-
- if(thirdperson)alSourcef(gSourceID[bodyhitsound], AL_MIN_GAIN, .1);
-
- alSourcefv(gSourceID[bodyhitsound], AL_POSITION, gLoc);
-
- alSourcePlay(gSourceID[bodyhitsound]);
-
- }
-
- if(hitstruct.joint1->modelnum==headmodel){
-
- if(!thirdperson)alSourcef(gSourceID[headshotsound], AL_MIN_GAIN, 1);
-
- if(thirdperson)alSourcef(gSourceID[headshotsound], AL_MIN_GAIN, .1);
-
- alSourcefv(gSourceID[headshotsound], AL_POSITION, gLoc);
-
- alSourcePlay(gSourceID[headshotsound]);
-
- }
-
+ auto hitsound = (hitstruct.joint1->modelnum == headmodel)
+ ? gSourceID[headshotsound]
+ : gSourceID[bodyhitsound];
+ auto hitpos = hitstruct.hitlocation
+ - camera.position;
+ ALfloat gLoc[] {
+ hitpos.x / soundscalefactor / 4,
+ hitpos.y / soundscalefactor / 4,
+ hitpos.z / soundscalefactor / 4,
+ };
+ ALfloat gain = thirdperson ? 0.1f : 1.0f;
+ alSourcef(hitsound, AL_MIN_GAIN, gain);
+ alSourcefv(hitsound, AL_POSITION, gLoc);
+ alSourcePlay(hitsound);
}//with wall
if(oldend==finalwallhit){
@@ -2834,18 +2765,16 @@ void Game::Tick()
}
- float gLoc[3];
-
- gLoc[0]=finalwallhit.x/soundscalefactor;
-
- gLoc[1]=finalwallhit.y/soundscalefactor;
-
- gLoc[2]=finalwallhit.z/soundscalefactor;
-
- alSourcefv(gSourceID[wallhitsound], AL_POSITION, gLoc);
-
+ auto wallhitpos = finalwallhit
+ - camera.position;
+ ALfloat gLoc[] {
+ wallhitpos.x / soundscalefactor,
+ wallhitpos.y / soundscalefactor,
+ wallhitpos.z / soundscalefactor,
+ };
+ alSourcefv(gSourceID[wallhitsound],
+ AL_POSITION, gLoc);
alSourcePlay(gSourceID[wallhitsound]);
-
}
lastshot[0]=start;
@@ -2892,25 +2821,19 @@ void Game::Tick()
}
- if(nearest.x){
-
- if(findDistancefast(nearest,camera.position)<10&&(thirdperson==2||j!=0)){
-
- float gLoc[3];
-
- gLoc[0]=(camera.position.x+(nearest.x-camera.position.x))/soundscalefactor;
-
- gLoc[1]=(camera.position.y+(nearest.y-camera.position.y))/soundscalefactor;
-
- gLoc[2]=(camera.position.z+(nearest.z-camera.position.z))/soundscalefactor;
-
- alSourcefv(gSourceID[nearbulletsound], AL_POSITION, gLoc);
-
- alSourcePlay(gSourceID[nearbulletsound]);
- }
+ if (nearest.x
+ && findDistancefast(nearest, camera.position) < 10
+ && (thirdperson == 2 || j != 0)) {
+ auto nearsound = nearest - camera.position;
+ ALfloat gLoc[] {
+ nearsound.x / soundscalefactor,
+ nearsound.y / soundscalefactor,
+ nearsound.z / soundscalefactor,
+ };
+ alSourcefv(gSourceID[nearbulletsound], AL_POSITION, gLoc);
+ alSourcePlay(gSourceID[nearbulletsound]);
}
}
-
}
}
@@ -3286,15 +3209,14 @@ void Game::Tick()
impact=1;
- sprites.location[i]=hitstruct.hitlocation;
-
- float gLoc[3];
-
- gLoc[0]=(((sprites.location[i].x)-camera.position.x)/findLengthfast(sprites.velocity[i])*5+camera.position.x)/soundscalefactor;
-
- gLoc[1]=(((sprites.location[i].y)-camera.position.y)/findLengthfast(sprites.velocity[i])*5+camera.position.y)/soundscalefactor;
-
- gLoc[2]=(((sprites.location[i].z)-camera.position.z)/findLengthfast(sprites.velocity[i])*5+camera.position.z)/soundscalefactor;
+ sprites.location[i] = hitstruct.hitlocation;
+ auto landpos = sprites.location[i] - camera.position;
+ auto v = findLengthfast(sprites.velocity[i]) * 0.2;
+ ALfloat gLoc[] {
+ landpos.x / v / soundscalefactor,
+ landpos.y / v / soundscalefactor,
+ landpos.z / v / soundscalefactor,
+ };
if(person[j].skeleton.free<1){
@@ -3399,23 +3321,18 @@ void Game::Tick()
sprites.brightness[i]-=multiplier*.3;
if(sprites.brightness[i]<=0||(impact&&sprites.size[i]>1)){
-
sprites.brightness[i]=0;
-
sprites.MakeSprite(smokesprite, 1, 1, 1, 1, sprites.location[i], facing*0, 60);
-
sprites.MakeSprite(muzzleflashsprite, 1, 1, 1, 1, sprites.location[i], facing*0, 9);
- float gLoc[3];
-
- gLoc[0]=(((sprites.location[i].x)-camera.position.x)/3+camera.position.x)/soundscalefactor;
-
- gLoc[1]=(((sprites.location[i].y)-camera.position.y)/3+camera.position.y)/soundscalefactor;
-
- gLoc[2]=(((sprites.location[i].z)-camera.position.z)/3+camera.position.z)/soundscalefactor;
-
+ auto explodepos = sprites.location[i]
+ - camera.position;
+ ALfloat gLoc[] {
+ explodepos.x / 3 / soundscalefactor,
+ explodepos.y / 3 / soundscalefactor,
+ explodepos.z / 3 / soundscalefactor,
+ };
alSourcefv(gSourceID[explosionsound], AL_POSITION, gLoc);
-
alSourcePlay(gSourceID[explosionsound]);
XYZ relation;