#include "options_menu.hpp"
#include "console.hpp"
#include "random_generator.hpp"
+#include "addon_manager.hpp"
enum MainMenuIDs {
MNID_STARTGAME,
MNID_LEVELS_CONTRIB,
+ MNID_ADDONS,
MNID_OPTIONMENU,
MNID_LEVELEDITOR,
MNID_CREDITS,
}
}
+namespace {
+ bool generate_addons_menu_sorter(const Addon& a1, const Addon& a2)
+ {
+ return a1.title < a2.title;
+ }
+}
+
void
-TitleScreen::make_tux_jump()
+TitleScreen::generate_addons_menu()
{
- static Timer randomWaitTimer;
- static Timer jumpPushTimer;
- static float last_tux_x_pos = -1;
- static float last_tux_y_pos = -1;
+ AddonManager& adm = AddonManager::get_instance();
+ addons = adm.get_addons();
+
+ // sort addons
+ std::sort(addons.begin(), addons.end(), generate_addons_menu_sorter);
+
+ // hide installed addons from installation menu
+ std::vector<Addon>::iterator it2 = addons.begin();
+ while (it2 != addons.end()) {
+ Addon addon = *it2;
+ if (addon.isInstalled) {
+ bool restart = false;
+ for (std::vector<Addon>::iterator it = addons.begin(); it != addons.end(); ++it) {
+ Addon addon2 = *it;
+ if ((addon2.title == addon.title) && (!addon2.isInstalled)) {
+ addons.erase(it);
+ restart = true;
+ break;
+ }
+ }
+ if (restart) {
+ it2 = addons.begin();
+ continue;
+ }
+ }
+ it2++;
+ }
+ free_addons_menu();
+ addons_menu.reset(new Menu());
+
+ addons_menu->add_label(_("Add-ons"));
+ addons_menu->add_hl();
+
+ int i = 0;
+ for (std::vector<Addon>::iterator it = addons.begin(); it != addons.end(); ++it) {
+ Addon addon = *it;
+ if (addon.isInstalled) {
+ addons_menu->add_entry(i++, std::string(_("Remove")) + " \"" + addon.title + "\"");
+ } else {
+ addons_menu->add_entry(i++, std::string(_("Install")) + " \"" + addon.title + "\"");
+ }
+ }
+
+ addons_menu->add_hl();
+ addons_menu->add_back(_("Back"));
+}
+
+void
+TitleScreen::check_addons_menu()
+{
+ int index = addons_menu->check();
+ if (index == -1) return;
+
+ //AddonManager& adm = AddonManager::get_instance();
+ Addon addon = addons[index];
+ if (!addon.isInstalled) {
+ addon.install();
+ generate_addons_menu();
+ Menu::set_current(addons_menu.get());
+ } else {
+ addon.remove();
+ generate_addons_menu();
+ Menu::set_current(addons_menu.get());
+ }
+}
+
+void
+TitleScreen::free_addons_menu()
+{
+}
+
+void
+TitleScreen::make_tux_jump()
+{
+ static bool jumpWasReleased = true;
Sector* sector = titlesession->get_current_sector();
Player* tux = sector->player;
- //sector->play_music(LEVEL_MUSIC);
-
controller->update();
controller->press(Controller::RIGHT);
- // Determine how far we moved since last frame
- float dx = fabsf(last_tux_x_pos - tux->get_pos().x);
- float dy = fabsf(last_tux_y_pos - tux->get_pos().y);
-
- // Calculate space to check for obstacles
- Rect lookahead = tux->get_bbox();
- lookahead.move(Vector(96, 0));
-
// Check if we should press the jump button
- bool randomJump = !randomWaitTimer.started();
- bool notMoving = (fabsf(dx) + fabsf(dy)) < 0.1;
+ Rect lookahead = tux->get_bbox();
+ lookahead.p2.x += 96;
bool pathBlocked = !sector->is_free_of_statics(lookahead);
- if (!controller->released(Controller::JUMP)
- && (notMoving || pathBlocked || randomJump)) {
- float jumpDuration;
- if(pathBlocked)
- jumpDuration = 0.5;
- else
- jumpDuration = systemRandom.randf(0.3, 0.8);
- jumpPushTimer.start(jumpDuration);
- randomWaitTimer.start(systemRandom.randf(3.0, 6.0));
- }
-
- // Keep jump button pressed
- if (jumpPushTimer.started())
+ if ((pathBlocked && jumpWasReleased) || !tux->on_ground()) {
controller->press(Controller::JUMP);
-
- // Remember last position, so we can determine if we moved
- last_tux_x_pos = tux->get_pos().x;
- last_tux_y_pos = tux->get_pos().y;
+ jumpWasReleased = false;
+ } else {
+ jumpWasReleased = true;
+ }
// Wrap around at the end of the level back to the beginnig
if(sector->get_width() - 320 < tux->get_pos().x) {
main_menu->set_pos(SCREEN_WIDTH/2, SCREEN_HEIGHT/2 + 35);
main_menu->add_entry(MNID_STARTGAME, _("Start Game"));
main_menu->add_entry(MNID_LEVELS_CONTRIB, _("Contrib Levels"));
+ main_menu->add_entry(MNID_ADDONS, _("Add-ons"));
main_menu->add_submenu(_("Options"), get_options_menu());
main_menu->add_entry(MNID_CREDITS, _("Credits"));
main_menu->add_entry(MNID_QUITMAINMENU, _("Quit"));
Sector* sector = titlesession->get_current_sector();
sector->draw(context);
- context.draw_text(white_small_text, " SuperTux " PACKAGE_VERSION "\n",
- Vector(0, SCREEN_HEIGHT - 50), LEFT_ALLIGN, LAYER_FOREGROUND1);
+ context.draw_text(white_small_text, "SuperTux " PACKAGE_VERSION "\n",
+ Vector(5, SCREEN_HEIGHT - 50), ALIGN_LEFT, LAYER_FOREGROUND1);
context.draw_text(white_small_text,
_(
-"Copyright (c) 2006 SuperTux Devel Team\n"
+"Copyright (c) 2007 SuperTux Devel Team\n"
"This game comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to\n"
"redistribute it under certain conditions; see the file COPYING for details.\n"
),
- Vector(0, SCREEN_HEIGHT - 50 + white_small_text->get_height() + 5),
- LEFT_ALLIGN, LAYER_FOREGROUND1);
+ Vector(5, SCREEN_HEIGHT - 50 + white_small_text->get_height() + 5),
+ ALIGN_LEFT, LAYER_FOREGROUND1);
}
void
generate_contrib_menu();
Menu::push_current(contrib_menu.get());
break;
+ case MNID_ADDONS:
+ // Add-ons Menu
+ generate_addons_menu();
+ Menu::push_current(addons_menu.get());
+ break;
case MNID_CREDITS:
main_loop->push_screen(new TextScroller("credits.txt"),
new FadeOut(0.5));
process_load_game_menu();
} else if(menu == contrib_menu.get()) {
check_levels_contrib_menu();
+ } else if(menu == addons_menu.get()) {
+ check_addons_menu();
} else if (menu == contrib_world_menu.get()) {
check_contrib_world_menu();
}