TORCS  1.3.10
The Open Racing Car Simulator
Loading...
Searching...
No Matches
racestate.cpp
Go to the documentation of this file.
1/***************************************************************************
2
3 file : racestate.cpp
4 created : Sat Nov 16 12:00:42 CET 2002
5 copyright : (C) 2002-2026 by Eric Espie, 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/* The Race Engine State Automaton */
23
24#include <stdlib.h>
25#include <stdio.h>
26#include <tgfclient.h>
27#include <raceman.h>
28#include <racescreens.h>
29
30#include "racemain.h"
31#include "raceinit.h"
32#include "raceengine.h"
33#include "racegl.h"
34#include "raceresults.h"
35#include "racemanmenu.h"
36
37#include "racestate.h"
38
39static void *mainMenu;
40
41/* State Automaton Init */
42void
43ReStateInit(void *prevMenu)
44{
45 mainMenu = prevMenu;
46}
47
48
49/* State Automaton Management */
50/* Called when a race menu is entered */
51void
53{
54 int mode = RM_SYNC | RM_NEXT_STEP;
55
56 do {
57 switch (ReInfo->_reState) {
58 case RE_STATE_CONFIG:
59 GfOut("RaceEngine: state = RE_STATE_CONFIG\n");
60 /* Display the race specific menu */
61 mode = ReRacemanMenu();
62 if (mode & RM_NEXT_STEP) {
63 ReInfo->_reState = RE_STATE_EVENT_INIT;
64 }
65 break;
66
68 GfOut("RaceEngine: state = RE_STATE_EVENT_INIT\n");
69 /* Load the event description (track and drivers list) */
70 mode = ReRaceEventInit();
71 if (mode & RM_NEXT_STEP) {
72 ReInfo->_reState = RE_STATE_PRE_RACE;
73 }
74 break;
75
77 GfOut("RaceEngine: state = RE_STATE_PRE_RACE\n");
78 mode = RePreRace();
79 if (mode & RM_NEXT_STEP) {
80 ReInfo->_reState = RE_STATE_RACE_START;
81 }
82 break;
83
85 GfOut("RaceEngine: state = RE_STATE_RACE_START\n");
86 mode = ReRaceStart();
87 if (mode & RM_NEXT_STEP) {
88 ReInfo->_reState = RE_STATE_RACE;
89 }
90 break;
91
92 case RE_STATE_RACE:
93 mode = ReUpdate();
94 if (ReInfo->s->_raceState == RM_RACE_ENDED) {
95 /* race finished */
96 ReInfo->_reState = RE_STATE_RACE_END;
97 } else if (mode & RM_END_RACE) {
98 /* interrupt by player */
99 ReInfo->_reState = RE_STATE_RACE_STOP;
100 }
101 break;
102
104 GfOut("RaceEngine: state = RE_STATE_RACE_STOP\n");
105 /* Interrupted by player */
106 mode = ReRaceStop();
107 if (mode & RM_NEXT_STEP) {
108 ReInfo->_reState = RE_STATE_RACE_END;
109 }
110 break;
111
113 GfOut("RaceEngine: state = RE_STATE_RACE_END\n");
114 mode = ReRaceEnd();
115 if (mode & RM_NEXT_STEP) {
116 ReInfo->_reState = RE_STATE_POST_RACE;
117 } else if (mode & RM_NEXT_RACE) {
118 ReInfo->_reState = RE_STATE_RACE_START;
119 }
120 break;
121
123 GfOut("RaceEngine: state = RE_STATE_POST_RACE\n");
124 mode = RePostRace();
125 if (mode & RM_NEXT_STEP) {
127 } else if (mode & RM_NEXT_RACE) {
128 ReInfo->_reState = RE_STATE_PRE_RACE;
129 }
130 break;
131
133 GfOut("RaceEngine: state = RE_STATE_EVENT_SHUTDOWN\n");
134 mode = ReEventShutdown();
135 if (mode & RM_NEXT_STEP) {
136 ReInfo->_reState = RE_STATE_SHUTDOWN;
137 } else if (mode & RM_NEXT_RACE) {
138 ReInfo->_reState = RE_STATE_EVENT_INIT;
139 }
140 break;
141
143 if (ReInfo->_displayMode == RM_DISP_MODE_CONSOLE) {
144 return;
145 }
146 case RE_STATE_ERROR:
147 GfOut("RaceEngine: state = RE_STATE_SHUTDOWN\n");
148 /* Back to race menu */
149 ReInfo->_reState = RE_STATE_CONFIG;
150 mode = RM_SYNC;
151 break;
152
153 case RE_STATE_EXIT:
155 exit (0); /* brutal isn't it ? */
156 break;
157 }
158
159 } while ((mode & (RM_SYNC | RM_QUIT)) == RM_SYNC);
160
161 if (mode & RM_QUIT) {
163 exit (0); /* brutal isn't it ? */
164 }
165
166 if (mode & RM_ACTIVGAMESCR) {
167 GfuiScreenActivate(ReInfo->_reGameScreen);
168 }
169}
170
171/* Change and Execute a New State */
172void
173ReStateApply(int state)
174{
175 ReInfo->_reState = (int)state;
177}
void GfuiScreenActivate(void *screen)
Activate a screen and make it current.
Definition gui.cpp:508
void GfScrShutdown(void)
Shutdown the screen.
Definition screen.cpp:501
int ReUpdate(void)
tRmInfo * ReInfo
int ReRaceStart(void)
Definition racemain.cpp:408
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
int ReEventShutdown(void)
Definition racemain.cpp:657
int RePreRace(void)
Definition racemain.cpp:232
int ReRaceStop(void)
Definition racemain.cpp:573
#define RM_ACTIVGAMESCR
Definition raceman.h:50
#define RE_STATE_RACE_END
Definition raceman.h:107
#define RE_STATE_SHUTDOWN
Definition raceman.h:110
#define RM_END_RACE
Definition raceman.h:43
#define RE_STATE_EXIT
Definition raceman.h:112
#define RE_STATE_PRE_RACE
Definition raceman.h:103
#define RM_NEXT_RACE
Definition raceman.h:47
#define RM_NEXT_STEP
Definition raceman.h:46
#define RE_STATE_POST_RACE
Definition raceman.h:108
#define RE_STATE_RACE_START
Definition raceman.h:104
#define RE_STATE_RACE
Definition raceman.h:105
#define RE_STATE_RACE_STOP
Definition raceman.h:106
#define RE_STATE_EVENT_SHUTDOWN
Definition raceman.h:109
#define RE_STATE_EVENT_INIT
Definition raceman.h:102
#define RE_STATE_ERROR
Definition raceman.h:111
#define RM_QUIT
Definition raceman.h:51
#define RM_DISP_MODE_CONSOLE
Definition raceman.h:150
#define RM_SYNC
Definition raceman.h:40
#define RE_STATE_CONFIG
Definition raceman.h:101
#define RM_RACE_ENDED
Definition raceman.h:65
int ReRacemanMenu(void)
void ReStateManage(void)
Definition racestate.cpp:52
void ReStateApply(int state)
void ReStateInit(void *prevMenu)
Definition racestate.cpp:43
static void * mainMenu
Definition racestate.cpp:39
#define GfOut
Definition tgf.h:372