/
TradeCmd.cpp
99 lines (78 loc) · 2.69 KB
/
TradeCmd.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include "stdafx.h"
#include "TradeCmd.h"
#include "Output.h"
#include "Input.h"
#include "Controller.h"
#include "LiveGame.h"
#include "Record.h"
#include "CommitSession.h"
class TradeRecord : public TeamRecord
{
public:
typedef std::pair<Resource, int> Pair;
typedef std::vector<Pair> PairVec;
TradeRecord() {}
TradeRecord(Colour colour, const PairVec& srcs, const Pair& dst) : TeamRecord(colour), m_srcs(srcs), m_dst(dst) {}
virtual void Save(Serial::SaveNode& node) const override
{
__super::Save(node);
node.SavePairs("srcs", m_srcs, Serial::EnumSaver(), Serial::TypeSaver());
node.SavePair("dst", m_dst, Serial::EnumSaver(), Serial::TypeSaver());
}
virtual void Load(const Serial::LoadNode& node) override
{
__super::Load(node);
node.LoadPairs("srcs", m_srcs, Serial::EnumLoader(), Serial::TypeLoader());
node.LoadPair("dst", m_dst, Serial::EnumLoader(), Serial::TypeLoader());
}
private:
virtual void Apply(bool bDo, const Game& game, const Team& team, GameState& gameState, TeamState& teamState) override
{
for (auto& src : m_srcs)
teamState.GetStorage()[src.first] -= bDo ? src.second : -src.second;
teamState.GetStorage()[m_dst.first] += bDo ? m_dst.second : -m_dst.second;
}
virtual void Update(const Game& game, const Team& team, const RecordContext& context) const override
{
context.SendMessage(Output::UpdateStorageTrack(team));
}
virtual std::string GetTeamMessage() const
{
return FormatString("traded");
}
PairVec m_srcs;
Pair m_dst;
};
REGISTER_DYNAMIC(TradeRecord)
//-----------------------------------------------------------------------------
TradeCmd::TradeCmd(Colour colour, const LiveGame& game) : Cmd(colour)
{
}
void TradeCmd::UpdateClient(const Controller& controller, const LiveGame& game) const
{
controller.SendMessage(Output::ChooseTrade(GetTeam(game)), GetPlayer(game));
}
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;
}
void TradeCmd::Save(Serial::SaveNode& node) const
{
__super::Save(node);
}
void TradeCmd::Load(const Serial::LoadNode& node)
{
__super::Load(node);
}
REGISTER_DYNAMIC(TradeCmd)