1
// $Id: CharSel.cxx 493 2004-12-21 03:12:00Z grumbel $
3
// TuxKart - a fun racing game with go-kart
4
// Copyright (C) 2004 Steve Baker <sjbaker1@airmail.net>
6
// This program is free software; you can redistribute it and/or
7
// modify it under the terms of the GNU General Public License
8
// as published by the Free Software Foundation; either version 2
9
// of the License, or (at your option) any later version.
11
// This program is distributed in the hope that it will be useful,
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
// GNU General Public License for more details.
16
// You should have received a copy of the GNU General Public License
17
// along with this program; if not, write to the Free Software
18
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28
#include "KartManager.h"
29
#include "preprocessor.h"
30
#include "WidgetSet.h"
31
#include "RaceManager.h"
32
#include "StartScreen.h"
34
CharSel::CharSel(int whichPlayer)
35
: kart(0), playerIndex(whichPlayer)
38
switch_to_character(3);
40
// for some strange reasons plib calls makeCurrent() in ssgContext
41
// constructor, so we have to save the old one here and restore it
42
ssgContext* oldContext = ssgGetCurrentContext();
43
context = new ssgContext;
44
oldContext->makeCurrent();
46
menu_id = widgetSet -> vstack(0);
48
sprintf(output, "Player %d, choose your character", playerIndex + 1);
49
widgetSet -> label(menu_id, output, GUI_LRG, GUI_ALL, 0, 0);
50
widgetSet -> space(menu_id);
52
int ha = widgetSet -> harray(menu_id);
53
widgetSet -> filler(ha);
54
int va = widgetSet -> varray(ha);
58
int row1 = widgetSet -> harray(va);
59
for(KartManager::KartPropertiesVector::size_type i = 0;
60
i < kart_manager.karts.size(); ++i)
62
//widgetSet ->state(row2, kart_manager.karts[i].name.c_str(), GUI_MED, i, 0);
63
int c = widgetSet -> image(row1,
65
"images/" + kart_manager.karts[i]->icon_file).c_str(),
66
icon_size, icon_size);
67
widgetSet -> activate_widget(c, i, 0);
69
if (i == kart_manager.karts.size() - 1)
70
widgetSet -> set_active(c);
75
int row2 = widgetSet -> harray(va);
76
for(KartManager::KartPropertiesVector::size_type i = 0;
77
i < kart_manager.karts.size()/2; ++i)
79
//widgetSet ->state(row1, kart_manager.karts[i].name.c_str(), GUI_MED, i, 0);
80
// FIXME: images needs to be 'clickable'
81
int c = widgetSet -> image(row1,
83
"images/" + kart_manager.karts[i]->icon_file).c_str(),
84
icon_size, icon_size);
85
widgetSet -> activate_widget(c, i, 0);
87
for(KartManager::KartPropertiesVector::size_type i =
88
kart_manager.karts.size()/2; i < kart_manager.karts.size(); ++i)
90
//widgetSet ->state(row2, kart_manager.karts[i].name.c_str(), GUI_MED, i, 0);
91
int c = widgetSet -> image(row2,
92
loader->getPath("images/" + kart_manager.karts[i]->icon_file).c_str(), icon_size, icon_size);
93
widgetSet -> activate_widget(c, i, 0);
98
widgetSet -> filler(ha);
100
widgetSet -> layout(menu_id, 0, 1);
109
widgetSet -> delete_widget(menu_id) ;
110
ssgDeRefDelete(kart);
115
void CharSel::switch_to_character(int n)
117
if (current_kart != n && n >= 0 && n < int(kart_manager.karts.size()))
120
ssgDeRefDelete(kart);
121
kart = new ssgTransform;
123
ssgEntity* kartentity = kart_manager.karts[n]->getModel();
125
kart->addKid(kartentity);
127
preProcessObj ( kart, 0 );
131
void CharSel::update(float dt)
135
widgetSet -> timer(menu_id, dt) ;
136
widgetSet -> paint(menu_id) ;
138
switch_to_character(widgetSet->token(widgetSet->click()));
142
ssgContext* oldContext = ssgGetCurrentContext();
143
context -> makeCurrent();
145
glClear(GL_DEPTH_BUFFER_BIT);
146
// FIXME: A bit hackish...
147
glViewport ( 0, 0, 800, 320);
149
context -> setFOV ( 45.0f, 45.0f * 320.0f/800.0f ) ;
150
context -> setNearFar ( 0.05f, 1000.0f ) ;
153
sgSetCoord(&cam_pos, 0, 0, 0, 0, 0, 0);
154
context -> setCamera ( &cam_pos ) ;
156
glEnable (GL_DEPTH_TEST);
158
sgSetCoord(&trans, 0, 3, -.4, clock, 0, 0);
159
kart->setTransform (&trans) ;
160
//glShadeModel(GL_SMOOTH);
161
ssgCullAndDraw ( kart ) ;
163
glViewport ( 0, 0, getScreenWidth(), getScreenHeight() ) ;
165
glDisable (GL_DEPTH_TEST);
166
oldContext->makeCurrent();
170
void CharSel::select()
172
int token = widgetSet -> token (widgetSet -> click());
174
if (token >= 0 && token < static_cast<int>(kart_manager.karts.size()))
175
RaceManager::instance()->setPlayerKart(playerIndex,
176
kart_manager.getKartById(token)->ident);
178
if (RaceManager::instance()->getNumPlayers() > 1)
180
if (guiStack.back() == GUIS_CHARSEL)
182
guiStack.push_back(GUIS_CHARSELP2);
186
if (RaceManager::instance()->getNumPlayers() > 2)
188
if (guiStack.back() == GUIS_CHARSELP2)
190
guiStack.push_back(GUIS_CHARSELP3);
194
if (RaceManager::instance()->getNumPlayers() > 3)
196
if (guiStack.back() == GUIS_CHARSELP3)
198
guiStack.push_back(GUIS_CHARSELP4);
205
if (RaceManager::instance()->getRaceMode() != RaceSetup::RM_GRAND_PRIX)
206
guiStack.push_back(GUIS_TRACKSEL);
208
startScreen->switchToGame();