Mercurial > fife-parpg
diff engine/core/model/structures/map.h @ 0:4a0efb7baf70
* Datasets becomes the new trunk and retires after that :-)
author | mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Sun, 29 Jun 2008 18:44:17 +0000 |
parents | |
children | 90005975cdbb |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/core/model/structures/map.h Sun Jun 29 18:44:17 2008 +0000 @@ -0,0 +1,185 @@ +/*************************************************************************** + * Copyright (C) 2005-2008 by the FIFE team * + * http://www.fifengine.de * + * This file is part of FIFE. * + * * + * FIFE 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 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#ifndef FIFE_MAP_MAP_H +#define FIFE_MAP_MAP_H + +// Standard C++ library includes +#include <list> +#include <string> +#include <vector> + +// 3rd party library includes + +// FIFE includes +// These includes are split up in two parts, separated by one empty line +// First block: files included from the FIFE root src directory +// Second block: files included from the same folder +#include "util/base/resourceclass.h" +#include "util/resource/resource.h" +#include "model/metamodel/timeprovider.h" + +#include "location.h" + +namespace FIFE { + + class Layer; + class CellGrid; + class Map; + + /** Listener interface for changes happening on map + */ + class MapChangeListener { + public: + virtual ~MapChangeListener() {}; + + /** Called when some layer is changed on map. @see LayerChangeListener + * Layer is effectively changed, in case some of its instances + * is created, deleted or changed during latest update cycle + * @param map where change occurred + * @param changedLayers list of layers containing some changes + * @note Does not report layer creations and deletions + */ + virtual void onMapChanged(Map* map, std::vector<Layer*>& changedLayers) = 0; + + /** Called when some layer gets created on the map + * @param map where change occurred + * @param layer which got created + */ + virtual void onLayerCreate(Map* map, Layer* layer) = 0; + + /** Called when some instance gets deleted on layer + * @param map where change occurred + * @param layer which will be deleted + * @note right after this call, layer actually gets deleted! + */ + virtual void onLayerDelete(Map* map, Layer* layer) = 0; + }; + + /** A container of \c Layer(s). + * + * The actual data is contained in \c Layer objects + * @see Layer + */ + class Map : public ResourceClass { + public: + + /** Construct a map + * To add map to model, one should call Model::addMap (otherwise + * map is not registered with the engine properly) + */ + Map(const std::string& identifier, TimeProvider* tp_master=NULL); + + /** Destructor + */ + ~Map(); + + /** Get the identifier for this map. + */ + const std::string& getId() { return m_id; } + + /** Add a Layer to this Map. Map owns the returned pointer to the new Layer, so don't delete it! + */ + Layer* createLayer(const std::string& identifier, CellGrid* grid); + + /** Delete a layer from the map + */ + void deleteLayer(Layer*); + + /** Get the layers on this map. + */ + const std::list<Layer*>& getLayers() const { return m_layers; } + + /** Get the layer with the given id. + */ + Layer* getLayer(const std::string& identifier); + + /** Get the overall number of layers + */ + size_t getNumLayers() const; + + /** Delete all layers from the map + */ + void deleteLayers(); + + /** Maps coordinate from one layer to another + */ + void getMatchingCoordinates(const ModelCoordinate& coord_to_map, const Layer* from_layer, + const Layer* to_layer, std::vector<ModelCoordinate>& matching_coords) const; + + /** Called periodically to update events on map + * @returns true, if map was changed + */ + bool update(); + + /** Sets speed for the map. See Model::setTimeMultiplier. + */ + void setTimeMultiplier(float multip) { m_timeprovider.setMultiplier(multip); } + + /** Gets model speed. @see setTimeMultiplier. + */ + float getTimeMultiplier() const { return m_timeprovider.getMultiplier(); } + + /** Gets timeprovider used in the map + */ + TimeProvider* getTimeProvider() { return &m_timeprovider; } + + /** Adds new change listener + * @param listener to add + */ + void addChangeListener(MapChangeListener* listener); + + /** Removes associated change listener + * @param listener to remove + */ + void removeChangeListener(MapChangeListener* listener); + + /** Returns true, if map information was changed during previous update round + */ + bool isChanged() { return !m_changedlayers.empty(); } + + /** Returns layers that were changed during previous update round + */ + std::vector<Layer*>& getChangedLayers() { return m_changedlayers; } + + private: + std::string m_id; + + std::list<Layer*> m_layers; + TimeProvider m_timeprovider; + + Map(const Map& map); + Map& operator=(const Map& map); + + // listeners for map changes + std::vector<MapChangeListener*> m_changelisteners; + + // holds changed layers after each update + std::vector<Layer*> m_changedlayers; + + // true, if something was changed on map during previous update (layer change, creation, deletion) + bool m_changed; + }; + +} //FIFE + +#endif +/* vim: set noexpandtab: set shiftwidth=2: set tabstop=2: */