/*
* area.h
* Header file for area code.
* ____ _
* | _ \ ___ __ _| |_ __ ___ ___
* | |_) / _ \/ _` | | '_ ` _ \/ __|
* | _ < __/ (_| | | | | | | \__ \
* |_| \_\___|\__,_|_|_| |_| |_|___/
*
* Permission to use, modify and distribute is granted via the
* Creative Commons - Attribution - Non Commercial - Share Alike 3.0 License
* http://creativecommons.org/licenses/by-nc-sa/3.0/
* Copyright (C) 2007-2012 Jason Mitchell, Randi Mitchell
* Contributions by Tim Callahan, Jonathan Hseu
* Based on Mordor (C) Brooke Paul, Brett J. Vickers, John P. Freeman
*
*/
#ifndef AREA_H
#define AREA_H
#define RADIAN 57.2957795
// max vision is defined because of the output functions - if it's any higher
// than this, some of the area grid gets truncated
#define MAX_VISION 18
// we don't let too many AreaTrack objects hang around
#define MAX_AREA_TRACK 100
//#include <list>
//#include <vector>
#include <map>
// forward declaration
class Area;
class AreaData;
class AreaRoom;
class Player;
class MapMarker {
public:
MapMarker();
MapMarker& operator=(const MapMarker& m);
bool operator==(const MapMarker& m) const;
bool operator!=(const MapMarker& m) const;
void save(xmlNodePtr curNode) const;
void load(xmlNodePtr curNode);
void load(bstring str);
void reset();
bstring str(bool color=false) const;
bstring direction(const MapMarker *mapmarker) const;
bstring distance(const MapMarker *mapmarker) const;
bstring filename() const;
short getArea() const;
short getX() const;
short getY() const;
short getZ() const;
void setArea(short n);
void setX(short n);
void setY(short n);
void setZ(short n);
void set(short _area, short _x, short _y, short _z);
void add(short _x, short _y, short _z);
protected:
short area;
short x;
short y;
short z;
};
class AreaTrack {
public:
AreaTrack();
MapMarker mapmarker;
Track track;
int getDuration() const;
void setDuration(int dur);
protected:
int duration;
};
class AreaZone {
public:
AreaZone();
~AreaZone();
bstring getFishing() const;
bool inside(const Area *area, const MapMarker *mapmarker) const;
bool inRestrict(char tile, const char *list) const;
void load(xmlNodePtr curNode);
void save(xmlNodePtr curNode) const;
bool swap(Swap s);
bool flagIsSet(int flag) const;
bstring name; // for staff identification
bstring display; // displayed to player in room description
char terRestrict[10];
char mapRestrict[10];
WanderInfo wander; // Random monster info
CatRef unique; // does this zone lead to a unique room
char flags[16];
MapMarker min;
MapMarker max;
std::map<int, MapMarker*> coords;
protected:
bstring fishing;
};
class TileInfo {
public:
TileInfo();
void load(xmlNodePtr curNode);
void save(xmlNodePtr curNode) const;
char getStyle(const Player* player=0) const;
char getId() const;
bstring getName() const;
bstring getDescription() const;
short getCost() const;
float getVision() const;
char getDisplay() const;
short getTrackDur() const;
bool flagIsSet(int flag) const;
bool isWater() const;
bool isRoad() const;
short getFly() const;
bool spawnHerbs(BaseRoom* room) const;
bstring getFishing() const;
WanderInfo wander; // Random monster info
std::map<Season,char> season;
protected:
char id;
bstring name;
bstring description;
bstring fishing;
short cost;
float vision;
char style;
char display;
short trackDur; // duration of tracks in game minutes
char flags[16];
bool water;
bool road;
short fly;
std::list<CatRef> herbs; // searchable disposable herbs
};
class AreaData {
public:
AreaData();
char get(short x, short y, short z) const;
std::vector< std::vector< std::vector<char> > > data;
void setArea(Area* a);
void setTerrain(bool t);
protected:
Area *area;
bool isTerrain;
};
class Area {
protected:
public:
Area();
~Area();
CatRef getUnique(const MapMarker *mapmarker) const;
bool move(Player* player, MapMarker *mapmarker);
void remove(AreaRoom* room);
AreaRoom *getRoom(const MapMarker *mapmarker);
AreaRoom *loadRoom(Creature* creature, const MapMarker* mapmarker, bool recycle, bool p=false);
void checkCycle(MapMarker *mapmarker) const;
short checkCycle(short vector, short critical) const;
bool canPass(const Creature* creature, const MapMarker *mapmarker, bool adjust=false) const;
bool isRoad(short x, short y, short z, bool adjust=false) const;
bool isWater(short x, short y, short z, bool adjust=false) const;
TileInfo *getTile(char grid, char seasonFlags, Season season=NO_SEASON, bool checkSeason=true) const;
char getTerrain(const Player* player, const MapMarker *mapmarker, short y, short x, short z, bool terOnly) const;
char getSeasonFlags(const MapMarker *mapmarker, short y=0, short x=0, short z=0) const;
float getLosPower(const Player* player, int xVision, int yVision) const;
void getGridText(char grid[][80], int height, const MapMarker *mapmarker, int maxWidth) const;
bstring showGrid(const Player* player, const MapMarker *mapmarker, bool compass) const;
bool outOfBounds(short x, short y, short z) const;
void adjustCoords(short* x, short* y, short* z) const;
void cleanUpRooms();
Track* getTrack(MapMarker* mapmarker) const;
void addTrack(AreaTrack *aTrack);
int getTrackDuration(const MapMarker* mapmarker) const;
void updateTrack(int t);
bool swap(Swap s);
void load(xmlNodePtr curNode);
void loadZones(xmlNodePtr curNode);
void loadTerrain(int minDepth);
void loadRooms();
void loadTiles(xmlNodePtr curNode, bool ter);
void save(xmlNodePtr curNode, bool saveRooms) const;
void checkFileSize(int& size, const char* filename) const;
bool isSunlight(const MapMarker* mapmarker) const;
bool flagIsSet(int flag, const MapMarker* mapmarker) const;
// line of sight functions
void losCloser(int *x, int *y, int me_x, int me_y, int i) const;
float lineOfSight(float *grid, const Player* player, int width, int *y, int *x, int me_y, int me_x, int *i, const MapMarker *mapmarker) const;
void makeLosGrid(float *grid, const Player* player, int height, int width, const MapMarker *mapmarker) const;
public:
short id;
bstring name;
// stuff we will need
// terrain grid
// data for each terrain spot
// zone-specific data
// if the point goes over this coord, it is cycled to the other
// side of the world. set to 0 if no auto-cycling
short critical_x;
short critical_y;
short critical_z;
// the point 0,0,0 will change if we ever modify the dimensions of the
// map. thus, a special map marker '*' marks 0,0,0 for us. we are free to edit
// map dimensions and keep the same coordinates for all rooms
short zero_offset_x;
short zero_offset_y;
short zero_offset_z;
short width;
short height;
short depth;
char dataFile[20];
char defaultTerrain;
AreaData aTerrain;
AreaData aMap;
AreaData aSeason;
// how much flying helps vision
short flightPower;
std::map<bstring, AreaRoom*> rooms;
std::list<AreaZone*> zones;
std::list<AreaTrack*> tracks;
std::map<char, TileInfo*> ter_tiles;
std::map<char, TileInfo*> map_tiles;
protected:
int minDepth;
};
#endif