#ifndef MAP_H #define MAP_H #include "behavior.h" class Dude; struct Pixel { union PixelData { int nbRes; // RESOURCES char *knowledge; // LIBRARY int teamId; // SPAWN Dude *dudePtr; // DUDE }; PixelType type; PixelData data; Pixel() : type(GRASS) {} }; class Map { Pixel *m_map; Coord *m_teams; int m_width; int m_height; int m_nbTeams; public: Map(int nbTeams, int width, int height = 0); ~Map(); int getWidth() const { return m_width; } int getHeight() const { return m_height; } int getNbTeams() const { return m_nbTeams; } /** * Teams accessers : */ Coord & team(int i) { return m_teams[i]; } /** * Pixel accessers : */ Pixel &getPixel(int x, int y) { return m_map[m_height*x + y]; } Pixel &getPixel(const Coord &c) { return m_map[m_height*c.x + c.y]; } /** * @brief operator [] allows to access a pixel of the map with the following syntax : * Pixel &p = map[x][y]; * or * Pixel &p = map[Coord(x, y)]; */ Pixel* operator[](int i) { return m_map + m_height*i; } Pixel &operator[](const Coord &c) { return m_map[m_height*c.x + c.y]; } Coord &toreillerLoop(Coord &c) { while(c.x < 0) c.x += m_width; while(c.y < 0) c.y += m_width; // this is the shader implementation of the toreiller Coord nbRevolutions(c.x/m_width, c.y/m_height); if(std::abs(nbRevolutions.y % 2)) { c.x += m_width/2; nbRevolutions.x = c.x/m_width; } c -= Coord(nbRevolutions.x*m_width, nbRevolutions.y*m_height); return c; } Coord toreillerLoop(const Coord &c) { Coord myCoord = c; toreillerLoop(myCoord); return myCoord; } }; /** * must be named "generate" */ typedef void (*GenerateFunction)(Map *map); #endif // MAP_H