TORCS  1.3.10
The Open Racing Car Simulator
Loading...
Searching...
No Matches
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-2026 by Eric EspiƩ, Bernhard Wymann
6 email : berniw@bluewin.ch
7
8 ***************************************************************************/
9
10/***************************************************************************
11 * *
12 * This program is free software; you can redistribute it and/or modify *
13 * it under the terms of the GNU General Public License as published by *
14 * the Free Software Foundation; either version 2 of the License, or *
15 * (at your option) any later version. *
16 * *
17 ***************************************************************************/
18
21
22#include <stdlib.h>
23#include <stdio.h>
24#include <tgfclient.h>
25#include <raceman.h>
26#include <robot.h>
27#include <racescreens.h>
28#include <exitmenu.h>
29#include <musicplayer/musicplayer.h>
30#include <portability.h>
31
32#include "raceengine.h"
33#include "raceinit.h"
34#include "racegl.h"
35#include "raceresults.h"
36#include "racestate.h"
37#include "racemanmenu.h"
38
39#include "racemain.h"
40
41/***************************************************************/
42/* ABANDON RACE HOOK */
43
44static void *AbandonRaceHookHandle = 0;
45
46static void
48{
49 // Shutdown current event.
51
52 /* Return to race menu */
53 ReInfo->_reState = RE_STATE_CONFIG;
54
55 GfuiScreenActivate(ReInfo->_reGameScreen);
56}
57
58static void *
69
70static void *AbortRaceHookHandle = 0;
71
72static void
73abortRace(bool returnToMenu)
74{
75 if (returnToMenu) {
76 GfuiScreenActivate(ReInfo->_reGameScreen);
77 }
78
79 ReInfo->_reSimItf.shutdown();
80 if (ReInfo->_displayMode == RM_DISP_MODE_NORMAL) {
81 ReInfo->_reGraphicItf.shutdowncars();
82 if (returnToMenu) {
84 }
85 }
86 ReInfo->_reGraphicItf.shutdowntrack();
88
89 FREEZ(ReInfo->_reCarInfo);
90 if (returnToMenu) {
91 /* Return to race menu */
92 ReInfo->_reState = RE_STATE_CONFIG;
93 }
94}
95
96static void
98{
99 abortRace(true);
100}
101
102static void
104{
105 abortRace(false);
106}
107
108static void *
119
127int
129{
130 void *params = ReInfo->params;
131
132 RmLoadingScreenStart(ReInfo->_reName, "data/img/splash-qrloading.png");
133 if (GfParmGetEltNb(params, RM_SECT_DRIVERS) == 0) {
134 GfError("RaceEngine: no drivers selected\n");
135 if (ReInfo->_displayMode != RM_DISP_MODE_CONSOLE) {
137 }
138 ReInfo->_reState = RE_STATE_SHUTDOWN;
139 return RM_SYNC;
140 }
141 if (ReInitTrack() != 0) {
142 GfError("RaceEngine: track initialization failed\n");
143 if (ReInfo->_displayMode != RM_DISP_MODE_CONSOLE) {
145 }
146 ReInfo->_reState = RE_STATE_SHUTDOWN;
147 return RM_SYNC;
148 }
149 if (
150 (ReInfo->_displayMode != RM_DISP_MODE_CONSOLE) &&
151 (ReInfo->_reGraphicItf.inittrack != 0)
152 ) {
153 RmLoadingScreenSetText("Loading Track 3D Description...");
154 ReInfo->_reGraphicItf.inittrack(ReInfo->track);
155 };
157
158 if (
159 (GfParmGetEltNb(params, RM_SECT_TRACKS) > 1) &&
160 (ReInfo->_displayMode != RM_DISP_MODE_NONE) &&
161 (ReInfo->_displayMode != RM_DISP_MODE_CONSOLE)
162 ) {
164 return RM_ASYNC | RM_NEXT_STEP;
165 }
166 return RM_SYNC | RM_NEXT_STEP;
167}
168
169
171{
172 // Invalidate best lap time when wall is hit?
173 const char* value = GfParmGetStr(ReInfo->params, ReInfo->_reRaceName, RM_ATTR_INVALIDATE_BEST_LAP_WALL_TOUCH, RM_VAL_YES);
174 if (!strcmp(value, RM_VAL_YES)) {
175 ReInfo->raceRules.enabled |= RmRaceRules::WALL_HIT_TIME_INVALIDATE;
176 }
177
178 // Invalidate best lap time when corner is cut?
180 if (!strcmp(value, RM_VAL_YES)) {
182 }
183
184 // Time penalty for corner cutting?
186 if (!strcmp(value, RM_VAL_YES)) {
188 }
189
190 // Fuel consumption factor
191 tdble number = GfParmGetNum(ReInfo->params, ReInfo->_reRaceName, RM_ATTR_FUEL_FACTOR, NULL, 1.0f);
192 if (number < 0.0f) number = 0.0f; // Avoid negative factor
193 ReInfo->raceRules.fuelFactor = number;
194
195 // Damage factor
196 number = GfParmGetNum(ReInfo->params, ReInfo->_reRaceName, RM_ATTR_DAMAGE_FACTOR, NULL, 1.0f);
197 if (number < 0.0f) number = 0.0f; // Avoid negative factor
198 ReInfo->raceRules.damageFactor = number;
199
200 // Tire model factor, for 0.0 the model is switched completely off
201 number = GfParmGetNum(ReInfo->params, ReInfo->_reRaceName, RM_ATTR_TIRE_FACTOR, NULL, 1.0f);
202 if (number < 0.0f) number = 0.0f; // Avoid negative factor
203 ReInfo->raceRules.tireFactor = number;
204
205 // Refuel fuel flow
206 number = GfParmGetNum(ReInfo->params, ReInfo->_reRaceName, RM_ATTR_REFUEL_FUEL_FLOW, NULL, 8.0f);
207 if (number < 1.0f) number = 1.0f; // Avoid division by zero or negative pit times
208 ReInfo->raceRules.refuelFuelFlow = number;
209
210 // Damage repair factor
211 number = GfParmGetNum(ReInfo->params, ReInfo->_reRaceName, RM_ATTR_DAMAGE_REPAIR_FACTOR, NULL, 0.007f);
212 if (number < 0.0f) number = 0.0f; // Avoid negative pit times
213 ReInfo->raceRules.damageRepairFactor = number;
214
215 // Pit stop base time (time for a stop even if nothing is done)
216 number = GfParmGetNum(ReInfo->params, ReInfo->_reRaceName, RM_ATTR_PITSTOP_BASE_TIME, NULL, 2.0f);
217 if (number < 0.0f) number = 0.0f; // Avoid negative pit times
218 ReInfo->raceRules.pitstopBaseTime = number;
219
220 // Tire change time for all 4 tires
221 number = GfParmGetNum(ReInfo->params, ReInfo->_reRaceName, RM_ATTR_ALL_TIRES_CHANGE_TIME, NULL, 16.0f);
222 if (number < 0.0f) number = 0.0f; // Avoid negative tire change times
223 ReInfo->raceRules.allTiresChangeTime = number;
224
225 // Race specific pit speed limit, if available
226 number = ReInfo->track->pits.speedLimit;
227 number = GfParmGetNum(ReInfo->params, ReInfo->_reRaceName, RM_ATTR_PIT_SPEED_LIMIT, NULL, number);
228 ReInfo->track->pits.speedLimit = number;
229}
230
231
232int RePreRace(void)
233{
234 tdble dist;
235 void *params = ReInfo->params;
236 void *results = ReInfo->results;
237 const int BUFSIZE = 1024;
238 char path[BUFSIZE];
239
240 const char* raceName = ReInfo->_reRaceName = ReGetCurrentRaceName();
241 if (!raceName) {
242 return RM_QUIT;
243 }
244
245 dist = GfParmGetNum(params, raceName, RM_ATTR_DISTANCE, NULL, 0);
246 if (dist < 0.001) {
247 ReInfo->s->_totLaps = (int)GfParmGetNum(params, raceName, RM_ATTR_LAPS, NULL, 30);
248 } else {
249 ReInfo->s->_totLaps = ((int)(dist / ReInfo->track->length)) + 1;
250 }
251 ReInfo->s->_maxDammage = (int)GfParmGetNum(params, raceName, RM_ATTR_MAX_DMG, NULL, 10000);
252
253 const char* raceType = GfParmGetStr(params, raceName, RM_ATTR_TYPE, RM_VAL_RACE);
254 if (!strcmp(raceType, RM_VAL_RACE)) {
255 ReInfo->s->_raceType = RM_TYPE_RACE;
256 } else if (!strcmp(raceType, RM_VAL_QUALIF)) {
257 ReInfo->s->_raceType = RM_TYPE_QUALIF;
258 } else if (!strcmp(raceType, RM_VAL_PRACTICE)) {
259 ReInfo->s->_raceType = RM_TYPE_PRACTICE;
260 }
261
262 ReInfo->s->_raceState = 0;
263
264 /* Cleanup results */
265 snprintf(path, BUFSIZE, "%s/%s/%s", ReInfo->track->name, RE_SECT_RESULTS, raceName);
266 GfParmListClean(results, path);
267
269
270 return RM_SYNC | RM_NEXT_STEP;
271}
272
273
274/* return state mode */
275static int reRaceRealStart(void)
276{
277 int i, j;
278 int sw, sh, vw, vh;
279 tRobotItf *robot;
280 tReCarInfo *carInfo;
281 const int BUFSIZE = 1024;
282 char buf[BUFSIZE];
283 int foundHuman;
284 void *params = ReInfo->params;
285 void *results = ReInfo->results;
286 tSituation *s = ReInfo->s;
287
288 RmLoadingScreenSetText("Loading Simulation Engine...");
289 const char* dllname = GfParmGetStr(ReInfo->_reParam, "Modules", "simu", "");
290 snprintf(buf, BUFSIZE, "%smodules/simu/%s.%s", GetLibDir (), dllname, DLLEXT);
291 if (GfModLoad(0, buf, &ReRaceModList)) return RM_QUIT;
292 ReRaceModList->modInfo->fctInit(ReRaceModList->modInfo->index, &ReInfo->_reSimItf);
293
294 if (ReInitCars()) {
295 return RM_QUIT;
296 }
297
298 /* Blind mode or not */
299 if (ReInfo->_displayMode != RM_DISP_MODE_CONSOLE) {
300 ReInfo->_displayMode = RM_DISP_MODE_NORMAL;
301 ReInfo->_reGameScreen = ReScreenInit();
302 foundHuman = 0;
303 for (i = 0; i < s->_ncars; i++) {
304 if (s->cars[i]->_driverType == RM_DRV_HUMAN) {
305 foundHuman = 1;
306 break;
307 }
308 }
309 if (!foundHuman) {
310 if (!strcmp(GfParmGetStr(params, ReInfo->_reRaceName, RM_ATTR_DISPMODE, RM_VAL_VISIBLE), RM_VAL_INVISIBLE)) {
311 ReInfo->_displayMode = RM_DISP_MODE_NONE;
312 ReInfo->_reGameScreen = ReResScreenInit();
313 }
314 }
315 }
316
317 if (!(ReInfo->s->_raceType == RM_TYPE_QUALIF) ||
318 ((int)GfParmGetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_DRIVER, NULL, 1) == 1))
319 {
320 RmLoadingScreenStart(ReInfo->_reName, "data/img/splash-qrloading.png");
321 }
322
323 for (i = 0; i < s->_ncars; i++) {
324 snprintf(buf, BUFSIZE, "Initializing Driver %s...", s->cars[i]->_name);
326 robot = s->cars[i]->robot;
327 robot->rbNewRace(robot->index, s->cars[i], s);
328 }
329 carInfo = ReInfo->_reCarInfo;
330
331 ReInfo->_reSimItf.update(s, RCM_MAX_DT_SIMU, -1);
332 for (i = 0; i < s->_ncars; i++) {
333 carInfo[i].prevTrkPos = s->cars[i]->_trkPos;
334 }
335
336 RmLoadingScreenSetText("Running Prestart...");
337 for (i = 0; i < s->_ncars; i++) {
338 memset(&(s->cars[i]->ctrl), 0, sizeof(tCarCtrl));
339 s->cars[i]->ctrl.brakeCmd = 1.0;
340 }
341
342 // Simulate 3 seconds to find equilibrium for suspension and car position
343 for (j = 0; j < ((int)(3.0 / RCM_MAX_DT_SIMU)); j++) {
344 ReInfo->_reSimItf.update(s, RCM_MAX_DT_SIMU, -1);
345 }
346
347 if (ReInfo->_displayMode == RM_DISP_MODE_NONE) {
348 if (ReInfo->s->_raceType == RM_TYPE_QUALIF) {
350 } else {
351 snprintf(buf, BUFSIZE, "%s on %s", s->cars[0]->_name, ReInfo->track->name);
353 }
354 }
355
356 RmLoadingScreenSetText("Ready.");
357
358 ReInfo->_reTimeMult = 1.0;
359 ReInfo->_reLastTime = -1.0;
360 ReInfo->raceEngineInfo.lastDriveTime[RM_DRV_HUMAN] = ReInfo->_reLastTime;
361 ReInfo->raceEngineInfo.lastDriveTime[RM_DRV_ROBOT] = ReInfo->_reLastTime;
362 ReInfo->s->currentTime = -2.0;
363 ReInfo->s->deltaTime = RCM_MAX_DT_SIMU;
364
365 ReInfo->s->_raceState = RM_RACE_STARTING;
366
367 if ((ReInfo->_displayMode != RM_DISP_MODE_CONSOLE) && ReInfo->_reGraphicItf.initview != 0) {
368 GfScrGetSize(&sw, &sh, &vw, &vh);
369 ReInfo->_reGraphicItf.initview((sw-vw)/2, (sh-vh)/2, vw, vh, GR_VIEW_STD, ReInfo->_reGameScreen);
370
371 if (ReInfo->_displayMode == RM_DISP_MODE_NORMAL) {
372 /* RmLoadingScreenSetText("Loading Cars 3D Objects..."); */
374 ReInfo->_reGraphicItf.initcars(s);
375 }
376
377 GfuiScreenActivate(ReInfo->_reGameScreen);
378 }
379
380 return RM_SYNC | RM_NEXT_STEP;
381}
382
383/***************************************************************/
384/* START RACE HOOK */
385
386static void *StartRaceHookHandle = 0;
387
388
389static void StartRaceHookActivate(void)
390{
392}
393
394
395static void* StartRaceHookInit(void)
396{
398 return StartRaceHookHandle;
399 }
400
402
403 return StartRaceHookHandle;
404}
405
406
407/* return state mode */
408int ReRaceStart(void)
409{
410 int i;
411 int nCars;
412 int maxCars;
413 const char *raceName = ReInfo->_reRaceName;
414 void *params = ReInfo->params;
415 void *results = ReInfo->results;
416 const int BUFSIZE = 1024;
417 char path[BUFSIZE], path2[BUFSIZE];
418
419 FREEZ(ReInfo->_reCarInfo);
420 ReInfo->_reCarInfo = (tReCarInfo*)calloc(GfParmGetEltNb(params, RM_SECT_DRIVERS), sizeof(tReCarInfo));
421
422 /* Drivers starting order */
424 if (ReInfo->s->_raceType == RM_TYPE_QUALIF) {
425 i = (int)GfParmGetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_DRIVER, NULL, 1);
426 if (i == 1) {
427 RmLoadingScreenStart(ReInfo->_reName, "data/img/splash-qrloading.png");
428 RmLoadingScreenSetText("Preparing Starting Grid...");
429 } else {
431 }
432
433 snprintf(path, BUFSIZE, "%s/%d", RM_SECT_DRIVERS, i);
434 snprintf(path2, BUFSIZE, "%s/%d", RM_SECT_DRIVERS_RACING, 1);
435 GfParmSetStr(params, path2, RM_ATTR_MODULE, GfParmGetStr(params, path, RM_ATTR_MODULE, ""));
436 GfParmSetNum(params, path2, RM_ATTR_IDX, NULL, GfParmGetNum(params, path, RM_ATTR_IDX, NULL, tModInfo::INVALID_INDEX));
437 GfParmSetStr(params, path2, RM_ATTR_DRVNAME, GfParmGetStr(params, path, RM_ATTR_DRVNAME, ""));
438 } else {
439 RmLoadingScreenStart(ReInfo->_reName, "data/img/splash-qrloading.png");
440 RmLoadingScreenSetText("Preparing Starting Grid...");
441
442 const char* gridType = GfParmGetStr(params, raceName, RM_ATTR_START_ORDER, RM_VAL_DRV_LIST_ORDER);
443 if (!strcmp(gridType, RM_VAL_LAST_RACE_ORDER)) {
444 /* Starting grid in the arrival of the previous race */
445 nCars = GfParmGetEltNb(params, RM_SECT_DRIVERS);
446 maxCars = (int)GfParmGetNum(params, raceName, RM_ATTR_MAX_DRV, NULL, 100);
447 nCars = MIN(nCars, maxCars);
448 const char* prevRaceName = ReGetPrevRaceName();
449 if (!prevRaceName) {
450 return RM_QUIT;
451 }
452 for (i = 1; i < nCars + 1; i++) {
453 snprintf(path, BUFSIZE, "%s/%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, prevRaceName, RE_SECT_RANK, i);
454 snprintf(path2, BUFSIZE, "%s/%d", RM_SECT_DRIVERS_RACING, i);
455 GfParmSetStr(params, path2, RM_ATTR_MODULE, GfParmGetStr(results, path, RE_ATTR_MODULE, ""));
456 GfParmSetNum(params, path2, RM_ATTR_IDX, NULL, GfParmGetNum(results, path, RE_ATTR_IDX, NULL, tModInfo::INVALID_INDEX));
457 GfParmSetStr(params, path2, RM_ATTR_DRVNAME, GfParmGetStr(params, path, RM_ATTR_DRVNAME, ""));
458 }
459 } else if (!strcmp(gridType, RM_VAL_LAST_RACE_RORDER)) {
460 /* Starting grid in the reversed arrival order of the previous race */
461 nCars = GfParmGetEltNb(params, RM_SECT_DRIVERS);
462 maxCars = (int)GfParmGetNum(params, raceName, RM_ATTR_MAX_DRV, NULL, 100);
463 nCars = MIN(nCars, maxCars);
464 const char* prevRaceName = ReGetPrevRaceName();
465 if (!prevRaceName) {
466 return RM_QUIT;
467 }
468 for (i = 1; i < nCars + 1; i++) {
469 snprintf(path, BUFSIZE, "%s/%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, prevRaceName, RE_SECT_RANK, nCars - i + 1);
470 snprintf(path2, BUFSIZE, "%s/%d", RM_SECT_DRIVERS_RACING, i);
471 GfParmSetStr(params, path2, RM_ATTR_MODULE, GfParmGetStr(results, path, RE_ATTR_MODULE, ""));
472 GfParmSetNum(params, path2, RM_ATTR_IDX, NULL, GfParmGetNum(results, path, RE_ATTR_IDX, NULL, tModInfo::INVALID_INDEX));
473 GfParmSetStr(params, path2, RM_ATTR_DRVNAME, GfParmGetStr(params, path, RM_ATTR_DRVNAME, ""));
474 }
475 } else {
476 /* Starting grid in the drivers list order */
477 nCars = GfParmGetEltNb(params, RM_SECT_DRIVERS);
478 maxCars = (int)GfParmGetNum(params, raceName, RM_ATTR_MAX_DRV, NULL, 100);
479 nCars = MIN(nCars, maxCars);
480 for (i = 1; i < nCars + 1; i++) {
481 snprintf(path, BUFSIZE, "%s/%d", RM_SECT_DRIVERS, i);
482 snprintf(path2, BUFSIZE, "%s/%d", RM_SECT_DRIVERS_RACING, i);
483 GfParmSetStr(params, path2, RM_ATTR_MODULE, GfParmGetStr(params, path, RM_ATTR_MODULE, ""));
484 GfParmSetNum(params, path2, RM_ATTR_IDX, NULL, GfParmGetNum(params, path, RM_ATTR_IDX, NULL, tModInfo::INVALID_INDEX));
485 GfParmSetStr(params, path2, RM_ATTR_DRVNAME, GfParmGetStr(params, path, RM_ATTR_DRVNAME, ""));
486 }
487 }
488 }
489
490 if (ReInfo->_displayMode != RM_DISP_MODE_CONSOLE) {
491 if (!strcmp(GfParmGetStr(params, ReInfo->_reRaceName, RM_ATTR_SPLASH_MENU, RM_VAL_NO), RM_VAL_YES)) {
494 return RM_ASYNC | RM_NEXT_STEP;
495 }
496 }
497
498 return reRaceRealStart();
499}
500
501/***************************************************************/
502/* BACK TO RACE HOOK */
503
504static void *BackToRaceHookHandle = 0;
505
506static void BackToRaceHookActivate(void)
507{
508 ReInfo->_reState = RE_STATE_RACE;
509 GfuiScreenActivate(ReInfo->_reGameScreen);
510}
511
512
523
524/***************************************************************/
525/* RESTART RACE HOOK */
526
527static void *RestartRaceHookHandle = 0;
528
529static void RestartRaceHookActivate(void)
530{
532 ReInfo->_reState = RE_STATE_PRE_RACE;
533 GfuiScreenActivate(ReInfo->_reGameScreen);
534}
535
546
547/***************************************************************/
548/* QUIT HOOK */
549
550static void *QuitHookHandle = 0;
551static void *StopScrHandle = 0;
552
559
560
561static void* QuitHookInit(void)
562{
563 if (QuitHookHandle) {
564 return QuitHookHandle;
565 }
566
568
569 return QuitHookHandle;
570}
571
572
573int ReRaceStop(void)
574{
575 void *params = ReInfo->params;
576 ReInfo->_reGraphicItf.muteformenu();
577
578 if (!strcmp(GfParmGetStr(params, ReInfo->_reRaceName, RM_ATTR_ALLOW_RESTART, RM_VAL_NO), RM_VAL_NO)) {
579 StopScrHandle = RmTriStateScreen("Race Stopped",
580 "Abandon Race", "Abort current race", AbortRaceHookInit(),
581 "Resume Race", "Return to Race", BackToRaceHookInit(),
582 "Quit Game", "Quit the game", QuitHookInit());
583 } else {
584 if (
585 (ReInfo->s->raceInfo.type == RM_TYPE_PRACTICE || ReInfo->s->raceInfo.type == RM_TYPE_QUALIF) &&
586 (ReInfo->s->raceInfo.ncars == 1) &&
587 (ReInfo->carList[0].info.driverType == RM_DRV_HUMAN)
588 ) {
589 tCarElt* carElt = &ReInfo->carList[0];
590 static const char* label[5] = { "Restart Race", "Setup Car, Restart", "Abandon Race", "Resume Race", "Quit Game" };
591 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" };
592 void* screen[5];
593
594 screen[0] = RestartRaceHookInit();
595 screen[1] = RmCarSetupScreenInit(RestartRaceHookInit(), carElt, ReInfo);
596 screen[2] = AbortRaceHookInit();
597 screen[3] = BackToRaceHookInit();
598 screen[4] = QuitHookInit();
599
600 StopScrHandle = RmNStateScreen("Race Stopped", label, tip, screen, 5);
601 } else {
602 StopScrHandle = RmFourStateScreen("Race Stopped",
603 "Restart Race", "Restart the current race", RestartRaceHookInit(),
604 "Abandon Race", "Abort current race", AbortRaceHookInit(),
605 "Resume Race", "Return to Race", BackToRaceHookInit(),
606 "Quit Game", "Quit the game", QuitHookInit());
607 }
608 }
609 return RM_ASYNC | RM_NEXT_STEP;
610}
611
612
613int ReRaceEnd(void)
614{
615 int curDrvIdx;
616 void *params = ReInfo->params;
617 void *results = ReInfo->results;
618
620
621 if (ReInfo->s->_raceType == RM_TYPE_QUALIF) {
622 curDrvIdx = (int)GfParmGetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_DRIVER, NULL, 1);
623 curDrvIdx++;
624 if (curDrvIdx > GfParmGetEltNb(params, RM_SECT_DRIVERS)) {
626 return ReDisplayResults();
627 }
628 GfParmSetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_DRIVER, NULL, curDrvIdx);
629 return RM_SYNC | RM_NEXT_RACE;
630 }
631
632 return ReDisplayResults();
633}
634
635
636int RePostRace(void)
637{
638 int curRaceIdx;
639 void *results = ReInfo->results;
640 void *params = ReInfo->params;
641
642 curRaceIdx = (int)GfParmGetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_RACE, NULL, 1);
643 if (curRaceIdx < GfParmGetEltNb(params, RM_SECT_RACES)) {
644 curRaceIdx++;
645 GfOut("Race Nb %d\n", curRaceIdx);
646 GfParmSetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_RACE, NULL, curRaceIdx);
648 return RM_SYNC | RM_NEXT_RACE;
649 }
650
653 return RM_SYNC | RM_NEXT_STEP;
654}
655
656
658{
659 int curTrkIdx;
660 void *params = ReInfo->params;
661 int nbTrk = GfParmGetEltNb(params, RM_SECT_TRACKS);
662 int ret = 0;
663 void *results = ReInfo->results;
664
665 if (
666 (ReInfo->_displayMode != RM_DISP_MODE_CONSOLE) &&
667 (ReInfo->_reGraphicItf.shutdowntrack != 0)
668 ) {
669 ReInfo->_reGraphicItf.shutdowntrack();
670 }
671
672 int curRaceIdx = (int)GfParmGetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_RACE, NULL, 1);
673 curTrkIdx = (int)GfParmGetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_TRACK, NULL, 1);
674
675 if (curRaceIdx == 1) {
676 if (curTrkIdx < nbTrk) {
677 // Next track.
678 curTrkIdx++;
679 } else if (curTrkIdx >= nbTrk) {
680 // Back to the beginning.
681 curTrkIdx = 1;
682 }
683 }
684
685 GfParmSetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_TRACK, NULL, curTrkIdx);
686
687 if (curTrkIdx != 1) {
688 ret = RM_NEXT_RACE;
689 } else {
690 ret = RM_NEXT_STEP;
691 }
692
693 if ((nbTrk != 1) && (ReInfo->_displayMode != RM_DISP_MODE_CONSOLE)) {
695 FREEZ(ReInfo->_reCarInfo);
696 return RM_ASYNC | ret;
697 }
698 FREEZ(ReInfo->_reCarInfo);
699
700 return RM_SYNC | ret;
701}
#define RM_DRV_HUMAN
Definition car.h:122
#define RM_DRV_ROBOT
Definition car.h:123
struct CarElt tCarElt
Car structure (tCarElt).
#define dllname
void * TorcsExitMenuInit(void *menu, void(*onQuit)(void))
Definition exitmenu.cpp:83
#define GR_VIEW_STD
Definition graphic.h:100
float tdble
Floating point type used in TORCS.
Definition tgf.h:47
void * GfuiHookCreateAction(const tGfuiAction &onActivate)
Create a callback hook.
Definition gui.cpp:736
void GfuiScreenActivate(void *screen)
Activate a screen and make it current.
Definition gui.cpp:508
int GfModLoad(unsigned int gfid, char *dllname, tModList **modlist)
Load the specified DLLs.
Definition module.cpp:57
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:2453
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:2623
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:2534
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:2737
int GfParmListClean(void *handle, const char *path)
Remove all the subsections in a section in the parameter set handle.
Definition params.cpp:2362
int GfParmGetEltNb(void *handle, const char *path)
Count the number of subsections in a section in the parameter set handle.
Definition params.cpp:2243
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)
void RmLoadingScreenSetText(const char *text)
Set a new line of text on the loading screen.
void * RmNStateScreen(const char *title, const char **label, const char **tip, void **screen, const int n)
Screen with N menu options (buttons)
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)
void * RmCarSetupScreenInit(void *prevMenu, tCarElt *car, tRmInfo *reInfo)
Display car setup screen, for loading, saving and changing car setups.
void RmShutdownLoadingScreen(void)
Shut down loading screen.
void RmLoadingScreenStart(const char *title, const char *bgimg)
Set up loading screen.
struct RobotItf tRobotItf
Interface Structure for Robots.
void GfScrGetSize(int *scrw, int *scrh, int *vieww, int *viewh)
Get the screen and viewport sizes.
Definition screen.cpp:529
void RmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr)
void stopMenuMusic()
void startMenuMusic()
tRmInfo * ReInfo
void * ReScreenInit(void)
Definition racegl.cpp:167
void * ReResScreenInit(void)
Definition racegl.cpp:307
void ReResScreenSetTitle(char *title)
Definition racegl.cpp:356
const char * ReGetPrevRaceName(void)
Definition raceinit.cpp:953
void ReRaceCleanup(void)
Definition raceinit.cpp:892
const char * ReGetCurrentRaceName(void)
Definition raceinit.cpp:939
int ReInitTrack(void)
Initialize the current race-manager track.
Definition raceinit.cpp:833
tModList * ReRaceModList
Definition raceinit.cpp:50
int ReInitCars(void)
Initialize the cars for a race.
Definition raceinit.cpp:553
void ReRaceCleanDrivers(void)
Definition raceinit.cpp:906
static void * RestartRaceHookHandle
Definition racemain.cpp:527
static void RestartRaceHookActivate(void)
Definition racemain.cpp:529
int ReRaceStart(void)
Definition racemain.cpp:408
static void * AbandonRaceHookHandle
Definition racemain.cpp:44
static void BackToRaceHookActivate(void)
Definition racemain.cpp:506
static void * QuitHookHandle
Definition racemain.cpp:550
int RePostRace(void)
Definition racemain.cpp:636
int ReRaceEventInit(void)
Initialize the current race event before pre-race setup.
Definition racemain.cpp:128
int ReRaceEnd(void)
Definition racemain.cpp:613
static void StartRaceHookActivate(void)
Definition racemain.cpp:389
int ReEventShutdown(void)
Definition racemain.cpp:657
int RePreRace(void)
Definition racemain.cpp:232
static void * RestartRaceHookInit(void)
Definition racemain.cpp:536
static void * StartRaceHookInit(void)
Definition racemain.cpp:395
static void * AbortRaceHookInit(void)
Definition racemain.cpp:109
static void * BackToRaceHookInit(void)
Definition racemain.cpp:513
static void * AbortRaceHookHandle
Definition racemain.cpp:70
static void * QuitHookInit(void)
Definition racemain.cpp:561
static void AbortRaceHookActivate(void)
Definition racemain.cpp:97
static void * BackToRaceHookHandle
Definition racemain.cpp:504
void ReInitRules(tRmInfo *ReInfo)
Definition racemain.cpp:170
static void * AbandonRaceHookInit(void)
Definition racemain.cpp:59
static void abortRace(bool returnToMenu)
Definition racemain.cpp:73
int ReRaceStop(void)
Definition racemain.cpp:573
static void QuitHookActivate(void)
Definition racemain.cpp:553
static void abortRaceForQuit(void)
Definition racemain.cpp:103
static void AbandonRaceHookActivate(void)
Definition racemain.cpp:47
static int reRaceRealStart(void)
Definition racemain.cpp:275
static void * StopScrHandle
Definition racemain.cpp:551
static void * StartRaceHookHandle
Definition racemain.cpp:386
#define RM_ATTR_DRVNAME
Definition raceman.h:259
#define RM_ATTR_START_ORDER
Definition raceman.h:248
#define RM_ATTR_SPLASH_MENU
Definition raceman.h:250
#define RM_ATTR_FUEL_FACTOR
Definition raceman.h:291
#define RE_STATE_SHUTDOWN
Definition raceman.h:110
#define RE_SECT_CURRENT
Definition raceman.h:333
#define RM_VAL_QUALIF
Definition raceman.h:312
#define RE_STATE_PRE_RACE
Definition raceman.h:103
struct RmInfo tRmInfo
Race Manager General Info.
#define RM_ATTR_INVALIDATE_BEST_LAP_WALL_TOUCH
Definition raceman.h:287
#define RM_SECT_RACES
Definition raceman.h:239
#define RE_ATTR_MODULE
Definition raceman.h:347
#define RM_VAL_LAST_RACE_ORDER
Definition raceman.h:308
#define RM_ATTR_DAMAGE_FACTOR
Definition raceman.h:290
#define RM_ATTR_DAMAGE_REPAIR_FACTOR
Definition raceman.h:295
#define RM_NEXT_RACE
Definition raceman.h:47
#define RCM_MAX_DT_SIMU
Definition raceman.h:54
#define RM_NEXT_STEP
Definition raceman.h:46
#define RM_ATTR_CORNER_CUT_TIME_PENALTY
Definition raceman.h:289
#define RM_VAL_YES
Definition raceman.h:315
#define RM_ATTR_MODULE
Definition raceman.h:266
#define RM_VAL_PRACTICE
Definition raceman.h:313
#define RM_SECT_DRIVERS
Definition raceman.h:237
#define RM_VAL_NO
Definition raceman.h:316
#define RE_ATTR_CUR_TRACK
Definition raceman.h:335
#define RM_ATTR_INVALIDATE_BEST_LAP_CORNER_CUT
Definition raceman.h:288
#define RM_RACE_STARTING
Definition raceman.h:66
#define RM_VAL_VISIBLE
Definition raceman.h:318
#define RE_ATTR_CUR_RACE
Definition raceman.h:334
#define RM_VAL_RACE
Definition raceman.h:311
#define RE_SECT_RANK
Definition raceman.h:343
#define RM_TYPE_PRACTICE
Definition raceman.h:70
#define RM_ATTR_IDX
Definition raceman.h:267
#define RE_STATE_RACE
Definition raceman.h:105
#define RM_VAL_LAST_RACE_RORDER
Definition raceman.h:309
#define RM_VAL_DRV_LIST_ORDER
Definition raceman.h:307
#define RM_ATTR_ALLOW_RESTART
Definition raceman.h:249
#define RM_TYPE_RACE
Definition raceman.h:72
#define RM_ASYNC
Definition raceman.h:41
#define RE_ATTR_IDX
Definition raceman.h:348
#define RM_ATTR_PIT_SPEED_LIMIT
Definition raceman.h:293
#define RM_ATTR_LAPS
Definition raceman.h:283
#define RM_SECT_DRIVERS_RACING
Definition raceman.h:245
#define RM_VAL_INVISIBLE
Definition raceman.h:319
#define RM_ATTR_DISPMODE
Definition raceman.h:270
#define RE_ATTR_CUR_DRIVER
Definition raceman.h:336
#define RM_ATTR_REFUEL_FUEL_FLOW
Definition raceman.h:294
#define RM_ATTR_MAX_DRV
Definition raceman.h:254
#define RM_QUIT
Definition raceman.h:51
#define RM_DISP_MODE_CONSOLE
Definition raceman.h:150
#define RM_SYNC
Definition raceman.h:40
#define RM_ATTR_TIRE_FACTOR
Definition raceman.h:292
#define RM_ATTR_MAX_DMG
Definition raceman.h:281
#define RM_ATTR_ALL_TIRES_CHANGE_TIME
Definition raceman.h:297
#define RM_SECT_TRACKS
Definition raceman.h:240
#define RE_SECT_RESULTS
Definition raceman.h:342
#define RM_ATTR_TYPE
Definition raceman.h:273
#define RM_DISP_MODE_NONE
Definition raceman.h:149
#define RM_ATTR_PITSTOP_BASE_TIME
Definition raceman.h:296
#define RM_TYPE_QUALIF
Definition raceman.h:71
struct Situation tSituation
cars situation used to inform the GUI and the drivers
#define RM_DISP_MODE_NORMAL
Definition raceman.h:147
#define RM_ATTR_DISTANCE
Definition raceman.h:282
#define RE_STATE_CONFIG
Definition raceman.h:101
int ReNewTrackMenu(void)
void ReUpdateQualifCurRes(tCarElt *car)
void ReEventInitResults(void)
void ReUpdateStandings(void)
void ReDisplayStandings(void)
int ReDisplayResults(void)
struct RobotItf * robot
private
Definition car.h:466
tCarCtrl ctrl
private
Definition car.h:464
@ INVALID_INDEX
Definition tgf.h:195
@ CORNER_CUTTING_TIME_INVALIDATE
Definition raceman.h:183
@ CORNER_CUTTING_TIME_PENALTY
Definition raceman.h:185
@ WALL_HIT_TIME_INVALIDATE
Definition raceman.h:184
int index
Definition robot.h:112
tfRbNewRace rbNewRace
Definition robot.h:107
tCarElt ** cars
list of cars
Definition raceman.h:89
Info returned by driver during the race.
Definition car.h:346
tdble brakeCmd
Brake command [0.0, 1.0].
Definition car.h:349
Race Engine Car Information about the race.
Definition raceman.h:116
tTrkLocPos prevTrkPos
Definition raceman.h:117
char * GetLibDir(void)
Definition tgf.cpp:243
#define GfOut
Definition tgf.h:372
#define MIN(x, y)
Definition tgf.h:56
#define FREEZ(x)
Definition tgf.h:59
#define GfError
Definition tgf.h:350