X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fworldmap%2Fworldmap.hpp;h=9bf35b28ec5c1c321476ef75ee1134ef297abda9;hb=6141e1672ec08427b989ca245508f0c1648ce68b;hp=b6e3a43770126d0fe78140ddceb0ddb532ab9c34;hpb=112f01454123c94f5627200c6819b219026f0af0;p=supertux.git diff --git a/src/worldmap/worldmap.hpp b/src/worldmap/worldmap.hpp index b6e3a4377..9bf35b28e 100644 --- a/src/worldmap/worldmap.hpp +++ b/src/worldmap/worldmap.hpp @@ -24,7 +24,6 @@ #include #include "math/vector.hpp" -#include "video/screen.hpp" #include "lisp/lisp.hpp" #include "control/controller.hpp" #include "statistics.hpp" @@ -33,6 +32,10 @@ #include "tile_manager.hpp" #include "game_object.hpp" #include "console.hpp" +#include "../level.hpp" +#include "worldmap/special_tile.hpp" +#include "worldmap/sprite_change.hpp" +#include "worldmap/teleporter.hpp" class Sprite; class Menu; @@ -43,7 +46,7 @@ class TileMap; namespace WorldMapNS { class Tux; -class Level; +class LevelTile; class SpecialTile; class SpriteChange; @@ -62,7 +65,9 @@ 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 + */ class WorldMap : public Screen { private: @@ -76,6 +81,7 @@ private: std::string name; std::string music; + std::string init_script; typedef std::vector GameObjects; GameObjects game_objects; @@ -94,47 +100,38 @@ private: typedef std::vector SpecialTiles; SpecialTiles special_tiles; - typedef std::vector Levels; - Levels levels; + typedef std::vector LevelTiles; + LevelTiles levels; typedef std::vector SpriteChanges; SpriteChanges sprite_changes; typedef std::vector SpawnPoints; SpawnPoints spawn_points; + std::vector teleporters; - Vector offset; - std::string savegame_file; - - std::string intro_script; - bool intro_displayed; - - void get_level_title(Level& level); + Statistics total_stats; - void draw_status(DrawingContext& context); + HSQOBJECT worldmap_table; + typedef std::vector ScriptList; + ScriptList scripts; - // to avoid calculating total stats all the time. This way only - // when need, it is calculated. - Statistics total_stats; - void calculate_total_stats(); + std::string force_spawnpoint; /**< if set, spawnpoint will be forced to this value */ public: - WorldMap(); + WorldMap(const std::string& filename, const std::string& force_spawnpoint = ""); ~WorldMap(); - void load_map(); - void add_object(GameObject* object); - void clear_objects(); static WorldMap* current() { return current_; } - void setup(); - - /** Update Tux position */ - void update(float delta); + virtual void setup(); + virtual void leave(); - /** Draw one frame */ - void draw(DrawingContext& context); + /** Update worldmap state */ + virtual void update(float delta); + /** Draw worldmap */ + virtual void draw(DrawingContext& context); Vector get_next_tile(Vector pos, Direction direction); const Tile* at(Vector pos); @@ -146,39 +143,55 @@ public: * gets called from the GameSession when a level has been successfully * finished */ - void finished_level(const std::string& filename); + void finished_level(Level* level); - Level* at_level(); + LevelTile* at_level(); SpecialTile* at_special_tile(); - SpriteChange* at_sprite_change(); + SpriteChange* at_sprite_change(const Vector& pos); + Teleporter* at_teleporter(const Vector& pos); /** Check if it is possible to walk from \a pos into \a direction, if possible, write the new position to \a new_pos */ - bool path_ok(Direction direction, Vector pos, Vector* new_pos); + bool path_ok(Direction direction, const Vector& pos, Vector* new_pos); /** * Save worldmap state to squirrel state table */ void save_state(); + /** * Load worldmap state from squirrel state table */ void load_state(); - /** - * Load a worldmap - */ - void loadmap(const std::string& filename); const std::string& get_title() const { return name; } - - void set_map_filename(std::string filename) - { map_filename = filename; } + + /** + * runs a script in the context of the worldmap (and keeps a reference to + * the script (so the script gets destroyed when the worldmap is destroyed) + */ + HSQUIRRELVM run_script(std::istream& in, const std::string& sourcename); + + /** + * switch to another worldmap. + * filename is relative to current world's path + */ + void change(const std::string& filename, const std::string& force_spawnpoint=""); + + /** + * moves Tux to the given spawnpoint + */ + void move_to_spawnpoint(const std::string& spawnpoint); private: + void get_level_title(LevelTile& level); + void draw_status(DrawingContext& context); + void calculate_total_stats(); + + void load(const std::string& filename); void on_escape_press(); - void parse_special_tile(const lisp::Lisp* lisp); - void parse_sprite_change(const lisp::Lisp* lisp); + }; } // namespace WorldMapNS