ttrts/game/game.cpp

178 lines
3.5 KiB
C++

#include "game.h"
// Interpret a string of orders
int CTTRTSGame::IssueOrders( player_id_t player, const std::string& _orders )
{
COrderVector orderVector;
std::string orders = _orders;
size_t pos;
while ( (pos = orders.find("\n")) != std::string::npos )
{
const std::string sorder = orders.substr(0, pos);
orders.erase(0,pos+1);
COrder order = GetOrderFromString( sorder );
orderVector.push_back(order);
}
return IssueOrders(player,orderVector);
}
// Issue orders by vector to the game
int CTTRTSGame::IssueOrders( player_id_t player, const COrderVector& orders )
{
// verify all the orders
for ( auto order : orders )
{
if ( IssueOrder(player,order) )
return 1;
}
return 0;
}
// Issue a single order
int CTTRTSGame::IssueOrder( player_id_t player, const COrder& order )
{
if ( VerifyOrder(player,order) )
return 1;
m_orders.push_back(order);
return 0;
}
// Simulate and progress to the next turn
// Returns non-zero if simulation failed
int CTTRTSGame::SimulateToNextTurn()
{
int error;
OrderUnitPairVector orderPairs;
// Grab all movement orders
for ( auto order : m_orders )
{
const OrderUnitPair pair = { order, GetUnitByID(order.unit) };
orderPairs.push_back(pair);
}
// Attempt all movement orders
for ( auto pair : orderPairs )
{
switch ( pair.order.order )
{
case order_c::F:
{
// Verify new unit position will be on the board
}
break;
}
}
// Vector of units to kill
std::vector< unit_id_t > toKill;
// Attempt all actions
for ( auto pair : orderPairs )
{
switch ( pair.order.order )
{
case order_c::A:
{
// Verify that there's a unit in front to attack
}
break;
case order_c::L:
case order_c::R:
// Nothing needed here, these orders can always be carried out
break;
}
}
for ( auto id : toKill )
{
}
// Clear all orders
m_orders.resize(0);
return error;
}
// Add a unit, nonzero return value indicates error
int CTTRTSGame::AddUnit( CUnit&& unit )
{
// Verify the unit
const int val = unit.valid();
if( val )
return val;
// Verify if the unit can be placed on the current board
const uvector2 pos = unit.getPos();
if( (pos.x < dimentions.x) && (pos.y < dimentions.y) )
return 1;
m_allUnits.push_back(std::move(unit));
return 0;
}
// Add a units, nonzero return value indicates error
int CTTRTSGame::AddUnits( CUnitVector&& units )
{
CUnitVector::iterator it;
for ( it = units.begin(); it != units.end(); it++ )
{
// Attempt the unit add
if ( AddUnit( std::move(*it) ) )
return 1;
}
// All units added successfully
return 0;
}
// Verify any order
int CTTRTSGame::VerifyOrder( player_id_t player, const COrder& order ) const
{
// Grab the unit ID
const unit_id_t unitID = order.unit;
// Attempt to find the unit
bool unitFound = false;
for ( const CUnit& unit : m_allUnits )
{
if ( unit.getID() == unitID )
{
unitFound = true;
break;
}
}
// for now, as long as the unit exists we can attempt the order
return unitFound;
}
// Get unit by unit ID
const CUnit& CTTRTSGame::GetUnitByID( unit_id_t id ) const
{
CUnitVector::const_iterator it;
for ( const CUnit& unit : m_allUnits )
{
// Attempt the unit add
if ( unit.getID() )
return unit;
}
// Return an invalid unit
static CUnit invalid_unit;
return invalid_unit;
}