/* * The Mana World Server * Copyright 2006 The Mana World Development Team * * This file is part of The Mana World. * * The Mana World 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 * any later version. * * The Mana World is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef _TMW_SERVER_MAPCOMPOSITE_ #define _TMW_SERVER_MAPCOMPOSITE_ #include #include class Map; class MapComposite; class MovingObject; class Object; class Character; class Point; class Rectangle; class Script; class Thing; struct MapContent; struct MapZone; /** * Ordered sets of zones of a map. */ typedef std::vector< unsigned > MapRegion; /** * Iterates through the zones of a region of the map. */ struct ZoneIterator { MapRegion region; /**< Zones to visit. Empty means the entire map. */ unsigned pos; MapZone *current; MapContent const *map; ZoneIterator(MapRegion const &, MapContent const *); void operator++(); MapZone *operator*() const { return current; } operator bool() const { return current; } }; /** * Iterates through the Characters of a region. */ struct CharacterIterator { ZoneIterator iterator; unsigned short pos; Character *current; CharacterIterator(ZoneIterator const &); void operator++(); Character *operator*() const { return current; } operator bool() const { return iterator; } }; /** * Iterates through the MovingObjects of a region. */ struct MovingObjectIterator { ZoneIterator iterator; unsigned short pos; MovingObject *current; MovingObjectIterator(ZoneIterator const &); void operator++(); MovingObject *operator*() const { return current; } operator bool() const { return iterator; } }; /** * Iterates through the non-moving Objects of a region. */ struct FixedObjectIterator { ZoneIterator iterator; unsigned short pos; Object *current; FixedObjectIterator(ZoneIterator const &); void operator++(); Object *operator*() const { return current; } operator bool() const { return iterator; } }; /** * Iterates through the Objects of a region. */ struct ObjectIterator { ZoneIterator iterator; unsigned short pos; Object *current; ObjectIterator(ZoneIterator const &); void operator++(); Object *operator*() const { return current; } operator bool() const { return iterator; } }; /** * Combined map/entity structure. */ class MapComposite { public: /** * Constructor. */ MapComposite(int id, std::string const &name); /** * Destructor. */ ~MapComposite(); /** * Sets the underlying pathfinding map. * Can be done only once. */ void setMap(Map *); /** * Gets the underlying pathfinding map. */ Map *getMap() const { return mMap; } /** * Sets the associated script. */ void setScript(Script *s) { mScript = s; } /** * Gets the associated script. */ Script *getScript() const { return mScript; } /** * Returns whether the map is active on this server or not. */ bool isActive() const { return mMap; } /** * Gets the game ID of this map. */ int getID() const { return mID; } /** * Gets the name of this map. */ std::string const &getName() const { return mName; } /** * Inserts an object on the map. Sets its public ID if relevant. */ bool insert(Thing *); /** * Removes an object from the map. */ void remove(Thing *); /** * Updates zones of every moving beings. */ void update(); /** * Gets an iterator on the objects of the whole map. */ ZoneIterator getWholeMapIterator() const { return ZoneIterator(MapRegion(), mContent); } /** * Gets an iterator on the objects inside a given rectangle. */ ZoneIterator getInsideRectangleIterator(Rectangle const &) const; /** * Gets an iterator on the objects around a given point. */ ZoneIterator getAroundPointIterator(Point const &, int radius) const; /** * Gets an iterator on the objects around a given object. */ ZoneIterator getAroundObjectIterator(Object *, int radius) const; /** * Gets an iterator on the objects around the old and new positions of * a character (including the ones that were but are now elsewhere). */ ZoneIterator getAroundCharacterIterator(MovingObject *, int radius) const; /** * Gets everything related to the map. */ std::vector< Thing * > const &getEverything() const; private: MapComposite(MapComposite const &); Map *mMap; /**< Actual map. */ MapContent *mContent; /**< Entities on the map. */ Script *mScript; /**< Script associated to this map. */ std::string mName; /**< Name of the map. */ unsigned short mID; /**< ID of the map. */ }; #endif