1 Index: src/control/joystickkeyboardcontroller.cpp
\r
2 ===================================================================
\r
3 --- src/control/joystickkeyboardcontroller.cpp (revision 6139)
\r
4 +++ src/control/joystickkeyboardcontroller.cpp (working copy)
\r
5 @@ -479,11 +479,12 @@
\r
6 KeyMap::iterator key_mapping = keymap.find(event.key.keysym.sym);
8 // if console key was pressed: toggle console
9 - if ((key_mapping != keymap.end()) && (key_mapping->second == CONSOLE)) {
10 + // only main controller does console
11 + if ((key_mapping != keymap.end()) && (key_mapping->second == CONSOLE) && (this == g_main_controller)) {
12 if (event.type == SDL_KEYDOWN)
13 Console::instance->toggle();
15 - if (Console::instance->hasFocus()) {
16 + if (Console::instance->hasFocus() && (this == g_main_controller)) {
17 // if console is open: send key there
18 process_console_key_event(event);
19 } else if (MenuManager::current()) {
20 Index: src/object/player.cpp
\r
21 ===================================================================
\r
22 --- src/object/player.cpp (revision 6139)
\r
23 +++ src/object/player.cpp (working copy)
\r
28 - controller = g_main_controller;
29 + controller = (name == "Penny") ? g_secondary_controller : g_main_controller;
30 scripting_controller.reset(new CodeController());
31 sprite = sprite_manager->create("images/creatures/tux/tux.sprite");
32 airarrow = Surface::create("images/engine/hud/airarrow.png");
33 @@ -1015,6 +1015,16 @@
\r
35 sa_postfix = "-right";
37 + // two-player hack: draw Penny in a different color
38 + if (name == "Penny") {
39 + sprite->set_color(Color(1.0f, 1.0f, 0.5f, 1.0f));
41 + sprite->set_color(Color(1.0f, 1.0f, 1.0f, 1.0f));
43 + // if/when we have complete penny gfx, we can
44 + // load those instead of Tux's sprite in the
47 /* Set Tux sprite action */
49 sprite->set_action("gameover");
50 @@ -1177,6 +1187,11 @@
\r
54 + Player* player = dynamic_cast<Player*> (&other);
59 if(hit.left || hit.right) {
60 try_grab(); //grab objects right now, in update it will be too late
62 @@ -1276,8 +1291,11 @@
\r
63 dying_timer.start(3.0);
64 set_group(COLGROUP_DISABLED);
66 - Sector::current()->effect->fade_out(3.0);
67 - sound_manager->stop_music(3.0);
68 + // Two-player hack: ignore Penny's death
69 + if (name != "Penny") {
70 + Sector::current()->effect->fade_out(3.0);
71 + sound_manager->stop_music(3.0);
76 Index: src/supertux/game_session.cpp
\r
77 ===================================================================
\r
78 --- src/supertux/game_session.cpp (revision 6139)
\r
79 +++ src/supertux/game_session.cpp (working copy)
\r
83 g_main_controller->reset();
84 + g_secondary_controller->reset();
88 @@ -434,6 +435,22 @@
\r
92 + // two-player hack: resurrect Penny when she dies
93 + Player* tux = currentsector->player;
94 + for(std::vector<GameObject*>::iterator i = currentsector->gameobjects.begin(); i != currentsector->gameobjects.end(); ++i) {
95 + Player* p = dynamic_cast<Player*>(*i);
97 + if (p == tux) continue;
100 + static PlayerStatus* ps = new PlayerStatus();
101 + p = new Player(ps, "Penny");
102 + currentsector->add_object(p);
103 + p->move(tux->get_pos());
104 + p->safe_timer.start(TUX_SAFE_TIME);
108 check_end_conditions();
110 // respawning in new sector?
111 Index: src/supertux/gameconfig.cpp
\r
112 ===================================================================
\r
113 --- src/supertux/gameconfig.cpp (revision 6139)
\r
114 +++ src/supertux/gameconfig.cpp (working copy)
\r
116 g_main_controller->read(*config_control_lisp);
119 + const lisp::Lisp* config_control_p2_lisp = config_lisp->get_lisp("control-p2");
120 + if(config_control_p2_lisp && g_secondary_controller) {
121 + g_secondary_controller->read(*config_control_p2_lisp);
124 const lisp::Lisp* config_addons_lisp = config_lisp->get_lisp("addons");
125 if(config_addons_lisp) {
126 AddonManager::get_instance().read(*config_addons_lisp);
127 @@ -138,6 +143,12 @@
\r
128 writer.end_list("control");
131 + if(g_secondary_controller) {
132 + writer.start_list("control-p2");
133 + g_secondary_controller->write(writer);
134 + writer.end_list("control-p2");
137 writer.start_list("addons");
138 AddonManager::get_instance().write(writer);
139 writer.end_list("addons");
140 Index: src/supertux/globals.cpp
\r
141 ===================================================================
\r
142 --- src/supertux/globals.cpp (revision 6139)
\r
143 +++ src/supertux/globals.cpp (working copy)
\r
146 SDL_Surface* g_screen;
147 JoystickKeyboardController* g_main_controller = 0;
148 +JoystickKeyboardController* g_secondary_controller = 0;
149 tinygettext::DictionaryManager* dictionary_manager = 0;
152 Index: src/supertux/globals.hpp
\r
153 ===================================================================
\r
154 --- src/supertux/globals.hpp (revision 6139)
\r
155 +++ src/supertux/globals.hpp (working copy)
\r
159 extern JoystickKeyboardController* g_main_controller;
160 +extern JoystickKeyboardController* g_secondary_controller;
162 extern SDL_Surface* g_screen;
166 // global player state
167 extern PlayerStatus* player_status;
168 +extern PlayerStatus* second_player_status;
170 extern SpriteManager* sprite_manager;
172 Index: src/supertux/main.cpp
\r
173 ===================================================================
\r
174 --- src/supertux/main.cpp (revision 6139)
\r
175 +++ src/supertux/main.cpp (working copy)
\r
176 @@ -541,6 +541,7 @@
\r
178 timelog("controller");
179 g_main_controller = new JoystickKeyboardController();
180 + g_secondary_controller = new JoystickKeyboardController();
184 @@ -629,6 +630,8 @@
\r
186 delete g_main_controller;
187 g_main_controller = NULL;
188 + delete g_secondary_controller;
189 + g_secondary_controller = NULL;
190 delete Console::instance;
191 Console::instance = NULL;
192 scripting::exit_squirrel();
193 Index: src/supertux/menu/menu_storage.cpp
\r
194 ===================================================================
\r
195 --- src/supertux/menu/menu_storage.cpp (revision 6139)
\r
196 +++ src/supertux/menu/menu_storage.cpp (working copy)
\r
198 ProfileMenu* MenuStorage::profile_menu = 0;
199 KeyboardMenu* MenuStorage::key_options_menu = 0;
200 JoystickMenu* MenuStorage::joystick_options_menu = 0;
201 +KeyboardMenu* MenuStorage::key_options_p2_menu = 0;
202 +JoystickMenu* MenuStorage::joystick_options_p2_menu = 0;
205 MenuStorage::get_options_menu()
207 return joystick_options_menu;
211 +MenuStorage::get_key_options_p2_menu()
213 + if (!key_options_p2_menu)
214 + { // FIXME: this in never freed
215 + key_options_p2_menu = new KeyboardMenu(g_secondary_controller);
218 + return key_options_p2_menu;
222 +MenuStorage::get_joystick_options_p2_menu()
224 + if (!joystick_options_p2_menu)
225 + { // FIXME: this in never freed
226 + joystick_options_p2_menu = new JoystickMenu(g_secondary_controller);
229 + return joystick_options_p2_menu;
233 Index: src/supertux/menu/menu_storage.hpp
\r
234 ===================================================================
\r
235 --- src/supertux/menu/menu_storage.hpp (revision 6139)
\r
236 +++ src/supertux/menu/menu_storage.hpp (working copy)
\r
237 @@ -32,12 +32,16 @@
\r
238 static ProfileMenu* get_profile_menu();
239 static KeyboardMenu* get_key_options_menu();
240 static JoystickMenu* get_joystick_options_menu();
241 + static KeyboardMenu* get_key_options_p2_menu();
242 + static JoystickMenu* get_joystick_options_p2_menu();
245 static OptionsMenu* options_menu;
246 static ProfileMenu* profile_menu;
247 static KeyboardMenu* key_options_menu;
248 static JoystickMenu* joystick_options_menu;
249 + static KeyboardMenu* key_options_p2_menu;
250 + static JoystickMenu* joystick_options_p2_menu;
253 MenuStorage(const MenuStorage&);
254 Index: src/supertux/menu/options_menu.cpp
\r
255 ===================================================================
\r
256 --- src/supertux/menu/options_menu.cpp (revision 6139)
\r
257 +++ src/supertux/menu/options_menu.cpp (working copy)
\r
258 @@ -161,6 +161,13 @@
\r
260 add_submenu(_("Setup Joystick"), MenuStorage::get_joystick_options_menu())
261 ->set_help(_("Configure joystick control-action mappings"));
263 + add_submenu(_("Setup P2 Keyboard"), MenuStorage::get_key_options_p2_menu())
264 + ->set_help(_("Configure key-action mappings"));
266 + add_submenu(_("Setup P2 Joystick"), MenuStorage::get_joystick_options_p2_menu())
267 + ->set_help(_("Configure joystick control-action mappings"));
272 Index: src/supertux/player_status.cpp
\r
273 ===================================================================
\r
274 --- src/supertux/player_status.cpp (revision 6139)
\r
275 +++ src/supertux/player_status.cpp (working copy)
\r
277 static const int MAX_COINS = 9999;
279 PlayerStatus* player_status = 0;
280 +PlayerStatus* second_player_status = 0;
282 PlayerStatus::PlayerStatus() :
284 Index: src/supertux/resources.cpp
\r
285 ===================================================================
\r
286 --- src/supertux/resources.cpp (revision 6139)
\r
287 +++ src/supertux/resources.cpp (working copy)
\r
289 sprite_manager = new SpriteManager();
291 player_status = new PlayerStatus();
292 + second_player_status = new PlayerStatus();
295 /* Free shared data: */
298 delete player_status;
299 player_status = NULL;
301 + delete second_player_status;
302 + second_player_status = NULL;
306 Index: src/supertux/screen_manager.cpp
\r
307 ===================================================================
\r
308 --- src/supertux/screen_manager.cpp (revision 6139)
\r
309 +++ src/supertux/screen_manager.cpp (working copy)
\r
310 @@ -190,11 +190,13 @@
\r
311 ScreenManager::process_events()
313 g_main_controller->update();
314 + g_secondary_controller->update();
315 Uint8* keystate = SDL_GetKeyState(NULL);
317 while(SDL_PollEvent(&event))
319 g_main_controller->process_event(event);
320 + g_secondary_controller->process_event(event);
322 if(MenuManager::current() != NULL)
323 MenuManager::current()->event(event);
324 Index: src/supertux/sector.cpp
\r
325 ===================================================================
\r
326 --- src/supertux/sector.cpp (revision 6139)
\r
327 +++ src/supertux/sector.cpp (working copy)
\r
331 add_object(new Player(player_status, "Tux"));
332 + add_object(new Player(second_player_status, "Penny"));
333 add_object(new DisplayEffect("Effect"));
334 add_object(new TextObject("Text"));
336 @@ -572,19 +573,27 @@
\r
340 - // spawn smalltux below spawnpoint
341 - if (!player->is_big()) {
342 - player->move(player_pos + Vector(0,32));
344 - player->move(player_pos);
347 - // spawning tux in the ground would kill him
348 - if(!is_free_of_tiles(player->get_bbox())) {
349 - log_warning << "Tried spawning Tux in solid matter. Compensating." << std::endl;
350 - Vector npos = player->get_bbox().p1;
352 - player->move(npos);
353 + // two-player hack: move other players to main player's position
354 + for(GameObjects::iterator i = gameobjects.begin();
355 + i != gameobjects.end(); ++i) {
356 + Player* p = dynamic_cast<Player*>(*i);
359 + // spawn smalltux below spawnpoint
360 + if (!p->is_big()) {
361 + p->move(player_pos + Vector(0,32));
363 + p->move(player_pos);
366 + // spawning tux in the ground would kill him
367 + if(!is_free_of_tiles(p->get_bbox())) {
368 + log_warning << "Tried spawning Tux in solid matter. Compensating." << std::endl;
369 + Vector npos = p->get_bbox().p1;
375 camera->reset(player->get_pos());
376 @@ -645,7 +654,13 @@
\r
378 Sector::update(float elapsed_time)
380 - player->check_bounds(camera);
381 + // keep players in bounds
382 + for(GameObjects::iterator i = gameobjects.begin();
383 + i != gameobjects.end(); ++i) {
384 + Player* p = dynamic_cast<Player*>(*i);
386 + p->check_bounds(camera);
390 for(GameObjects::iterator i = gameobjects.begin();
391 @@ -741,10 +756,11 @@
\r
392 Player* player = dynamic_cast<Player*> (object);
394 if(this->player != 0) {
395 - log_warning << "Multiple players added. Ignoring" << std::endl;
397 +// log_warning << "Multiple players added. Ignoring" << std::endl;
400 + this->player = player;
402 - this->player = player;
405 DisplayEffect* effect = dynamic_cast<DisplayEffect*> (object);