Cmd::ProcessResult ColoniseSquaresCmd::Process(const Input::CmdMessage& msg, CommitSession& session) { auto& m = VerifyCastInput<const Input::CmdColoniseSquares>(msg); Population pop = m.m_moved; VERIFY_INPUT_MSG("no moves specified", !pop.IsEmpty()); VERIFY_INPUT_MSG("not enough ships", pop.GetTotal() <= GetTeam(session.GetGame()).GetUnusedColonyShips()); Moves moves = GetMoves(pop, GetSquareCounts(session.GetGame())); DoRecord(RecordPtr(new ColoniseRecord(m_colour, m_pos, moves)), session); return nullptr; }
Cmd::ProcessResult CombatDiceCmd::Process(const Input::CmdMessage& msg, CommitSession& session) { auto& m = VerifyCastInput<const Input::CmdDice>(msg); session.GetController().SendMessage(Output::ChooseFinished(), GetPlayer(session.GetGame())); // TODO: manually assign hits. DoRecord(session.GetGame().GetBattle().CreateAttackRecord(session.GetGame(), m_dice), session); // TODO: Send attack animation return nullptr; }
Cmd::ProcessResult AutoInfluenceCmd::Process(const Input::CmdMessage& msg, CommitSession& session) { if (dynamic_cast<const Input::CmdAbort*>(&msg)) return nullptr; std::vector<MapPos> hexes = GetHexes(session.GetGame()); auto& m = VerifyCastInput<const Input::CmdAutoInfluence>(msg); VERIFY_INPUT(m.m_selected.size() == hexes.size()); const LiveGame& game = session.GetGame(); for (size_t i = 0; i < hexes.size();++i) if (m.m_selected[i]) DoRecord(RecordPtr(new InfluenceRecord(m_colour, nullptr, &hexes[i])), session); return nullptr; }
Cmd::ProcessResult BankruptCmd::Process(const Input::CmdMessage& msg, CommitSession& session) { auto& m = VerifyCastInput<const Input::CmdInfluenceSrc>(msg); std::vector<MapPos> srcs = BankruptCmd::GetSources(session.GetGame()); VERIFY_INPUT_MSG("invalid pos index", m.m_iPos == -1 || InRange(srcs, m.m_iPos)); auto& pos = srcs[m.m_iPos]; InfluenceRecord* pRec = new InfluenceRecord(m_colour, &pos, nullptr); DoRecord(RecordPtr(pRec), session); const LiveGame& game = session.GetGame(); const Map& map = game.GetMap(); if (map.GetHex(pos).HasPopulation()) return ProcessResult(new UncoloniseCmd(m_colour, pos), nullptr); return nullptr; }
Cmd::ProcessResult TradeCmd::Process(const Input::CmdMessage& msg, CommitSession& session) { const Team& team = session.GetGame().GetTeam(m_colour); auto& storage = team.GetStorage(); auto& m = VerifyCastInput<const Input::CmdTrade>(msg); const int fromCount = m.m_count * Race(team.GetRace()).GetTradeRate(); VERIFY_INPUT_MSG("no count", m.m_count > 0); VERIFY_INPUT_MSG("to == from", m.m_from != m.m_to); VERIFY_INPUT_MSG("can't afford trade", fromCount <= storage[m.m_from]); TradeRecord::PairVec srcs{ { m.m_from, fromCount } }; TradeRecord::Pair dst(m.m_to, m.m_count); TradeRecord* pRec = new TradeRecord(m_colour, srcs, dst); DoRecord(RecordPtr(pRec), session); return nullptr; }
Cmd::ProcessResult DiscoverCmd::Process(const Input::CmdMessage& msg, CommitSession& session) { auto& m = VerifyCastInput<const Input::CmdDiscovery>(msg); VERIFY_INPUT(m.m_action != Input::CmdDiscovery::Action::None); auto& game = session.GetGame(); bool use = m.m_action == Input::CmdDiscovery::Action::Use; VERIFY_INPUT(!use || CanUse(game)); if (use && m_discovery == DiscoveryType::AncientTech) return ProcessResult(new ResearchDiscoveryCmd(m_colour, game, GetAncientTechs(game))); DiscoveryType discovery = m.m_action == Input::CmdDiscovery::Action::Points ? DiscoveryType::None : m_discovery; DoRecord(RecordPtr(new DiscoveryRecord(m_colour, discovery, m_idHex)), session); if (use && Discovery::GetClass(m_discovery) == DiscoveryClass::ShipPart) return ProcessResult(new UpgradeDiscoveryCmd(m_colour, session.GetGame(), Discovery::GetShipPart(m_discovery))); return ProcessResult(nullptr); }
int main(int argc, char * argv[]) { Operations operation; if (argc < 2 || (operation = GetOperation(argv[1])) == NumOperations || argc < RequiredArgsForOperation[operation]) { Operations op; fputs("usage: c_api { ", stderr); for (op = OpListen; op < NumOperations; op++) { if (op > OpListen) fputs(" | ", stderr); fputs(OperationNames[op], stderr); } fputs(" } [ A-party [ B-party | file ] ]\n", stderr); return 1; } puts("Initialising.\n"); if (!InitialiseOPAL()) return 1; switch (operation) { case OpListen : puts("Listening.\n"); HandleMessages(60000); break; case OpCall : if (argc > 3) { if (!DoCall(argv[2], argv[3])) break; } else { if (!DoCall(NULL, argv[2])) break; } HandleMessages(15000); break; case OpMute : if (!DoCall(NULL, argv[2])) break; HandleMessages(15000); if (!DoMute(1)) break; HandleMessages(15000); if (!DoMute(0)) break; HandleMessages(15000); break; case OpHold : if (!DoCall(NULL, argv[2])) break; HandleMessages(15000); if (!DoHold()) break; HandleMessages(15000); break; case OpTransfer : if (!DoCall(NULL, argv[2])) break; HandleMessages(15000); if (!DoTransfer(argv[3])) break; HandleMessages(15000); break; case OpConsult : if (!DoCall(NULL, argv[2])) break; HandleMessages(15000); if (!DoHold()) break; HandleMessages(15000); if (!DoCall(NULL, argv[3])) break; HandleMessages(15000); if (!DoTransfer(HeldCallToken)) break; HandleMessages(15000); break; case OpRegister : if (!DoRegister(argv[2], argv[3])) break; HandleMessages(15000); break; case OpSubscribe : if (!DoSubscribe(argv[2], argv[3], argv[4])) break; HandleMessages(INT_MAX); // More or less forever break; case OpRecord : if (!DoRecord(argv[2], argv[3])) break; HandleMessages(INT_MAX); // More or less forever break; case OpPlay : if (!DoPlay(argv[2], argv[3])) break; HandleMessages(INT_MAX); // More or less forever break; default : break; } puts("Exiting.\n"); ShutDownFunction(hOPAL); return 0; }