00001
00026 #include <assert.h>
00027 #include <stddef.h>
00028 #include "bflderrstate.h"
00029 #include "states.h"
00030 #include "splashstate.h"
00031 #include "gamestate.h"
00032 #include "menustate.h"
00033 #include "menu.h"
00034
00040 static int currState = STATE_SPLASH;
00041
00047 static Bool initalized = FALSE;
00048
00056 static int Stub() {
00057 int state = currState + 1;
00058 if (state == STATE_MAX)
00059 return STATE_QUIT;
00060 return state;
00061 }
00062
00068 static const struct State_t stateImpls[STATE_MAX] = {
00069 { SplashInit, SplashRun, SplashUninit },
00070 { MenuRootInit, MenuRun, MenuRootUninit },
00071 { NULL, Stub, NULL },
00072 { NULL, Stub, NULL },
00073 { NULL, Stub, NULL },
00074 { NULL, Stub, NULL },
00075 { GameInit, GameRun, GameUninit },
00076 { BfldErrInit, BfldErrRun, BfldErrUninit },
00077 { NULL, Stub, NULL }
00078 };
00079
00080 int GetCurrentState() {
00081 return currState;
00082 }
00083
00084 Bool RunState() {
00085 int result;
00086
00087 if (!initalized) {
00088
00089 if (stateImpls[currState].init) {
00090 result = (*stateImpls[currState].init)();
00091
00092 if (result <= STATE_QUIT) {
00093
00094 return FALSE;
00095 }
00096
00097 if (result < STATE_MAX) {
00098
00099 currState = result;
00100
00101 return TRUE;
00102 }
00103
00104 assert(result == STATE_OK);
00105 }
00106
00107 initalized = TRUE;
00108 }
00109
00110 result = (*stateImpls[currState].run)();
00111
00112 if (result != currState) {
00113 assert(result < STATE_MAX);
00114
00115 if (stateImpls[currState].uninit &&
00116 ((*stateImpls[currState].uninit)() != STATE_OK)) {
00117
00118 return FALSE;
00119 }
00120
00121 initalized = FALSE;
00122
00123 currState = result;
00124 }
00125
00126 if (result < 0) {
00127
00128 return FALSE;
00129 }
00130
00131 return TRUE;
00132 }
00133