aboutsummaryrefslogtreecommitdiffstats
path: root/src/jake2/game/PlayerTrail.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jake2/game/PlayerTrail.java')
-rw-r--r--src/jake2/game/PlayerTrail.java151
1 files changed, 151 insertions, 0 deletions
diff --git a/src/jake2/game/PlayerTrail.java b/src/jake2/game/PlayerTrail.java
new file mode 100644
index 0000000..09af3d8
--- /dev/null
+++ b/src/jake2/game/PlayerTrail.java
@@ -0,0 +1,151 @@
+/*
+Copyright (C) 1997-2001 Id Software, Inc.
+
+This program 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 2
+of the License, or (at your option) any later version.
+
+This program 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 this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+// Created on 13.11.2003 by RST.
+// $Id: PlayerTrail.java,v 1.1 2004-07-07 19:59:23 hzi Exp $
+
+package jake2.game;
+
+import jake2.util.*;
+import jake2.util.*;
+
+public class PlayerTrail extends PlayerHud {
+
+ /*
+ ==============================================================================
+
+ PLAYER TRAIL
+
+ ==============================================================================
+
+ This is a circular list containing the a list of points of where
+ the player has been recently. It is used by monsters for pursuit.
+
+ .origin the spot
+ .owner forward link
+ .aiment backward link
+ */
+
+ static int TRAIL_LENGTH= 8;
+
+ static edict_t trail[]= new edict_t[TRAIL_LENGTH];
+ static {
+ //TODO: potential error
+ for (int n=0; n < TRAIL_LENGTH; n++)
+ trail[n] = new edict_t(n);
+ }
+ static int trail_head;
+ static boolean trail_active= false;
+
+ static int NEXT(int n) {
+ return (n + 1) % TRAIL_LENGTH;
+ }
+
+ static int PREV(int n) {
+ return (n + TRAIL_LENGTH - 1) % TRAIL_LENGTH;
+ }
+
+ static void Init() {
+
+ // FIXME || coop
+ if (deathmatch.value != 0)
+ return;
+
+ for (int n= 0; n < TRAIL_LENGTH; n++) {
+ trail[n]= G_Spawn();
+ trail[n].classname= "player_trail";
+ }
+
+ trail_head= 0;
+ trail_active= true;
+ }
+
+ static void Add(float[] spot) {
+ float[] temp= { 0, 0, 0 };
+
+ if (!trail_active)
+ return;
+
+ Math3D.VectorCopy(spot, trail[trail_head].s.origin);
+
+ trail[trail_head].timestamp= level.time;
+
+ Math3D.VectorSubtract(spot, trail[PREV(trail_head)].s.origin, temp);
+ trail[trail_head].s.angles[1]= Math3D.vectoyaw(temp);
+
+ trail_head= NEXT(trail_head);
+ }
+
+ static void New(float[] spot) {
+ if (!trail_active)
+ return;
+
+ Init();
+ Add(spot);
+ }
+
+ static edict_t PickFirst(edict_t self) {
+
+ if (!trail_active)
+ return null;
+
+ int marker= trail_head;
+
+ for (int n= TRAIL_LENGTH; n > 0; n--) {
+ if (trail[marker].timestamp <= self.monsterinfo.trail_time)
+ marker= NEXT(marker);
+ else
+ break;
+ }
+
+ if (visible(self, trail[marker])) {
+ return trail[marker];
+ }
+
+ if (visible(self, trail[PREV(marker)])) {
+ return trail[PREV(marker)];
+ }
+
+ return trail[marker];
+ }
+
+ static edict_t PickNext(edict_t self) {
+ int marker;
+ int n;
+
+ if (!trail_active)
+ return null;
+
+ for (marker= trail_head, n= TRAIL_LENGTH; n > 0; n--) {
+ if (trail[marker].timestamp <= self.monsterinfo.trail_time)
+ marker= NEXT(marker);
+ else
+ break;
+ }
+
+ return trail[marker];
+ }
+
+ static edict_t LastSpot() {
+ return trail[PREV(trail_head)];
+ }
+
+
+}