// Copyright (C) 2006 Christoph Sommer <christoph.sommer@2006.expires.deltadevelopment.de>
//
// This program is free software: you can redistribute it and/or modify
// Copyright (C) 2006 Christoph Sommer <christoph.sommer@2006.expires.deltadevelopment.de>
//
// This program is free software: you can redistribute it and/or modify
#include "object/decal.hpp"
#include "object/tilemap.hpp"
#include "physfs/ifile_streambuf.hpp"
#include "object/decal.hpp"
#include "object/tilemap.hpp"
#include "physfs/ifile_streambuf.hpp"
#include "scripting/squirrel_error.hpp"
#include "scripting/squirrel_util.hpp"
#include "sprite/sprite.hpp"
#include "sprite/sprite_manager.hpp"
#include "supertux/game_session.hpp"
#include "scripting/squirrel_error.hpp"
#include "scripting/squirrel_util.hpp"
#include "sprite/sprite.hpp"
#include "sprite/sprite_manager.hpp"
#include "supertux/game_session.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/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"
#include "supertux/shrinkfade.hpp"
#include "supertux/spawn_point.hpp"
#include "supertux/sector.hpp"
#include "supertux/shrinkfade.hpp"
#include "supertux/spawn_point.hpp"
-WorldMap::WorldMap(const std::string& filename, PlayerStatus* player_status, const std::string& force_spawnpoint) :
- tux(0),
- player_status(player_status),
+WorldMap::WorldMap(const std::string& filename, Savegame& savegame, const std::string& force_spawnpoint_) :
+ tux(),
+ m_savegame(savegame),
worldmap_table(),
scripts(),
ambient_light( 1.0f, 1.0f, 1.0f, 1.0f ),
worldmap_table(),
scripts(),
ambient_light( 1.0f, 1.0f, 1.0f, 1.0f ),
if(object_ != NULL) {
HSQUIRRELVM vm = scripting::global_vm;
sq_pushobject(vm, worldmap_table);
if(object_ != NULL) {
HSQUIRRELVM vm = scripting::global_vm;
sq_pushobject(vm, worldmap_table);
- g_screen_manager->exit_screen();
- g_screen_manager->push_screen(new WorldMap(filename, player_status, force_spawnpoint));
+ ScreenManager::current()->pop_screen();
+ ScreenManager::current()->push_screen(std::unique_ptr<Screen>(new WorldMap(filename, m_savegame, force_spawnpoint_)));
}
current_tileset = tileset;
lisp::ListIterator iter(sector);
while(iter.next()) {
if(iter.item() == "tilemap") {
}
current_tileset = tileset;
lisp::ListIterator iter(sector);
while(iter.next()) {
if(iter.item() == "tilemap") {
} else if(iter.item() == "music") {
iter.value()->get(music);
} else if(iter.item() == "init-script") {
} else if(iter.item() == "music") {
iter.value()->get(music);
} else if(iter.item() == "init-script") {
SpawnPoint* sp = new SpawnPoint(*iter.lisp());
spawn_points.push_back(sp);
} else if(iter.item() == "level") {
SpawnPoint* sp = new SpawnPoint(*iter.lisp());
spawn_points.push_back(sp);
} else if(iter.item() == "level") {
- LevelTile* level = new LevelTile(levels_path, *iter.lisp());
- levels.push_back(level);
+ auto level = std::make_shared<LevelTile>(levels_path, *iter.lisp());
+ levels.push_back(level.get());
- SpecialTile* special_tile = new SpecialTile(*iter.lisp());
- special_tiles.push_back(special_tile);
+ auto special_tile = std::make_shared<SpecialTile>(*iter.lisp());
+ special_tiles.push_back(special_tile.get());
- SpriteChange* sprite_change = new SpriteChange(*iter.lisp());
- sprite_changes.push_back(sprite_change);
+ auto sprite_change = std::make_shared<SpriteChange>(*iter.lisp());
+ sprite_changes.push_back(sprite_change.get());
- if(!MenuManager::instance().current()) {
- MenuManager::instance().set_current(worldmap_menu.get());
+ if(!MenuManager::instance().is_active()) {
+ MenuManager::instance().set_menu(MenuStorage::WORLDMAP_MENU);
// remove old GameObjects
for(GameObjects::iterator i = game_objects.begin();
i != game_objects.end(); ) {
// remove old GameObjects
for(GameObjects::iterator i = game_objects.begin();
i != game_objects.end(); ) {
bool enter_level = false;
if(controller->pressed(Controller::ACTION)
|| controller->pressed(Controller::JUMP)
bool enter_level = false;
if(controller->pressed(Controller::ACTION)
|| controller->pressed(Controller::JUMP)
change(teleporter->worldmap, teleporter->spawnpoint);
} else {
// TODO: an animation, camera scrolling or a fading would be a nice touch
change(teleporter->worldmap, teleporter->spawnpoint);
} else {
// TODO: an animation, camera scrolling or a fading would be a nice touch
tux->back_direction = D_NONE;
move_to_spawnpoint(teleporter->spawnpoint, true);
}
tux->back_direction = D_NONE;
move_to_spawnpoint(teleporter->spawnpoint, true);
}
//Respawn if player on a tile with no level and nowhere to go.
int tile_data = tile_data_at(tux->get_tile_pos());
if(!( tile_data & ( Tile::WORLDMAP_NORTH | Tile::WORLDMAP_SOUTH | Tile::WORLDMAP_WEST | Tile::WORLDMAP_EAST ))){
//Respawn if player on a tile with no level and nowhere to go.
int tile_data = tile_data_at(tux->get_tile_pos());
if(!( tile_data & ( Tile::WORLDMAP_NORTH | Tile::WORLDMAP_SOUTH | Tile::WORLDMAP_WEST | Tile::WORLDMAP_EAST ))){
- Vector shrinkpos = Vector(level->pos.x*32 + 16 - camera_offset.x,
- level->pos.y*32 + 8 - camera_offset.y);
- std::string levelfile = levels_path + level->get_name();
+ Vector shrinkpos = Vector(level_->pos.x*32 + 16 - camera_offset.x,
+ level_->pos.y*32 + 8 - camera_offset.y);
+ std::string levelfile = levels_path + level_->get_name();
- g_screen_manager->push_screen(new GameSession(levelfile, player_status, &level->statistics),
- new ShrinkFade(shrinkpos, 1.0f));
+ ScreenManager::current()->push_screen(std::unique_ptr<Screen>(new GameSession(levelfile, m_savegame, &level_->statistics)),
+ std::unique_ptr<ScreenFade>(new ShrinkFade(shrinkpos, 1.0f)));
TileMap* tilemap = *i;
const Tile* tile = tilemap->get_tile((int)p.x, (int)p.y);
int dirdata = tile->getData();
TileMap* tilemap = *i;
const Tile* tile = tilemap->get_tile((int)p.x, (int)p.y);
int dirdata = tile->getData();
- for(GameObjects::iterator i = game_objects.begin();
- i != game_objects.end(); ++i) {
- GameObject* object = *i;
+ for(auto i = game_objects.begin(); i != game_objects.end(); ++i)
+ {
+ GameObjectPtr& object = *i;
context.push_transform();
context.set_translation(Vector(0, 0));
context.push_transform();
context.set_translation(Vector(0, 0));
sq_pushroottable(global_vm);
sq_pushstring(global_vm, "worldmap", -1);
sq_pushobject(global_vm, worldmap_table);
sq_pushroottable(global_vm);
sq_pushstring(global_vm, "worldmap", -1);
sq_pushobject(global_vm, worldmap_table);
+WorldMap::set_levels_solved(bool solved, bool perfect)
+{
+ for(auto& level : levels)
+ {
+ level->set_solved(solved);
+ level->set_perfect(perfect);
+ }
+}
+
+void
if(SQ_FAILED(sq_get(vm, -2))) {
sq_pushstring(vm, "worlds", -1);
sq_newtable(vm);
if(SQ_FAILED(sq_get(vm, -2))) {
sq_pushstring(vm, "worlds", -1);
sq_newtable(vm);
throw scripting::SquirrelError(vm, "Couldn't create state.worlds");
sq_pushstring(vm, "worlds", -1);
throw scripting::SquirrelError(vm, "Couldn't create state.worlds");
sq_pushstring(vm, "worlds", -1);
sq_pushstring(vm, map_filename.c_str(), map_filename.length());
if(SQ_FAILED(sq_deleteslot(vm, -2, SQFalse)))
sq_pushstring(vm, map_filename.c_str(), map_filename.length());
if(SQ_FAILED(sq_deleteslot(vm, -2, SQFalse)))
// construct new table for this worldmap
sq_pushstring(vm, map_filename.c_str(), map_filename.length());
// construct new table for this worldmap
sq_pushstring(vm, map_filename.c_str(), map_filename.length());
store_float(vm, "y", tux->get_tile_pos().y);
store_string(vm, "back", direction_to_string(tux->back_direction));
store_float(vm, "y", tux->get_tile_pos().y);
store_string(vm, "back", direction_to_string(tux->back_direction));
store_bool(vm, "perfect", level->perfect);
level->statistics.serialize_to_squirrel(vm);
store_bool(vm, "perfect", level->perfect);
level->statistics.serialize_to_squirrel(vm);