00001 #ifndef TRACK_H
00002 #define TRACK_H
00003
00004 #include "genesis.h"
00005 #include "bit.h"
00006 #include "genvsi.h"
00007
00008
00009
00010
00011 #define MAX_TRACKS 100
00012 #define MAX_TRACK_POINTS 30
00013 #define MAX_TRACK_VIS 20
00014
00015 typedef struct Track Track;
00016
00017 typedef struct
00018 {
00019 geVec3d *Pos;
00020 geVec3d *WatchPos;
00021 int32 Action;
00022 int32 ShootTimes;
00023 int32 ActionDir;
00024 int32 Flags;
00025 float Time;
00026 float Dist;
00027 float VelocityScale;
00028 }TrackPt;
00029
00030 typedef struct Track
00031 {
00032 TrackPt PointList[MAX_TRACK_POINTS];
00033 int32 PointCount;
00034 int32 Type;
00035 int32 Flags;
00036 Track* Vis[MAX_TRACK_VIS+1];
00037 int32 VisFlag[MAX_TRACK_VIS+1];
00038 }Track;
00039
00040
00041 typedef struct
00042 {
00043 int32 TrackNdx;
00044 int32 PointNdx;
00045 int32 TrackDir;
00046 }TrackData;
00047
00048 typedef struct TrackCB
00049 {
00050 geBoolean (*CB)(GenVSI *VSI, void *Data, Track *Track);
00051 void *Data;
00052 }TrackCB;
00053
00054 extern int32 TrackCount;
00055 extern Track TrackList[];
00056
00057 geBoolean Track_OnTrack(TrackData *td);
00058 void Track_ClearTrack(TrackData *td);
00059 Track *Track_GetTrack(TrackData *td);
00060 int32 Track_GetDir(TrackData *td);
00061 geBoolean Track_PastStartPoint(TrackData *td);
00062 TrackPt *Track_NextPoint(TrackData *td);
00063 TrackPt *Track_PrevPoint(TrackData *td);
00064 TrackPt *Track_GetPoint(TrackData *td);
00065 float Track_Length(Track* t);
00066 TrackPt* Track_GetEndPoint(TrackData *td);
00067 TrackPt* Track_GetFirstPoint(TrackData *td);
00068 geBoolean Track_IsOneWay(Track *t);
00069 Track* Track_FindTrack(GenVSI *VSI, geVec3d *StartPos, geVec3d *TgtPos, int32 player_dir, int32 *track_type, TrackData *td);
00070 Track* Track_FindFarTrack(GenVSI *VSI, geVec3d *StartPos);
00071 geBoolean Track_FindMultiTrack(GenVSI *VSI, geVec3d *StartPos, geVec3d *EndPos, int32 dir, TrackCB*, Stack *nodestack);
00072 geBoolean Track_NextMultiTrack(GenVSI *VSI, geVec3d *StartPos, int32 TrackNdx, TrackData *td);
00073 void Track_LinkTracks(geWorld *World);
00074 Track* Track_GetNextTrack(Track *t);
00075
00076
00077
00078
00079
00080 #define TRACK_TYPE_UP 1 // Gets bot higher
00081 #define TRACK_TYPE_DOWN 2 // Gets bot lower
00082 #define TRACK_TYPE_ELEVATOR_UP 3 //
00083 #define TRACK_TYPE_ELEVATOR_DOWN 4 // Shortcut - just fall down it
00084 #define TRACK_TYPE_MOVING_PLAT 5 //
00085 #define TRACK_TYPE_SCAN 6 // Run to this point and look for something else
00086 #define TRACK_TYPE_HIDE 7 // Move to this point and wait for player
00087 #define TRACK_TYPE_EXIT 8 // There is an exit here
00088 #define TRACK_TYPE_SCAN_HEALTH 9 // Bot can see health from here
00089 #define TRACK_TYPE_TRAVERSE 10 // Traverse a obsticles
00090 #define TRACK_TYPE_SCAN_LOOP 11 // Run around in this loop to search for player
00091 #define TRACK_TYPE_SCAN_WEAPON_AMMO 12 // Bot can see weapons or ammo from here
00092 #define TRACK_TYPE_TRAVERSE_DOOR 13 // Bot can see weapons or ammo from here
00093 #define TRACK_TYPE_TRAVERSE_ONEWAY 14 // Bot can see weapons or ammo from here
00094
00095 #define TRACK_FLAG_LOOP BIT(0)
00096
00097
00098
00099
00100
00101 #define POINT_TYPE_JUMP 1
00102 #define POINT_TYPE_WAIT_POINT_DIST 2
00103 #define POINT_TYPE_ROCKET_JUMP 3
00104 #define POINT_TYPE_WAIT_FOR_PLAYER 4 //
00105 #define POINT_TYPE_WAIT_POINT_VISIBLE 5 //doors
00106 #define POINT_TYPE_LOOK_FOR_ITEMS 6
00107 #define POINT_TYPE_BLASTER_JUMP 7
00108
00109 #define POINT_TYPE_SHOOT_BLASTER 20
00110 #define POINT_TYPE_SHOOT_GRENADE 21
00111 #define POINT_TYPE_SHOOT_ROCKET 22
00112 #define POINT_TYPE_SHOOT_SHREDDER 23
00113
00114 #endif