feat: implement shapes for entities
This commit is contained in:
@@ -9,7 +9,7 @@ namespace game {
|
||||
bool Tower::isMobInRange(MobPtr mob) {
|
||||
if (mob->isDead())
|
||||
return false;
|
||||
return (m_X - mob->getX()) * (m_X - mob->getX()) + (m_Y - mob->getY()) * (m_Y - mob->getY()) < (getStats()->getRange() * getStats()->getRange());
|
||||
return mob->collidesWith(*this);
|
||||
}
|
||||
|
||||
const std::map<std::pair<TowerType, TowerLevel>, TowerStats> TowerConstants = {
|
||||
|
||||
@@ -111,8 +111,7 @@ void World::tick(std::uint64_t delta) {
|
||||
|
||||
void World::spawnMobAt(MobID id, MobType type, std::uint8_t level, PlayerID sender, float x, float y, Direction dir) {
|
||||
MobPtr mob = MobFactory::createMob(id, type, level, sender);
|
||||
mob->setX(x);
|
||||
mob->setY(y);
|
||||
mob->setCenter({x, y});
|
||||
mob->setDirection(dir);
|
||||
m_Mobs.push_back(mob);
|
||||
}
|
||||
@@ -131,38 +130,42 @@ void World::tickMobs(std::uint64_t delta) {
|
||||
|
||||
void World::moveMobs(std::uint64_t delta) {
|
||||
for (MobPtr mob : m_Mobs) {
|
||||
TilePtr tile = getTile(mob->getX(), mob->getY());
|
||||
TilePtr tile = getTile(mob->getCenter().getX(), mob->getCenter().getY());
|
||||
|
||||
if (tile != nullptr && tile->getType() == TileType::Walk) {
|
||||
WalkableTile* walkTile = dynamic_cast<WalkableTile*>(tile.get());
|
||||
mob->setDirection(walkTile->direction);
|
||||
}
|
||||
|
||||
float mobWalkSpeed = mob->getStats()->getMovementSpeed();
|
||||
moveMob(mob, delta);
|
||||
}
|
||||
}
|
||||
|
||||
float walkAmount = mobWalkSpeed * ((float)delta / 1000.0f);
|
||||
void World::moveMob(MobPtr mob, std::uint64_t delta) {
|
||||
float mobWalkSpeed = mob->getStats()->getMovementSpeed();
|
||||
|
||||
if (mob->hasEffect(EffectType::Slowness))
|
||||
walkAmount *= 0.70;
|
||||
float walkAmount = mobWalkSpeed * ((float)delta / 1000.0f);
|
||||
|
||||
switch (mob->getDirection()) {
|
||||
case Direction::NegativeX: {
|
||||
mob->setX(mob->getX() - walkAmount);
|
||||
break;
|
||||
}
|
||||
case Direction::PositiveX: {
|
||||
mob->setX(mob->getX() + walkAmount);
|
||||
break;
|
||||
}
|
||||
case Direction::NegativeY: {
|
||||
mob->setY(mob->getY() - walkAmount);
|
||||
break;
|
||||
}
|
||||
case Direction::PositiveY: {
|
||||
mob->setY(mob->getY() + walkAmount);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (mob->hasEffect(EffectType::Slowness))
|
||||
walkAmount *= 0.70; // walk 30% slower
|
||||
|
||||
switch (mob->getDirection()) {
|
||||
case Direction::NegativeX: {
|
||||
mob->setCenterX(mob->getCenterX() - walkAmount);
|
||||
break;
|
||||
}
|
||||
case Direction::PositiveX: {
|
||||
mob->setCenterX(mob->getCenterX() + walkAmount);
|
||||
break;
|
||||
}
|
||||
case Direction::NegativeY: {
|
||||
mob->setCenterY(mob->getCenterY() - walkAmount);
|
||||
break;
|
||||
}
|
||||
case Direction::PositiveY: {
|
||||
mob->setCenterY(mob->getCenterY() + walkAmount);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -245,16 +248,16 @@ void World::cleanDeadMobs() {
|
||||
for (std::size_t i = 0; i < m_Mobs.size(); i++) {
|
||||
MobPtr mob = m_Mobs[i];
|
||||
if (mob->isDead()) {
|
||||
mob->OnDeath(this);
|
||||
if (mob->OnDeath(this)) {
|
||||
//reward players
|
||||
Player& sender = m_Game->getPlayerById(mob->getSender());
|
||||
sender.addExp(mob->getStats()->getExpReward());
|
||||
|
||||
//reward players
|
||||
Player& sender = m_Game->getPlayerById(mob->getSender());
|
||||
sender.addExp(mob->getStats()->getExpReward());
|
||||
Player& killer = m_Game->getPlayerById(mob->getLastDamageTower()->getBuilder());
|
||||
killer.addGold(mob->getStats()->getMoneyCost());
|
||||
|
||||
Player& killer = m_Game->getPlayerById(mob->getLastDamageTower()->getBuilder());
|
||||
killer.addGold(mob->getStats()->getMoneyCost());
|
||||
|
||||
m_Mobs.erase(m_Mobs.begin() + i);
|
||||
m_Mobs.erase(m_Mobs.begin() + i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,7 +103,7 @@ void ClientGame::HandlePacket(const protocol::WorldDataPacket* packet) {
|
||||
m_WorldRenderer.loadModels();
|
||||
// set cam pos to player spawn
|
||||
const game::Spawn& spawn = m_World->getTeam(m_Player->getTeamColor()).getSpawn();
|
||||
m_WorldRenderer.setCamPos(spawn.x + 0.5, spawn.y + 0.5);
|
||||
m_WorldRenderer.setCamPos(spawn.getCenterX(), spawn.getCenterY());
|
||||
}
|
||||
|
||||
void ClientGame::renderWorld() {
|
||||
|
||||
@@ -22,8 +22,8 @@ void ServerWorld::spawnMobs(game::MobType type, std::uint8_t level, game::Player
|
||||
enemyMobSpawn = &getTeam(game::TeamColor::Red).getSpawn();
|
||||
}
|
||||
|
||||
std::int32_t spawnCenterX = enemyMobSpawn->x;
|
||||
std::int32_t spawnCenterY = enemyMobSpawn->y;
|
||||
std::int32_t spawnCenterX = enemyMobSpawn->getCenterX();
|
||||
std::int32_t spawnCenterY = enemyMobSpawn->getCenterY();
|
||||
|
||||
std::int32_t minSpawnY = spawnCenterY - 2;
|
||||
std::int32_t maxSpawnY = spawnCenterY + 2;
|
||||
@@ -34,9 +34,9 @@ void ServerWorld::spawnMobs(game::MobType type, std::uint8_t level, game::Player
|
||||
float mobX = utils::getRandomReal<float>(minSpawnX, maxSpawnX);
|
||||
float mobY = utils::getRandomReal<float>(minSpawnY, maxSpawnY);
|
||||
|
||||
spawnMobAt(m_CurrentMobID, type, level, sender, mobX, mobY, enemyMobSpawn->direction);
|
||||
spawnMobAt(m_CurrentMobID, type, level, sender, mobX, mobY, enemyMobSpawn->getDirection());
|
||||
|
||||
protocol::SpawnMobPacket packet(m_CurrentMobID, type, level, sender, mobX, mobY, enemyMobSpawn->direction);
|
||||
protocol::SpawnMobPacket packet(m_CurrentMobID, type, level, sender, mobX, mobY, enemyMobSpawn->getDirection());
|
||||
m_Server->broadcastPacket(&packet);
|
||||
|
||||
m_CurrentMobID++;
|
||||
|
||||
@@ -74,7 +74,7 @@ void WorldRenderer::renderMobs() const {
|
||||
for (game::MobPtr mob : m_World->getMobList()) {
|
||||
Renderer::Model model;
|
||||
model.vao = m_MobVao.get();
|
||||
model.positon = { mob->getX(), mob->getY() };
|
||||
model.positon = { mob->getCenterX(), mob->getCenterY() };
|
||||
m_Renderer->renderModel(model);
|
||||
}
|
||||
}
|
||||
@@ -235,11 +235,7 @@ void WorldRenderer::renderMobTooltip() const {
|
||||
void WorldRenderer::detectMobHovering() const {
|
||||
glm::vec2 cursorWorldPos = getCursorWorldPos();
|
||||
for (game::MobPtr mob : m_World->getMobList()) {
|
||||
// mob size is currently 1x1 for all mobs
|
||||
float mobCenterX = mob->getX();
|
||||
float mobCenterY = mob->getY();
|
||||
if (cursorWorldPos.x > mobCenterX - 0.5f && cursorWorldPos.x < mobCenterX + 0.5f
|
||||
&& cursorWorldPos.y > mobCenterY - 0.5f && cursorWorldPos.y < mobCenterY + 0.5f) {
|
||||
if(mob->collidesWith({cursorWorldPos.x, cursorWorldPos.y})){
|
||||
m_MobTooltip->setMob(mob.get());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -97,8 +97,8 @@ GL::VertexArray loadWorldModel(const td::game::World* world) {
|
||||
|
||||
for (int spawnColor = 0; spawnColor < 2; spawnColor++) {
|
||||
const game::Spawn& spawn = world->getTeam(game::TeamColor(spawnColor)).getSpawn();
|
||||
float fromX = spawn.x - 2, toX = spawn.x + 3;
|
||||
float fromY = spawn.y - 2, toY = spawn.y + 3;
|
||||
float fromX = spawn.getTopLeft().getX() , toX = spawn.getBottomRight().getX();
|
||||
float fromY = spawn.getTopLeft().getY() , toY = spawn.getBottomRight().getY();
|
||||
|
||||
positions.insert(positions.end(), {
|
||||
fromX, fromY,
|
||||
@@ -125,8 +125,8 @@ GL::VertexArray loadWorldModel(const td::game::World* world) {
|
||||
|
||||
for (int castleColor = 0; castleColor < 2; castleColor++) {
|
||||
const game::TeamCastle& castle = world->getTeam(game::TeamColor(castleColor)).getCastle();
|
||||
float fromX = castle.x - 2, toX = castle.x + 3;
|
||||
float fromY = castle.y - 2, toY = castle.y + 3;
|
||||
float fromX = castle.getTopLeft().getX(), toX = castle.getBottomRight().getX();
|
||||
float fromY = castle.getTopLeft().getY(), toY = castle.getBottomRight().getY();
|
||||
|
||||
positions.insert(positions.end(), {
|
||||
fromX, fromY,
|
||||
|
||||
Reference in New Issue
Block a user