/*************************************************************************** file : racemanmenu.cpp created : Fri Jan 3 22:24:41 CET 2003 copyright : (C) 2003 by Eric Espié email : eric.espie@torcs.org version : $Id: racemanmenu.cpp,v 1.5 2004/08/11 17:44:06 torcs Exp $ ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ /** @file @author Eric Espie @version $Id: racemanmenu.cpp,v 1.5 2004/08/11 17:44:06 torcs Exp $ */ #include #include #include #include #include #include #include "raceengine.h" #include "racemain.h" #include "raceinit.h" #include "racestate.h" #include "racemanmenu.h" static float red[4] = {1.0, 0.0, 0.0, 1.0}; static void *racemanMenuHdle = NULL; static void *newTrackMenuHdle = NULL; static tRmTrackSelect ts; static tRmDrvSelect ds; static tRmRaceParam rp; static tRmFileSelect fs; static char path[1024]; static char buf[1024]; static void reConfigRunState(void); static void reConfigBack(void) { void *params = ReInfo->params; /* Go back one step in the conf */ GfParmSetNum(params, RM_SECT_CONF, RM_ATTR_CUR_CONF, NULL, GfParmGetNum(params, RM_SECT_CONF, RM_ATTR_CUR_CONF, NULL, 1) - 2); reConfigRunState(); } /***************************************************************/ /* Callback hooks used only to run the automaton on activation */ static void *configHookHandle = 0; static void configHookActivate(void * /* dummy */) { reConfigRunState(); } static void * reConfigHookInit(void) { if (configHookHandle) { return configHookHandle; } configHookHandle = GfuiHookCreate(0, configHookActivate); return configHookHandle; } /***************************************************************/ /* Config Back Hook */ static void *ConfigBackHookHandle = 0; static void ConfigBackHookActivate(void * /* dummy */) { reConfigBack(); } static void * reConfigBackHookInit(void) { if (ConfigBackHookHandle) { return ConfigBackHookHandle; } ConfigBackHookHandle = GfuiHookCreate(0, ConfigBackHookActivate); return ConfigBackHookHandle; } static void reConfigRunState(void) { int i; int curConf; char *conf; int numOpt; char *opt; void *params = ReInfo->params; curConf = (int)GfParmGetNum(params, RM_SECT_CONF, RM_ATTR_CUR_CONF, NULL, 1); if (curConf > GfParmGetEltNb(params, RM_SECT_CONF)) { GfOut("End of configuration\n"); GfParmWriteFile(NULL, ReInfo->params, ReInfo->_reName); goto menuback; } sprintf(path, "%s/%d", RM_SECT_CONF, curConf); conf = GfParmGetStr(params, path, RM_ATTR_TYPE, 0); if (!conf) { GfOut("no %s here %s\n", RM_ATTR_TYPE, path); goto menuback; } GfOut("Configuration step %s\n", conf); if (!strcmp(conf, RM_VAL_TRACKSEL)) { /* Track Select Menu */ ts.nextScreen = reConfigHookInit(); if (curConf == 1) { ts.prevScreen = racemanMenuHdle; } else { ts.prevScreen = reConfigBackHookInit(); } ts.param = ReInfo->params; ts.trackItf = ReInfo->_reTrackItf; RmTrackSelect(&ts); } else if (!strcmp(conf, RM_VAL_DRVSEL)) { /* Drivers select menu */ ds.nextScreen = reConfigHookInit(); if (curConf == 1) { ds.prevScreen = racemanMenuHdle; } else { ds.prevScreen = reConfigBackHookInit(); } ds.param = ReInfo->params; RmDriversSelect(&ds); } else if (!strcmp(conf, RM_VAL_RACECONF)) { /* Race Options menu */ rp.nextScreen = reConfigHookInit(); if (curConf == 1) { rp.prevScreen = racemanMenuHdle; } else { rp.prevScreen = reConfigBackHookInit(); } rp.param = ReInfo->params; rp.title = GfParmGetStr(params, path, RM_ATTR_RACE, "Race"); /* Select options to configure */ rp.confMask = 0; sprintf(path, "%s/%d/%s", RM_SECT_CONF, curConf, RM_SECT_OPTIONS); numOpt = GfParmGetEltNb(params, path); for (i = 1; i < numOpt + 1; i++) { sprintf(path, "%s/%d/%s/%d", RM_SECT_CONF, curConf, RM_SECT_OPTIONS, i); opt = GfParmGetStr(params, path, RM_ATTR_TYPE, ""); if (!strcmp(opt, RM_VAL_CONFRACELEN)) { /* Configure race length */ rp.confMask |= RM_CONF_RACE_LEN; } else { if (!strcmp(opt, RM_VAL_CONFDISPMODE)) { /* Configure display mode */ rp.confMask |= RM_CONF_DISP_MODE; } } } RmRaceParamMenu(&rp); } curConf++; GfParmSetNum(params, RM_SECT_CONF, RM_ATTR_CUR_CONF, NULL, curConf); return; /* Back to the race menu */ menuback: GfuiScreenActivate(racemanMenuHdle); return; } static void reConfigureMenu(void * /* dummy */) { void *params = ReInfo->params; /* Reset configuration automaton */ GfParmSetNum(params, RM_SECT_CONF, RM_ATTR_CUR_CONF, NULL, 1); reConfigRunState(); } static void reSelectLoadFile(char *filename) { sprintf(buf, "%sresults/%s/%s", GetLocalDir(), ReInfo->_reFilename, filename); GfOut("Loading Saved File %s...\n", buf); ReInfo->results = GfParmReadFile(buf, GFPARM_RMODE_STD | GFPARM_RMODE_CREAT); ReInfo->_reRaceName = ReInfo->_reName; RmShowStandings(ReInfo->_reGameScreen, ReInfo); } static void reLoadMenu(void *prevHandle) { char *str; void *params = ReInfo->params; fs.prevScreen = prevHandle; fs.select = reSelectLoadFile; str = GfParmGetStr(params, RM_SECT_HEADER, RM_ATTR_NAME, 0); if (str) { fs.title = str; } sprintf(buf, "%sresults/%s", GetLocalDir(), ReInfo->_reFilename); fs.path = buf; RmFileSelect((void*)&fs); } int ReRacemanMenu(void) { char *str; void *params = ReInfo->params; if (racemanMenuHdle) { GfuiScreenRelease(racemanMenuHdle); } racemanMenuHdle = GfuiScreenCreateEx(NULL, NULL, (tfuiCallback)NULL, NULL, (tfuiCallback)NULL, 1); str = GfParmGetStr(params, RM_SECT_HEADER, RM_ATTR_BGIMG, 0); if (str) { GfuiScreenAddBgImg(racemanMenuHdle, str); } GfuiMenuDefaultKeysAdd(racemanMenuHdle); str = GfParmGetStr(params, RM_SECT_HEADER, RM_ATTR_NAME, 0); if (str) { GfuiTitleCreate(racemanMenuHdle, str, strlen(str)); } GfuiMenuButtonCreate(racemanMenuHdle, "New Race", "Start a New Race", NULL, ReStartNewRace); GfuiMenuButtonCreate(racemanMenuHdle, "Configure Race", "Configure The Race", NULL, reConfigureMenu); /* GfuiMenuButtonCreate(racemanMenuHdle, */ /* "Configure Players", "Players configuration menu", */ /* TorcsDriverMenuInit(racemanMenuHdle), GfuiScreenActivate); */ if (GfParmGetEltNb(params, RM_SECT_TRACKS) > 1) { GfuiMenuButtonCreate(racemanMenuHdle, "Load", "Load a Previously Saved Game", racemanMenuHdle, reLoadMenu); } GfuiMenuBackQuitButtonCreate(racemanMenuHdle, "Back to Main", "Return to previous Menu", ReInfo->_reMenuScreen, GfuiScreenActivate); GfuiScreenActivate(racemanMenuHdle); return RM_ASYNC | RM_NEXT_STEP; } static void reStateManage(void * /* dummy */) { ReStateManage(); } int ReNewTrackMenu(void) { char *str; void *params = ReInfo->params; void *results = ReInfo->results; if (newTrackMenuHdle) { GfuiScreenRelease(newTrackMenuHdle); } newTrackMenuHdle = GfuiScreenCreateEx(NULL, NULL, (tfuiCallback)NULL, NULL, (tfuiCallback)NULL, 1); str = GfParmGetStr(params, RM_SECT_HEADER, RM_ATTR_BGIMG, 0); if (str) { GfuiScreenAddBgImg(newTrackMenuHdle, str); } str = GfParmGetStr(params, RM_SECT_HEADER, RM_ATTR_NAME, ""); GfuiTitleCreate(newTrackMenuHdle, str, strlen(str)); GfuiMenuDefaultKeysAdd(newTrackMenuHdle); sprintf(buf, "Race Day #%d/%d on %s", (int)GfParmGetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_TRACK, NULL, 1), GfParmGetEltNb(params, RM_SECT_TRACKS), ReInfo->track->name); GfuiLabelCreateEx(newTrackMenuHdle, buf, red, GFUI_FONT_MEDIUM_C, 320, 420, GFUI_ALIGN_HC_VB, 50); GfuiMenuButtonCreate(newTrackMenuHdle, "Start Event", "Start The Current Race", NULL, reStateManage); GfuiMenuButtonCreate(newTrackMenuHdle, "Abandon", "Abandon The Race", ReInfo->_reMenuScreen, GfuiScreenActivate); GfuiAddKey(newTrackMenuHdle, 27, "Abandon", ReInfo->_reMenuScreen, GfuiScreenActivate, NULL); GfuiScreenActivate(newTrackMenuHdle); return RM_ASYNC | RM_NEXT_STEP; }