Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
TimeStep.cpp
Go to the documentation of this file.
1#include "TimeStep.hpp"
2
4#include "UserInterface.hpp"
5#include "Actions.hpp"
6#include "Messaging.hpp"
7#include "RulesEngine.hpp"
8#include "RuleTypes.hpp"
9#include "GameQueueGate.hpp"
10#include "Timers.hpp"
11
12#include <chrono>
13
15{
16 namespace
17 {
18 using Clock = std::chrono::steady_clock;
19
20 constexpr auto TickTimeDelay =
21 std::chrono::milliseconds(1000);
22
23 Clock::time_point lastTickTime{};
24 GameQueueGate gameQueueGate;
25
26 bool firstTimeStep = true;
27 }
28
30 {
31 lastTickTime = {};
32 firstTimeStep = true;
33 gameQueueGate.reset();
35 }
36
38 {
40 }
41
43 {
45 }
46
48 {
49 return gameQueueGate.blocks(timers::tickCount());
50 }
51
53 {
54 const Clock::time_point currentTime = Clock::now();
55
56 if (firstTimeStep)
57 {
58 // Les variables statiques originales démarrent à zéro.
59 // Le premier passage peut donc immédiatement produire
60 // ACTION_TICK si aucune action n'est en attente.
62 std::chrono::milliseconds(1);
63
64 firstTimeStep = false;
65 }
66
67 // Userifce.cpp::AdvanceTimeStep() stops consuming ordinary RULE
68 // messages while display-driven animation locks are active, but it
69 // still removes ACTION/NOTIFY_VOICE_CHAT from the middle of MESS so
70 // audio does not break up behind a long token animation.
71 if (gameQueueGate.blocks(timers::tickCount()))
72 {
75 {
76 if ((voiceMessage.toPlayer == rules::AllPlayers ||
77 voiceMessage.toPlayer == rules::BankPlayer) &&
79 {
81 }
82
84 update();
86 return;
87 }
88 update();
89 return;
90 }
91
92 actions::Message message{};
93
94 // MESS_ReceiveActionMessage(&NewMessage)
95 //
96 // Une seule action est retirée de la file par appel,
97 // exactement comme dans AdvanceTimeStep() original.
98 if (messaging::receiveAction(message))
99 {
100 // Le serveur/bank ne traite que les messages qui lui
101 // sont effectivement destinés.
102 if ((message.toPlayer == rules::AllPlayers ||
103 message.toPlayer == rules::BankPlayer) &&
105 {
106 rules::process(message);
107 }
108
109 // ProcessPlayersUI(&NewMessage) original.
110 processRuleMessage(message);
111 update();
113
114 return;
115 }
116
117 // File vide : ACTION_TICK au maximum une fois par seconde.
119 {
121
123 {
124 // Même rattrapage que le code original :
125 // si on a raté plus d'un tick complet, on abandonne
126 // le retard accumulé.
128 }
129
130 actions::Message tick{};
132 tick.fromPlayer = rules::BankPlayer;
133 tick.toPlayer = rules::AllPlayers;
134
136 {
137 rules::process(tick);
138
139 // Suite de ActionTick() :
140 // notamment GF_WAIT_START_TURN lorsque
141 // la file MESS vient de devenir vide.
143 }
144
145 // ProcessPlayersUI(&NewMessage);
146 processRuleMessage(tick);
147 update();
149
150 return;
151 }
152
153 // ProcessPlayersUI(NULL) moderne.
154 update();
155
156 // Dans l'original cet appel sert également
157 // au clignotement du curseur.
158 }
159}
160
161
162
unsigned index
void processMessage(const rules::GameState &state, const actions::Message &message) noexcept
void resetMessageIngress() noexcept
bool receiveAction(actions::Message &message)
bool receiveVoiceChatOnly(actions::Message &message)
constexpr PlayerNumber BankPlayer
Definition RuleTypes.hpp:15
void process(const actions::Message &message)
constexpr PlayerNumber AllPlayers
Definition RuleTypes.hpp:17
std::uint64_t tickCount()
Definition Timers.cpp:183
const rules::GameState & ruleStateReadOnly()
void processRuleMessage(const actions::Message &message)