TORCS  1.3.9
The Open Racing Car Simulator
racemain.cpp
Go to the documentation of this file.
1 /***************************************************************************
2 
3  file : racemain.cpp
4  created : Sat Nov 16 12:13:31 CET 2002
5  copyright : (C) 2002-2017 by Eric Espie, Bernhard Wymann
6  email : eric.espie@torcs.org
7  version : $Id$
8 
9  ***************************************************************************/
10 
11 /***************************************************************************
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * *
18  ***************************************************************************/
19 
26 #include <stdlib.h>
27 #include <stdio.h>
28 #include <tgfclient.h>
29 #include <raceman.h>
30 #include <robot.h>
31 #include <racescreens.h>
32 #include <exitmenu.h>
34 #include <portability.h>
35 
36 #include "raceengine.h"
37 #include "raceinit.h"
38 #include "racegl.h"
39 #include "raceresults.h"
40 #include "racestate.h"
41 #include "racemanmenu.h"
42 
43 #include "racemain.h"
44 
45 /***************************************************************/
46 /* ABANDON RACE HOOK */
47 
48 static void *AbandonRaceHookHandle = 0;
49 
50 static void
51 AbandonRaceHookActivate(void * /* vforce */)
52 {
53  // Shutdown current event.
55 
56  /* Return to race menu */
57  ReInfo->_reState = RE_STATE_CONFIG;
58 
59  GfuiScreenActivate(ReInfo->_reGameScreen);
60 }
61 
62 static void *
64 {
66  return AbandonRaceHookHandle;
67  }
68 
70 
71  return AbandonRaceHookHandle;
72 }
73 
74 static void *AbortRaceHookHandle = 0;
75 
76 static void
77 AbortRaceHookActivate(void * /* dummy */)
78 {
79  GfuiScreenActivate(ReInfo->_reGameScreen);
80 
81  ReInfo->_reSimItf.shutdown();
82  if (ReInfo->_displayMode == RM_DISP_MODE_NORMAL) {
83  ReInfo->_reGraphicItf.shutdowncars();
85  }
86  ReInfo->_reGraphicItf.shutdowntrack();
88 
89  FREEZ(ReInfo->_reCarInfo);
90  /* Return to race menu */
91  ReInfo->_reState = RE_STATE_CONFIG;
92 }
93 
94 static void *
96 {
97  if (AbortRaceHookHandle) {
98  return AbortRaceHookHandle;
99  }
100 
102 
103  return AbortRaceHookHandle;
104 }
105 
106 int
108 {
109  void *params = ReInfo->params;
110 
111  RmLoadingScreenStart(ReInfo->_reName, "data/img/splash-qrloading.png");
112  ReInitTrack();
113  if (
114  (ReInfo->_displayMode != RM_DISP_MODE_CONSOLE) &&
115  (ReInfo->_reGraphicItf.inittrack != 0)
116  ) {
117  RmLoadingScreenSetText("Loading Track 3D Description...");
118  ReInfo->_reGraphicItf.inittrack(ReInfo->track);
119  };
121 
122  if (
123  (GfParmGetEltNb(params, RM_SECT_TRACKS) > 1) &&
124  (ReInfo->_displayMode != RM_DISP_MODE_NONE) &&
125  (ReInfo->_displayMode != RM_DISP_MODE_CONSOLE)
126  ) {
127  ReNewTrackMenu();
128  return RM_ASYNC | RM_NEXT_STEP;
129  }
130  return RM_SYNC | RM_NEXT_STEP;
131 }
132 
133 
135 {
136  // Invalidate best lap time when wall is hit?
138  if (!strcmp(value, RM_VAL_YES)) {
140  }
141 
142  // Invalidate best lap time when corner is cut?
144  if (!strcmp(value, RM_VAL_YES)) {
146  }
147 
148  // Time penalty for corner cutting?
150  if (!strcmp(value, RM_VAL_YES)) {
152  }
153 
154  // Fuel consumption factor
155  tdble number = GfParmGetNum(ReInfo->params, ReInfo->_reRaceName, RM_ATTR_FUEL_FACTOR, NULL, 1.0f);
156  if (number < 0.0f) number = 0.0f; // Avoid negative factor
157  ReInfo->raceRules.fuelFactor = number;
158 
159  // Damage factor
160  number = GfParmGetNum(ReInfo->params, ReInfo->_reRaceName, RM_ATTR_DAMAGE_FACTOR, NULL, 1.0f);
161  if (number < 0.0f) number = 0.0f; // Avoid negative factor
162  ReInfo->raceRules.damageFactor = number;
163 
164  // Tire model factor, for 0.0 the model is switched completely off
165  number = GfParmGetNum(ReInfo->params, ReInfo->_reRaceName, RM_ATTR_TIRE_FACTOR, NULL, 1.0f);
166  if (number < 0.0f) number = 0.0f; // Avoid negative factor
167  ReInfo->raceRules.tireFactor = number;
168 
169  // Refuel fuel flow
170  number = GfParmGetNum(ReInfo->params, ReInfo->_reRaceName, RM_ATTR_REFUEL_FUEL_FLOW, NULL, 8.0f);
171  if (number < 1.0f) number = 1.0f; // Avoid division by zero or negative pit times
172  ReInfo->raceRules.refuelFuelFlow = number;
173 
174  // Damage repair factor
175  number = GfParmGetNum(ReInfo->params, ReInfo->_reRaceName, RM_ATTR_DAMAGE_REPAIR_FACTOR, NULL, 0.007f);
176  if (number < 0.0f) number = 0.0f; // Avoid negative pit times
178 
179  // Pit stop base time (time for a stop even if nothing is done)
180  number = GfParmGetNum(ReInfo->params, ReInfo->_reRaceName, RM_ATTR_PITSTOP_BASE_TIME, NULL, 2.0f);
181  if (number < 0.0f) number = 0.0f; // Avoid negative pit times
182  ReInfo->raceRules.pitstopBaseTime = number;
183 
184  // Tire change time for all 4 tires
185  number = GfParmGetNum(ReInfo->params, ReInfo->_reRaceName, RM_ATTR_ALL_TIRES_CHANGE_TIME, NULL, 16.0f);
186  if (number < 0.0f) number = 0.0f; // Avoid negative tire change times
188 
189  // Race specific pit speed limit, if available
190  number = ReInfo->track->pits.speedLimit;
191  number = GfParmGetNum(ReInfo->params, ReInfo->_reRaceName, RM_ATTR_PIT_SPEED_LIMIT, NULL, number);
192  ReInfo->track->pits.speedLimit = number;
193 }
194 
195 
196 int RePreRace(void)
197 {
198  tdble dist;
199  void *params = ReInfo->params;
200  void *results = ReInfo->results;
201  const int BUFSIZE = 1024;
202  char path[BUFSIZE];
203 
204  const char* raceName = ReInfo->_reRaceName = ReGetCurrentRaceName();
205  if (!raceName) {
206  return RM_QUIT;
207  }
208 
209  dist = GfParmGetNum(params, raceName, RM_ATTR_DISTANCE, NULL, 0);
210  if (dist < 0.001) {
211  ReInfo->s->_totLaps = (int)GfParmGetNum(params, raceName, RM_ATTR_LAPS, NULL, 30);
212  } else {
213  ReInfo->s->_totLaps = ((int)(dist / ReInfo->track->length)) + 1;
214  }
215  ReInfo->s->_maxDammage = (int)GfParmGetNum(params, raceName, RM_ATTR_MAX_DMG, NULL, 10000);
216 
217  const char* raceType = GfParmGetStr(params, raceName, RM_ATTR_TYPE, RM_VAL_RACE);
218  if (!strcmp(raceType, RM_VAL_RACE)) {
219  ReInfo->s->_raceType = RM_TYPE_RACE;
220  } else if (!strcmp(raceType, RM_VAL_QUALIF)) {
221  ReInfo->s->_raceType = RM_TYPE_QUALIF;
222  } else if (!strcmp(raceType, RM_VAL_PRACTICE)) {
223  ReInfo->s->_raceType = RM_TYPE_PRACTICE;
224  }
225 
226  ReInfo->s->_raceState = 0;
227 
228  /* Cleanup results */
229  snprintf(path, BUFSIZE, "%s/%s/%s", ReInfo->track->name, RE_SECT_RESULTS, raceName);
230  GfParmListClean(results, path);
231 
233 
234  return RM_SYNC | RM_NEXT_STEP;
235 }
236 
237 
238 /* return state mode */
239 static int reRaceRealStart(void)
240 {
241  int i, j;
242  int sw, sh, vw, vh;
243  tRobotItf *robot;
244  tReCarInfo *carInfo;
245  const int BUFSIZE = 1024;
246  char buf[BUFSIZE];
247  int foundHuman;
248  void *params = ReInfo->params;
249  void *results = ReInfo->results;
250  tSituation *s = ReInfo->s;
251 
252  RmLoadingScreenSetText("Loading Simulation Engine...");
253  const char* dllname = GfParmGetStr(ReInfo->_reParam, "Modules", "simu", "");
254  snprintf(buf, BUFSIZE, "%smodules/simu/%s.%s", GetLibDir (), dllname, DLLEXT);
255  if (GfModLoad(0, buf, &ReRaceModList)) return RM_QUIT;
257 
258  if (ReInitCars()) {
259  return RM_QUIT;
260  }
261 
262  /* Blind mode or not */
263  if (ReInfo->_displayMode != RM_DISP_MODE_CONSOLE) {
264  ReInfo->_displayMode = RM_DISP_MODE_NORMAL;
265  ReInfo->_reGameScreen = ReScreenInit();
266  foundHuman = 0;
267  for (i = 0; i < s->_ncars; i++) {
268  if (s->cars[i]->_driverType == RM_DRV_HUMAN) {
269  foundHuman = 1;
270  break;
271  }
272  }
273  if (!foundHuman) {
274  if (!strcmp(GfParmGetStr(params, ReInfo->_reRaceName, RM_ATTR_DISPMODE, RM_VAL_VISIBLE), RM_VAL_INVISIBLE)) {
275  ReInfo->_displayMode = RM_DISP_MODE_NONE;
276  ReInfo->_reGameScreen = ReResScreenInit();
277  }
278  }
279  }
280 
281  if (!(ReInfo->s->_raceType == RM_TYPE_QUALIF) ||
282  ((int)GfParmGetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_DRIVER, NULL, 1) == 1))
283  {
284  RmLoadingScreenStart(ReInfo->_reName, "data/img/splash-qrloading.png");
285  }
286 
287  for (i = 0; i < s->_ncars; i++) {
288  snprintf(buf, BUFSIZE, "Initializing Driver %s...", s->cars[i]->_name);
290  robot = s->cars[i]->robot;
291  robot->rbNewRace(robot->index, s->cars[i], s);
292  }
293  carInfo = ReInfo->_reCarInfo;
294 
295  ReInfo->_reSimItf.update(s, RCM_MAX_DT_SIMU, -1);
296  for (i = 0; i < s->_ncars; i++) {
297  carInfo[i].prevTrkPos = s->cars[i]->_trkPos;
298  }
299 
300  RmLoadingScreenSetText("Running Prestart...");
301  for (i = 0; i < s->_ncars; i++) {
302  memset(&(s->cars[i]->ctrl), 0, sizeof(tCarCtrl));
303  s->cars[i]->ctrl.brakeCmd = 1.0;
304  }
305  for (j = 0; j < ((int)(1.0 / RCM_MAX_DT_SIMU)); j++) {
306  ReInfo->_reSimItf.update(s, RCM_MAX_DT_SIMU, -1);
307  }
308 
309  if (ReInfo->_displayMode == RM_DISP_MODE_NONE) {
310  if (ReInfo->s->_raceType == RM_TYPE_QUALIF) {
311  ReUpdateQualifCurRes(s->cars[0]);
312  } else {
313  snprintf(buf, BUFSIZE, "%s on %s", s->cars[0]->_name, ReInfo->track->name);
314  ReResScreenSetTitle(buf);
315  }
316  }
317 
318  RmLoadingScreenSetText("Ready.");
319 
320  ReInfo->_reTimeMult = 1.0;
321  ReInfo->_reLastTime = -1.0;
322  ReInfo->s->currentTime = -2.0;
324 
325  ReInfo->s->_raceState = RM_RACE_STARTING;
326 
327  if ((ReInfo->_displayMode != RM_DISP_MODE_CONSOLE) && ReInfo->_reGraphicItf.initview != 0) {
328  GfScrGetSize(&sw, &sh, &vw, &vh);
329  ReInfo->_reGraphicItf.initview((sw-vw)/2, (sh-vh)/2, vw, vh, GR_VIEW_STD, ReInfo->_reGameScreen);
330 
331  if (ReInfo->_displayMode == RM_DISP_MODE_NORMAL) {
332  /* RmLoadingScreenSetText("Loading Cars 3D Objects..."); */
333  stopMenuMusic();
334  ReInfo->_reGraphicItf.initcars(s);
335  }
336 
337  GfuiScreenActivate(ReInfo->_reGameScreen);
338  }
339 
340  return RM_SYNC | RM_NEXT_STEP;
341 }
342 
343 /***************************************************************/
344 /* START RACE HOOK */
345 
346 static void *StartRaceHookHandle = 0;
347 
348 
349 static void StartRaceHookActivate(void * /* dummy */)
350 {
351  reRaceRealStart();
352 }
353 
354 
355 static void* StartRaceHookInit(void)
356 {
357  if (StartRaceHookHandle) {
358  return StartRaceHookHandle;
359  }
360 
362 
363  return StartRaceHookHandle;
364 }
365 
366 
367 /* return state mode */
368 int ReRaceStart(void)
369 {
370  int i;
371  int nCars;
372  int maxCars;
373  const char *raceName = ReInfo->_reRaceName;
374  void *params = ReInfo->params;
375  void *results = ReInfo->results;
376  const int BUFSIZE = 1024;
377  char path[BUFSIZE], path2[BUFSIZE];
378 
379  FREEZ(ReInfo->_reCarInfo);
380  ReInfo->_reCarInfo = (tReCarInfo*)calloc(GfParmGetEltNb(params, RM_SECT_DRIVERS), sizeof(tReCarInfo));
381 
382  /* Drivers starting order */
384  if (ReInfo->s->_raceType == RM_TYPE_QUALIF) {
385  i = (int)GfParmGetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_DRIVER, NULL, 1);
386  if (i == 1) {
387  RmLoadingScreenStart(ReInfo->_reName, "data/img/splash-qrloading.png");
388  RmLoadingScreenSetText("Preparing Starting Grid...");
389  } else {
391  }
392 
393  snprintf(path, BUFSIZE, "%s/%d", RM_SECT_DRIVERS, i);
394  snprintf(path2, BUFSIZE, "%s/%d", RM_SECT_DRIVERS_RACING, 1);
395  GfParmSetStr(params, path2, RM_ATTR_MODULE, GfParmGetStr(params, path, RM_ATTR_MODULE, ""));
396  GfParmSetNum(params, path2, RM_ATTR_IDX, NULL, GfParmGetNum(params, path, RM_ATTR_IDX, NULL, tModInfo::INVALID_INDEX));
397  GfParmSetStr(params, path2, RM_ATTR_DRVNAME, GfParmGetStr(params, path, RM_ATTR_DRVNAME, ""));
398  } else {
399  RmLoadingScreenStart(ReInfo->_reName, "data/img/splash-qrloading.png");
400  RmLoadingScreenSetText("Preparing Starting Grid...");
401 
402  const char* gridType = GfParmGetStr(params, raceName, RM_ATTR_START_ORDER, RM_VAL_DRV_LIST_ORDER);
403  if (!strcmp(gridType, RM_VAL_LAST_RACE_ORDER)) {
404  /* Starting grid in the arrival of the previous race */
405  nCars = GfParmGetEltNb(params, RM_SECT_DRIVERS);
406  maxCars = (int)GfParmGetNum(params, raceName, RM_ATTR_MAX_DRV, NULL, 100);
407  nCars = MIN(nCars, maxCars);
408  const char* prevRaceName = ReGetPrevRaceName();
409  if (!prevRaceName) {
410  return RM_QUIT;
411  }
412  for (i = 1; i < nCars + 1; i++) {
413  snprintf(path, BUFSIZE, "%s/%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, prevRaceName, RE_SECT_RANK, i);
414  snprintf(path2, BUFSIZE, "%s/%d", RM_SECT_DRIVERS_RACING, i);
415  GfParmSetStr(params, path2, RM_ATTR_MODULE, GfParmGetStr(results, path, RE_ATTR_MODULE, ""));
416  GfParmSetNum(params, path2, RM_ATTR_IDX, NULL, GfParmGetNum(results, path, RE_ATTR_IDX, NULL, tModInfo::INVALID_INDEX));
417  GfParmSetStr(params, path2, RM_ATTR_DRVNAME, GfParmGetStr(params, path, RM_ATTR_DRVNAME, ""));
418  }
419  } else if (!strcmp(gridType, RM_VAL_LAST_RACE_RORDER)) {
420  /* Starting grid in the reversed arrival order of the previous race */
421  nCars = GfParmGetEltNb(params, RM_SECT_DRIVERS);
422  maxCars = (int)GfParmGetNum(params, raceName, RM_ATTR_MAX_DRV, NULL, 100);
423  nCars = MIN(nCars, maxCars);
424  const char* prevRaceName = ReGetPrevRaceName();
425  if (!prevRaceName) {
426  return RM_QUIT;
427  }
428  for (i = 1; i < nCars + 1; i++) {
429  snprintf(path, BUFSIZE, "%s/%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, prevRaceName, RE_SECT_RANK, nCars - i + 1);
430  snprintf(path2, BUFSIZE, "%s/%d", RM_SECT_DRIVERS_RACING, i);
431  GfParmSetStr(params, path2, RM_ATTR_MODULE, GfParmGetStr(results, path, RE_ATTR_MODULE, ""));
432  GfParmSetNum(params, path2, RM_ATTR_IDX, NULL, GfParmGetNum(results, path, RE_ATTR_IDX, NULL, tModInfo::INVALID_INDEX));
433  GfParmSetStr(params, path2, RM_ATTR_DRVNAME, GfParmGetStr(params, path, RM_ATTR_DRVNAME, ""));
434  }
435  } else {
436  /* Starting grid in the drivers list order */
437  nCars = GfParmGetEltNb(params, RM_SECT_DRIVERS);
438  maxCars = (int)GfParmGetNum(params, raceName, RM_ATTR_MAX_DRV, NULL, 100);
439  nCars = MIN(nCars, maxCars);
440  for (i = 1; i < nCars + 1; i++) {
441  snprintf(path, BUFSIZE, "%s/%d", RM_SECT_DRIVERS, i);
442  snprintf(path2, BUFSIZE, "%s/%d", RM_SECT_DRIVERS_RACING, i);
443  GfParmSetStr(params, path2, RM_ATTR_MODULE, GfParmGetStr(params, path, RM_ATTR_MODULE, ""));
444  GfParmSetNum(params, path2, RM_ATTR_IDX, NULL, GfParmGetNum(params, path, RM_ATTR_IDX, NULL, tModInfo::INVALID_INDEX));
445  GfParmSetStr(params, path2, RM_ATTR_DRVNAME, GfParmGetStr(params, path, RM_ATTR_DRVNAME, ""));
446  }
447  }
448  }
449 
450  if (ReInfo->_displayMode != RM_DISP_MODE_CONSOLE) {
451  if (!strcmp(GfParmGetStr(params, ReInfo->_reRaceName, RM_ATTR_SPLASH_MENU, RM_VAL_NO), RM_VAL_YES)) {
454  return RM_ASYNC | RM_NEXT_STEP;
455  }
456  }
457 
458  return reRaceRealStart();
459 }
460 
461 /***************************************************************/
462 /* BACK TO RACE HOOK */
463 
464 static void *BackToRaceHookHandle = 0;
465 
466 static void BackToRaceHookActivate(void * /* dummy */)
467 {
468  ReInfo->_reState = RE_STATE_RACE;
469  GfuiScreenActivate(ReInfo->_reGameScreen);
470 }
471 
472 
473 static void* BackToRaceHookInit(void)
474 {
475  if (BackToRaceHookHandle) {
476  return BackToRaceHookHandle;
477  }
478 
480 
481  return BackToRaceHookHandle;
482 }
483 
484 /***************************************************************/
485 /* RESTART RACE HOOK */
486 
487 static void *RestartRaceHookHandle = 0;
488 
489 static void RestartRaceHookActivate(void * /* dummy */)
490 {
491  ReRaceCleanup();
492  ReInfo->_reState = RE_STATE_PRE_RACE;
493  GfuiScreenActivate(ReInfo->_reGameScreen);
494 }
495 
496 static void* RestartRaceHookInit(void)
497 {
498  if (RestartRaceHookHandle) {
499  return RestartRaceHookHandle;
500  }
501 
503 
504  return RestartRaceHookHandle;
505 }
506 
507 /***************************************************************/
508 /* QUIT HOOK */
509 
510 static void *QuitHookHandle = 0;
511 static void *StopScrHandle = 0;
512 
513 static void QuitHookActivate(void * /* dummy */)
514 {
515  if (StopScrHandle) {
517  }
518 }
519 
520 
521 static void* QuitHookInit(void)
522 {
523  if (QuitHookHandle) {
524  return QuitHookHandle;
525  }
526 
528 
529  return QuitHookHandle;
530 }
531 
532 
533 int ReRaceStop(void)
534 {
535  void *params = ReInfo->params;
536  ReInfo->_reGraphicItf.muteformenu();
537 
538  if (!strcmp(GfParmGetStr(params, ReInfo->_reRaceName, RM_ATTR_ALLOW_RESTART, RM_VAL_NO), RM_VAL_NO)) {
539  StopScrHandle = RmTriStateScreen("Race Stopped",
540  "Abandon Race", "Abort current race", AbortRaceHookInit(),
541  "Resume Race", "Return to Race", BackToRaceHookInit(),
542  "Quit Game", "Quit the game", QuitHookInit());
543  } else {
544  if (
546  (ReInfo->s->raceInfo.ncars == 1) &&
548  ) {
549  tCarElt* carElt = &ReInfo->carList[0];
550  static const char* label[5] = { "Restart Race", "Setup Car, Restart", "Abandon Race", "Resume Race", "Quit Game" };
551  static const char* tip[5] = { "Restart the current race", "Setup car and restart the current race", "Abort the current race", "Return to the race", "Quit TORCS" };
552  void* screen[5];
553 
554  screen[0] = RestartRaceHookInit();
555  screen[1] = RmCarSetupScreenInit(RestartRaceHookInit(), carElt, ReInfo);
556  screen[2] = AbortRaceHookInit();
557  screen[3] = BackToRaceHookInit();
558  screen[4] = QuitHookInit();
559 
560  StopScrHandle = RmNStateScreen("Race Stopped", label, tip, screen, 5);
561  } else {
562  StopScrHandle = RmFourStateScreen("Race Stopped",
563  "Restart Race", "Restart the current race", RestartRaceHookInit(),
564  "Abandon Race", "Abort current race", AbortRaceHookInit(),
565  "Resume Race", "Return to Race", BackToRaceHookInit(),
566  "Quit Game", "Quit the game", QuitHookInit());
567  }
568  }
569  return RM_ASYNC | RM_NEXT_STEP;
570 }
571 
572 
573 int ReRaceEnd(void)
574 {
575  int curDrvIdx;
576  void *params = ReInfo->params;
577  void *results = ReInfo->results;
578 
579  ReRaceCleanup();
580 
581  if (ReInfo->s->_raceType == RM_TYPE_QUALIF) {
582  curDrvIdx = (int)GfParmGetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_DRIVER, NULL, 1);
583  curDrvIdx++;
584  if (curDrvIdx > GfParmGetEltNb(params, RM_SECT_DRIVERS)) {
585  GfParmSetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_DRIVER, NULL, 1);
586  return ReDisplayResults();
587  }
588  GfParmSetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_DRIVER, NULL, curDrvIdx);
589  return RM_SYNC | RM_NEXT_RACE;
590  }
591 
592  return ReDisplayResults();
593 }
594 
595 
596 int RePostRace(void)
597 {
598  int curRaceIdx;
599  void *results = ReInfo->results;
600  void *params = ReInfo->params;
601 
602  curRaceIdx = (int)GfParmGetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_RACE, NULL, 1);
603  if (curRaceIdx < GfParmGetEltNb(params, RM_SECT_RACES)) {
604  curRaceIdx++;
605  GfOut("Race Nb %d\n", curRaceIdx);
606  GfParmSetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_RACE, NULL, curRaceIdx);
608  return RM_SYNC | RM_NEXT_RACE;
609  }
610 
612  GfParmSetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_RACE, NULL, 1);
613  return RM_SYNC | RM_NEXT_STEP;
614 }
615 
616 
618 {
619  int curTrkIdx;
620  void *params = ReInfo->params;
621  int nbTrk = GfParmGetEltNb(params, RM_SECT_TRACKS);
622  int ret = 0;
623  void *results = ReInfo->results;
624 
625  if (
626  (ReInfo->_displayMode != RM_DISP_MODE_CONSOLE) &&
627  (ReInfo->_reGraphicItf.shutdowntrack != 0)
628  ) {
629  ReInfo->_reGraphicItf.shutdowntrack();
630  }
631 
632  int curRaceIdx = (int)GfParmGetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_RACE, NULL, 1);
633  curTrkIdx = (int)GfParmGetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_TRACK, NULL, 1);
634 
635  if (curRaceIdx == 1) {
636  if (curTrkIdx < nbTrk) {
637  // Next track.
638  curTrkIdx++;
639  } else if (curTrkIdx >= nbTrk) {
640  // Back to the beginning.
641  curTrkIdx = 1;
642  }
643  }
644 
645  GfParmSetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_TRACK, NULL, curTrkIdx);
646 
647  if (curTrkIdx != 1) {
648  ret = RM_NEXT_RACE;
649  } else {
650  ret = RM_NEXT_STEP;
651  }
652 
653  if ((nbTrk != 1) && (ReInfo->_displayMode != RM_DISP_MODE_CONSOLE)) {
655  FREEZ(ReInfo->_reCarInfo);
656  return RM_ASYNC | ret;
657  }
658  FREEZ(ReInfo->_reCarInfo);
659 
660  return RM_SYNC | ret;
661 }
662 
int GfParmSetStr(void *handle, const char *path, const char *key, const char *val)
Set a string parameter in the parameter set handle.
Definition: params.cpp:2477
Race Manager General Info.
Definition: raceman.h:218
#define RM_VAL_VISIBLE
Definition: raceman.h:317
int GfModLoad(unsigned int gfid, char *dllname, tModList **modlist)
Load the specified DLLs.
Definition: module.cpp:57
tModInfo modInfo[MAX_MOD_ITF]
module info list for this dll
Definition: tgf.h:204
double currentTime
current time in sec since the beginning of the simulation
Definition: raceman.h:88
tdble refuelFuelFlow
Definition: raceman.h:190
#define RM_VAL_LAST_RACE_RORDER
Definition: raceman.h:308
#define RM_ATTR_ALLOW_RESTART
Definition: raceman.h:248
static void * AbandonRaceHookHandle
Definition: racemain.cpp:48
#define RM_ATTR_TIRE_FACTOR
Definition: raceman.h:291
#define RM_ATTR_DISTANCE
Definition: raceman.h:281
int ReRaceStop(void)
Definition: racemain.cpp:533
cars situation used to inform the GUI and the drivers
Definition: raceman.h:85
Interface Structure for Robots.
Definition: robot.h:107
tdble brakeCmd
Brake command [0.0, 1.0].
Definition: car.h:347
void ReUpdateStandings(void)
static void * AbandonRaceHookInit(void)
Definition: racemain.cpp:63
void ReRaceCleanDrivers(void)
Definition: raceinit.cpp:873
tInitCar info
public
Definition: car.h:458
#define RM_TYPE_PRACTICE
Definition: raceman.h:71
#define RE_STATE_RACE
Definition: raceman.h:105
void * RmCarSetupScreenInit(void *prevMenu, tCarElt *car, tRmInfo *reInfo)
Display car setup screen, for loading, saving and changing car setups.
#define RM_NEXT_STEP
Definition: raceman.h:48
static void StartRaceHookActivate(void *)
Definition: racemain.cpp:349
tCarElt ** cars
list of cars
Definition: raceman.h:90
tCarCtrl ctrl
private
Definition: car.h:462
#define FREEZ(x)
Definition: tgf.h:60
#define RM_SECT_TRACKS
Definition: raceman.h:239
static void * StartRaceHookInit(void)
Definition: racemain.cpp:355
tTrkLocPos prevTrkPos
Definition: raceman.h:117
void * RmFourStateScreen(const char *title, const char *label1, const char *tip1, void *screen1, const char *label2, const char *tip2, void *screen2, const char *label3, const char *tip3, void *screen3, const char *label4, const char *tip4, void *screen4)
Screen with 4 menu options (buttons)
#define RM_ATTR_DRVNAME
Definition: raceman.h:258
#define RM_DRV_HUMAN
Definition: car.h:122
void * results
Race results.
Definition: raceman.h:224
Car structure (tCarElt).
Definition: car.h:455
#define RM_SYNC
Definition: raceman.h:42
tModList * ReRaceModList
Definition: raceinit.cpp:53
#define RE_ATTR_CUR_RACE
Definition: raceman.h:333
Robot Module Interface Definition.
static void * QuitHookInit(void)
Definition: racemain.cpp:521
#define RE_STATE_PRE_RACE
Definition: raceman.h:103
#define RE_SECT_CURRENT
Definition: raceman.h:332
#define RM_VAL_NO
Definition: raceman.h:315
#define RM_ATTR_INVALIDATE_BEST_LAP_CORNER_CUT
Definition: raceman.h:287
void * ReResScreenInit(void)
Definition: racegl.cpp:311
void * TorcsExitMenuInit(void *menu)
Definition: exitmenu.cpp:79
#define GR_VIEW_STD
Definition: graphic.h:118
#define RE_SECT_RESULTS
Definition: raceman.h:341
tSituation * s
Situation during race.
Definition: raceman.h:221
static void * BackToRaceHookInit(void)
Definition: racemain.cpp:473
#define RE_SECT_RANK
Definition: raceman.h:342
void ReInitRules(tRmInfo *ReInfo)
Definition: racemain.cpp:134
void * ReScreenInit(void)
Definition: racegl.cpp:171
static void QuitHookActivate(void *)
Definition: racemain.cpp:513
const char * GfParmGetStr(void *parmHandle, const char *path, const char *key, const char *deflt)
Get a string parameter from the parameter set handle.
Definition: params.cpp:2311
static void * RestartRaceHookInit(void)
Definition: racemain.cpp:496
The Gaming Framework API (client part).
void * RmTriStateScreen(const char *title, const char *label1, const char *tip1, void *screen1, const char *label2, const char *tip2, void *screen2, const char *label3, const char *tip3, void *screen3)
Screen with 3 menu options (buttons)
Definition: miscscreens.cpp:84
#define dllname
tCarElt * carList
List of all the cars racing.
Definition: raceman.h:220
int ReEventShutdown(void)
Definition: racemain.cpp:617
tdble length
main track length
Definition: track.h:512
tdble speedLimit
Speed limit between pitStart and pitEnd.
Definition: track.h:470
#define RM_NEXT_RACE
Definition: raceman.h:49
#define RM_VAL_PRACTICE
Definition: raceman.h:312
#define RM_TYPE_QUALIF
Definition: raceman.h:72
int RePostRace(void)
Definition: racemain.cpp:596
int ReInitTrack(void)
Initialize the track for a race manager.
Definition: raceinit.cpp:832
tRmInfo * ReInfo
Definition: raceengine.cpp:45
#define RE_ATTR_IDX
Definition: raceman.h:347
int ReRaceEnd(void)
Definition: racemain.cpp:573
tfModPrivInit fctInit
init function
Definition: tgf.h:191
char * GetLibDir(void)
Definition: tgf.cpp:244
float tdble
Floating point type used in TORCS.
Definition: tgf.h:48
static void * AbortRaceHookHandle
Definition: racemain.cpp:74
struct RobotItf * robot
private
Definition: car.h:464
void ReDisplayStandings(void)
#define RM_ATTR_IDX
Definition: raceman.h:266
#define RM_ATTR_CORNER_CUT_TIME_PENALTY
Definition: raceman.h:288
#define GfOut
Definition: tgf.h:373
#define RM_DISP_MODE_NONE
Definition: raceman.h:148
tdble pitstopBaseTime
Definition: raceman.h:192
#define RM_ATTR_MODULE
Definition: raceman.h:265
const char * name
Name of the track.
Definition: track.h:504
int ncars
number of cars
Definition: raceman.h:61
static void * RestartRaceHookHandle
Definition: racemain.cpp:487
tTrack * track
Current track.
Definition: raceman.h:222
tRmRaceRules raceRules
Definition: raceman.h:229
#define RM_ATTR_SPLASH_MENU
Definition: raceman.h:249
int ReInitCars(void)
Initialize the cars for a race.
Definition: raceinit.cpp:556
#define RM_ATTR_TYPE
Definition: raceman.h:272
static void * QuitHookHandle
Definition: racemain.cpp:510
int ReRaceEventInit(void)
Definition: racemain.cpp:107
#define RM_TYPE_RACE
Definition: raceman.h:73
const char * ReGetCurrentRaceName(void)
Definition: raceinit.cpp:906
void * GfuiHookCreate(void *userDataOnActivate, tfuiCallback onActivate)
Create a callback hook.
Definition: gui.cpp:679
static void AbortRaceHookActivate(void *)
Definition: racemain.cpp:77
tdble allTiresChangeTime
Definition: raceman.h:194
This is the race information structures.
static void AbandonRaceHookActivate(void *)
Definition: racemain.cpp:51
void ReResScreenSetTitle(char *title)
Definition: racegl.cpp:358
int enabled
Definition: raceman.h:187
int ReRaceStart(void)
Definition: racemain.cpp:368
void GfuiScreenActivate(void *screen)
Activate a screen and make it current.
Definition: gui.cpp:467
tdble fuelFactor
Definition: raceman.h:188
int driverType
Driver type.
Definition: car.h:80
#define RM_ATTR_PITSTOP_BASE_TIME
Definition: raceman.h:295
#define RM_SECT_DRIVERS
Definition: raceman.h:236
#define RM_VAL_QUALIF
Definition: raceman.h:311
#define RM_ATTR_REFUEL_FUEL_FLOW
Definition: raceman.h:293
#define RM_ATTR_DAMAGE_REPAIR_FACTOR
Definition: raceman.h:294
#define RM_ATTR_DAMAGE_FACTOR
Definition: raceman.h:289
int GfParmSetNum(void *handle, const char *path, const char *key, const char *unit, tdble val)
Set a numerical parameter in the parameter set handle.
Definition: params.cpp:2586
#define RM_ATTR_MAX_DRV
Definition: raceman.h:253
#define RM_ATTR_START_ORDER
Definition: raceman.h:247
#define RM_ATTR_MAX_DMG
Definition: raceman.h:280
tdble tireFactor
Definition: raceman.h:193
#define RE_ATTR_MODULE
Definition: raceman.h:346
#define RM_ATTR_INVALIDATE_BEST_LAP_WALL_TOUCH
Definition: raceman.h:286
void GfScrGetSize(int *scrw, int *scrh, int *vieww, int *viewh)
Get the screen and viewport sizes.
Definition: screen.cpp:471
tdble GfParmGetNum(void *handle, const char *path, const char *key, const char *unit, tdble deflt)
Get a numerical parameter from the parameter set handle.
Definition: params.cpp:2392
#define RM_VAL_INVISIBLE
Definition: raceman.h:318
int type
Race type.
Definition: raceman.h:70
int GfParmListClean(void *handle, const char *path)
Remove all the subsections in a section in the parameter set handle.
Definition: params.cpp:2221
tRaceAdmInfo raceInfo
Definition: raceman.h:86
static void * StopScrHandle
Definition: racemain.cpp:511
int index
index if multiple interface in one dll
Definition: tgf.h:193
static void * BackToRaceHookHandle
Definition: racemain.cpp:464
#define RM_ATTR_PIT_SPEED_LIMIT
Definition: raceman.h:292
#define RM_VAL_DRV_LIST_ORDER
Definition: raceman.h:306
void RmShutdownLoadingScreen(void)
Shut down loading screen.
#define RM_QUIT
Definition: raceman.h:53
#define RM_RACE_STARTING
Definition: raceman.h:67
#define RM_SECT_RACES
Definition: raceman.h:238
static void BackToRaceHookActivate(void *)
Definition: racemain.cpp:466
static void * AbortRaceHookInit(void)
Definition: racemain.cpp:95
void RmLoadingScreenStart(const char *title, const char *bgimg)
Set up loading screen.
int GfParmGetEltNb(void *handle, const char *path)
Count the number of subsections in a section in the parameter set handle.
Definition: params.cpp:2106
#define RM_DISP_MODE_CONSOLE
Definition: raceman.h:149
void * RmNStateScreen(const char *title, const char **label, const char **tip, void **screen, const int n)
Screen with N menu options (buttons)
#define RM_ATTR_DISPMODE
Definition: raceman.h:269
void RmLoadingScreenSetText(const char *text)
Set a new line of text on the loading screen.
#define RM_ATTR_ALL_TIRES_CHANGE_TIME
Definition: raceman.h:296
#define RM_VAL_LAST_RACE_ORDER
Definition: raceman.h:307
void ReEventInitResults(void)
#define RM_ASYNC
Definition: raceman.h:43
int RePreRace(void)
Definition: racemain.cpp:196
Definition: Endpoint.h:36
tfRbNewRace rbNewRace
Definition: robot.h:109
#define RM_ATTR_FUEL_FACTOR
Definition: raceman.h:290
void RmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr)
void ReUpdateQualifCurRes(tCarElt *car)
Race Engine Car Information about the race.
Definition: raceman.h:115
#define RE_STATE_CONFIG
Definition: raceman.h:101
#define RM_DISP_MODE_NORMAL
Definition: raceman.h:146
tdble damageRepairFactor
Definition: raceman.h:191
#define RM_ATTR_LAPS
Definition: raceman.h:282
#define RE_ATTR_CUR_TRACK
Definition: raceman.h:334
void ReRaceCleanup(void)
Definition: raceinit.cpp:859
static void RestartRaceHookActivate(void *)
Definition: racemain.cpp:489
tdble damageFactor
Definition: raceman.h:189
const char * ReGetPrevRaceName(void)
Definition: raceinit.cpp:920
Info returned by driver during the race.
Definition: car.h:344
int index
Definition: robot.h:114
static void * StartRaceHookHandle
Definition: racemain.cpp:346
#define RM_SECT_DRIVERS_RACING
Definition: raceman.h:244
void startMenuMusic()
Definition: musicplayer.cpp:80
void stopMenuMusic()
Definition: musicplayer.cpp:90
double deltaTime
Definition: raceman.h:87
int ReNewTrackMenu(void)
tTrackPitInfo pits
Pits information.
Definition: track.h:514
void * params
Raceman parameters.
Definition: raceman.h:223
static int reRaceRealStart(void)
Definition: racemain.cpp:239
#define RCM_MAX_DT_SIMU
Definition: raceman.h:56
#define RE_ATTR_CUR_DRIVER
Definition: raceman.h:335
#define RM_VAL_RACE
Definition: raceman.h:310
#define RM_VAL_YES
Definition: raceman.h:314
int ReDisplayResults(void)