1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
#pragma once
#include "game/build_graph.hpp" // MaterialDef
#include <vector>
#include <string>
class ScriptEngine;
// A weapon definition, loaded from Lua (data/weapons.lua). Values are in our
// world units (scaled from the Forts data).
struct WeaponDef {
std::string name;
float muzzle_speed; // launch speed (units/s)
float reload; // seconds between shots
float splash_damage; // damage at blast centre
float splash_radius; // blast radius (units)
float knockback; // impulse applied to nearby nodes
float projectile_radius; // collision radius of the shell
float fire_chance; // 0..1 chance to ignite on impact (M4 fire)
float min_fire_angle; // firing-arc lower bound, radians rel. to mount
float max_fire_angle; // firing-arc upper bound, radians rel. to mount
bool is_beam; // laser (hitscan beam) vs ballistic shell
float beam_range; // max beam length (units)
float beam_dps; // HP damage per second to the struck strut
float beam_duration; // seconds the beam stays on
float energy_cost; // energy spent per shot (Forts EnergyFireCost)
float recoil; // velocity kick shoved back into the FIRING
// structure on each shot (Forts Recoil); 0 = none
std::string texture; // turret/base sprite (CC0 placeholder)
std::string projectile_texture; // shell sprite (CC0 placeholder)
std::string texture_forts; // preferred BYO Forts turret art
std::string projectile_texture_forts; // preferred BYO Forts shell art
};
// Loads the material table from <data_dir>/materials.lua, then applies every
// mod under <data_dir>/mods/<name>/ (each may define mod.lua with a Priority and
// a materials.lua that mutates the base table) in (priority, name) order.
// Returns the final material list. Empty on failure.
std::vector<MaterialDef> load_materials(ScriptEngine& script,
const std::string& data_dir);
// Loads weapons from <data_dir>/weapons.lua (+ mod overrides), same layering.
std::vector<WeaponDef> load_weapons(ScriptEngine& script,
const std::string& data_dir);
// Loads prebuilt structures from <data_dir>/structures.lua (+ mods) and builds
// them into `graph`. Each structure is a list of beams {x1,y1,x2,y2,material}.
// Used for scenario forts (e.g. the enemy target). Requires graph.materials set.
void load_structures(ScriptEngine& script, const std::string& data_dir,
BuildGraph& graph);
// A device type (reactor / mine / turbine / battery / ...), from data/devices.lua.
struct DeviceDef {
std::string name;
float hp;
float energy_rate, metal_rate; // resources produced per second (mine e<0)
float energy_storage, metal_storage;// added to the resource caps
bool needs_deposit; // mine: only produces on a metal deposit
bool wind; // turbine: energy scales with height
float wind_max_rate, wind_max_height;
bool is_core; // reactor: destroying it decides the game
float half_w, half_h;
float cost_metal, cost_energy; // build cost
std::string texture; // CC0 placeholder ("" = flat colour)
std::string texture_forts; // preferred BYO Forts art, else texture
float r, g, b; // fallback colour when no texture
};
// Scenario map: metal deposits + pre-placed devices (player reactor, enemy
// reactor, starter generators), from data/map.lua (+ mods).
struct PlacedDevice { std::string type; float x, y; int team; };
struct MapData {
std::vector<std::pair<float,float>> deposits;
std::vector<PlacedDevice> devices;
};
std::vector<DeviceDef> load_devices(ScriptEngine& script, const std::string& data_dir);
MapData load_map(ScriptEngine& script, const std::string& data_dir);
|