summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/Camera.h48
-rw-r--r--src/Game.h1
-rw-r--r--src/GameTick.cpp176
3 files changed, 95 insertions, 130 deletions
diff --git a/src/Camera.h b/src/Camera.h
index 538c4ac..7746537 100644
--- a/src/Camera.h
+++ b/src/Camera.h
@@ -1,23 +1,41 @@
-#ifndef _CAMERA_H_
-#define _CAMERA_H_
+// Camera object
+// Copyright (C) 2002  David Rosen
+// Copyright (C) 2003  Steven Fuller
+// Copyright (C) 2003  Zachary Jack Slater
+// Copyright (C) 2021  Nguyễn Gia Phong
+//
+// This file is part of Black Shades.
+//
+// Black Shades is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published
+// by the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Black Shades is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Black Shades.  If not, see <https://www.gnu.org/licenses/>.
+
+#ifndef BLACKSHADES_CAMERA_H
+#define BLACKSHADES_CAMERA_H
 
-/**> HEADER FILES <**/
 #include <GL/gl.h>
 
 #include "Quaternions.h"
 
-class Camera
-{
-	public:
-		XYZ position;
-		XYZ oldposition;
-		XYZ targetoffset;
+class Camera {
+public:
+	XYZ position;
+	XYZ oldposition;
+	XYZ targetoffset;
 
-		float rotation, rotation2;
-		float oldrotation, oldrotation2;
-		float oldoldrotation, oldoldrotation2;
-		float visrotation,  visrotation2;
-		void Apply();
+	float rotation, rotation2;
+	float oldrotation, oldrotation2;
+	float visrotation, visrotation2;
+	void Apply();
 };
 
-#endif
+#endif // BLACKSHADES_CAMERA_H
diff --git a/src/Game.h b/src/Game.h
index 69289d7..a8d093d 100644
--- a/src/Game.h
+++ b/src/Game.h
@@ -56,6 +56,7 @@ class Game {
 	void updateSong();
 	void handleMenu(unsigned char*);
 	void handleToggles(unsigned char*);
+	void mouseLook();
 public:
 	// Event loop
 	Boolean	gQuit;
diff --git a/src/GameTick.cpp b/src/GameTick.cpp
index 0d13e2d..d8c8801 100644
--- a/src/GameTick.cpp
+++ b/src/GameTick.cpp
@@ -206,7 +206,6 @@ void Game::handleToggles(unsigned char* theKeyMap)
 
 				camera.visrotation = camera.rotation;
 				camera.oldrotation = camera.rotation;
-				camera.oldoldrotation = camera.rotation;
 			}
 
 			person[0].playercoords = bodycoords;
@@ -251,12 +250,68 @@ void Game::handleToggles(unsigned char* theKeyMap)
 		slomo = 2;
 		score -= 20;
 
-		alSourcef(gSourceID[knifesong], AL_PITCH, (ALfloat)(.5));
-		alSourcef(gSourceID[shootsong], AL_PITCH, (ALfloat)(.5));
-		alSourcef(gSourceID[zombiesong], AL_PITCH, (ALfloat)(.5));
+		alSourcef(gSourceID[knifesong], AL_PITCH, 0.5f);
+		alSourcef(gSourceID[shootsong], AL_PITCH, 0.5f);
+		alSourcef(gSourceID[zombiesong], AL_PITCH, 0.5f);
 	}
 }
 
+void Game::mouseLook()
+{
+	if ((person[0].aimamount <= 0
+	     && person[0].targetanimation != crouchanim)) {
+		camera.rotation = camera.visrotation;
+		camera.rotation2 = camera.visrotation2;
+		mousesensitivity = usermousesensitivity;
+	} else if (person[0].aimamount >= 1 && !zoom) {
+		mousesensitivity = usermousesensitivity * 0.8;
+	}
+	if (slomo == 2)
+		mousesensitivity *= 0.6;
+
+	GetMouseRel(&mouseloc);
+	auto factor = mousesensitivity / 1.3888;
+	mouserotation = mouseloc.h * factor;
+	mouserotation2 = mouseloc.v * factor;
+	if (abs(mouseloc.h) < 400)
+		camera.rotation += mouserotation;
+	if (abs(mouseloc.v) < 200)
+		camera.rotation2 += mouserotation2;
+
+	auto hrot = factor * 500;
+	if (mouseloc.h > 400)
+		camera.rotation += mouserotation - hrot;
+	if (mouseloc.h < -400)
+		camera.rotation += mouserotation + hrot;
+
+	auto vrot = factor * 300;
+	if (mouseloc.v > 200)
+		camera.rotation2 += mouserotation2 - vrot;
+	if (mouseloc.v < -200)
+		camera.rotation2 += mouserotation2 + vrot;
+	camera.rotation2 = min(max(camera.rotation2, -89.0f), 89.0f);
+
+	// Smooth
+	camera.rotation = camera.rotation * 0.7 + camera.oldrotation * 0.3;
+	camera.rotation2 = camera.rotation2 * 0.7 + camera.oldrotation2 * 0.3;
+
+	if (zoom || visions || person[0].aimamount <= 0
+	    || person[0].whichgun == nogun
+	    || person[0].whichgun == grenade
+	    || person[0].whichgun == knife) {
+		camera.visrotation = camera.rotation;
+		camera.visrotation2 = camera.rotation2;
+	} else {
+		camera.visrotation = min(camera.rotation + 7,
+			max(camera.rotation - 7, camera.visrotation));
+		camera.visrotation2 = min(camera.rotation2 + 15,
+			max(camera.rotation2 - 15, camera.visrotation2));
+	}
+
+	camera.oldrotation = camera.rotation;
+	camera.oldrotation2 = camera.rotation2;
+}
+
 void Game::Tick()
 {
 	unsigned char theKeyMap[16];
@@ -328,117 +383,7 @@ void Game::Tick()
 	Normalise(&flatfacing);
 
 	handleToggles(theKeyMap);
-
-	// Mouse look
-	if((person[0].aimamount<=0&&person[0].targetanimation!=crouchanim)){
-
-		camera.rotation=camera.visrotation;
-
-		camera.rotation2=camera.visrotation2;
-
-		mousesensitivity=usermousesensitivity;
-
-	}
-
-	if(person[0].aimamount>=1&&zoom==0){
-
-		mousesensitivity=usermousesensitivity*.8;
-
-	}
-
-	if(slomo==2){
-
-		mousesensitivity*=.6;
-
-	}
-
-// DDOI
-	GetMouse(&mouseloc);
-
-	if (mouseloc.h>600){MoveMouse(mouseloc.h-500,mouseloc.v,&mouseloc);}
-
-	if (mouseloc.h<100){MoveMouse(mouseloc.h+500,mouseloc.v,&mouseloc);}
-
-	GetMouse(&mouseloc);
-
-	if (mouseloc.v>400){MoveMouse(mouseloc.h,mouseloc.v-300,&mouseloc);}
-
-	if (mouseloc.v<100){MoveMouse(mouseloc.h,mouseloc.v+300,&mouseloc);}
-
-	GetMouse(&mouseloc);
-
-
-	GetMouseRel(&mouseloc);
-
-
-// DDOI
-	oldmouserotation=(oldmouseloc.h/1.3888)*mousesensitivity;
-
-	oldmouserotation2=(oldmouseloc.v/1.3888)*mousesensitivity;
-
-
-	mouserotation=(mouseloc.h/1.3888)*mousesensitivity;
-
-	mouserotation2=(mouseloc.v/1.3888)*mousesensitivity;
-
-// DDOI
-	if(abs(oldmouseloc.h-mouseloc.h)<400)camera.rotation+=mouserotation-oldmouserotation;
-
-	if(abs(oldmouseloc.v-mouseloc.v)<200)camera.rotation2+=mouserotation2-oldmouserotation2;
-
-	if(mouseloc.h-oldmouseloc.h>400)camera.rotation+=mouserotation-oldmouserotation-(500/1.3888*mousesensitivity);
-
-	if(mouseloc.h-oldmouseloc.h<-400)camera.rotation+=mouserotation-oldmouserotation+(500/1.3888*mousesensitivity);
-
-	if(mouseloc.v-oldmouseloc.v>200)camera.rotation2+=mouserotation2-oldmouserotation2-(300/1.3888*mousesensitivity);
-
-	if(mouseloc.v-oldmouseloc.v<-200)camera.rotation2+=mouserotation2-oldmouserotation2+(300/1.3888*mousesensitivity);
-
-	if(abs(mouseloc.h)<400)camera.rotation+=mouserotation;
-	if(abs(mouseloc.v)<200)camera.rotation2+=mouserotation2;
-	if(mouseloc.h>400)camera.rotation+=mouserotation-(500/1.3888*mousesensitivity);
-	if(mouseloc.h<-400)camera.rotation+=mouserotation+(500/1.3888*mousesensitivity);
-
-	if(mouseloc.v>200)camera.rotation2+=mouserotation2-(300/1.3888*mousesensitivity);
-
-	if(mouseloc.v<-200)camera.rotation2+=mouserotation2+(300/1.3888*mousesensitivity);
-
-
-	if(camera.rotation2>89){camera.rotation2=89;}
-
-	if(camera.rotation2<-89){camera.rotation2=-89;}
-
-	//Smooth
-
-	camera.rotation=(camera.oldoldrotation+((camera.rotation-camera.oldoldrotation)*.7+(camera.oldrotation-camera.oldoldrotation)*.3));
-
-	camera.rotation2=(camera.oldoldrotation2+((camera.rotation2-camera.oldoldrotation2)*.7+(camera.oldrotation2-camera.oldoldrotation2)*.3));
-
-	if(camera.visrotation<camera.rotation-7)camera.visrotation=camera.rotation-7;
-
-	if(camera.visrotation>camera.rotation+7)camera.visrotation=camera.rotation+7;
-
-	if(camera.visrotation2<camera.rotation2-15)camera.visrotation2=camera.rotation2-15;
-
-	if(camera.visrotation2>camera.rotation2+15)camera.visrotation2=camera.rotation2+15;
-
-	if(zoom||person[0].aimamount<=0||person[0].whichgun==nogun||visions||person[0].whichgun==grenade||person[0].whichgun==knife){
-
-		camera.visrotation=camera.rotation;
-
-		camera.visrotation2=camera.rotation2;
-
-	}
-
-	oldzoom=zoom;
-
-	camera.oldoldrotation=camera.oldrotation;
-
-	camera.oldoldrotation2=camera.oldrotation2;
-
-	camera.oldrotation=camera.rotation;
-
-	camera.oldrotation2=camera.rotation2;
+	mouseLook();
 
 	//Check collision with buildings
 
@@ -1059,6 +1004,7 @@ void Game::Tick()
 			 	if(person[i].recoil<0)person[i].recoil=0;
 
 				if(i==0){
+					oldzoom = zoom;
 					if(zoom){
 						mousesensitivity=.05*usermousesensitivity;
 						if(person[i].targetanimation!=crouchanim||person[i].currentanimation!=crouchanim||person[i].aiming<1){