10#include <unordered_map>
15 inline std::unordered_map<rtp::ecs::components::WeaponKind, rtp::ecs::components::SimpleWeapon>
loadWeaponConfigs(
const std::string &path =
"config/common/weapons.json")
17 std::unordered_map<rtp::ecs::components::WeaponKind, rtp::ecs::components::SimpleWeapon> map;
20 std::vector<std::string> candidates = {
22 "config/common/weapons.json",
23 "config/weapons.json",
24 "./config/common/weapons.json",
25 "../config/common/weapons.json"
28 std::unordered_map<std::string, SimpleJson> weapons;
29 for (
const auto &p : candidates) {
31 if (!weapons.empty())
break;
34 if (weapons.empty()) {
38 for (
const auto& [name, data] : weapons) {
42 int kindVal = data.getInt(
"kind", -1);
55 cfg.
fireRate = data.getFloat(
"fireRate", 0.0f);
57 cfg.
damage = data.getInt(
"damage", 0);
58 cfg.
ammo = data.getInt(
"ammo", -1);
59 cfg.
maxAmmo = data.getInt(
"maxAmmo", -1);
63 cfg.
homing = data.getBool(
"homing",
false);
65 cfg.
homingRange = data.getFloat(
"homingRange", 600.0f);
66 cfg.
isBoomerang = data.getBool(
"isBoomerang",
false);
76 inline std::unordered_map<rtp::ecs::components::WeaponKind, rtp::ecs::components::SimpleWeapon> &
weapon_cache()
78 static std::unordered_map<rtp::ecs::components::WeaponKind, rtp::ecs::components::SimpleWeapon> cache;
84 static bool loaded =
false;
122 std::vector<std::string> candidates = {
123 "config/common/weapons.json",
124 "config/weapons.json",
125 "./config/common/weapons.json",
126 "../config/common/weapons.json"
129 for (
const auto &p : candidates) {
131 if (weapons.empty())
continue;
133 for (
const auto& [name, data] : weapons) {
134 int k = data.getInt(
"kind", -1);
136 if (name ==
"Classic") k = 0;
137 else if (name ==
"Beam") k = 1;
138 else if (name ==
"Tracker") k = 3;
139 else if (name ==
"Boomerang") k = 4;
142 if (
static_cast<uint8_t
>(kind) ==
static_cast<uint8_t
>(k)) {
143 std::string displayName = data.getString(
"displayName",
"");
144 if (!displayName.empty())
return displayName;
150 return std::string();
Logger declaration with support for multiple log levels.
File : SpriteMapConfig.hpp License: MIT Author : GitHub Copilot Date : 18/01/2026.
bool & weapon_cache_loaded()
std::string getWeaponDisplayName(rtp::ecs::components::WeaponKind kind)
std::unordered_map< std::string, SimpleJson > parseWeaponsFile(const std::string &filepath="config/common/weapons.json")
std::unordered_map< rtp::ecs::components::WeaponKind, rtp::ecs::components::SimpleWeapon > loadWeaponConfigs(const std::string &path="config/common/weapons.json")
std::unordered_map< rtp::ecs::components::WeaponKind, rtp::ecs::components::SimpleWeapon > & weapon_cache()
const rtp::ecs::components::SimpleWeapon & getWeaponDef(rtp::ecs::components::WeaponKind kind)
void reloadWeaponConfigs()
WeaponKind
Types of player weapons.
@ Tracker
Weak auto-homing shots.
@ Boomerang
Single projectile that returns.
@ Classic
Default spam/charge laser.
@ Beam
Continuous beam 5s active, 5s cooldown.
void info(LogFmt< std::type_identity_t< Args >... > fmt, Args &&...args) noexcept
Log an informational message.
Component representing a weapon configuration.
int difficulty
Difficulty to use this weapon (1-5)
float beamCooldown
Beam cooldown time (Beam)
int maxAmmo
Max ammo (-1 = infinite)
bool isBoomerang
Projectile returns (Boomerang)
int ammo
Current ammo (-1 = infinite)
float homingSteering
Steering factor for homing bullets.
float beamDuration
Beam active time (Beam)
float fireRate
Shots per second (or cooldown)
int damage
Damage per shot.
bool homing
Shots home to enemies (Tracker)
float lastShotTime
Time since last shot.
WeaponKind kind
Weapon type.
float homingRange
Detection range for homing bullets.