Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
ModernTokenCatalog.cpp
Go to the documentation of this file.
2#include "PieceRuntime.hpp"
3
4namespace monopoly::data
5{
6 namespace
7 {
8 constexpr std::array<ModernTokenDefinition, ModernTokenCount>
10 {0, "cannon", "assets/modern/tokens/cannon.glb", 430.65547F, -90.0F, {-5.0F, 0.0F, 23.23071F}, true},
11 {1, "race_car", "assets/modern/tokens/race_car.glb", 122.94F, -90.0F, {-2.0F, 0.0F, 13.02F}, true},
12 {2, "dog", "assets/modern/tokens/dog.glb", 154.80F, 90.0F, {-0.5F, 0.0F, -15.05967734F}, false},
13 {3, "top_hat", "assets/modern/tokens/top_hat.glb", 86.15F, -90.0F, {}, true},
14 {4, "iron", "assets/modern/tokens/iron.glb", 135.72687F, -90.0F, {0.5F, 0.0F, -6.49181F}, true},
15 {5, "horse", "assets/modern/tokens/horse.glb", 211.87215F, -90.0F, {-1.0F, 1.0F, -4.84202F}, false},
16 {6, "ship", "assets/modern/tokens/ship.glb", 87.55F, -90.0F, {0.0F, 0.0F, 6.63F}, true},
17 {7, "boot", "assets/modern/tokens/boot.glb", 181.06F, -90.0F, {0.0F, 0.0F, 25.94F}, true},
18 {8, "thimble", "assets/modern/tokens/thimble.glb", 130.89F, -90.0F, {}, true},
19 {9, "wheelbarrow", "assets/modern/tokens/wheelbarrow.glb", 239.07104F, -90.0F, {0.0F, 0.0F, 14.84771F}, true},
20 {10, "moneybag", "assets/modern/tokens/moneybag.glb", 275.57889F, -90.0F, {-1.44884F, -4.0F, -6.0F}, true},
21 }};
22
23 [[nodiscard]] constexpr bool inRange(
24 DataTag tag, DataTag first, DataTag last) noexcept
25 {
26 return tag >= first && tag <= last;
27 }
28 }
29
30
31 const std::array<ModernTokenDefinition, ModernTokenCount>&
36
37
38 std::optional<std::uint8_t>
40 {
42 return std::nullopt;
43
44 const auto tag = dataTag(id);
45
46 // Source/monopoly/Dat_Mon/dat_3d.h + UDPieces.cpp. The source loads
47 // HMD_bag01..HMD_wbr04 as the token mesh corpus. Non-token HMDs inside
48 // that broad span (digital die, shadows, wand, trucks) are excluded.
49 if (inRange(tag, 0x0006, 0x000D)) return std::uint8_t{10}; // moneybag / bag
50 if (inRange(tag, 0x000E, 0x0017)) return std::uint8_t{9}; // wheelbarrow / barrow
51 if (inRange(tag, 0x0018, 0x0022)) return std::uint8_t{6}; // ship / boat
52 if (inRange(tag, 0x0023, 0x0031)) return std::uint8_t{0}; // cannon / can
53 if (inRange(tag, 0x0032, 0x0036)) return std::uint8_t{1}; // race car
54 if (inRange(tag, 0x0038, 0x008C)) return std::uint8_t{2}; // dog
55 if (inRange(tag, 0x008D, 0x0093)) return std::uint8_t{3}; // top hat
56 if (inRange(tag, 0x0094, 0x00AC)) return std::uint8_t{5}; // horse
57 if (inRange(tag, 0x00AD, 0x00B3)) return std::uint8_t{4}; // iron
58 if (inRange(tag, 0x00BF, 0x00CB)) return std::uint8_t{7}; // boot / shu
59 if (inRange(tag, 0x00CC, 0x00D1)) return std::uint8_t{8}; // thimble
60 if (tag == 0x00D3 ||
61 inRange(tag, 0x00DF, 0x00E2))
62 return std::uint8_t{9}; // additional wheelbarrow representations
63
64 return std::nullopt;
65 }
66
67
68 const ModernTokenDefinition*
69 modernTokenDefinition(std::uint8_t token) noexcept
70 {
71 return token < Definitions.size()
73 : nullptr;
74 }
75
76
77 const ModernTokenDefinition*
79 {
80 const auto token = tokenForLegacyMesh(id);
81 return token ? modernTokenDefinition(*token) : nullptr;
82 }
83
84
85 DataId representativeLegacyMesh(std::uint8_t token) noexcept
86 {
87 constexpr std::array<DataTag, ModernTokenCount> tags{{
88 0x0023, // cannon
89 0x0032, // race car
90 0x0038, // dog
91 0x008D, // top hat
92 0x00AD, // iron
93 0x0094, // horse
94 0x0018, // ship
95 0x00BF, // boot
96 0x00CC, // thimble
97 0x000E, // wheelbarrow
98 0x0006 // moneybag
99 }};
100 return token < tags.size()
102 : EmptyDataId;
103 }
104
105
106 DataId idleSequenceDataId(std::uint8_t token) noexcept
107 {
108 constexpr std::uint32_t MoveBase = 0x010D;
109 constexpr std::uint32_t AnimsPerToken = 0x0159 - 0x00F6;
110 if (token >= ModernTokenCount)
111 return EmptyDataId;
112 return packDataId(
114 static_cast<DataTag>(
115 MoveBase +
116 static_cast<std::uint32_t>(token) * AnimsPerToken));
117 }
118
120 std::optional<DataId> rootSequenceDataId, std::uint16_t priority) noexcept
121 {
122 const auto* definition = modernTokenForLegacyMesh(meshId);
123 if (!definition || !definition->staticIdleReplacement || !rootSequenceDataId)
124 return false;
125
126 const bool idlePriority = priority >= pieces::TokenPriority &&
128 if (idlePriority && *rootSequenceDataId == idleSequenceDataId(definition->token))
129 return true;
130
132 meshId != representativeLegacyMesh(definition->token))
133 return false;
134
135 // Explicit complete-sequence qualification, not a tag interval.
136 // Every root was evaluated at every tick through its end plus two
137 // held ticks: only the representative HMD, pose choices 0/0/0 and
138 // at most one token mesh. CNK-owned gaps, sounds and transform
139 // tweekers remain unchanged. Evidence: modern-token-sequences.json.
140 struct MovementRoot { DataTag sequence; DataTag mesh; };
141 constexpr std::array<MovementRoot, 46> MovementRoots{{
142 {0x010d, 0x0023}, // CNK_knamx0, 24 ticks
143 {0x0170, 0x0032}, // CNK_knbmx0, 32 ticks
144 {0x021f, 0x008d}, // CNK_kndcx0, 40 ticks
145 {0x0220, 0x008d}, // CNK_kndcx1, 136 ticks
146 {0x0221, 0x008d}, // CNK_kndcx2, 180 ticks
147 {0x0222, 0x008d}, // CNK_kndcx3, 164 ticks
148 {0x0223, 0x008d}, // CNK_kndcx4, 208 ticks
149 {0x0236, 0x008d}, // CNK_kndmx0, 48 ticks
150 {0x0237, 0x008d}, // CNK_kndmx1, 44 ticks
151 {0x0238, 0x008d}, // CNK_kndmx2, 68 ticks
152 {0x0239, 0x008d}, // CNK_kndmx3, 152 ticks
153 {0x023a, 0x008d}, // CNK_kndmx4, 96 ticks
154 {0x023b, 0x008d}, // CNK_kndmx5, 188 ticks
155 {0x023c, 0x008d}, // CNK_kndmx6, 108 ticks
156 {0x023e, 0x008d}, // CNK_kndmx8, 260 ticks
157 {0x023f, 0x008d}, // CNK_kndmx9, 256 ticks
158 {0x0240, 0x008d}, // CNK_kndmxa, 132 ticks
159 {0x0241, 0x008d}, // CNK_kndmxb3a, 140 ticks
160 {0x0242, 0x008d}, // CNK_kndmxb3b, 172 ticks
161 {0x0243, 0x008d}, // CNK_kndmxb3c, 140 ticks
162 {0x0282, 0x00ad}, // CNK_knecx0, 28 ticks
163 {0x0299, 0x00ad}, // CNK_knemx0, 48 ticks
164 {0x02a3, 0x00ad}, // CNK_knemxa, 208 ticks
165 {0x0348, 0x0018}, // CNK_kngcx0, 60 ticks
166 {0x035f, 0x0018}, // CNK_kngmx0, 88 ticks
167 {0x0364, 0x0018}, // CNK_kngmx5, 80 ticks
168 {0x0366, 0x0018}, // CNK_kngmx7, 104 ticks
169 {0x0367, 0x0018}, // CNK_kngmx8, 108 ticks
170 {0x0368, 0x0018}, // CNK_kngmx9, 120 ticks
171 {0x0369, 0x0018}, // CNK_kngmxa, 152 ticks
172 {0x03c2, 0x00bf}, // CNK_knhmx0, 32 ticks
173 {0x0425, 0x00cc}, // CNK_knimx0, 180 ticks
174 {0x042f, 0x00cc}, // CNK_knimxa, 216 ticks
175 {0x0471, 0x000e}, // CNK_knjcx0, 124 ticks
176 {0x0474, 0x000e}, // CNK_knjcx3, 128 ticks
177 {0x0475, 0x000e}, // CNK_knjcx4, 140 ticks
178 {0x0488, 0x000e}, // CNK_knjmx0, 20 ticks
179 {0x0489, 0x000e}, // CNK_knjmx1, 108 ticks
180 {0x048b, 0x000e}, // CNK_knjmx3, 107 ticks
181 {0x048c, 0x000e}, // CNK_knjmx4, 128 ticks
182 {0x048d, 0x000e}, // CNK_knjmx5, 148 ticks
183 {0x048f, 0x000e}, // CNK_knjmx7, 120 ticks
184 {0x0493, 0x000e}, // CNK_knjmxb3a, 124 ticks
185 {0x0494, 0x000e}, // CNK_knjmxb3b, 96 ticks
186 {0x0495, 0x000e}, // CNK_knjmxb3c, 128 ticks
187 {0x04eb, 0x0006}, // CNK_knkmx0, 100 ticks
188 }};
189 for (const auto& root : MovementRoots)
190 if (*rootSequenceDataId == packDataId(LegacyGroupId::ThreeD, root.sequence) &&
192 return true;
193 return false;
194 }
195}
std::size_t root
std::uint16_t priority
unsigned index
data::DataTag first
int token
std::uint32_t DataId
Definition DataBanks.hpp:10
constexpr DataId EmptyDataId
Definition DataBanks.hpp:13
constexpr DataTag dataTag(DataId id) noexcept
Definition DataBanks.hpp:64
const ModernTokenDefinition * modernTokenForLegacyMesh(DataId id) noexcept
std::uint16_t DataTag
Definition DataBanks.hpp:11
constexpr std::uint16_t legacyGroupValue(LegacyGroupId group) noexcept
Definition DataBanks.hpp:30
const std::array< ModernTokenDefinition, ModernTokenCount > & modernTokenDefinitions() noexcept
bool qualifiedModernTokenSequence(DataId meshId, std::optional< DataId > rootSequenceDataId, std::uint16_t priority) noexcept
DataId representativeLegacyMesh(std::uint8_t token) noexcept
DataId idleSequenceDataId(std::uint8_t token) noexcept
const ModernTokenDefinition * modernTokenDefinition(std::uint8_t token) noexcept
constexpr std::size_t ModernTokenCount
std::optional< std::uint8_t > tokenForLegacyMesh(DataId id) noexcept
constexpr DataId packDataId(std::uint16_t group, DataTag tag) noexcept
Definition DataBanks.hpp:39
constexpr std::uint16_t dataGroup(DataId id) noexcept
Definition DataBanks.hpp:57
constexpr std::uint16_t Generic3DPriority
constexpr std::uint16_t TokenPriority
constexpr PlayerNumber MaxPlayers
Definition RuleTypes.hpp:14