Annotation of quake2/rogue/p_trail.c, revision 1.1

1.1     ! root        1: #include "g_local.h"
        !             2: 
        !             3: 
        !             4: /*
        !             5: ==============================================================================
        !             6: 
        !             7: PLAYER TRAIL
        !             8: 
        !             9: ==============================================================================
        !            10: 
        !            11: This is a circular list containing the a list of points of where
        !            12: the player has been recently.  It is used by monsters for pursuit.
        !            13: 
        !            14: .origin                the spot
        !            15: .owner         forward link
        !            16: .aiment                backward link
        !            17: */
        !            18: 
        !            19: 
        !            20: #define        TRAIL_LENGTH    8
        !            21: 
        !            22: edict_t                *trail[TRAIL_LENGTH];
        !            23: int                    trail_head;
        !            24: qboolean       trail_active = false;
        !            25: 
        !            26: #define NEXT(n)                (((n) + 1) & (TRAIL_LENGTH - 1))
        !            27: #define PREV(n)                (((n) - 1) & (TRAIL_LENGTH - 1))
        !            28: 
        !            29: 
        !            30: void PlayerTrail_Init (void)
        !            31: {
        !            32:        int             n;
        !            33: 
        !            34:        if (deathmatch->value /* FIXME || coop */)
        !            35:                return;
        !            36: 
        !            37:        for (n = 0; n < TRAIL_LENGTH; n++)
        !            38:        {
        !            39:                trail[n] = G_Spawn();
        !            40:                trail[n]->classname = "player_trail";
        !            41:        }
        !            42: 
        !            43:        trail_head = 0;
        !            44:        trail_active = true;
        !            45: }
        !            46: 
        !            47: 
        !            48: void PlayerTrail_Add (vec3_t spot)
        !            49: {
        !            50:        vec3_t  temp;
        !            51: 
        !            52:        if (!trail_active)
        !            53:                return;
        !            54: 
        !            55:        VectorCopy (spot, trail[trail_head]->s.origin);
        !            56: 
        !            57:        trail[trail_head]->timestamp = level.time;
        !            58: 
        !            59:        VectorSubtract (spot, trail[PREV(trail_head)]->s.origin, temp);
        !            60:        trail[trail_head]->s.angles[1] = vectoyaw (temp);
        !            61: 
        !            62:        trail_head = NEXT(trail_head);
        !            63: }
        !            64: 
        !            65: 
        !            66: void PlayerTrail_New (vec3_t spot)
        !            67: {
        !            68:        if (!trail_active)
        !            69:                return;
        !            70: 
        !            71:        PlayerTrail_Init ();
        !            72:        PlayerTrail_Add (spot);
        !            73: }
        !            74: 
        !            75: 
        !            76: edict_t *PlayerTrail_PickFirst (edict_t *self)
        !            77: {
        !            78:        int             marker;
        !            79:        int             n;
        !            80: 
        !            81:        if (!trail_active)
        !            82:                return NULL;
        !            83: 
        !            84:        for (marker = trail_head, n = TRAIL_LENGTH; n; n--)
        !            85:        {
        !            86:                if(trail[marker]->timestamp <= self->monsterinfo.trail_time)
        !            87:                        marker = NEXT(marker);
        !            88:                else
        !            89:                        break;
        !            90:        }
        !            91: 
        !            92:        if (visible(self, trail[marker]))
        !            93:        {
        !            94:                return trail[marker];
        !            95:        }
        !            96: 
        !            97:        if (visible(self, trail[PREV(marker)]))
        !            98:        {
        !            99:                return trail[PREV(marker)];
        !           100:        }
        !           101: 
        !           102:        return trail[marker];
        !           103: }
        !           104: 
        !           105: edict_t *PlayerTrail_PickNext (edict_t *self)
        !           106: {
        !           107:        int             marker;
        !           108:        int             n;
        !           109: 
        !           110:        if (!trail_active)
        !           111:                return NULL;
        !           112: 
        !           113:        for (marker = trail_head, n = TRAIL_LENGTH; n; n--)
        !           114:        {
        !           115:                if(trail[marker]->timestamp <= self->monsterinfo.trail_time)
        !           116:                        marker = NEXT(marker);
        !           117:                else
        !           118:                        break;
        !           119:        }
        !           120: 
        !           121:        return trail[marker];
        !           122: }
        !           123: 
        !           124: edict_t *PlayerTrail_LastSpot (void)
        !           125: {
        !           126:        return trail[PREV(trail_head)];
        !           127: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.