Skip to content
Snippets Groups Projects
Commit fc8dbffb authored by Frederik Alexander Keens's avatar Frederik Alexander Keens
Browse files

Merge branch 'player-interaction' into 'main'

Add player interaction handling

See merge request !28
parents 512e95d0 49dba561
Branches
No related tags found
2 merge requests!29Merge main into box2d to implement physics,!28Add player interaction handling
......@@ -65,14 +65,10 @@ bool Building::check_spawn(std::unordered_map<int, advanced_wars::Unit>& units)
return true;
}
// can be added as soon as the playerobject is available
bool Building::check_money(int price)
bool Building::check_money(int price, int playerMoney)
{
// replace 400 with player.money and replace price with chosenUnit.price
if (400 > price)
{
return false;
}
return true;
return (playerMoney >= price);
}
std::vector<UnitId> Building::recruitableUnits()
......
......@@ -37,7 +37,7 @@ class Building
/*
checks if the player has enough money for the unit to be recruited
*/
bool check_money(int price);
bool check_money(int price, int playerMoney);
/*
When the building is selected, the player should have the ability to recruit a selection of
......
......@@ -119,7 +119,7 @@ std::shared_ptr<Level> Level::loadLevel(std::string path, Engine& engine)
{
if (has_factions[i])
{
turnQ.push(Player(2000, static_cast<PlayerFaction>(i)));
turnQ.push(Player(2000, static_cast<UnitFaction>(i)));
}
}
......@@ -430,17 +430,25 @@ void Level::handleRecruitingEvent(Engine& engine, SDL_Event& event)
Building& b = m_buildings.at(m_selectedBuilding);
UnitFaction u_faction = static_cast<UnitFaction>(b.m_faction);
UnitId unit_id = m_recruitingMenu.getSelectedOption();
int cost = engine.getUnitConfig().getUnitCost(unit_id);
if (b.check_money(500))
if (b.check_money(cost, m_turnQ.front().getMoney()))
{
if (b.check_spawn(m_units))
{
addUnit(Unit(
b.m_x, b.m_y, u_faction, unit_id, UnitState::IDLE, engine.getUnitConfig()));
m_state = LevelState::SELECTING_STATE;
m_turnQ.front().spendMoney(cost);
m_selectedBuilding = -1;
}
}
else
{
std::cout << "You dont have enough money, current money: "
<< m_turnQ.front().getMoney() << " || needed money: " << cost
<< std::endl;
}
}
}
}
......@@ -596,11 +604,30 @@ void Level::handleSelectingEvents(Engine& engine, SDL_Event& event)
}
}
m_contextMenu.setOptions({"Move", "Attack", "Info", "Wait"});
// Show according menu options if unit has same/different faction than current
// player
if (m_units.at(m_selectedUnit).getFaction() == m_turnQ.front().getFaction())
{
m_contextMenu.setOptions({"Move", "Attack", "Info", "Wait", "End Turn"});
}
else
{
m_contextMenu.setOptions({"Train", "Info", "Wait"});
m_contextMenu.setOptions({"Info", "Wait", "End Turn"});
}
}
else
{
// Show according menu options if building has same/different faction than
// current player
if (m_buildings.at(m_selectedBuilding).getFaction() ==
static_cast<BuildingFaction>(m_turnQ.front().getFaction()))
{
m_contextMenu.setOptions({"Train", "Info", "Wait", "End Turn"});
}
else
{
m_contextMenu.setOptions({"Info", "Wait", "End Turn"});
}
}
m_state = LevelState::MENUACTIVE_STATE;
}
......@@ -701,6 +728,13 @@ void Level::handleMenuActiveEvents(Engine& engine, SDL_Event& event)
UnitId::HEAVY_TANK});
std::cout << "no training here" << std::endl;
}
if (cmd == "End Turn")
{
m_state = LevelState::SELECTING_STATE;
m_showAttackableTiles = false;
m_showReachableTiles = false;
changeTurn();
}
}
break;
......
......@@ -4,7 +4,7 @@
namespace advanced_wars
{
Player::Player(int money, PlayerFaction faction)
Player::Player(int money, UnitFaction faction)
: m_money(money), m_alive(true), m_activeTurn(false), m_faction(faction)
{
}
......@@ -16,42 +16,10 @@ void Player::startTurn(
{
for (auto& [id, unit] : lvUnits)
{
switch (m_faction)
{
case PlayerFaction::RED:
if (unit.getFaction() == UnitFaction::URED)
{
unit.setState(UnitState::IDLE);
}
break;
case PlayerFaction::BLUE:
if (unit.getFaction() == UnitFaction::UBLUE)
if (unit.getFaction() == m_faction)
{
unit.setState(UnitState::IDLE);
}
break;
case PlayerFaction::YELLOW:
if (unit.getFaction() == UnitFaction::UYELLOW)
{
unit.setState(UnitState::IDLE);
}
break;
case PlayerFaction::GREEN:
if (unit.getFaction() == UnitFaction::UGREEN)
{
unit.setState(UnitState::IDLE);
}
break;
case PlayerFaction::PURPLE:
if (unit.getFaction() == UnitFaction::UPURPLE)
{
unit.setState(UnitState::IDLE);
}
break;
default:
break;
}
}
int underControl = 0;
......@@ -60,31 +28,31 @@ void Player::startTurn(
{
switch (m_faction)
{
case PlayerFaction::RED:
case UnitFaction::URED:
if (building.getFaction() == BuildingFaction::URED)
{
underControl++;
}
break;
case PlayerFaction::BLUE:
case UnitFaction::UBLUE:
if (building.getFaction() == BuildingFaction::UBLUE)
{
underControl++;
}
break;
case PlayerFaction::YELLOW:
case UnitFaction::UYELLOW:
if (building.getFaction() == BuildingFaction::UYELLOW)
{
underControl++;
}
break;
case PlayerFaction::GREEN:
case UnitFaction::UGREEN:
if (building.getFaction() == BuildingFaction::UGREEN)
{
underControl++;
}
break;
case PlayerFaction::PURPLE:
case UnitFaction::UPURPLE:
if (building.getFaction() == BuildingFaction::UPURPLE)
{
underControl++;
......@@ -105,43 +73,26 @@ void Player::endTurn(std::unordered_map<int, Unit>& lvUnits)
{
for (auto& [id, unit] : lvUnits)
{
switch (m_faction)
{
case PlayerFaction::RED:
if (unit.getFaction() == UnitFaction::URED)
if (unit.getFaction() == m_faction)
{
unit.setState(UnitState::UNAVAILABLE);
}
break;
case PlayerFaction::BLUE:
if (unit.getFaction() == UnitFaction::UBLUE)
{
unit.setState(UnitState::UNAVAILABLE);
}
break;
case PlayerFaction::YELLOW:
if (unit.getFaction() == UnitFaction::UYELLOW)
{
unit.setState(UnitState::UNAVAILABLE);
m_activeTurn = false;
}
break;
case PlayerFaction::GREEN:
if (unit.getFaction() == UnitFaction::UGREEN)
UnitFaction Player::getFaction()
{
unit.setState(UnitState::UNAVAILABLE);
return m_faction;
}
break;
case PlayerFaction::PURPLE:
if (unit.getFaction() == UnitFaction::UPURPLE)
int Player::getMoney()
{
unit.setState(UnitState::UNAVAILABLE);
return m_money;
}
break;
default:
break;
}
}
m_activeTurn = false;
void Player::spendMoney(int toSpend)
{
m_money -= toSpend;
}
} // namespace advanced_wars
\ No newline at end of file
......@@ -7,25 +7,16 @@
namespace advanced_wars
{
enum class PlayerFaction
{
RED,
BLUE,
YELLOW,
GREEN,
PURPLE
};
class Player
{
private:
int m_money;
bool m_alive;
bool m_activeTurn;
PlayerFaction m_faction;
UnitFaction m_faction;
public:
Player(int money, PlayerFaction faction);
Player(int money, UnitFaction faction);
~Player();
/**
......@@ -45,6 +36,12 @@ class Player
* @param lvUnits All current units of a level
*/
void endTurn(std::unordered_map<int, Unit>& lvUnits);
UnitFaction getFaction();
int getMoney();
void spendMoney(int toSpend);
};
} // namespace advanced_wars
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment