aboutsummaryrefslogtreecommitdiffstats
path: root/src/game/data.hpp
blob: 9b9aec1a28c6c7d17ac4e80f7264e9c29a7a4c00 (plain) (blame)
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);