Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
RulesEngine.cpp
Go to the documentation of this file.
1#include "RulesEngine.hpp"
2#include "Messaging.hpp"
3#include "BoardRules.hpp"
4#include "PhaseStack.hpp"
6#include "RuleGameStart.hpp"
7#include "RuleEconomy.hpp"
8#include "RuleAuction.hpp"
9#include "RuleBuildings.hpp"
10#include "RuleCards.hpp"
11#include "RuleJail.hpp"
12#include "RuleTrade.hpp"
13#include "RuleLifecycle.hpp"
14#include "RuleSave.hpp"
15#include "RuleCoreActions.hpp"
17#include "RulePlayers.hpp"
18#include "RuleRandom.hpp"
19#include "RuleTurnActions.hpp"
20
21#include <chrono>
22#include <random>
23
24namespace monopoly::rules
25{
26 namespace
27 {
28 GameState currentRulesState;
29
30 std::mt19937 randomGenerator;
31
32 using RulesClock = std::chrono::steady_clock;
33
34 RulesClock::time_point previousRulesTick{};
35 bool previousRulesTickValid = false;
36 }
37
38 static void actionNewGame()
39 {
40 // ActionNewGame(NULL) original commence par remettre
41 // CurrentRulesState entièrement à zéro.
42
45
46 currentRulesState.currentPlayer = NobodyPlayer;
47 currentRulesState.numberOfPlayers = 0;
48
49 for (SquareState& square : currentRulesState.squares)
50 {
51 square.owner = NobodyPlayer;
52 square.gameEarnings = 0;
53 }
54
55 // Valeurs EXACTES du ActionNewGame() de Rule.cpp.
56
57 GameOptions& options =
58 currentRulesState.options;
59
60 options.housesPerHotel = 5;
61 options.maximumHouses = 32;
62 options.maximumHotels = 12;
63
64 options.interestRate = 10;
65 options.initialCash = 1500;
66 options.passingGoAmount = 200;
67
68 options.luxuryTaxAmount = 75;
69 options.taxRate = 10;
70 options.flatTaxFee = 200;
71
72 options.hideCash = false;
73 options.evenBuildRule = true;
74 options.rollDiceToDecideStartingOrder = false;
75
76 options.cheatingAllowed = false;
77 options.aiTakesTimeToThink = true;
78
79 options.maximumTurnsInJail = 3;
80 options.getOutOfJailFee = 50;
81
82 options.mortgagedCountsInGroupRent = true;
83
84 options.houseShortageLevel = 5;
85 options.hotelShortageLevel = 3;
86
87 options.auctionGoingTimeDelay = 5;
88 options.inactivityWarningTime = 0;
89 options.gameOverTimeLimit = 0;
90
91 options.futureRentTradingAllowed = false;
92 options.immunitiesTradingAllowed = false;
93
94 options.freeParkingSeed = 500;
95 options.freeParkingPot = false;
96
97 options.doubleSalaryOnGo = false;
98 options.allowPlayersToTakeOverAIs = true;
99
100 options.dealNPropertiesAtStartup = 0;
101 options.dealFreePropertiesAtStartup = false;
102
103 options.stopAtNthBankruptcy = 0;
104
105 options.voiceChat.recordingHz = 11025;
106 options.voiceChat.recordingBits = 8;
107 options.voiceChat.compressorName =
108 L"GSM 6.10";
109
110 // PushPhase(GF_ADDING_NEW_PLAYERS, ...)
111 // PushPhase(GF_ADDING_NEW_PLAYERS, 0, 0, 0);
115 0,
116 0,
117 0
118 );
119
120 // L'argent du joueur sera appliqué lorsqu'un joueur
121 // rejoint réellement la partie.
122 }
123
125 {
126 // srand(GetTickCount()) moderne.
128
129 // RULE_InitializeSystem() original :
130 //
131 // srand(GetTickCount());
132
133 const auto seed =
134 static_cast<std::mt19937::result_type>(
135 std::chrono::steady_clock::now()
136 .time_since_epoch()
137 .count()
138 );
139
140 randomGenerator.seed(seed);
141
142 // InitialisePredefinedData() dépend encore des données
143 // de plateau/langue historiques. Ce port viendra avec
144 // notre nouvelle base de données du plateau.
145
146 // RULE_InitializeSystem() original :
147 //
148 // RULE_GameOptionsRecord FakeGameOptions;
149 // memset(&FakeGameOptions, 0, ...);
150 // FakeGameOptions.housesPerHotel = 5;
151 // InitialisePredefinedData(&FakeGameOptions);
152
155
158 {
159 return false;
160 }
161
162 // ActionNewGame(NULL);
164
168 );
169
170 return true;
171 }
172
174 {
175 // ActionTick() original :
176 //
177 // enchères / housing shortage
178 // puis WAIT_START_TURN.
179
180 // ActionTick() :
181 // l'inactivité est testée avant les traitements
182 // temporels propres aux phases.
183 // Save timeout avant les autres timers de phase.
184 // GF_WAIT_FOR_EVERYBODY_READY :
185 // timeout historique de 60 secondes.
188 );
189
192 );
193
196 );
197
200 );
201
204 );
205
208 );
209 }
210
211 void shutdown()
212 {
213 // RULE_CleanAndRemoveSystem() original est vide.
214 }
215
216 void process(const actions::Message& message)
217 {
218 // Source Rule.cpp: ownership is checked at dispatch, before activity.
219 if (!messaging::authenticSender(currentRulesState, message)) return;
220 // RULE_ProcessRules() original :
221 // toute action issue d'un slot joueur remet à zéro
222 // son compteur d'inactivité.
225 message.fromPlayer
226 );
227 switch (message.action)
228 {
232 message
233 );
234 break;
235
239 message
240 );
241 break;
242
246 message
247 );
248 break;
249
253 message
254 );
255 break;
256
257 // ------------------------------------------------
258 // Save / load / resync
259 // ------------------------------------------------
260
264 message
265 );
266 break;
267
268
272 message
273 );
274 break;
275
276
280 message
281 );
282 break;
283
284
288 message
289 );
290 break;
291
292
296 message
297 );
298 break;
299
300
304 message
305 );
306 break;
307
310 message
311 );
312 break;
313
314
318 message
319 );
320 break;
321
322
326 message
327 );
328 break;
329
330
334 message
335 );
336 break;
337
338
342 message
343 );
344 break;
345
346
350 message
351 );
352 break;
353
354
358 message
359 );
360 break;
361
362
365 message
366 );
367 break;
368
369
372 message
373 );
374 break;
375
376
380 message
381 );
382 break;
383
384
388 message
389 );
390 break;
391
392
396 message
397 );
398 break;
399
403 message
404 );
405 break;
406
411 message
412 );
413 break;
414
418 message
419 );
420 break;
421
425 message
426 );
427 break;
428
432 message
433 );
434 break;
435
439 message
440 );
441 break;
442
443
447 message
448 );
449 break;
450
451
455 message
456 );
457 break;
458
459
460 // ------------------------------------------------
461 // Économie
462 // ------------------------------------------------
463
467 message
468 );
469 break;
470
471
475 message
476 );
477 break;
478
479
483 message
484 );
485 break;
486
487
491 message
492 );
493 break;
494
495
499 message
500 );
501 break;
502
503
504 // ------------------------------------------------
505 // Enchères
506 // ------------------------------------------------
507
511 message
512 );
513 break;
514
515
519 message
520 );
521 break;
522
523
524 // ------------------------------------------------
525 // Bâtiments / Buy-Sell-Mortgage
526 // ------------------------------------------------
527
531 message
532 );
533 break;
534
535
539 message
540 );
541 break;
542
543
547 message
548 );
549 break;
550
551
555 message
556 );
557 break;
558
559
560 // ------------------------------------------------
561 // Trading
562 // ------------------------------------------------
563
567 message
568 );
569 break;
570
571
575 message
576 );
577 break;
578
579
583 message
584 );
585 break;
586
587
591 message
592 );
593 break;
594
595
599 message
600 );
601 break;
602
603
604 case actions::Type::
608 message
609 );
610 break;
611
613 {
614 // Première partie de ActionTick() original :
615 // mise à jour de GameDurationInSeconds.
616
617 const RulesClock::time_point now =
618 RulesClock::now();
619
621 {
624 break;
625 }
626
627 const auto elapsed =
628 std::chrono::duration_cast<std::chrono::milliseconds>(
630 );
631
632 // L'original ignore un saut supérieur à cinq minutes
633 // (démarrage, reprise ou chargement).
634 if (elapsed > std::chrono::minutes(5))
635 {
637 break;
638 }
639
640 const auto elapsedSeconds =
641 std::chrono::duration_cast<std::chrono::seconds>(
642 elapsed
643 ).count();
644
645 if (elapsedSeconds > 0)
646 {
647 currentRulesState.gameDurationInSeconds +=
648 static_cast<std::uint64_t>(elapsedSeconds);
649
651 std::chrono::seconds(elapsedSeconds);
652 }
653
654 break;
655 }
656
657 default:
658 break;
659 }
660 }
661
663 {
664 return currentRulesState;
665 }
666}
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
unsigned index
SDL_Process * process
bool authenticSender(const rules::GameState &state, const actions::Message &message)
Definition Messaging.cpp:88
void actionBid(GameState &state, const actions::Message &message)
void actionStartHousingAuction(GameState &state, const actions::Message &message)
void onIdleTick(GameState &state)
bool initializeForOptions(const GameOptions &options)
void actionBuyHouse(GameState &state, const actions::Message &message)
void actionCancelDecomposition(GameState &state, const actions::Message &message)
void actionPlayerDoneBuySellMortgage(GameState &state, const actions::Message &message)
void actionPlayerBuySellMortgage(GameState &state, const actions::Message &message)
void actionSellBuildings(GameState &state, const actions::Message &message)
void actionCardSeen(GameState &state, const actions::Message &message)
void actionCheatCash(GameState &state, const actions::Message &message)
void actionRandomSeed(const actions::Message &message)
void actionStarWarsAnimationInfo(const actions::Message &message)
void actionNewGame(GameState &state, const actions::Message &message)
void actionCheatOwner(GameState &state, const actions::Message &message)
void actionEchoChat(const actions::Message &message)
void actionKillAuctionCheat(GameState &state, const actions::Message &message)
void actionUpdateTradeInfo(const actions::Message &message)
void actionFreeUnmortgageDone(GameState &state, const actions::Message &message)
void actionMortgaging(GameState &state, const actions::Message &message)
void actionTaxDecision(GameState &state, const actions::Message &message)
void actionGoBankrupt(GameState &state, const actions::Message &message)
void actionBuyOrAuctionDecision(GameState &state, const actions::Message &message)
void actionStartGame(GameState &state, const actions::Message &message)
void actionAcceptConfiguration(GameState &state, const actions::Message &message)
void actionExitJailDecision(GameState &state, const actions::Message &message)
Definition RuleJail.cpp:44
void onIdleTick(GameState &state)
void actionPauseGame(GameState &state, const actions::Message &message)
void recordPlayerActivity(GameState &state, PlayerNumber player)
void actionDisconnectedPlayer(GameState &state, const actions::Message &message)
bool push(GameState &state, GamePhase phase, PlayerNumber fromPlayer, PlayerNumber toPlayer, std::int64_t amount)
void actionNamePlayer(GameState &state, const actions::Message &message)
void afterNewGame(GameState &state, PlayerNumber initiator)
void restartPhase(GameState &state, const actions::Message &message)
void actionAISaveParameters(GameState &state, const actions::Message &message)
Definition RuleSave.cpp:303
void actionSetGameState(GameState &state, const actions::Message &message)
Definition RuleSave.cpp:399
void actionGetOptionsForSave(GameState &state, const actions::Message &message)
Definition RuleSave.cpp:564
void actionGetGameState(GameState &state, const actions::Message &message)
Definition RuleSave.cpp:151
void actionResyncClient(GameState &state, const actions::Message &message)
Definition RuleSave.cpp:624
void onIdleTick(GameState &state)
Definition RuleSave.cpp:748
void onIdleTick(GameState &state)
void actionIAmHere(GameState &state, const actions::Message &message)
void actionTradeItem(GameState &state, const actions::Message &message)
void onIdleTick(GameState &state)
void actionStartTradeEditing(GameState &state, const actions::Message &message)
void actionClearTradedContracts(GameState &state, const actions::Message &message)
void actionTradeAccept(GameState &state, const actions::Message &message)
void actionClearTradeItems(GameState &state, const actions::Message &message)
void actionTradeEditingDone(GameState &state, const actions::Message &message)
void actionEndTurn(GameState &state, const actions::Message &message)
void actionMoveForwards(GameState &state, const actions::Message &message)
void actionJumpToSquare(GameState &state, const actions::Message &message)
void actionStartTurn(GameState &state, const actions::Message &message)
void actionMoveBackwards(GameState &state, const actions::Message &message)
void onIdleTick(GameState &state)
void actionRollDice(GameState &state, const actions::Message &message)
void actionLandedOnSquare(GameState &state, const actions::Message &message)
constexpr PlayerNumber BankPlayer
Definition RuleTypes.hpp:15
const GameState & state()
constexpr PlayerNumber NobodyPlayer
Definition RuleTypes.hpp:16
static void actionNewGame()
rules::PlayerNumber fromPlayer
Definition Actions.hpp:128