Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
BoardRules.cpp
Go to the documentation of this file.
1#include "BoardRules.hpp"
2
3#include <algorithm>
4
6{
7 namespace
8 {
9 using G = SquareGroup;
10
11
12 constexpr std::array<SquareDefinition, 42>
14 {{
15 // purchase, mortgage, rents[0..5], house, group
16
17 { 0, 0, { 0, 0, 0, 0, 0, 0 }, 0, G::Miscellaneous },
18
19 { 60, 30, { 2, 10, 30, 90, 160, 250 }, 50, G::MediterraneanAvenue },
20 { 0, 0, { 0, 0, 0, 0, 0, 0 }, 50, G::CommunityChest },
21 { 60, 30, { 4, 20, 60, 180, 320, 450 }, 50, G::MediterraneanAvenue },
22
23 { 0, 0, { 0, 0, 0, 0, 0, 0 }, 0, G::Miscellaneous },
24
25 { 200, 100, { 0, 25, 50, 100, 200, 200 }, 0, G::Railroad },
26
27 { 100, 50, { 6, 30, 90, 270, 400, 550 }, 50, G::OrientalAvenue },
28 { 0, 0, { 0, 0, 0, 0, 0, 0 }, 50, G::Chance },
29 { 100, 50, { 6, 30, 90, 270, 400, 550 }, 50, G::OrientalAvenue },
30 { 120, 60, { 8, 40, 100, 300, 450, 600 }, 50, G::OrientalAvenue },
31
32 { 0, 0, { 0, 0, 0, 0, 0, 0 }, 0, G::Miscellaneous },
33
34 { 140, 70, { 10, 50, 150, 450, 625, 750 }, 100, G::StCharlesPlace },
35 { 150, 75, { 0, 0, 0, 0, 0, 0 }, 0, G::Utility },
36 { 140, 70, { 10, 50, 150, 450, 625, 750 }, 100, G::StCharlesPlace },
37 { 160, 80, { 12, 60, 180, 500, 700, 900 }, 100, G::StCharlesPlace },
38
39 { 200, 100, { 0, 25, 50, 100, 200, 200 }, 0, G::Railroad },
40
41 { 180, 90, { 14, 70, 200, 550, 750, 950 }, 100, G::StJamesPlace },
42 { 0, 0, { 0, 0, 0, 0, 0, 0 }, 0, G::CommunityChest },
43 { 180, 90, { 14, 70, 200, 550, 750, 950 }, 100, G::StJamesPlace },
44 { 200, 100, { 16, 80, 220, 600, 800, 1000 }, 100, G::StJamesPlace },
45
46 { 0, 0, { 0, 0, 0, 0, 0, 0 }, 0, G::Miscellaneous },
47
48 { 220, 110, { 18, 90, 250, 700, 875, 1050 }, 150, G::KentuckyAvenue },
49 { 0, 0, { 0, 0, 0, 0, 0, 0 }, 0, G::Chance },
50 { 220, 110, { 18, 90, 250, 700, 875, 1050 }, 150, G::KentuckyAvenue },
51 { 240, 120, { 20, 100, 300, 750, 925, 1100 }, 150, G::KentuckyAvenue },
52
53 { 200, 100, { 0, 25, 50, 100, 200, 200 }, 0, G::Railroad },
54
55 { 260, 130, { 22, 110, 330, 800, 975, 1150 }, 150, G::AtlanticAvenue },
56 { 260, 130, { 22, 110, 330, 800, 975, 1150 }, 150, G::AtlanticAvenue },
57 { 150, 75, { 0, 0, 0, 0, 0, 0 }, 0, G::Utility },
58 { 280, 140, { 24, 120, 360, 850, 1025, 1200 }, 150, G::AtlanticAvenue },
59
60 { 0, 0, { 0, 0, 0, 0, 0, 0 }, 0, G::Miscellaneous },
61
62 { 300, 150, { 26, 130, 390, 900, 1100, 1275 }, 200, G::PacificAvenue },
63 { 300, 150, { 26, 130, 390, 900, 1100, 1275 }, 200, G::PacificAvenue },
64 { 0, 0, { 0, 0, 0, 0, 0, 0 }, 0, G::CommunityChest },
65 { 320, 160, { 28, 150, 450, 1000, 1200, 1400 }, 200, G::PacificAvenue },
66
67 { 200, 100, { 0, 25, 50, 100, 200, 200 }, 0, G::Railroad },
68
69 { 0, 0, { 0, 0, 0, 0, 0, 0 }, 0, G::Chance },
70
71 { 350, 175, { 35, 175, 500, 1100, 1300, 1500 }, 200, G::ParkPlace },
72 { 0, 0, { 0, 0, 0, 0, 0, 0 }, 0, G::Miscellaneous },
73 { 400, 200, { 50, 200, 600, 1400, 1700, 2000 }, 200, G::ParkPlace },
74
75 { 0, 0, { 0, 0, 0, 0, 0, 0 }, 0, G::Miscellaneous },
76 { 0, 0, { 0, 0, 0, 0, 0, 0 }, 0, G::Miscellaneous }
77 }};
78
79
80 constexpr std::array<PropertySet, 42>
82 {{
83 0,
84 (1u << 0),
85 0,
86 (1u << 1),
87 0,
88 (1u << 2),
89 (1u << 3),
90 0,
91 (1u << 4),
92 (1u << 5),
93
94 0,
95 (1u << 6),
96 (1u << 7),
97 (1u << 8),
98 (1u << 9),
99 (1u << 10),
100 (1u << 11),
101 0,
102 (1u << 12),
103 (1u << 13),
104
105 0,
106 (1u << 14),
107 0,
108 (1u << 15),
109 (1u << 16),
110 (1u << 17),
111 (1u << 18),
112 (1u << 19),
113 (1u << 20),
114 (1u << 21),
115
116 0,
117 (1u << 22),
118 (1u << 23),
119 0,
120 (1u << 24),
121 (1u << 25),
122 0,
123 (1u << 26),
124 0,
125 (1u << 27),
126
127 0,
128 0
129 }};
130
131
132 std::array<SquareDefinition, 42>
134
135 bool lastGameWasShort = false;
136 }
137
138
140 const GameOptions& options)
141 {
142 // InitialisePredefinedData() :
143 //
144 // si housesPerHotel passe de 5 -> 4,
145 // ou de 4 -> 5,
146 // échange rent[4] et rent[5] pour chaque case.
147
148 const bool shortGame =
149 options.housesPerHotel == 4;
150
152 {
153 for (SquareDefinition& square :
155 {
156 std::swap(
157 square.rent[4],
158 square.rent[5]
159 );
160 }
161 }
162
164
165 // La seconde moitié de InitialisePredefinedData()
166 // charge les noms depuis DAT_LANG.
167 //
168 // Elle sera branchée lorsque LANG sera porté.
169 return true;
170 }
171
172
173 const std::array<SquareDefinition, 42>&
175 {
176 return currentDefinitions;
177 }
178
179
180 const SquareDefinition&
182 {
183 return currentDefinitions[
184 static_cast<std::size_t>(square)
185 ];
186 }
187
188
190 {
191 return OriginalDefinitions[static_cast<std::size_t>(square)];
192 }
193
194
196 SquareType square)
197 {
198 return PropertyBits[
199 static_cast<std::size_t>(square)
200 ];
201 }
202
203
205 SquareType square)
206 {
207 return static_cast<std::size_t>(
208 definition(square).group
210 }
211}
unsigned index
const SquareDefinition & definition(SquareType square)
bool isOwnable(SquareType square)
const SquareDefinition & originalDefinition(SquareType square)
bool initializeForOptions(const GameOptions &options)
constexpr std::size_t MaxPropertyGroups
std::uint32_t PropertySet
PropertySet propertyBit(SquareType square)
const std::array< SquareDefinition, 42 > & definitions()