TORCS  1.3.9
The Open Racing Car Simulator
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-2014 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 /* The Race Engine State Automaton */
27 
28 #include <stdlib.h>
29 #include <stdio.h>
30 #include <tgfclient.h>
31 #include <raceman.h>
32 #include <racescreens.h>
33 
34 #include "racemain.h"
35 #include "raceinit.h"
36 #include "raceengine.h"
37 #include "racegl.h"
38 #include "raceresults.h"
39 #include "racemanmenu.h"
40 
41 #include "racestate.h"
42 
43 static void *mainMenu;
44 
45 /* State Automaton Init */
46 void
47 ReStateInit(void *prevMenu)
48 {
49  mainMenu = prevMenu;
50 }
51 
52 
53 /* State Automaton Management */
54 /* Called when a race menu is entered */
55 void
57 {
58  int mode = RM_SYNC | RM_NEXT_STEP;
59 
60  do {
61  switch (ReInfo->_reState) {
62  case RE_STATE_CONFIG:
63  GfOut("RaceEngine: state = RE_STATE_CONFIG\n");
64  /* Display the race specific menu */
65  mode = ReRacemanMenu();
66  if (mode & RM_NEXT_STEP) {
67  ReInfo->_reState = RE_STATE_EVENT_INIT;
68  }
69  break;
70 
72  GfOut("RaceEngine: state = RE_STATE_EVENT_INIT\n");
73  /* Load the event description (track and drivers list) */
74  mode = ReRaceEventInit();
75  if (mode & RM_NEXT_STEP) {
76  ReInfo->_reState = RE_STATE_PRE_RACE;
77  }
78  break;
79 
80  case RE_STATE_PRE_RACE:
81  GfOut("RaceEngine: state = RE_STATE_PRE_RACE\n");
82  mode = RePreRace();
83  if (mode & RM_NEXT_STEP) {
84  ReInfo->_reState = RE_STATE_RACE_START;
85  }
86  break;
87 
89  GfOut("RaceEngine: state = RE_STATE_RACE_START\n");
90  mode = ReRaceStart();
91  if (mode & RM_NEXT_STEP) {
92  ReInfo->_reState = RE_STATE_RACE;
93  }
94  break;
95 
96  case RE_STATE_RACE:
97  mode = ReUpdate();
98  if (ReInfo->s->_raceState == RM_RACE_ENDED) {
99  /* race finished */
100  ReInfo->_reState = RE_STATE_RACE_END;
101  } else if (mode & RM_END_RACE) {
102  /* interrupt by player */
103  ReInfo->_reState = RE_STATE_RACE_STOP;
104  }
105  break;
106 
107  case RE_STATE_RACE_STOP:
108  GfOut("RaceEngine: state = RE_STATE_RACE_STOP\n");
109  /* Interrupted by player */
110  mode = ReRaceStop();
111  if (mode & RM_NEXT_STEP) {
112  ReInfo->_reState = RE_STATE_RACE_END;
113  }
114  break;
115 
116  case RE_STATE_RACE_END:
117  GfOut("RaceEngine: state = RE_STATE_RACE_END\n");
118  mode = ReRaceEnd();
119  if (mode & RM_NEXT_STEP) {
120  ReInfo->_reState = RE_STATE_POST_RACE;
121  } else if (mode & RM_NEXT_RACE) {
122  ReInfo->_reState = RE_STATE_RACE_START;
123  }
124  break;
125 
126  case RE_STATE_POST_RACE:
127  GfOut("RaceEngine: state = RE_STATE_POST_RACE\n");
128  mode = RePostRace();
129  if (mode & RM_NEXT_STEP) {
130  ReInfo->_reState = RE_STATE_EVENT_SHUTDOWN;
131  } else if (mode & RM_NEXT_RACE) {
132  ReInfo->_reState = RE_STATE_PRE_RACE;
133  }
134  break;
135 
137  GfOut("RaceEngine: state = RE_STATE_EVENT_SHUTDOWN\n");
138  mode = ReEventShutdown();
139  if (mode & RM_NEXT_STEP) {
140  ReInfo->_reState = RE_STATE_SHUTDOWN;
141  } else if (mode & RM_NEXT_RACE) {
142  ReInfo->_reState = RE_STATE_EVENT_INIT;
143  }
144  break;
145 
146  case RE_STATE_SHUTDOWN:
147  if (ReInfo->_displayMode == RM_DISP_MODE_CONSOLE) {
148  return;
149  }
150  case RE_STATE_ERROR:
151  GfOut("RaceEngine: state = RE_STATE_SHUTDOWN\n");
152  /* Back to race menu */
153  ReInfo->_reState = RE_STATE_CONFIG;
154  mode = RM_SYNC;
155  break;
156 
157  case RE_STATE_EXIT:
158  GfScrShutdown();
159  exit (0); /* brutal isn't it ? */
160  break;
161  }
162 
163  } while ((mode & (RM_SYNC | RM_QUIT)) == RM_SYNC);
164 
165  if (mode & RM_QUIT) {
166  GfScrShutdown();
167  exit (0); /* brutal isn't it ? */
168  }
169 
170  if (mode & RM_ACTIVGAMESCR) {
171  GfuiScreenActivate(ReInfo->_reGameScreen);
172  }
173 }
174 
175 /* Change and Execute a New State */
176 void
177 ReStateApply(void *vstate)
178 {
179  long state = (long)vstate;
180 
181  ReInfo->_reState = (int)state;
182  ReStateManage();
183 }
#define RM_END_RACE
Definition: raceman.h:45
#define RE_STATE_EXIT
Definition: raceman.h:112
void ReStateManage(void)
Definition: racestate.cpp:56
static void * mainMenu
Definition: racestate.cpp:43
int ReRaceStop(void)
Definition: racemain.cpp:533
#define RE_STATE_RACE
Definition: raceman.h:105
#define RE_STATE_EVENT_SHUTDOWN
Definition: raceman.h:109
#define RM_NEXT_STEP
Definition: raceman.h:48
#define RE_STATE_RACE_END
Definition: raceman.h:107
void ReStateInit(void *prevMenu)
Definition: racestate.cpp:47
#define RM_SYNC
Definition: raceman.h:42
#define RE_STATE_PRE_RACE
Definition: raceman.h:103
tSituation * s
Situation during race.
Definition: raceman.h:221
The Gaming Framework API (client part).
#define RE_STATE_SHUTDOWN
Definition: raceman.h:110
int ReEventShutdown(void)
Definition: racemain.cpp:617
#define RM_ACTIVGAMESCR
Definition: raceman.h:52
#define RM_NEXT_RACE
Definition: raceman.h:49
int RePostRace(void)
Definition: racemain.cpp:596
tRmInfo * ReInfo
Definition: raceengine.cpp:45
int ReRaceEnd(void)
Definition: racemain.cpp:573
#define RE_STATE_POST_RACE
Definition: raceman.h:108
#define RE_STATE_RACE_STOP
Definition: raceman.h:106
int ReUpdate(void)
Definition: raceengine.cpp:711
#define GfOut
Definition: tgf.h:373
#define RE_STATE_RACE_START
Definition: raceman.h:104
int ReRaceEventInit(void)
Definition: racemain.cpp:107
#define RE_STATE_ERROR
Definition: raceman.h:111
This is the race information structures.
#define RE_STATE_EVENT_INIT
Definition: raceman.h:102
int ReRaceStart(void)
Definition: racemain.cpp:368
void GfuiScreenActivate(void *screen)
Activate a screen and make it current.
Definition: gui.cpp:467
#define RM_RACE_ENDED
Definition: raceman.h:66
#define RM_QUIT
Definition: raceman.h:53
#define RM_DISP_MODE_CONSOLE
Definition: raceman.h:149
int ReRacemanMenu(void)
int RePreRace(void)
Definition: racemain.cpp:196
#define RE_STATE_CONFIG
Definition: raceman.h:101
void GfScrShutdown(void)
Shutdown the screen.
Definition: screen.cpp:442
void ReStateApply(void *vstate)
Definition: racestate.cpp:177