00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "revolt.h"
00018 #ifndef _PSX
00019 #include "main.h"
00020 #endif
00021 #include "geom.h"
00022 #include "particle.h"
00023 #include "model.h"
00024 #include "aerial.h"
00025 #include "newcoll.h"
00026 #include "body.h"
00027 #include "car.h"
00028 #include "ctrlread.h"
00029 #include "object.h"
00030 #include "Control.h"
00031 #include "player.h"
00032 #include "move.h"
00033 #include "move.h"
00034 #include "ai.h"
00035 #include "ai_car.h"
00036 #include "ai_init.h"
00037 #ifdef _PC
00038 #include "sfx.h"
00039 #endif
00040 #include "field.h"
00041
00042
00043
00044
00045
00046 PLAYER *s_NextFreePlayer;
00047
00048
00049
00050
00051
00052 PLAYER Players[MAX_NUM_PLAYERS];
00053 PLAYER *PLR_PlayerHead = NULL;
00054 PLAYER *PLR_PlayerTail = NULL;
00055
00056
00057 PLAYER *PLR_LocalPlayer = NULL;
00058 CTRL_TYPE PLR_LocalCtrlType;
00059
00060 long NumPlayers;
00061
00062
00063
00064
00065
00066 void PLR_InitPlayers(void);
00067 PLAYER *PLR_CreatePlayer(PLAYER_TYPE Type, CTRL_TYPE CtrlType, CAR_TYPE CarType, VEC *Pos, MAT *Mat);
00068 void PLR_KillPlayer(PLAYER *Player);
00069 void CreatePlayerForceField(PLAYER *player);
00070
00071
00072
00073 void PLR_InitPlayers(void)
00074 {
00075 long ii;
00076
00077 for (ii = 0; ii < MAX_NUM_PLAYERS; ii++)
00078 {
00079 Players[ii].type = PLAYER_NONE;
00080 Players[ii].score = 0;
00081 Players[ii].lastscore = 0;
00082 Players[ii].raceswon = 0;
00083 Players[ii].ctrlhandler = NULL;
00084 Players[ii].conhandler = NULL;
00085 Players[ii].Slot = ii;
00086 }
00087
00088 NumPlayers = 0;
00089 s_NextFreePlayer = Players;
00090
00091 Players[0].prev = NULL;
00092 Players[0].next = &(Players[1]);
00093
00094 for (ii = 1; ii < (MAX_NUM_PLAYERS - 1); ii++)
00095 {
00096 Players[ii].prev = &(Players[ii - 1]);
00097 Players[ii].next = &(Players[ii + 1]);
00098 }
00099
00100 Players[MAX_NUM_PLAYERS - 1].prev = &(Players[MAX_NUM_PLAYERS - 2]);
00101 Players[MAX_NUM_PLAYERS - 1].next = NULL;
00102
00103 PLR_PlayerHead = NULL;
00104 PLR_PlayerTail = NULL;
00105 }
00106
00107
00108
00109 PLAYER *PLR_CreatePlayer(PLAYER_TYPE Type, CTRL_TYPE CtrlType, CAR_TYPE CarType, VEC *Pos, MAT *Mat)
00110 {
00111 PLAYER *newplayer;
00112 OBJECT *newobj;
00113
00114
00115 if (s_NextFreePlayer == NULL) {
00116 return NULL;
00117 }
00118 #ifdef _PC
00119 Assert(NumPlayers <= MAX_NUM_PLAYERS);
00120 #endif
00121
00122 newobj = OBJ_AllocObject();
00123 if (newobj == NULL)
00124 {
00125 return(NULL);
00126 }
00127
00128 newplayer = s_NextFreePlayer;
00129
00130 s_NextFreePlayer = s_NextFreePlayer->next;
00131 if (s_NextFreePlayer != NULL)
00132 {
00133 s_NextFreePlayer->prev = NULL;
00134 }
00135
00136 newplayer->prev = PLR_PlayerTail;
00137
00138 if (PLR_PlayerHead == NULL)
00139 {
00140 PLR_PlayerHead = newplayer;
00141 }
00142 else
00143 {
00144 PLR_PlayerTail->next = newplayer;
00145 }
00146 PLR_PlayerTail = newplayer;
00147
00148 newplayer->next = NULL;
00149
00150 newplayer->ownobj = newobj;
00151 newplayer->ownobj->player = newplayer;
00152 newplayer->car.Body = &newplayer->ownobj->body;
00153 newplayer->type = Type;
00154
00155 newplayer->ctrltype = CtrlType;
00156 newplayer->conhandler = NULL;
00157 #ifndef _PSX
00158 CRD_InitPlayerControl(newplayer, CtrlType);
00159 #endif
00160
00161 newplayer->ownobj->flag.Draw = FALSE;
00162 newplayer->ownobj->flag.Move = TRUE;
00163 newplayer->ownobj->renderhandler = NULL;
00164 newplayer->ownobj->freehandler = NULL;
00165 newplayer->ownobj->Type = OBJECT_TYPE_CAR;
00166 newplayer->ownobj->Field = NULL;
00167
00168 if (Type == PLAYER_LOCAL)
00169 {
00170 #ifndef _PSX
00171 newplayer->conhandler = (CON_HANDLER)CON_LocalCarControl;
00172 #endif
00173 newplayer->ownobj->aihandler = (AI_HANDLER)AI_CarAiHandler;
00174 newplayer->ownobj->CollType = COLL_TYPE_CAR;
00175 newplayer->ownobj->movehandler = (MOVE_HANDLER)MOV_MoveCarNew;
00176 newplayer->ownobj->collhandler = (COLL_HANDLER)COL_CarCollHandler;
00177 }
00178 else if (Type == PLAYER_CPU)
00179 {
00180 newplayer->ownobj->aihandler = (AI_HANDLER)AI_CarAiHandler;
00181 newplayer->ownobj->CollType = COLL_TYPE_CAR;
00182 newplayer->ownobj->movehandler = (MOVE_HANDLER)MOV_MoveCarNew;
00183 newplayer->ownobj->collhandler = (COLL_HANDLER)COL_CarCollHandler;
00184 }
00185 #ifdef _PC
00186 else if (Type == PLAYER_GHOST)
00187 {
00188 newplayer->ownobj->CollType = COLL_TYPE_NONE;
00189 newplayer->ownobj->movehandler = NULL;
00190 newplayer->ownobj->collhandler = NULL;
00191 newplayer->ownobj->aihandler = (AI_HANDLER)AI_GhostCarAiHandler;
00192 }
00193 else if (Type == PLAYER_REMOTE)
00194 {
00195 newplayer->conhandler = (CON_HANDLER)CON_LocalCarControl;
00196 newplayer->ownobj->CollType = COLL_TYPE_CAR;
00197 newplayer->ownobj->movehandler = (MOVE_HANDLER)MOV_MoveCarNew;
00198 newplayer->ownobj->collhandler = (COLL_HANDLER)COL_CarCollHandler;
00199 newplayer->ownobj->aihandler = (AI_HANDLER)AI_RemoteAiHandler;
00200 }
00201
00202 #endif
00203 else
00204 {
00205 newplayer->ownobj->CollType = COLL_TYPE_NONE;
00206 newplayer->ownobj->movehandler = NULL;
00207 newplayer->ownobj->collhandler = NULL;
00208 newplayer->ownobj->aihandler = NULL;
00209 }
00210
00211 AI_InitPlayerAI(newplayer);
00212
00213 InitCar(&newplayer->car);
00214 SetupCar(newplayer, CarType);
00215 SetCarPos(&newplayer->car, Pos, Mat);
00216
00217 #ifndef _PSX
00218 CAI_InitCarAI(newplayer, 0);
00219 #endif
00220
00221 NumPlayers++;
00222
00223 newplayer->PickupCycleSpeed = 0;
00224 newplayer->PickupNum = 0;
00225 newplayer->ValidRailCamNode = -1;
00226 newplayer->LastValidRailCamNode = -1;
00227
00228 return(newplayer);
00229 }
00230
00231
00232
00233 void PLR_SetPlayerType(PLAYER *player, PLAYER_TYPE type)
00234 {
00235 player->type = type;
00236
00237 if (type == PLAYER_LOCAL)
00238 {
00239 #if defined(_N64)
00240 player->ctrltype = CTRL_TYPE_STD;
00241 CRD_InitPlayerControl(player, CTRL_TYPE_STD);
00242 player->conhandler = (CON_HANDLER)CON_LocalCarControl;
00243 #elif defined(_PC)
00244 player->ctrltype = PLR_LocalCtrlType;
00245 CRD_InitPlayerControl(player, player->ctrltype);
00246 player->conhandler = (CON_HANDLER)CON_LocalCarControl;
00247 #elif defined(_PSX)
00248 player->ctrltype = PLR_LocalCtrlType;
00249 #endif
00250 }
00251 else if (type == PLAYER_CPU)
00252 {
00253 player->ctrltype = CTRL_TYPE_NONE;
00254 #ifndef _PSX
00255 CRD_InitPlayerControl(player, player->ctrltype);
00256 #endif
00257 player->conhandler = NULL;
00258 }
00259 }
00260
00261
00262
00263 void PLR_KillPlayer(PLAYER *Player)
00264 {
00265 FreeCar(Player);
00266 OBJ_FreeObject(Player->ownobj);
00267
00268 if (Player->prev != NULL)
00269 {
00270 (Player->prev)->next = Player->next;
00271 }
00272 else
00273 {
00274 PLR_PlayerHead = Player->next;
00275 }
00276
00277 if (Player->next != NULL)
00278 {
00279 (Player->next)->prev = Player->prev;
00280 }
00281 else
00282 {
00283 PLR_PlayerTail = Player->prev;
00284 }
00285
00286
00287 if (s_NextFreePlayer != NULL)
00288 {
00289 s_NextFreePlayer->prev = Player;
00290 }
00291
00292 Player->next = s_NextFreePlayer;
00293 Player->prev = NULL;
00294 s_NextFreePlayer = Player;
00295
00296
00297
00298 Player->type = PLAYER_NONE;
00299 Player->ownobj = NULL;
00300
00301
00302 NumPlayers--;
00303 }
00304
00305
00306
00307 void PLR_KillAllPlayers(void)
00308 {
00309 int iP;
00310
00311 for (iP = 0; iP < MAX_NUM_PLAYERS; iP++)
00312 {
00313 if (Players[iP].type != PLAYER_NONE)
00314 {
00315 PLR_KillPlayer(&Players[iP]);
00316 }
00317 }
00318 }
00319
00320
00322
00323
00324
00326
00327 void CreatePlayerForceField(PLAYER *player)
00328 {
00329 BBOX bBox;
00330 VEC size;
00331
00332 SetBBox(&bBox, -1.73f * CAR_RADIUS, 1.73f * CAR_RADIUS, -1.73f * CAR_RADIUS, 1.73f * CAR_RADIUS, -1.73f * CAR_RADIUS, 1.73f * CAR_RADIUS);
00333 SetVec(&size, CAR_RADIUS, CAR_RADIUS, CAR_RADIUS);
00334
00335 player->ownobj->Field = AddLocalField(
00336 player->ownobj->ObjID,
00337 FIELD_PRIORITY_MAX,
00338 &player->car.Body->Centre.Pos,
00339 &player->car.Body->Centre.WMatrix,
00340 &bBox,
00341 &size,
00342 &player->car.FieldVec,
00343 ONE,
00344 ZERO);
00345 }
00346