26 state.currentTrade = {};
27 state.immunities = {};
28 state.counterRuntime = {};
31 state.tradeStarted =
false;
32 state.tradeOfferedForAcceptance =
false;
33 state.tradeJustRejectedCountered =
false;
35 state.pendingTradeAcceptPlayers = 0;
36 state.deferredAcceptancePlayers = 0;
38 session.timesCounteredTrade = 0;
52 switch (message.action)
61 state.currentTrade = {};
62 state.immunities = {};
71 state.counterRuntime = {};
72 if (!
state.tradeStarted)
76 state.tradeOfferedForAcceptance =
false;
77 state.tradeJustRejectedCountered =
false;
79 state.pendingTradeAcceptPlayers = 0;
80 state.deferredAcceptancePlayers = 0;
82 state.tradeStarted =
true;
88 state.tradeOfferedForAcceptance =
true;
97 message.numberC < 0 ||
98 message.numberC >
static_cast<std::int64_t
>(
105 state.tradeStarted =
true;
118 if (
state.tradeOfferedForAcceptance)
119 state.tradeOfferedForAcceptance =
false;
131 state.tradeStarted =
true;
133 if (
state.counterRuntime.hasPendingProposal &&
152 state.pendingTradeAcceptPlayers &= ~(1u << player);
153 if (
state.tradeJustRejectedCountered &&
154 state.playerJustRejectedCountered == player)
156 state.tradeJustRejectedCountered =
false;
165 if (player !=
state.counterRuntime.player)
170 message.numberB != 0);
172 state.tradeJustRejectedCountered &&
173 state.playerJustRejectedCountered == player)
175 state.tradeJustRejectedCountered =
false;
209 next.proposedPlayer = player;
210 next.pendingProposal = proposal;
211 next.hasPendingProposal =
true;
212 next.sending.sendTradeOffer =
true;
218 state.turnState[player].timeLastTrade[
static_cast<std::size_t
>(
spot)] =
224 std::uint8_t numberOfPlayers,
235 auto& turn =
state.turnState[player];
237 ++turn.turnsAfterForgettingLast;
238 if (turn.turnsAfterForgettingLast >=
strategy.turnsToForgetPropertyTrade)
241 turn.turnsAfterForgettingLast = 0;
243 for (
auto&
timer : turn.timeLastTrade)
265 std::array<double, rules::MaxPlayers>
changes{};
276 if (!context.localAIPlayer[
observer])
282 evaluation *=
strategy.attitudeChangeTradeObserving;
285 if (evaluation < -
strategy.attitudeLostForRejectedTrade)
286 evaluation = -
strategy.attitudeLostForRejectedTrade;
288 else if (evaluation >
strategy.attitudeLostForRejectedTrade)
289 evaluation =
strategy.attitudeLostForRejectedTrade;
298 if (context.localAIPlayer[
proposer])
318 if (
state.tradeJustRejectedCountered)
326 (
state.counterRuntime.player == player &&
346 state.counterSessions[player].propertyMemory,
347 state.proposedPlayer,
state.currentTrade[player],
348 config.numberTimesAllowPropertyTrade) != 0;
352 config.minEvaluationIfFedUp :
config.minEvaluationThreshold;
359 result.status = result.fedUp ?
377 if (player >=
gameState.numberOfPlayers ||
383 inputs.pendingActions = pendingActions;
384 inputs.tradeAccept = tradeAccept;
385 inputs.counterRoll = counterRoll;
386 inputs.auctionOn = auctionOn;
387 inputs.playerSendingTrade =
397 state.counterSessions[player],
398 state.counterRuntime,
@ NotifyTradeAcceptanceDecision
double evaluateTrade(const rules::GameState &state, rules::PlayerNumber player, rules::PlayerNumber strategyPlayer, const ai::trade::TradeProposalList &proposals, const TradeEvaluationConfig &config) noexcept
std::array< Profile, rules::MaxPlayers > ProfileSet
decision::TradeEvaluationConfig makeTradeEvaluationConfig(const ProfileSet &profiles, rules::PlayerNumber strategyPlayer, const ConfigContext &context) noexcept
int findFreeTradeSpot(std::span< const std::int64_t > timeLastTrade, std::size_t maxTrades) noexcept
void forgetTradedProperties(PropertyTradeMemory &memory) noexcept
bool sendProposedTrade(const rules::GameState &state, rules::PlayerNumber player, const TradeProposalList &proposals, bool tradeAccept, rules::PlayerNumber proposedPlayer, TradeSendRuntimeState &runtime) noexcept
bool tradeIsProper(const rules::GameState &state, const TradeProposalList &proposals, std::span< const FutureImmunityRecord > immunities) noexcept
rules::board::PropertySet propertiesAlreadyTraded(const PropertyTradeMemory &memory, rules::PlayerNumber proposedPlayer, const TradeProposalRecord &proposal, int dangerLevel) noexcept
void resetTradeIngress(TradeIngressState &state) noexcept
bool playerInvolvedInTrade(const TradeProposalRecord &proposal) noexcept
std::array< double, rules::MaxPlayers > tradeResponseAttitudeChanges(const rules::GameState &gameState, rules::PlayerNumber proposer, rules::PlayerNumber respondingPlayer, bool accepted, const TradeIngressState &state, const profile::ProfileSet &profiles, const profile::ConfigContext &context) noexcept
bool addTradeItem(TradeProposalList &proposals, FutureImmunityList &immunities, rules::TradeItemKind kind, std::int64_t amount, rules::PlayerNumber fromPlayer, rules::PlayerNumber toPlayer, rules::board::PropertySet propertySet) noexcept
void processCounterProposalActionCompleted(CounterTradeRuntimeState &runtime, actions::Type action, bool success) noexcept
bool continueCounterProposalTradeSend(const rules::GameState &state, CounterTradeRuntimeState &runtime) noexcept
bool sendProactiveTrade(const rules::GameState &gameState, rules::PlayerNumber player, const TradeProposalList &proposal, const profile::Profile &strategy, TradeIngressState &state) noexcept
void advanceTradeTurn(std::uint8_t numberOfPlayers, profile::ProfileSet &profiles, const std::array< bool, rules::MaxPlayers > &localAIPlayers, TradeIngressState &state) noexcept
CounterTradeRunResult counterProposeCurrentTrade(const rules::GameState &gameState, rules::PlayerNumber player, bool tradeAccept, double counterRoll, int pendingActions, bool auctionOn, const decision::CounterProposalPreflightConfig &preflightConfig, const decision::CounterProposalBalanceConfig &balanceConfig, TradeIngressState &state) noexcept
bool playerHasFutureOrImmunity(rules::PlayerNumber player, std::span< const FutureImmunityRecord > immunities) noexcept
std::array< TradeProposalRecord, rules::MaxPlayers > TradeProposalList
TradeAcceptanceResult evaluateCurrentTradeAcceptance(const rules::GameState &gameState, rules::PlayerNumber player, const TradeAcceptanceConfig &config, const TradeIngressState &state) noexcept
CounterTradeRunResult counterProposeTrade(const rules::GameState &state, rules::PlayerNumber player, const TradeProposalList ¤tTrade, const decision::CounterProposalPreflightInputs &inputs, const decision::CounterProposalPreflightConfig &preflightConfig, const decision::CounterProposalBalanceConfig &balanceConfig, decision::CounterProposalSession &session, CounterTradeRuntimeState &runtime, std::span< const FutureImmunityRecord > immunities) noexcept
bool processTradeRuleMessage(const rules::GameState &gameState, const actions::Message &message, TradeIngressState &state) noexcept
std::uint32_t PropertySet
std::uint8_t PlayerNumber
constexpr PlayerNumber MaxPlayers
constexpr PlayerNumber NobodyPlayer
rules::PlayerNumber player
TradeAcceptanceStatus status