LCOV - code coverage report
Current view: top level - core/entities - WeaponParametersFactory.cpp (source / functions) Coverage Total Hit
Test: coverage-src.info Lines: 0.0 % 250 0
Test Date: 2025-05-27 23:26:07 Functions: 0.0 % 7 0

            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
        

Generated by: LCOV version 2.0-1