#pragma once #include "object.hpp" #include #include "missile_hit_type.hpp" namespace game { class State; class Ship; class Planet; class Player; class State; class Trace; // missile belongs to a player and optionally fills a trace behind it. // trace then belongs to the player. class Missile : public Object { public: // missile advances to pos. if hit != Nothing, it hits something and // stops existing afterwards. class Event { public: Event(const glm::vec2 &pos, const glm::vec2 &missileVelocity) : Event(pos, missileVelocity, Hit::Nothing) { } Event(const glm::vec2 &pos, const glm::vec2 &missileVelocity, Hit hit) : hit(hit), position(pos), missileVelocity(missileVelocity) { } Event(const glm::vec2 &pos, const glm::vec2 &missileVelocity, size_t planetId) : Event(pos, missileVelocity, Hit::Planet) { this->planetId = planetId; } Event(const glm::vec2 &pos, const glm::vec2 &missileVelocity, size_t playerIdKiller, size_t playerIdVictim) : Event(pos, missileVelocity, Hit::Ship) { this->playerIdKiller = playerIdKiller; this->playerIdVictim = playerIdVictim; } Hit hit; glm::vec2 position; glm::vec2 missileVelocity; // if a player was hit, these are valid. size_t playerIdKiller; size_t playerIdVictim; // if a planet was hit, this is valid size_t planetId; }; Missile(size_t id, Player *player, const glm::vec2 &pos, const glm::vec3 &col, float angle, float speed); ~Missile(); // try to advance. if something will be hit, return the first hit in // time. Missile::Event advance(const game::State *state, float dt); Player *player; // owner won't be hit by own missiles glm::vec2 velocity; Trace *trace; glm::vec3 color; }; }