/***************************************************************************
file : miscscreens.cpp
created : Sun Dec 8 13:01:47 CET 2002
copyright : (C) 2002 by Eric Espié
email : eric.espie@torcs.org
version : $Id: miscscreens.cpp,v 1.2 2003/06/24 21:02:24 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: miscscreens.cpp,v 1.2 2003/06/24 21:02:24 torcs Exp $
*/
#include
#include
#include
#include
static void *twoStateHdle = 0;
static void *triStateHdle = 0;
static void *fourStateHdle = 0;
void *
RmTwoStateScreen(char *title,
char *label1, char *tip1, void *screen1,
char *label2, char *tip2, void *screen2)
{
if (twoStateHdle) {
GfuiScreenRelease(twoStateHdle);
}
twoStateHdle = GfuiMenuScreenCreate(title);
GfuiScreenAddBgImg(twoStateHdle, "data/img/splash-quit.png");
GfuiMenuButtonCreate(twoStateHdle,
label1, tip1, screen1,
GfuiScreenActivate);
GfuiMenuButtonCreate(twoStateHdle,
label2, tip2, screen2,
GfuiScreenActivate);
GfuiAddKey(twoStateHdle, 27, tip2, screen2, GfuiScreenActivate, NULL);
GfuiScreenActivate(twoStateHdle);
return twoStateHdle;
}
void *
RmTriStateScreen(char *title,
char *label1, char *tip1, void *screen1,
char *label2, char *tip2, void *screen2,
char *label3, char *tip3, void *screen3)
{
if (triStateHdle) {
GfuiScreenRelease(triStateHdle);
}
triStateHdle = GfuiMenuScreenCreate(title);
GfuiScreenAddBgImg(triStateHdle, "data/img/splash-quit.png");
GfuiMenuButtonCreate(triStateHdle,
label1, tip1, screen1,
GfuiScreenActivate);
GfuiMenuButtonCreate(triStateHdle,
label2, tip2, screen2,
GfuiScreenActivate);
GfuiMenuButtonCreate(triStateHdle,
label3, tip3, screen3,
GfuiScreenActivate);
GfuiAddKey(triStateHdle, 27, tip3, screen3, GfuiScreenActivate, NULL);
GfuiScreenActivate(triStateHdle);
return triStateHdle;
}
void *
RmFourStateScreen(char *title,
char *label1, char *tip1, void *screen1,
char *label2, char *tip2, void *screen2,
char *label3, char *tip3, void *screen3,
char *label4, char *tip4, void *screen4)
{
if (fourStateHdle) {
GfuiScreenRelease(fourStateHdle);
}
fourStateHdle = GfuiMenuScreenCreate(title);
GfuiScreenAddBgImg(fourStateHdle, "data/img/splash-quit.png");
GfuiMenuButtonCreate(fourStateHdle,
label1, tip1, screen1,
GfuiScreenActivate);
GfuiMenuButtonCreate(fourStateHdle,
label2, tip2, screen2,
GfuiScreenActivate);
GfuiMenuButtonCreate(fourStateHdle,
label3, tip3, screen3,
GfuiScreenActivate);
GfuiMenuButtonCreate(fourStateHdle,
label4, tip4, screen4,
GfuiScreenActivate);
GfuiAddKey(fourStateHdle, 27, tip4, screen4, GfuiScreenActivate, NULL);
GfuiScreenActivate(fourStateHdle);
return fourStateHdle;
}
/*********************************************************
* Start screen
*/
#define MAX_LINES 20
typedef struct
{
void *startScr;
void *abortScr;
tRmInfo *info;
int start;
} tStartRaceCall;
static tStartRaceCall nextStartRace, prevStartRace;
static void *rmScrHdle = 0;
static void rmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr, int start);
static void
rmChgStartScreen(void *vpsrc)
{
void *prevScr = rmScrHdle;
tStartRaceCall *psrc = (tStartRaceCall*)vpsrc;
rmDisplayStartRace(psrc->info, psrc->startScr, psrc->abortScr, psrc->start);
GfuiScreenRelease(prevScr);
}
static void
rmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr, int start)
{
static char path[1024];
int nCars;
int i;
int y;
int x, dx;
int rows, curRow;
char *img;
char *name;
int robotIdx;
void *robhdle;
void *carHdle;
char *carName;
void *params = info->params;
char *race = info->_reRaceName;
rmScrHdle = GfuiScreenCreate();
GfuiTitleCreate(rmScrHdle, race, strlen(race));
img = GfParmGetStr(params, RM_SECT_HEADER, RM_ATTR_STARTIMG, 0);
if (img) {
GfuiScreenAddBgImg(rmScrHdle, img);
}
if (!strcmp(GfParmGetStr(params, race, RM_ATTR_DISP_START_GRID, RM_VAL_YES), RM_VAL_YES)) {
GfuiLabelCreate(rmScrHdle, "Starting Grid", GFUI_FONT_MEDIUM_C,
320, 420, GFUI_ALIGN_HC_VB, 0);
sprintf(path, "%s/%s", race, RM_SECT_STARTINGGRID);
rows = (int)GfParmGetNum(params, path, RM_ATTR_ROWS, (char*)NULL, 2);
/* dx = 80; */
/* x = 220 - (rows * dx / 2); */
dx = 0;
x = 40;
y = 400;
curRow = 0;
nCars = GfParmGetEltNb(params, RM_SECT_DRIVERS_RACING);
for (i = start; i < MIN(start + MAX_LINES, nCars); i++) {
/* Find starting driver's name */
sprintf(path, "%s/%d", RM_SECT_DRIVERS_RACING, i + 1);
name = GfParmGetStr(info->params, path, RM_ATTR_MODULE, "");
robotIdx = (int)GfParmGetNum(info->params, path, RM_ATTR_IDX, NULL, 0);
sprintf(path, "%sdrivers/%s/%s.xml", GetLocalDir(), name, name);
robhdle = GfParmReadFile(path, GFPARM_RMODE_STD);
if (!robhdle) {
sprintf(path, "drivers/%s/%s.xml", name, name);
robhdle = GfParmReadFile(path, GFPARM_RMODE_STD);
}
if (robhdle) {
sprintf(path, "%s/%s/%d", ROB_SECT_ROBOTS, ROB_LIST_INDEX, robotIdx);
name = GfParmGetStr(robhdle, path, ROB_ATTR_NAME, "");
carName = GfParmGetStr(robhdle, path, ROB_ATTR_CAR, "");
sprintf(path, "cars/%s/%s.xml", carName, carName);
carHdle = GfParmReadFile(path, GFPARM_RMODE_STD);
carName = GfParmGetName(carHdle);
GfParmReleaseHandle(carHdle);
sprintf(path, "%d - %s - (%s)", i + 1, name, carName);
GfuiLabelCreate(rmScrHdle, path, GFUI_FONT_MEDIUM_C,
x + curRow * dx, y, GFUI_ALIGN_HL_VB, 0);
}
curRow = (curRow + 1) % rows;
y -= 15;
}
if (start > 0) {
prevStartRace.startScr = startScr;
prevStartRace.abortScr = abortScr;
prevStartRace.info = info;
prevStartRace.start = start - MAX_LINES;
GfuiGrButtonCreate(rmScrHdle, "data/img/arrow-up.png", "data/img/arrow-up.png",
"data/img/arrow-up.png", "data/img/arrow-up-pushed.png",
80, 40, GFUI_ALIGN_HL_VB, 1,
(void*)&prevStartRace, rmChgStartScreen,
NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
GfuiAddSKey(rmScrHdle, GLUT_KEY_PAGE_UP, "Previous drivers", (void*)&prevStartRace, rmChgStartScreen, NULL);
}
if (i < nCars) {
nextStartRace.startScr = startScr;
nextStartRace.abortScr = abortScr;
nextStartRace.info = info;
nextStartRace.start = start + MAX_LINES;
GfuiGrButtonCreate(rmScrHdle, "data/img/arrow-down.png", "data/img/arrow-down.png",
"data/img/arrow-down.png", "data/img/arrow-down-pushed.png",
540, 40, GFUI_ALIGN_HL_VB, 1,
(void*)&nextStartRace, rmChgStartScreen,
NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
GfuiAddSKey(rmScrHdle, GLUT_KEY_PAGE_DOWN, "Next Drivers", (void*)&nextStartRace, rmChgStartScreen, NULL);
}
}
GfuiButtonCreate(rmScrHdle,
"Start",
GFUI_FONT_LARGE,
210,
40,
150,
GFUI_ALIGN_HC_VB,
0,
startScr,
GfuiScreenReplace,
NULL,
(tfuiCallback)NULL,
(tfuiCallback)NULL);
GfuiAddKey(rmScrHdle, (unsigned char)13, "Start", startScr, GfuiScreenReplace, NULL);
GfuiButtonCreate(rmScrHdle,
"Abandon",
GFUI_FONT_LARGE,
430,
40,
150,
GFUI_ALIGN_HC_VB,
0,
abortScr,
GfuiScreenReplace,
NULL,
(tfuiCallback)NULL,
(tfuiCallback)NULL);
GfuiAddKey(rmScrHdle, (unsigned char)27, "Abandon", abortScr, GfuiScreenReplace, NULL);
GfuiAddSKey(rmScrHdle, GLUT_KEY_F12, "Take a Screen Shot", NULL, GfuiScreenShot, NULL);
GfuiScreenActivate(rmScrHdle);
}
void
RmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr)
{
rmDisplayStartRace(info, startScr, abortScr, 0);
}