#include "lisp/list_iterator.hpp"
#include "lisp/parser.hpp"
#include "object/background.hpp"
+#include "object/decal.hpp"
#include "object/tilemap.hpp"
#include "physfs/ifile_stream.hpp"
#include "scripting/squirrel_error.hpp"
#include "sprite/sprite_manager.hpp"
#include "supertux/game_session.hpp"
#include "supertux/globals.hpp"
-#include "supertux/mainloop.hpp"
-#include "supertux/menu/menu_manager.hpp"
+#include "supertux/screen_manager.hpp"
+#include "supertux/menu/menu_storage.hpp"
#include "supertux/menu/options_menu.hpp"
+#include "supertux/menu/worldmap_menu.hpp"
#include "supertux/player_status.hpp"
#include "supertux/resources.hpp"
#include "supertux/sector.hpp"
static const float CAMERA_PAN_SPEED = 5.0;
-namespace WorldMapNS {
-
-enum WorldMapMenuIDs {
- MNID_RETURNWORLDMAP,
- MNID_QUITWORLDMAP
-};
+namespace worldmap {
WorldMap* WorldMap::current_ = NULL;
-Direction reverse_dir(Direction direction)
-{
- switch(direction)
- {
- case D_WEST:
- return D_EAST;
- case D_EAST:
- return D_WEST;
- case D_NORTH:
- return D_SOUTH;
- case D_SOUTH:
- return D_NORTH;
- case D_NONE:
- return D_NONE;
- }
- return D_NONE;
-}
-
-std::string
-direction_to_string(Direction direction)
-{
- switch(direction)
- {
- case D_WEST:
- return "west";
- case D_EAST:
- return "east";
- case D_NORTH:
- return "north";
- case D_SOUTH:
- return "south";
- default:
- return "none";
- }
-}
-
-Direction
-string_to_direction(const std::string& directory)
-{
- if (directory == "west")
- return D_WEST;
- else if (directory == "east")
- return D_EAST;
- else if (directory == "north")
- return D_NORTH;
- else if (directory == "south")
- return D_SOUTH;
- else if (directory == "none")
- return D_NONE;
- else {
- log_warning << "unknown direction: \"" << directory << "\"" << std::endl;
- return D_NONE;
- }
-}
-
-//---------------------------------------------------------------------------
-
-WorldMap::WorldMap(const std::string& filename, const std::string& force_spawnpoint) :
+WorldMap::WorldMap(const std::string& filename, PlayerStatus* player_status, const std::string& force_spawnpoint) :
tux(0),
+ player_status(player_status),
tileset(NULL),
free_tileset(false),
worldmap_menu(),
total_stats.reset();
- worldmap_menu.reset(new Menu());
- worldmap_menu->add_label(_("Pause"));
- worldmap_menu->add_hl();
- worldmap_menu->add_entry(MNID_RETURNWORLDMAP, _("Continue"));
- worldmap_menu->add_submenu(_("Options"), MenuManager::get_options_menu());
- worldmap_menu->add_hl();
- worldmap_menu->add_entry(MNID_QUITWORLDMAP, _("Quit World"));
+ worldmap_menu.reset(new WorldmapMenu());
// create a new squirrel table for the worldmap
- using namespace Scripting;
+ using namespace scripting;
sq_collectgarbage(global_vm);
sq_newtable(global_vm);
sq_pushroottable(global_vm);
if(SQ_FAILED(sq_setdelegate(global_vm, -2)))
- throw Scripting::SquirrelError(global_vm, "Couldn't set worldmap_table delegate");
+ throw scripting::SquirrelError(global_vm, "Couldn't set worldmap_table delegate");
sq_resetobject(&worldmap_table);
if(SQ_FAILED(sq_getstackobj(global_vm, -1, &worldmap_table)))
- throw Scripting::SquirrelError(global_vm, "Couldn't get table from stack");
+ throw scripting::SquirrelError(global_vm, "Couldn't get table from stack");
sq_addref(global_vm, &worldmap_table);
sq_pop(global_vm, 1);
WorldMap::~WorldMap()
{
- using namespace Scripting;
+ using namespace scripting;
if(free_tileset)
delete tileset;
void
WorldMap::try_expose(GameObject* object)
{
- ScriptInterface* interface = dynamic_cast<ScriptInterface*> (object);
- if(interface != NULL) {
- HSQUIRRELVM vm = Scripting::global_vm;
+ ScriptInterface* object_ = dynamic_cast<ScriptInterface*> (object);
+ if(object_ != NULL) {
+ HSQUIRRELVM vm = scripting::global_vm;
sq_pushobject(vm, worldmap_table);
- interface->expose(vm, -1);
+ object_->expose(vm, -1);
sq_pop(vm, 1);
}
}
void
WorldMap::try_unexpose(GameObject* object)
{
- ScriptInterface* interface = dynamic_cast<ScriptInterface*> (object);
- if(interface != NULL) {
- HSQUIRRELVM vm = Scripting::global_vm;
+ ScriptInterface* object_ = dynamic_cast<ScriptInterface*> (object);
+ if(object_ != NULL) {
+ HSQUIRRELVM vm = scripting::global_vm;
SQInteger oldtop = sq_gettop(vm);
sq_pushobject(vm, worldmap_table);
try {
- interface->unexpose(vm, -1);
+ object_->unexpose(vm, -1);
} catch(std::exception& e) {
log_warning << "Couldn't unregister object: " << e.what() << std::endl;
}
void
WorldMap::change(const std::string& filename, const std::string& force_spawnpoint)
{
- g_main_loop->exit_screen();
- g_main_loop->push_screen(new WorldMap(filename, force_spawnpoint));
+ g_screen_manager->exit_screen();
+ g_screen_manager->push_screen(new WorldMap(filename, player_status, force_spawnpoint));
}
void
Teleporter* teleporter = new Teleporter(*iter.lisp());
teleporters.push_back(teleporter);
add_object(teleporter);
+ } else if(iter.item() == "decal") {
+ Decal* decal = new Decal(*iter.lisp());
+ add_object(decal);
} else if(iter.item() == "ambient-light") {
std::vector<float> vColor;
sector->get( "ambient-light", vColor );
WorldMap::on_escape_press()
{
// Show or hide the menu
- if(!MenuManager2::current()) {
- MenuManager2::set_current(worldmap_menu.get());
+ if(!MenuManager::current()) {
+ MenuManager::set_current(worldmap_menu.get());
tux->set_direction(D_NONE); // stop tux movement when menu is called
} else {
- MenuManager2::set_current(NULL);
+ MenuManager::set_current(NULL);
}
}
WorldMap::update(float delta)
{
if(!in_level) {
- Menu* menu = MenuManager2::current();
+ Menu* menu = MenuManager::current();
if(menu != NULL) {
if(menu == worldmap_menu.get()) {
switch (worldmap_menu->check())
{
case MNID_RETURNWORLDMAP: // Return to game
- MenuManager2::set_current(0);
+ MenuManager::set_current(0);
break;
case MNID_QUITWORLDMAP: // Quit Worldmap
- g_main_loop->exit_screen();
+ g_screen_manager->exit_screen();
break;
}
}
}
// handle input
+ Controller *controller = g_jk_controller->get_main_controller();
bool enter_level = false;
- if(g_main_controller->pressed(Controller::ACTION)
- || g_main_controller->pressed(Controller::JUMP)
- || g_main_controller->pressed(Controller::MENU_SELECT)) {
+ if(controller->pressed(Controller::ACTION)
+ || controller->pressed(Controller::JUMP)
+ || controller->pressed(Controller::MENU_SELECT)) {
/* some people define UP and JUMP on the same key... */
- if(!g_main_controller->pressed(Controller::UP))
+ if(!controller->pressed(Controller::UP))
enter_level = true;
}
- if(g_main_controller->pressed(Controller::PAUSE_MENU))
+ if(controller->pressed(Controller::PAUSE_MENU))
on_escape_press();
// check for teleporters
// update state and savegame
save_state();
- g_main_loop->push_screen(new GameSession(levelfile, &level->statistics),
+ g_screen_manager->push_screen(new GameSession(levelfile, player_status, &level->statistics),
new ShrinkFade(shrinkpos, 1.0f));
in_level = true;
} catch(std::exception& e) {
if(level->title == "")
get_level_title(*level);
- context.draw_text(normal_font, level->title,
+ context.draw_text(Resources::normal_font, level->title,
Vector(SCREEN_WIDTH/2,
- SCREEN_HEIGHT - normal_font->get_height() - 30),
+ SCREEN_HEIGHT - Resources::normal_font->get_height() - 30),
ALIGN_CENTER, LAYER_FOREGROUND1, WorldMap::level_title_color);
// if level is solved, draw level picture behind stats
if (special_tile->pos == tux->get_tile_pos()) {
/* Display an in-map message in the map, if any as been selected */
if(!special_tile->map_message.empty() && !special_tile->passive_message)
- context.draw_text(normal_font, special_tile->map_message,
+ context.draw_text(Resources::normal_font, special_tile->map_message,
Vector(SCREEN_WIDTH/2,
- SCREEN_HEIGHT - normal_font->get_height() - 60),
+ SCREEN_HEIGHT - Resources::normal_font->get_height() - 60),
ALIGN_CENTER, LAYER_FOREGROUND1, WorldMap::message_color);
break;
}
// display teleporter messages
Teleporter* teleporter = at_teleporter(tux->get_tile_pos());
if (teleporter && (teleporter->message != "")) {
- Vector pos = Vector(SCREEN_WIDTH/2, SCREEN_HEIGHT - normal_font->get_height() - 30);
- context.draw_text(normal_font, teleporter->message, pos, ALIGN_CENTER, LAYER_FOREGROUND1, WorldMap::teleporter_message_color);
+ Vector pos = Vector(SCREEN_WIDTH/2, SCREEN_HEIGHT - Resources::normal_font->get_height() - 30);
+ context.draw_text(Resources::normal_font, teleporter->message, pos, ALIGN_CENTER, LAYER_FOREGROUND1, WorldMap::teleporter_message_color);
}
}
/* Display a passive message in the map, if needed */
if(passive_message_timer.started())
- context.draw_text(normal_font, passive_message,
- Vector(SCREEN_WIDTH/2, SCREEN_HEIGHT - normal_font->get_height() - 60),
+ context.draw_text(Resources::normal_font, passive_message,
+ Vector(SCREEN_WIDTH/2, SCREEN_HEIGHT - Resources::normal_font->get_height() - 60),
ALIGN_CENTER, LAYER_FOREGROUND1, WorldMap::message_color);
context.pop_transform();
WorldMap::setup()
{
sound_manager->play_music(music);
- MenuManager2::set_current(NULL);
+ MenuManager::set_current(NULL);
current_ = this;
load_state();
tux->setup();
// register worldmap_table as worldmap in scripting
- using namespace Scripting;
+ using namespace scripting;
sq_pushroottable(global_vm);
sq_pushstring(global_vm, "worldmap", -1);
void
WorldMap::leave()
{
- using namespace Scripting;
+ using namespace scripting;
// save state of world and player
save_state();
void
WorldMap::save_state()
{
- using namespace Scripting;
+ using namespace scripting;
HSQUIRRELVM vm = global_vm;
int oldtop = sq_gettop(vm);
sq_pushroottable(vm);
sq_pushstring(vm, "state", -1);
if(SQ_FAILED(sq_get(vm, -2)))
- throw Scripting::SquirrelError(vm, "Couldn't get state table");
+ throw scripting::SquirrelError(vm, "Couldn't get state table");
// get or create worlds table
sq_pushstring(vm, "worlds", -1);
sq_pushstring(vm, "worlds", -1);
sq_newtable(vm);
if(SQ_FAILED(sq_createslot(vm, -3)))
- throw Scripting::SquirrelError(vm, "Couldn't create state.worlds");
+ throw scripting::SquirrelError(vm, "Couldn't create state.worlds");
sq_pushstring(vm, "worlds", -1);
if(SQ_FAILED(sq_get(vm, -2)))
- throw Scripting::SquirrelError(vm, "Couldn't create.get state.worlds");
+ throw scripting::SquirrelError(vm, "Couldn't create.get state.worlds");
}
sq_pushstring(vm, map_filename.c_str(), map_filename.length());
void
WorldMap::load_state()
{
- using namespace Scripting;
+ using namespace scripting;
HSQUIRRELVM vm = global_vm;
int oldtop = sq_gettop(vm);
sq_pushroottable(vm);
sq_pushstring(vm, "state", -1);
if(SQ_FAILED(sq_get(vm, -2)))
- throw Scripting::SquirrelError(vm, "Couldn't get state table");
+ throw scripting::SquirrelError(vm, "Couldn't get state table");
// get worlds table
sq_pushstring(vm, "worlds", -1);
if(SQ_FAILED(sq_get(vm, -2)))
- throw Scripting::SquirrelError(vm, "Couldn't get state.worlds");
+ throw scripting::SquirrelError(vm, "Couldn't get state.worlds");
// get table for our world
sq_pushstring(vm, map_filename.c_str(), map_filename.length());
if(SQ_FAILED(sq_get(vm, -2)))
- throw Scripting::SquirrelError(vm, "Couldn't get state.worlds.mapfilename");
+ throw scripting::SquirrelError(vm, "Couldn't get state.worlds.mapfilename");
// load tux
sq_pushstring(vm, "tux", -1);
if(SQ_FAILED(sq_get(vm, -2)))
- throw Scripting::SquirrelError(vm, "Couldn't get tux");
+ throw scripting::SquirrelError(vm, "Couldn't get tux");
Vector p;
p.x = read_float(vm, "x");
// load levels
sq_pushstring(vm, "levels", -1);
if(SQ_FAILED(sq_get(vm, -2)))
- throw Scripting::SquirrelError(vm, "Couldn't get levels");
+ throw scripting::SquirrelError(vm, "Couldn't get levels");
for(LevelTiles::iterator i = levels.begin(); i != levels.end(); ++i) {
LevelTile* level = *i;
HSQUIRRELVM
WorldMap::run_script(std::istream& in, const std::string& sourcename)
{
- using namespace Scripting;
+ using namespace scripting;
// garbage collect thread list
for(ScriptList::iterator i = scripts.begin();
return height;
}
-} // namespace WorldMapNS
+} // namespace worldmap
/* EOF */