#include "commands.hpp" #include #include "trace.hpp" #include "util.hpp" namespace game { void ShootCommand::apply(Player *player, State *state) const { // TODO: idea // shoot multiple rockets at once or from different positions after // level up / upgrade ... // angles are supplied in degrees and are CCW Missile *missile = new Missile( player, player->ship->position, -util::deg2rad(m_angle), 0.005*player->speed); Trace *trace = new Trace(missile); missile->trace = trace; player->energy -= player->speed; player->missiles.push_back(missile); state->addTrace(trace); } bool ShootCommand::ready(const Player *player, const State *state) const { (void) state; return player->alive && player->energy >= player->speed; } void ChangeNameCommand::apply(Player *player, State *state) const { // discard if not unique for (const Player *other : state->players) { if (m_name == other->name) { std::cout << "name '" << m_name << "' already given to player #" << other->id << std::endl; return; } } player->name = m_name; } void SetSpeedCommand::apply(Player *player, State *state) const { (void) state; if (m_speed < 0.0) { return; } player->speed = m_speed; } void ClearTracesCommand::apply(Player *player, State *state) const { std::cout<<"clearing traces!!!" << std::endl; std::vector rm; for (Trace *trace : state->traces) { if (trace->missile == nullptr && trace->player == player) { rm.push_back(trace); } } for (Trace *trace : rm) { state->traces.remove(trace); } } #if 0 bool TakeOverPlayerCommand::ready(const Player *player, const State *state) const { (void) state; return state->havePlayerGrantFor(player->id, m_otherPlayerId); } void TakeOverPlayerCommand::apply(Player *player, State *state) const { if ( state->playerGrant(player->id, m_otherPlayerId); } #endif }