defense_tower.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include "defense_tower.h"
  2. #include "../core/component.h"
  3. #include "../core/event_manager.h"
  4. #include "../core/ownership_constants.h"
  5. #include "../core/world.h"
  6. #include "../systems/building_collision_registry.h"
  7. #include "../visuals/team_colors.h"
  8. #include "units/unit.h"
  9. #include <memory>
  10. namespace Game::Units {
  11. DefenseTower::DefenseTower(Engine::Core::World &world)
  12. : Unit(world, "defense_tower") {}
  13. auto DefenseTower::create(Engine::Core::World &world, const SpawnParams &params)
  14. -> std::unique_ptr<DefenseTower> {
  15. auto unit = std::unique_ptr<DefenseTower>(new DefenseTower(world));
  16. unit->init(params);
  17. return unit;
  18. }
  19. void DefenseTower::init(const SpawnParams &params) {
  20. auto *e = m_world->create_entity();
  21. m_id = e->get_id();
  22. const auto nation_id = resolve_nation_id(params);
  23. m_t = e->add_component<Engine::Core::TransformComponent>();
  24. m_t->position = {params.position.x(), params.position.y(),
  25. params.position.z()};
  26. m_t->scale = {1.0F, 2.0F, 1.0F};
  27. m_r = e->add_component<Engine::Core::RenderableComponent>("", "");
  28. m_r->visible = true;
  29. m_r->mesh = Engine::Core::RenderableComponent::MeshKind::Cube;
  30. m_u = e->add_component<Engine::Core::UnitComponent>();
  31. m_u->spawn_type = SpawnType::DefenseTower;
  32. m_u->health = 1500;
  33. m_u->max_health = 1500;
  34. m_u->speed = 0.0F;
  35. m_u->owner_id = params.player_id;
  36. m_u->vision_range = 18.0F;
  37. m_u->nation_id = nation_id;
  38. if (params.ai_controlled) {
  39. e->add_component<Engine::Core::AIControlledComponent>();
  40. }
  41. QVector3D const tc = Game::Visuals::team_colorForOwner(m_u->owner_id);
  42. m_r->color[0] = tc.x();
  43. m_r->color[1] = tc.y();
  44. m_r->color[2] = tc.z();
  45. e->add_component<Engine::Core::BuildingComponent>();
  46. m_atk = e->add_component<Engine::Core::AttackComponent>();
  47. m_atk->range = 16.0F;
  48. m_atk->damage = 25;
  49. m_atk->cooldown = 2.0F;
  50. m_atk->can_ranged = true;
  51. m_atk->can_melee = false;
  52. m_atk->preferred_mode = Engine::Core::AttackComponent::CombatMode::Ranged;
  53. m_atk->current_mode = Engine::Core::AttackComponent::CombatMode::Ranged;
  54. m_atk->max_height_difference = 4.0F;
  55. Game::Systems::BuildingCollisionRegistry::instance().register_building(
  56. m_id, m_type_string, m_t->position.x, m_t->position.z, m_u->owner_id);
  57. Engine::Core::EventManager::instance().publish(Engine::Core::UnitSpawnedEvent(
  58. m_id, m_u->owner_id, m_u->spawn_type, params.is_initial_spawn));
  59. }
  60. } // namespace Game::Units