X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fworldmap.cpp;h=173e9363f57614fc2050177c846cd47cde696fb1;hb=2b18d7e2549f4be99533fed58c0f07887a19db37;hp=b49ecaa5499d852727c8b85a1a391cdf82d4d809;hpb=300183d63afce3e0167a1009a79c2f11a4f4a4fd;p=supertux.git diff --git a/src/worldmap.cpp b/src/worldmap.cpp index b49ecaa54..173e9363f 100644 --- a/src/worldmap.cpp +++ b/src/worldmap.cpp @@ -26,32 +26,33 @@ #include #include -#include "app/globals.h" -#include "app/gettext.h" -#include "app/setup.h" +#include "gettext.h" #include "video/surface.h" #include "video/screen.h" #include "video/drawing_context.h" -#include "special/frame_rate.h" -#include "special/sprite_manager.h" +#include "sprite/sprite_manager.h" #include "audio/sound_manager.h" #include "lisp/parser.h" #include "lisp/lisp.h" #include "lisp/list_iterator.h" #include "lisp/writer.h" -#include "gameloop.h" +#include "game_session.h" #include "sector.h" #include "worldmap.h" #include "resources.h" #include "misc.h" #include "player_status.h" #include "textscroller.h" - -#define map_message_TIME 2.8 +#include "main.h" +#include "file_system.h" +#include "gui/menu.h" +#include "gui/mousecursor.h" +#include "control/joystickkeyboardcontroller.h" Menu* worldmap_menu = 0; static const float TUXSPEED = 200; +static const float map_message_TIME = 2.8; namespace WorldMapNS { @@ -190,13 +191,23 @@ Tux::stop() void Tux::set_direction(Direction dir) { -input_direction = dir; + input_direction = dir; } void Tux::action(float delta) { - if (!moving) + // check controller + if(main_controller->pressed(Controller::UP)) + input_direction = D_NORTH; + else if(main_controller->pressed(Controller::DOWN)) + input_direction = D_SOUTH; + else if(main_controller->pressed(Controller::LEFT)) + input_direction = D_WEST; + else if(main_controller->pressed(Controller::RIGHT)) + input_direction = D_EAST; + + if(!moving) { if (input_direction != D_NONE) { @@ -348,8 +359,6 @@ WorldMap::WorldMap() messagedot = new Surface(datadir + "/images/worldmap/messagedot.png", true); teleporterdot = new Surface(datadir + "/images/worldmap/teleporterdot.png", true); - enter_level = false; - name = ""; music = "salcon.mod"; intro_displayed = false; @@ -533,103 +542,33 @@ void WorldMap::on_escape_press() { // Show or hide the menu - if(!Menu::current()) - { - Menu::set_current(worldmap_menu); + if(!Menu::current()) { + Menu::set_current(worldmap_menu); tux->set_direction(D_NONE); // stop tux movement when menu is called - } - else - Menu::set_current(0); + } else { + Menu::set_current(0); + } } void WorldMap::get_input() { - enter_level = false; - SDLKey key; + main_controller->update(); SDL_Event event; - while (SDL_PollEvent(&event)) - { - if (Menu::current()) - { - Menu::current()->event(event); - } - else - { - switch(event.type) - { - case SDL_QUIT: - Termination::abort("Received window close", ""); - break; - - case SDL_KEYDOWN: - key = event.key.keysym.sym; - - if(key == SDLK_ESCAPE) - on_escape_press(); - else if(key == SDLK_RETURN || key == keymap.power) - enter_level = true; - else if(key == SDLK_LEFT || key == keymap.power) - tux->set_direction(D_WEST); - else if(key == SDLK_RIGHT || key == keymap.right) - tux->set_direction(D_EAST); - else if(key == SDLK_UP || key == keymap.up || - key == keymap.jump) - // there might be ppl that use jump as up key - tux->set_direction(D_NORTH); - else if(key == SDLK_DOWN || key == keymap.down) - tux->set_direction(D_SOUTH); - break; - - case SDL_JOYHATMOTION: - if(event.jhat.value & SDL_HAT_UP) { - tux->set_direction(D_NORTH); - } else if(event.jhat.value & SDL_HAT_DOWN) { - tux->set_direction(D_SOUTH); - } else if(event.jhat.value & SDL_HAT_LEFT) { - tux->set_direction(D_WEST); - } else if(event.jhat.value & SDL_HAT_RIGHT) { - tux->set_direction(D_EAST); - } - break; - - case SDL_JOYAXISMOTION: - if (event.jaxis.axis == joystick_keymap.x_axis) - { - if (event.jaxis.value < -joystick_keymap.dead_zone) - tux->set_direction(D_WEST); - else if (event.jaxis.value > joystick_keymap.dead_zone) - tux->set_direction(D_EAST); - } - else if (event.jaxis.axis == joystick_keymap.y_axis) - { - if (event.jaxis.value > joystick_keymap.dead_zone) - tux->set_direction(D_SOUTH); - else if (event.jaxis.value < -joystick_keymap.dead_zone) - tux->set_direction(D_NORTH); - } - break; - - case SDL_JOYBUTTONDOWN: - if (event.jbutton.button == joystick_keymap.b_button) - enter_level = true; - else if (event.jbutton.button == joystick_keymap.start_button) - on_escape_press(); - break; - - default: - break; - } - } - } + while (SDL_PollEvent(&event)) { + if (Menu::current()) + Menu::current()->event(event); + main_controller->process_event(event); + if(event.type == SDL_QUIT) + throw std::runtime_error("Received window close"); + } } Vector WorldMap::get_next_tile(Vector pos, Direction direction) { - switch(direction) - { + switch(direction) { case D_WEST: pos.x -= 1; break; @@ -644,7 +583,7 @@ WorldMap::get_next_tile(Vector pos, Direction direction) break; case D_NONE: break; - } + } return pos; } @@ -688,6 +627,35 @@ WorldMap::path_ok(Direction direction, Vector old_pos, Vector* new_pos) void WorldMap::update(float delta) { + Menu* menu = Menu::current(); + if(menu) { + menu->action(); + + if(menu == worldmap_menu) { + switch (worldmap_menu->check()) + { + case MNID_RETURNWORLDMAP: // Return to game + Menu::set_current(0); + break; + case MNID_QUITWORLDMAP: // Quit Worldmap + quit = true; + break; + } + } else if(menu == options_menu) { + process_options_menu(); + } + + return; + } + + bool enter_level = false; + if(main_controller->pressed(Controller::ACTION) + || main_controller->pressed(Controller::JUMP) + || main_controller->pressed(Controller::MENU_SELECT)) + enter_level = true; + if(main_controller->pressed(Controller::PAUSE_MENU)) + on_escape_press(); + if (enter_level && !tux->is_moving()) { /* Check special tile action */ @@ -697,7 +665,7 @@ WorldMap::update(float delta) if (special_tile->teleport_dest != Vector(-1,-1)) { // TODO: an animation, camera scrolling or a fading would be a nice touch - SoundManager::get()->play_sound(IDToSound(SND_WARP)); + sound_manager->play_sound("warp"); tux->back_direction = D_NONE; tux->set_tile_pos(special_tile->teleport_dest); SDL_Delay(1000); @@ -720,7 +688,6 @@ WorldMap::update(float delta) { PlayerStatus old_player_status = player_status; - std::cout << "Enter the current level: " << level->name << std::endl; // do a shriking fade to the level shrink_fade(Vector((level->pos.x*32 + 16 + offset.x), (level->pos.y*32 + 16 + offset.y)), 500); @@ -764,8 +731,6 @@ WorldMap::update(float delta) tux->set_direction(dir); //tux->update(delta); } - - std::cout << "Walk to dir: " << dir << std::endl; } } @@ -774,7 +739,7 @@ WorldMap::update(float delta) level_finished = false; /* In case the player's abort the level, keep it using the old status. But the minimum lives and no bonus. */ - player_status.distros = old_player_status.distros; + player_status.coins = old_player_status.coins; player_status.lives = std::min(old_player_status.lives, player_status.lives); player_status.bonus = NO_BONUS; @@ -793,19 +758,18 @@ WorldMap::update(float delta) LAYER_BACKGROUND0); context.draw_text(blue_text, _("GAMEOVER"), - Vector(screen->w/2, 200), CENTER_ALLIGN, LAYER_FOREGROUND1); + Vector(SCREEN_WIDTH/2, 200), CENTER_ALLIGN, LAYER_FOREGROUND1); - sprintf(str, _("COINS: %d"), player_status.distros); + sprintf(str, _("COINS: %d"), player_status.coins); context.draw_text(gold_text, str, - Vector(screen->w/2, screen->w - 32), CENTER_ALLIGN, + Vector(SCREEN_WIDTH/2, SCREEN_WIDTH - 32), CENTER_ALLIGN, LAYER_FOREGROUND1); total_stats.draw_message_info(context, _("Total Statistics")); context.do_drawing(); - SDL_Event event; - wait_for_event(event,2000,6000,true); + wait_for_event(2.0, 6.0); quit = true; player_status.reset(); @@ -817,7 +781,7 @@ WorldMap::update(float delta) break; } - SoundManager::get()->play_music(song); + sound_manager->play_music(song); Menu::set_current(0); if (!savegame_file.empty()) savegame(savegame_file); @@ -845,28 +809,6 @@ WorldMap::update(float delta) tux->action(delta); // tux->set_direction(input_direction); } - - Menu* menu = Menu::current(); - if(menu) - { - menu->action(); - - if(menu == worldmap_menu) - { - switch (worldmap_menu->check()) - { - case MNID_RETURNWORLDMAP: // Return to game - break; - case MNID_QUITWORLDMAP: // Quit Worldmap - quit = true; - break; - } - } - else if(menu == options_menu) - { - process_options_menu(); - } - } } const Tile* @@ -956,30 +898,30 @@ WorldMap::draw_status(DrawingContext& context) context.draw_text(white_text, _("SCORE"), Vector(0, 0), LEFT_ALLIGN, LAYER_FOREGROUND1); context.draw_text(gold_text, str, Vector(96, 0), LEFT_ALLIGN, LAYER_FOREGROUND1); - sprintf(str, "%d", player_status.distros); - context.draw_text(white_text, _("COINS"), Vector(screen->w/2 - 16*5, 0), + sprintf(str, "%d", player_status.coins); + context.draw_text(white_text, _("COINS"), Vector(SCREEN_WIDTH/2 - 16*5, 0), LEFT_ALLIGN, LAYER_FOREGROUND1); - context.draw_text(gold_text, str, Vector(screen->w/2 + (16*5)/2, 0), + context.draw_text(gold_text, str, Vector(SCREEN_WIDTH/2 + (16*5)/2, 0), LEFT_ALLIGN, LAYER_FOREGROUND1); if (player_status.lives >= 5) { sprintf(str, "%dx", player_status.lives); context.draw_text(gold_text, str, - Vector(screen->w - gold_text->get_text_width(str) - tux_life->w, 0), + Vector(SCREEN_WIDTH - gold_text->get_text_width(str) - tux_life->w, 0), LEFT_ALLIGN, LAYER_FOREGROUND1); - context.draw_surface(tux_life, Vector(screen->w - + context.draw_surface(tux_life, Vector(SCREEN_WIDTH - gold_text->get_text_width("9"), 0), LEFT_ALLIGN, LAYER_FOREGROUND1); } else { for(int i= 0; i < player_status.lives; ++i) context.draw_surface(tux_life, - Vector(screen->w - tux_life->w*4 + (tux_life->w*i), 0), + Vector(SCREEN_WIDTH - tux_life->w*4 + (tux_life->w*i), 0), LAYER_FOREGROUND1); } context.draw_text(white_text, _("LIVES"), - Vector(screen->w - white_text->get_text_width(_("LIVES")) - white_text->get_text_width(" 99"), 0), + Vector(SCREEN_WIDTH - white_text->get_text_width(_("LIVES")) - white_text->get_text_width(" 99"), 0), LEFT_ALLIGN, LAYER_FOREGROUND1); if (!tux->is_moving()) @@ -992,8 +934,8 @@ WorldMap::draw_status(DrawingContext& context) get_level_title(*i); context.draw_text(white_text, i->title, - Vector(screen->w/2, - screen->h - white_text->get_height() - 30), + Vector(SCREEN_WIDTH/2, + SCREEN_HEIGHT - white_text->get_height() - 30), CENTER_ALLIGN, LAYER_FOREGROUND1); i->statistics.draw_worldmap_info(context); @@ -1007,8 +949,8 @@ WorldMap::draw_status(DrawingContext& context) /* Display an in-map message in the map, if any as been selected */ if(!i->map_message.empty() && !i->passive_message) context.draw_text(gold_text, i->map_message, - Vector(screen->w/2, - screen->h - white_text->get_height() - 60), + Vector(SCREEN_WIDTH/2, + SCREEN_HEIGHT - white_text->get_height() - 60), CENTER_ALLIGN, LAYER_FOREGROUND1); break; } @@ -1017,7 +959,7 @@ WorldMap::draw_status(DrawingContext& context) /* Display a passive message in the map, if needed */ if(passive_message_timer.check()) context.draw_text(gold_text, passive_message, - Vector(screen->w/2, screen->h - white_text->get_height() - 60), + Vector(SCREEN_WIDTH/2, SCREEN_HEIGHT - white_text->get_height() - 60), CENTER_ALLIGN, LAYER_FOREGROUND1); context.pop_transform(); @@ -1030,8 +972,8 @@ WorldMap::display() quit = false; - song = SoundManager::get()->load_music(datadir + "/music/" + music); - SoundManager::get()->play_music(song); + song = sound_manager->load_music(datadir + "/music/" + music); + sound_manager->play_music(song); if(!intro_displayed && intro_filename != "") { std::string filename = levels_path + intro_filename; @@ -1053,14 +995,14 @@ WorldMap::display() Vector tux_pos = tux->get_pos(); - offset.x = -tux_pos.x + screen->w/2; - offset.y = -tux_pos.y + screen->h/2; + offset.x = -tux_pos.x + SCREEN_WIDTH/2; + offset.y = -tux_pos.y + SCREEN_HEIGHT/2; if (offset.x > 0) offset.x = 0; if (offset.y > 0) offset.y = 0; - if (offset.x < screen->w - width*32) offset.x = screen->w - width*32; - if (offset.y < screen->h - height*32) offset.y = screen->h - height*32; + if (offset.x < SCREEN_WIDTH - width*32) offset.x = SCREEN_WIDTH - width*32; + if (offset.y < SCREEN_HEIGHT - height*32) offset.y = SCREEN_HEIGHT - height*32; context.push_transform(); context.set_translation(-offset); @@ -1159,7 +1101,7 @@ WorldMap::loadgame(const std::string& filename) savegame->get("intro-displayed", intro_displayed); savegame->get("lives", player_status.lives); - savegame->get("distros", player_status.distros); + savegame->get("coins", player_status.coins); savegame->get("max-score-multiplier", player_status.max_score_multiplier); if (player_status.lives < 0) player_status.reset();