#pragma once

class Player;
class Ship;

class Action {
public:
    // As you can see keeping type here, require modify a base class whenever we add a new class, this volatile an open-close principle.
    // We should be able to extend code without modification already implemented one
    enum class Type {
        Attack,
        Defense,
        Escape
    };

    enum class Status {
        Escaped,
        Defeated,
        Nothing,
    };

    virtual Status operator()(Player* player, Ship* enemyShip) = 0;
    virtual Type type() const = 0;
};
