X-Git-Url: https://git.octo.it/?a=blobdiff_plain;ds=inline;f=src%2Fworldmap%2Fworldmap.hpp;h=c42e5510bd529d421bb23d58608cddc18386991b;hb=c0b5cfa3eadebef8101f87cd593eb221bdef9280;hp=acbbedb66aa838554fe102152e48494a81ca030e;hpb=99199c39ed744bf40e3fa60e26ba64c29c014ddc;p=supertux.git diff --git a/src/worldmap/worldmap.hpp b/src/worldmap/worldmap.hpp index acbbedb66..c42e5510b 100644 --- a/src/worldmap/worldmap.hpp +++ b/src/worldmap/worldmap.hpp @@ -1,13 +1,11 @@ -// $Id$ -// // SuperTux -// Copyright (C) 2004 Ingo Ruhnke +// Copyright (C) 2004 Ingo Ruhnke // Copyright (C) 2006 Christoph Sommer // -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -15,36 +13,38 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -#ifndef SUPERTUX_WORLDMAP_H -#define SUPERTUX_WORLDMAP_H +// along with this program. If not, see . + +#ifndef HEADER_SUPERTUX_WORLDMAP_WORLDMAP_HPP +#define HEADER_SUPERTUX_WORLDMAP_WORLDMAP_HPP -#include #include +#include -#include "math/vector.hpp" -#include "lisp/lisp.hpp" #include "control/controller.hpp" -#include "statistics.hpp" -#include "timer.hpp" -#include "screen.hpp" -#include "tile_manager.hpp" -#include "game_object.hpp" -#include "console.hpp" -#include "../level.hpp" +#include "math/vector.hpp" +#include "supertux/console.hpp" +#include "supertux/game_object.hpp" +#include "supertux/game_object_ptr.hpp" +#include "supertux/level.hpp" +#include "supertux/screen.hpp" +#include "supertux/statistics.hpp" +#include "supertux/tile_manager.hpp" +#include "supertux/timer.hpp" +#include "util/reader_fwd.hpp" +#include "worldmap/direction.hpp" +#include "worldmap/spawn_point.hpp" #include "worldmap/special_tile.hpp" #include "worldmap/sprite_change.hpp" #include "worldmap/teleporter.hpp" -#include "worldmap/spawn_point.hpp" -#include "worldmap/direction.hpp" -class Sprite; -class Menu; class GameObject; +class PlayerStatus; +class Sprite; class TileMap; +class Savegame; -namespace WorldMapNS { +namespace worldmap { class Tux; class LevelTile; @@ -60,21 +60,31 @@ enum { WEST_EAST_WAY }; -std::string direction_to_string(Direction d); -Direction string_to_direction(const std::string& d); -Direction reverse_dir(Direction d); - /** - * Screen that displays a worldmap + * Screen that runs a WorldMap, which lets the player choose a Level. */ class WorldMap : public Screen { + static Color level_title_color; + static Color message_color; + static Color teleporter_message_color; + private: - Tux* tux; + typedef std::vector SpecialTiles; + typedef std::vector SpriteChanges; + typedef std::vector SpawnPoints; + typedef std::vector LevelTiles; + typedef std::vector GameObjects; + typedef std::vector ScriptList; - static WorldMap* current_; + std::shared_ptr tux; - std::auto_ptr worldmap_menu; + Savegame& m_savegame; + + TileSet *tileset; + bool free_tileset; + + static WorldMap* current_; Vector camera_offset; @@ -82,11 +92,8 @@ private: std::string music; std::string init_script; - typedef std::vector GameObjects; GameObjects game_objects; - TileMap* solids; - - std::auto_ptr tile_manager; + std::list solid_tilemaps; public: /** Variables to deal with the passive map messages */ @@ -97,29 +104,34 @@ private: std::string map_filename; std::string levels_path; - typedef std::vector SpecialTiles; SpecialTiles special_tiles; - typedef std::vector LevelTiles; LevelTiles levels; - typedef std::vector SpriteChanges; SpriteChanges sprite_changes; - typedef std::vector SpawnPoints; SpawnPoints spawn_points; std::vector teleporters; Statistics total_stats; HSQOBJECT worldmap_table; - typedef std::vector ScriptList; ScriptList scripts; + Color ambient_light; std::string force_spawnpoint; /**< if set, spawnpoint will be forced to this value */ + bool in_level; + + /* variables to track panning to a spawn point */ + Vector pan_pos; + bool panning; + public: - WorldMap(const std::string& filename, const std::string& force_spawnpoint = ""); + WorldMap(const std::string& filename, Savegame& savegame, const std::string& force_spawnpoint = ""); ~WorldMap(); - void add_object(GameObject* object); + void add_object(GameObjectPtr object); + + void try_expose(const GameObjectPtr& object); + void try_unexpose(const GameObjectPtr& object); static WorldMap* current() { return current_; } @@ -133,7 +145,18 @@ public: virtual void draw(DrawingContext& context); Vector get_next_tile(Vector pos, Direction direction); - const Tile* at(Vector pos); + + /** + * gets a bitfield of Tile::WORLDMAP_NORTH | Tile::WORLDMAP_WEST | ... values, + * which indicates the directions Tux can move to when at the given position. + */ + int available_directions_at(Vector pos); + + /** + * returns a bitfield representing the union of all Tile::WORLDMAP_XXX values + * of all solid tiles at the given position + */ + int tile_data_at(Vector pos); size_t level_count(); size_t solved_level_count(); @@ -144,6 +167,11 @@ public: */ void finished_level(Level* level); + /** returns current Tux incarnation */ + Tux* get_tux() { return tux.get(); } + + Savegame& get_savegame() { return m_savegame; } + LevelTile* at_level(); SpecialTile* at_special_tile(); SpriteChange* at_sprite_change(const Vector& pos); @@ -181,18 +209,44 @@ public: /** * moves Tux to the given spawnpoint */ - void move_to_spawnpoint(const std::string& spawnpoint); + void move_to_spawnpoint(const std::string& spawnpoint, bool pan =false); + + /** + * returns the width (in tiles) of a worldmap + */ + float get_width() const; + + /** + * returns the height (in tiles) of a worldmap + */ + float get_height() const; + + /** + * Mark all levels as solved or unsolved + */ + void set_levels_solved(bool solved, bool perfect); private: void get_level_title(LevelTile& level); + void get_level_target_time(LevelTile& level); void draw_status(DrawingContext& context); void calculate_total_stats(); void load(const std::string& filename); void on_escape_press(); + Vector get_camera_pos_for_tux(); + void clamp_camera_position(Vector& c); + Vector last_position; + float last_target_time; + +private: + WorldMap(const WorldMap&); + WorldMap& operator=(const WorldMap&); }; -} // namespace WorldMapNS +} // namespace worldmap #endif + +/* EOF */