Line data Source code
1 : #include "WeaponParametersFactory.hpp"
2 :
3 : #include "core/config/Config.hpp"
4 : #include "core/entities/WeaponParametersFactory.hpp"
5 :
6 : #include "spdlog/spdlog.h"
7 :
8 : #include <unordered_map>
9 :
10 : namespace Soldank::WeaponParametersFactory
11 : {
12 : const std::uint16_t SECOND = 60;
13 : const std::uint16_t BULLET_TIMEOUT = SECOND * 7;
14 : const std::uint16_t GRENADE_TIMEOUT = SECOND * 3;
15 : const std::uint16_t M2BULLET_TIMEOUT = SECOND;
16 : const std::uint16_t FLAMER_TIMEOUT = SECOND * 32;
17 : const std::uint16_t MELEE_TIMEOUT = 1;
18 :
19 : // TODO: Move to Bullet classes
20 0 : BulletType ConvertToBulletStyleEnum(uint8_t bullet_type_id)
21 : {
22 0 : switch (bullet_type_id) {
23 0 : case 1:
24 0 : return BulletType::Bullet;
25 0 : case 2:
26 0 : return BulletType::FragGrenade;
27 0 : case 3:
28 0 : return BulletType::GaugeBullet;
29 0 : case 4:
30 0 : return BulletType::M79Grenade;
31 0 : case 5:
32 0 : return BulletType::Flame;
33 0 : case 6:
34 0 : return BulletType::Fist;
35 0 : case 7:
36 0 : return BulletType::Arrow;
37 0 : case 8:
38 0 : return BulletType::FlameArrow;
39 0 : case 9:
40 0 : return BulletType::ClusterGrenade;
41 0 : case 10:
42 0 : return BulletType::Cluster;
43 0 : case 11:
44 0 : return BulletType::Blade;
45 0 : case 12:
46 0 : return BulletType::LAWMissile;
47 0 : case 13:
48 0 : return BulletType::ThrownKnife;
49 0 : case 14:
50 0 : return BulletType::M2Bullet;
51 0 : default:
52 : std::unreachable();
53 : }
54 : }
55 :
56 0 : WeaponParameters LoadFromINI(const CSimpleIniA& ini_config, WeaponType weapon_type)
57 : {
58 0 : WeaponParameters weapon_parameters;
59 :
60 0 : weapon_parameters.kind = weapon_type;
61 0 : weapon_parameters.name = GetNameForWeaponType(weapon_type);
62 0 : weapon_parameters.ini_name = GetININameForWeaponType(weapon_type);
63 0 : std::string ini_name = weapon_parameters.ini_name;
64 :
65 0 : weapon_parameters.hit_multiply = (float)ini_config.GetDoubleValue(ini_name.c_str(), "Damage");
66 0 : weapon_parameters.fire_interval = ini_config.GetLongValue(ini_name.c_str(), "FireInterval");
67 0 : weapon_parameters.ammo = ini_config.GetLongValue(ini_name.c_str(), "Ammo");
68 0 : weapon_parameters.reload_time = ini_config.GetLongValue(ini_name.c_str(), "ReloadTime");
69 0 : weapon_parameters.speed = (float)ini_config.GetDoubleValue(ini_name.c_str(), "Speed");
70 0 : weapon_parameters.start_up_time = ini_config.GetLongValue(ini_name.c_str(), "StartUpTime");
71 0 : weapon_parameters.bink = (int16_t)ini_config.GetLongValue(ini_name.c_str(), "Bink");
72 0 : weapon_parameters.movement_acc =
73 0 : (float)ini_config.GetDoubleValue(ini_name.c_str(), "MovementAcc");
74 0 : weapon_parameters.bullet_spread =
75 0 : (float)ini_config.GetDoubleValue(ini_name.c_str(), "BulletSpread");
76 0 : weapon_parameters.recoil = ini_config.GetLongValue(ini_name.c_str(), "Recoil");
77 0 : weapon_parameters.push = (float)ini_config.GetDoubleValue(ini_name.c_str(), "Push");
78 0 : weapon_parameters.inherited_velocity =
79 0 : (float)ini_config.GetDoubleValue(ini_name.c_str(), "InheritedVelocity");
80 0 : weapon_parameters.modifier_head =
81 0 : (float)ini_config.GetDoubleValue(ini_name.c_str(), "ModifierHead");
82 0 : weapon_parameters.modifier_chest =
83 0 : (float)ini_config.GetDoubleValue(ini_name.c_str(), "ModifierChest");
84 0 : weapon_parameters.modifier_legs =
85 0 : (float)ini_config.GetDoubleValue(ini_name.c_str(), "ModifierLegs");
86 :
87 0 : switch (weapon_type) {
88 0 : case WeaponType::ClusterGrenade:
89 0 : weapon_parameters.bullet_style = BulletType::ClusterGrenade;
90 0 : break;
91 0 : case WeaponType::Cluster:
92 0 : weapon_parameters.bullet_style = BulletType::Cluster;
93 0 : break;
94 0 : case WeaponType::ThrownKnife:
95 0 : weapon_parameters.bullet_style = BulletType::ThrownKnife;
96 0 : break;
97 0 : default:
98 0 : weapon_parameters.bullet_style =
99 0 : ConvertToBulletStyleEnum(ini_config.GetLongValue(ini_name.c_str(), "BulletStyle"));
100 : }
101 :
102 0 : weapon_parameters.clip_reload = GetClipReload(weapon_type);
103 :
104 0 : switch (weapon_parameters.bullet_style) {
105 0 : case BulletType::FragGrenade:
106 : case BulletType::ClusterGrenade:
107 0 : weapon_parameters.timeout = GRENADE_TIMEOUT;
108 0 : break;
109 0 : case BulletType::Flame:
110 0 : weapon_parameters.timeout = FLAMER_TIMEOUT;
111 0 : break;
112 0 : case BulletType::Fist:
113 : case BulletType::Blade:
114 0 : weapon_parameters.timeout = MELEE_TIMEOUT;
115 0 : break;
116 0 : case BulletType::M2Bullet:
117 0 : weapon_parameters.timeout = M2BULLET_TIMEOUT;
118 0 : break;
119 0 : default:
120 0 : weapon_parameters.timeout = BULLET_TIMEOUT;
121 : }
122 :
123 0 : return weapon_parameters;
124 0 : }
125 :
126 0 : WeaponParameters LoadFromINIFile(const std::string& ini_file_path,
127 : WeaponType weapon_type,
128 : const IFileReader& file_reader)
129 : {
130 0 : spdlog::debug("ini_file_path: {}", ini_file_path);
131 0 : auto file_data = file_reader.Read(ini_file_path);
132 0 : if (!file_data.has_value()) {
133 0 : spdlog::critical("Animation file not found {}", ini_file_path);
134 0 : std::string message = "Could not open file: " + ini_file_path;
135 0 : throw std::runtime_error(message.c_str());
136 0 : }
137 :
138 0 : CSimpleIniA ini_config;
139 0 : SI_Error rc = ini_config.LoadData(*file_data);
140 0 : if (rc < 0) {
141 0 : spdlog::critical("Error: INI File could not be loaded: {}", ini_file_path);
142 : };
143 0 : return LoadFromINI(ini_config, weapon_type);
144 0 : }
145 :
146 0 : const WeaponParameters& GetParameters(WeaponType weapon_type,
147 : bool realistic,
148 : const IFileReader& file_reader)
149 : {
150 : // clang-format off
151 : static std::unordered_map<WeaponType, const WeaponParameters> weapon_parameters_map{
152 0 : { WeaponType::DesertEagles, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::DesertEagles, file_reader) },
153 0 : { WeaponType::MP5, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::MP5, file_reader) },
154 0 : { WeaponType::Ak74, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::Ak74, file_reader) },
155 0 : { WeaponType::SteyrAUG, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::SteyrAUG, file_reader) },
156 0 : { WeaponType::Spas12, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::Spas12, file_reader) },
157 0 : { WeaponType::Ruger77, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::Ruger77, file_reader) },
158 0 : { WeaponType::M79, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::M79, file_reader) },
159 0 : { WeaponType::Barrett, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::Barrett, file_reader) },
160 0 : { WeaponType::Minimi, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::Minimi, file_reader) },
161 0 : { WeaponType::Minigun, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::Minigun, file_reader) },
162 0 : { WeaponType::USSOCOM, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::USSOCOM, file_reader) },
163 0 : { WeaponType::Knife, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::Knife, file_reader) },
164 0 : { WeaponType::Chainsaw, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::Chainsaw, file_reader) },
165 0 : { WeaponType::LAW, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::LAW, file_reader) },
166 0 : { WeaponType::FlameBow, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::FlameBow, file_reader) },
167 0 : { WeaponType::Bow, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::Bow, file_reader) },
168 0 : { WeaponType::Flamer, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::Flamer, file_reader) },
169 0 : { WeaponType::M2, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::M2, file_reader) },
170 0 : { WeaponType::NoWeapon, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::NoWeapon, file_reader) },
171 0 : { WeaponType::FragGrenade, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::FragGrenade, file_reader) },
172 0 : { WeaponType::ClusterGrenade, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::ClusterGrenade, file_reader) },
173 0 : { WeaponType::Cluster, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::Cluster, file_reader) },
174 0 : { WeaponType::ThrownKnife, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::ThrownKnife, file_reader) },
175 0 : };
176 :
177 : static std::unordered_map<WeaponType, const WeaponParameters> weapon_parameters_realistic_map{
178 0 : { WeaponType::DesertEagles, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::DesertEagles, file_reader) },
179 0 : { WeaponType::MP5, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::MP5, file_reader) },
180 0 : { WeaponType::Ak74, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::Ak74, file_reader) },
181 0 : { WeaponType::SteyrAUG, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::SteyrAUG, file_reader) },
182 0 : { WeaponType::Spas12, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::Spas12, file_reader) },
183 0 : { WeaponType::Ruger77, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::Ruger77, file_reader) },
184 0 : { WeaponType::M79, LoadFromINIFile(Config::WEAPONS_INI_FILE_PATH, WeaponType::M79, file_reader) },
185 0 : { WeaponType::Barrett, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::Barrett, file_reader) },
186 0 : { WeaponType::Minimi, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::Minimi, file_reader) },
187 0 : { WeaponType::Minigun, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::Minigun, file_reader) },
188 0 : { WeaponType::USSOCOM, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::USSOCOM, file_reader) },
189 0 : { WeaponType::Knife, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::Knife, file_reader) },
190 0 : { WeaponType::Chainsaw, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::Chainsaw, file_reader) },
191 0 : { WeaponType::LAW, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::LAW, file_reader) },
192 0 : { WeaponType::FlameBow, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::FlameBow, file_reader) },
193 0 : { WeaponType::Bow, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::Bow, file_reader) },
194 0 : { WeaponType::Flamer, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::Flamer, file_reader) },
195 0 : { WeaponType::M2, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::M2, file_reader) },
196 0 : { WeaponType::NoWeapon, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::NoWeapon, file_reader) },
197 0 : { WeaponType::FragGrenade, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::FragGrenade, file_reader) },
198 0 : { WeaponType::ClusterGrenade, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::ClusterGrenade, file_reader) },
199 0 : { WeaponType::Cluster, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::Cluster, file_reader) },
200 0 : { WeaponType::ThrownKnife, LoadFromINIFile(Config::WEAPONS_REALISTIC_INI_FILE_PATH, WeaponType::ThrownKnife, file_reader) },
201 0 : };
202 : // clang-format on
203 :
204 0 : if (realistic) {
205 0 : return weapon_parameters_realistic_map.at(weapon_type);
206 : }
207 0 : return weapon_parameters_map.at(weapon_type);
208 0 : }
209 :
210 0 : std::string GetNameForWeaponType(WeaponType weapon_type)
211 : {
212 0 : switch (weapon_type) {
213 0 : case WeaponType::DesertEagles:
214 0 : return "Desert Eagles";
215 0 : case WeaponType::MP5:
216 0 : return "HK MP5";
217 0 : case WeaponType::Ak74:
218 0 : return "Ak-74";
219 0 : case WeaponType::SteyrAUG:
220 0 : return "Steyr AUG";
221 0 : case WeaponType::Spas12:
222 0 : return "Spas-12";
223 0 : case WeaponType::Ruger77:
224 0 : return "Ruger 77";
225 0 : case WeaponType::M79:
226 0 : return "M79";
227 0 : case WeaponType::Barrett:
228 0 : return "Barrett M82A1";
229 0 : case WeaponType::Minimi:
230 0 : return "FN Minimi";
231 0 : case WeaponType::Minigun:
232 0 : return "XM214 Minigun";
233 0 : case WeaponType::USSOCOM:
234 0 : return "USSOCOM";
235 0 : case WeaponType::Knife:
236 0 : return "Combat Knife";
237 0 : case WeaponType::Chainsaw:
238 0 : return "Chainsaw";
239 0 : case WeaponType::LAW:
240 0 : return "LAW";
241 0 : case WeaponType::FlameBow:
242 0 : return "Flame Bow";
243 0 : case WeaponType::Bow:
244 0 : return "Bow";
245 0 : case WeaponType::Flamer:
246 0 : return "Flamer";
247 0 : case WeaponType::M2:
248 0 : return "M2 MG";
249 0 : case WeaponType::NoWeapon:
250 0 : return "Hands";
251 0 : case WeaponType::FragGrenade:
252 : case WeaponType::ClusterGrenade:
253 : case WeaponType::Cluster:
254 0 : return "Frag Grenade";
255 0 : case WeaponType::ThrownKnife:
256 0 : return "Combat Knife";
257 : }
258 : }
259 :
260 0 : std::string GetININameForWeaponType(WeaponType weapon_type)
261 : {
262 0 : switch (weapon_type) {
263 0 : case WeaponType::DesertEagles:
264 0 : return "Desert Eagles";
265 0 : case WeaponType::MP5:
266 0 : return "HK MP5";
267 0 : case WeaponType::Ak74:
268 0 : return "Ak-74";
269 0 : case WeaponType::SteyrAUG:
270 0 : return "Steyr AUG";
271 0 : case WeaponType::Spas12:
272 0 : return "Spas-12";
273 0 : case WeaponType::Ruger77:
274 0 : return "Ruger 77";
275 0 : case WeaponType::M79:
276 0 : return "M79";
277 0 : case WeaponType::Barrett:
278 0 : return "Barret M82A1";
279 0 : case WeaponType::Minimi:
280 0 : return "FN Minimi";
281 0 : case WeaponType::Minigun:
282 0 : return "XM214 Minigun";
283 0 : case WeaponType::USSOCOM:
284 0 : return "USSOCOM";
285 0 : case WeaponType::Knife:
286 0 : return "Combat Knife";
287 0 : case WeaponType::Chainsaw:
288 0 : return "Chainsaw";
289 0 : case WeaponType::LAW:
290 0 : return "M72 LAW";
291 0 : case WeaponType::FlameBow:
292 0 : return "Flamed Arrows";
293 0 : case WeaponType::Bow:
294 0 : return "Rambo Bow";
295 0 : case WeaponType::Flamer:
296 0 : return "Flamer";
297 0 : case WeaponType::M2:
298 0 : return "Stationary Gun";
299 0 : case WeaponType::NoWeapon:
300 0 : return "Punch";
301 0 : case WeaponType::FragGrenade:
302 : case WeaponType::ClusterGrenade:
303 : case WeaponType::Cluster:
304 0 : return "Grenade";
305 0 : case WeaponType::ThrownKnife:
306 0 : return "Combat Knife";
307 : }
308 : }
309 :
310 0 : bool GetClipReload(WeaponType weapon_type)
311 : {
312 0 : switch (weapon_type) {
313 0 : case WeaponType::DesertEagles:
314 : case WeaponType::MP5:
315 : case WeaponType::Ak74:
316 : case WeaponType::SteyrAUG:
317 : case WeaponType::M79:
318 : case WeaponType::Barrett:
319 : case WeaponType::Minimi:
320 : case WeaponType::USSOCOM:
321 : case WeaponType::LAW:
322 0 : return true;
323 0 : case WeaponType::Spas12:
324 : case WeaponType::Ruger77:
325 : case WeaponType::Minigun:
326 : case WeaponType::Knife:
327 : case WeaponType::Chainsaw:
328 : case WeaponType::FlameBow:
329 : case WeaponType::Bow:
330 : case WeaponType::Flamer:
331 : case WeaponType::M2:
332 : case WeaponType::NoWeapon:
333 : case WeaponType::FragGrenade:
334 : case WeaponType::ClusterGrenade:
335 : case WeaponType::Cluster:
336 : case WeaponType::ThrownKnife:
337 0 : return false;
338 : }
339 : }
340 :
341 : } // namespace Soldank::WeaponParametersFactory
|