12 constexpr std::array<std::uint8_t, 4>
Magic{
'A',
'I',
'S',
'V'};
13 constexpr std::uint32_t
Version = 1;
17 std::vector<std::uint8_t>
data{};
38 u32(std::bit_cast<std::uint32_t>(
value));
43 u64(std::bit_cast<std::uint64_t>(
value));
48 u64(std::bit_cast<std::uint64_t>(
value));
54 std::span<const std::uint8_t>
data{};
57 bool u8(std::uint8_t&
value)
noexcept
59 if (offset >=
data.size())
65 bool u32(std::uint32_t&
value)
noexcept
67 if (
data.size() - offset < 4)
71 value |=
static_cast<std::uint32_t
>(data[offset++]) <<
shift;
75 bool u64(std::uint64_t&
value)
noexcept
77 if (
data.size() - offset < 8)
81 value |=
static_cast<std::uint64_t
>(data[offset++]) <<
shift;
85 bool i32(std::int32_t&
value)
noexcept
90 value = std::bit_cast<std::int32_t>(
raw);
94 bool i64(std::int64_t&
value)
noexcept
99 value = std::bit_cast<std::int64_t>(
raw);
118 template <std::
size_t N>
121 const std::array<double, N>& values)
123 for (
double value : values)
127 template <std::
size_t N>
130 std::array<double, N>& values)
noexcept
132 for (
double&
value : values)
134 if (!reader.f64(
value))
147 if (
value.maxTrades > std::numeric_limits<std::uint32_t>::max())
156 writer.u32(
static_cast<std::uint32_t
>(
value.maxTrades));
160 writer.u8(
static_cast<std::uint8_t
>(
value.cashStrategy));
165 writer.f64(
value.monopolyNotOwnedStageCashMultiplier);
166 writer.f64(
value.monopolyOwnedStageCashMultiplier);
176 const auto& importance =
value.propertyImportance;
177 writer.f64(importance.monopolyReceivedImportance);
178 writer.f64(importance.givingMonopolyImportance);
179 writer.f64(importance.negativePropertyImportanceChangeMultiplier);
180 writer.f64(importance.propertyAllowTradeImportance);
181 writer.f64(importance.propertyAllowMoreTradeImportance);
182 writer.f64(importance.propertyOneUnownedImportance);
183 writer.f64(importance.propertyTwoUnownedImportance);
190 writer.f64(
value.proposeMonopolyGiveAwayProbability);
200 writer.f64(
value.lowestPropertyImportanceForCounter);
203 for (
const auto& trade :
value.whatToTrade)
205 writer.u8(
static_cast<std::uint8_t
>(trade.giveMonopoly));
206 writer.u8(trade.giveGroupTrades);
207 writer.u8(trade.giveCashCows);
208 writer.u8(trade.giveJunk);
209 writer.f64(trade.cashMultiplier);
217 std::uint32_t maxTrades{};
222 !reader.f64(
value.attitudeLostForRejectedTrade) ||
223 !reader.f64(
value.attitudeChangeTradeObserving) ||
224 !reader.f64(
value.attitudeTickChange) ||
225 !reader.f64(
value.neutralAttitude) ||
226 !reader.i64(
value.timeForgetTrade) ||
227 !reader.u32(maxTrades) ||
231 value.maxTrades = maxTrades;
234 if (!reader.f64(
value.tradeCounterProbability) ||
235 !reader.i64(
value.minCashOnHand) ||
241 if (!reader.u8(
value.housingPurchaseStrategy) ||
242 !reader.f64(
value.buyingStageCashMultiplier) ||
243 !reader.f64(
value.noMonopolyStageCashMultiplier) ||
244 !reader.f64(
value.cashLiquidAssetsDependence) ||
245 !reader.f64(
value.monopolyNotOwnedStageCashMultiplier) ||
246 !reader.f64(
value.monopolyOwnedStageCashMultiplier) ||
247 !reader.f64(
value.chancesFactor) ||
248 !reader.f64(
value.chancesThreshold) ||
249 !reader.f64(
value.cashFactor) ||
252 !reader.f64(
value.tradeImportanceFactor) ||
253 !reader.f64(
value.minEvaluationThreshold) ||
254 !reader.f64(
value.minGiveMonopolyEvaluation))
257 auto& importance =
value.propertyImportance;
258 if (!reader.f64(importance.monopolyReceivedImportance) ||
259 !reader.f64(importance.givingMonopolyImportance) ||
260 !reader.f64(importance.negativePropertyImportanceChangeMultiplier) ||
261 !reader.f64(importance.propertyAllowTradeImportance) ||
262 !reader.f64(importance.propertyAllowMoreTradeImportance) ||
263 !reader.f64(importance.propertyOneUnownedImportance) ||
264 !reader.f64(importance.propertyTwoUnownedImportance) ||
265 !
readDoubles(reader, importance.railroadImportance) ||
266 !
readDoubles(reader, importance.utilityImportance) ||
267 !
readDoubles(reader, importance.monopolyVetoImportance) ||
268 !reader.f64(
value.balticReceivedImportance) ||
269 !reader.f64(
value.proposeTradeProbability) ||
270 !reader.f64(
value.monopolyTradeProbability) ||
271 !reader.f64(
value.proposeMonopolyGiveAwayProbability))
287 if (!reader.u64(
value.patience))
296 if (!reader.f64(
value.minEvaluationIfFedUp) ||
297 !reader.f64(
value.monopolySuicideFactor) ||
298 !reader.f64(
value.lowestPropertyImportanceForCounter) ||
299 !reader.f64(
value.minimumNonmonopolyTradeAttitude))
302 for (
auto& trade :
value.whatToTrade)
308 if (!reader.u8(trade.giveGroupTrades) ||
309 !reader.u8(trade.giveCashCows) ||
310 !reader.u8(trade.giveJunk) ||
311 !reader.f64(trade.cashMultiplier))
321 std::vector<std::uint8_t>& result)
noexcept
329 for (std::int64_t
timer :
state.timeLastTrade)
332 if (payload.data.size() >
333 std::numeric_limits<std::uint32_t>::max())
337 for (std::uint8_t
byte :
Magic)
339 chunk.u32(
static_cast<std::uint32_t
>(payload.data.size()));
341 chunk.data.end(), payload.data.begin(), payload.data.end());
342 result = std::move(chunk.data);
353 std::span<const std::uint8_t> data,
354 State& result)
noexcept
356 if (
data.size() < 12 ||
366 Reader reader{
data.subspan(8)};
367 std::uint32_t version{};
368 if (!reader.u32(version) || version !=
Version)
376 if (!reader.i64(
timer))
379 if (!reader.finished())