This repository has been archived on 2023-04-11. You can view files and clone it, but cannot push or open issues or pull requests.
defend-together/server/gamemap.hpp

293 lines
6.8 KiB
C++

#ifndef GAMEMAP_HPP
#define GAMEMAP_HPP
#include <string>
#include <iostream>
#include <vector>
#include <sstream>
#include "gameentity.hpp"
class GameMap
{
public:
GameMap(int,int);
int get_tile(int,int);
void set_tile(int,int,int);
std::string get_tile_dump(void);
std::string get_entity_dump(void);
std::string spawn_entity(std::string,std::string,float,float);
std::string move_entity(std::string,std::string,float,float);
void set_entity_velocity(std::string,std::string,float,float);
std::string move_enitity_relatively(std::string,std::string,float,float);
int get_entity_pos_x(std::string,std::string);
int get_entity_pos_y(std::string,std::string);
int get_size_x(void);
int get_size_y(void);
bool entity_exists(std::string, std::string);
bool remove_entity(std::string, std::string);
std::string world_tick(void);
private:
int ** map_data;
int size_x;
int size_y;
bool valid_x_y(int,int);
std::vector<GameEntity> entities;
};
GameMap::GameMap(int x, int y)
{
size_x = x;
size_y = y;
map_data = new int * [x];
for (int i = 0; i < x; i++)
{
map_data[i] = new int [y];
for(int q = 0; q < y; q++)
{
if(q == 0 || i == 0 || i == x-1 || q == y-1)
{
map_data[i][q] = 0;
}
else
{
map_data[i][q] = 1;
}
}
}
this -> spawn_entity("spawn","crystal",size_x/2, size_y/2);
}
std::string GameMap::spawn_entity(std::string entity_id, std::string entity_type, float x = 0, float y = 0)
{
GameEntity entity = GameEntity(entity_id, entity_type, x, y);
entities.push_back(entity);
return entity.get_dump();
}
std::string GameMap::move_enitity_relatively(std::string entity_id, std::string entity_type, float x = 0, float y = 0)
{
for(int i = 0; i < entities.size(); i++)
{
if(entities[i].get_id() == entity_id && entities[i].get_type() == entity_type)
{
return move_entity(entity_id, entity_type, x - entities[i].get_x(), y - entities[i].get_y());
}
}
return "";
}
std::string GameMap::move_entity(std::string entity_id, std::string entity_type, float x = 0, float y = 0)
{
for(int i = 0; i < entities.size(); i++)
{
if(entities[i].get_id() == entity_id && entities[i].get_type() == entity_type)
{
GameEntity* entity = &entities[i];
//if(map_data[entities[i].get_x() + x][entities[i].get_y() + y] % 2 == 1)
//{
if(entity->get_x() + x < 0)
{
entity->set_x(0);
}
else if(entity->get_x() + x >= this->get_size_x())
{
entity->set_x(this->get_size_x() - 1);
}
else
{
entity->set_x(entities[i].get_x() + x);
}
if(entity->get_y() + y < 0)
{
entity->set_y(0);
}
else if(entity->get_y() + y >= this->get_size_y())
{
entity->set_y(this->get_size_y() - 1);
}
else
{
entity->set_y(entities[i].get_y() + y);
}
return entity->get_dump();
}
}
return "";
}
void GameMap::set_entity_velocity(std::string entity_id, std::string entity_type, float x = 0, float y = 0)
{
for(int i = 0; i < entities.size(); i++)
{
if(entities[i].get_id() == entity_id && entities[i].get_type() == entity_type)
{
GameEntity* entity = &entities[i];
entity->set_velocity(x,y);
}
}
}
bool GameMap::valid_x_y(int x, int y)
{
if(x < size_x && x >= 0)
{
if(y < size_y && y >= 0)
{
return true;
}
}
return false;
}
std::string GameMap::world_tick(void)
{
std::string dump = "";
for(int i = 0; i < entities.size(); i++)
{
if(entities[i].movement_tick())
{
dump += entities[i].get_dump();
}
}
if(dump != "")
{
std::cout << dump << std::endl;
}
return dump;
}
int GameMap::get_tile(int x, int y)
{
if(this->valid_x_y(x,y))
{
return map_data[x][y];
}
return -1;
}
void GameMap::set_tile(int x, int y, int tile_type)
{
if(this->valid_x_y(x,y))
{
map_data[x][y] = tile_type;
}
}
std::string GameMap::get_tile_dump(void)
{
std::string data_string("");
for(int x = 0; x < size_x; x++)
{
for(int y = 0; y < size_y; y++)
{
data_string += std::to_string(x) + "," + std::to_string(y) + "," + std::to_string(map_data[x][y]) + '\n';
}
}
return data_string;
}
std::string GameMap::get_entity_dump(void)
{
std::string data_string("");
for(int i = 0; i < entities.size(); i++)
{
data_string += entities[i].get_dump();
}
return data_string;
}
int GameMap::get_size_x(void)
{
return size_x;
}
int GameMap::get_size_y(void)
{
return size_y;
}
bool GameMap::entity_exists(std::string entity_id, std::string entity_type)
{
for(int i = 0; i < entities.size(); i++)
{
GameEntity* entity = &entities[i];
if(entity->get_id() == entity_id)
{
if(entity->get_type() == entity_type)
{
return true;
}
}
}
return false;
}
bool erase(std::vector<GameEntity> &v, GameEntity key)
{
for(auto it = v.begin(); it != v.end();)
{
if (it->get_id() == key.get_id())
{
it = v.erase(it);
return true;
}
else
{
++it;
}
}
return false;
}
bool GameMap::remove_entity(std::string entity_id, std::string entity_type)
{
for(int i = 0; i < entities.size(); i++)
{
if(entities[i].get_id() == entity_id && entities[i].get_type() == entity_type)
{
return erase(entities, entities[i]);
}
}
return false;
}
int GameMap::get_entity_pos_x(std::string entity_id, std::string entity_type)
{
for(int i = 0; i < entities.size(); i++)
{
GameEntity* entity = &entities[i];
if(entity->get_id() == entity_id)
{
if(entity->get_type() == entity_type)
{
return entity->get_x();
}
}
}
return -1;
}
int GameMap::get_entity_pos_y(std::string entity_id, std::string entity_type)
{
for(int i = 0; i < entities.size(); i++)
{
GameEntity* entity = &entities[i];
if(entity->get_id() == entity_id)
{
if(entity->get_type() == entity_type)
{
return entity->get_y();
}
}
}
return -1;
}
#endif