1 #ifndef SHIP_TEMPLATE_BASED_OBJECT_H
2 #define SHIP_TEMPLATE_BASED_OBJECT_H
3 
4 #include "engine.h"
5 #include "spaceObject.h"
6 #include "shipTemplate.h"
7 
8 /**
9     An object which is based on a ship template. Contains generic behaviour for:
10     * Hull damage
11     * Shield damage
12     * Rendering
13     Used as a base class for stations and ships.
14 */
15 class ShipTemplateBasedObject : public SpaceObject, public Updatable
16 {
17 private:
18     float long_range_radar_range;
19     float short_range_radar_range;
20 public:
21     string template_name;
22     string type_name;
23     string radar_trace;
24     string impulse_sound_file;
25     P<ShipTemplate> ship_template;
26 
27     int shield_count;
28     float shield_level[max_shield_count];
29     float shield_max[max_shield_count];
30     float hull_strength, hull_max;
31     float shield_hit_effect[max_shield_count];
32     bool can_be_destroyed;
33 
34     bool shares_energy_with_docked;       //[config]
35     bool repair_docked;                   //[config]
36     bool restocks_scan_probes;
37     bool restocks_missiles_docked;        //only restocks cpuships; playerships should use comms
38 
39     ScriptSimpleCallback on_destruction;
40     ScriptSimpleCallback on_taking_damage;
41 public:
42     ShipTemplateBasedObject(float collision_range, string multiplayer_name, float multiplayer_significant_range=-1);
43 
44 #if FEATURE_3D_RENDERING
45     virtual void draw3DTransparent() override;
46 #endif
47     virtual void drawShieldsOnRadar(sf::RenderTarget& window, sf::Vector2f position, float scale, float rotation, float sprite_scale, bool show_levels);
48     virtual void update(float delta) override;
49 
50     virtual std::unordered_map<string, string> getGMInfo() override;
canRestockMissiles()51     virtual bool canRestockMissiles() override { return restocks_missiles_docked; }
canBeTargetedBy(P<SpaceObject> other)52     virtual bool canBeTargetedBy(P<SpaceObject> other) override { return true; }
53     virtual bool hasShield() override;
getCallSign()54     virtual string getCallSign() override { return callsign; }
55     virtual void takeDamage(float damage_amount, DamageInfo info) override;
56     virtual void takeHullDamage(float damage_amount, DamageInfo& info);
57     virtual void destroyedByDamage(DamageInfo& info) = 0;
58     virtual float getShieldDamageFactor(DamageInfo& info, int shield_index);
59 
setCanBeDestroyed(bool enabled)60     void setCanBeDestroyed(bool enabled) { can_be_destroyed = enabled; }
getCanBeDestroyed()61     bool getCanBeDestroyed(){ return can_be_destroyed; }
62 
63     virtual void applyTemplateValues() = 0;
64     virtual float getShieldRechargeRate(int shield_index);
65 
66     void setTemplate(string template_name);
setShipTemplate(string template_name)67     void setShipTemplate(string template_name) { LOG(WARNING) << "Deprecated \"setShipTemplate\" function called."; setTemplate(template_name); }
setTypeName(string type_name)68     void setTypeName(string type_name) { this->type_name = type_name; }
getTypeName()69     string getTypeName() { return type_name; }
70 
getHull()71     float getHull() { return hull_strength; }
getHullMax()72     float getHullMax() { return hull_max; }
setHull(float amount)73     void setHull(float amount) { if (amount < 0) return; hull_strength = amount; }
setHullMax(float amount)74     void setHullMax(float amount) { if (amount < 0) return; hull_max = amount; hull_strength = std::max(hull_strength, hull_max); }
getShieldsActive()75     virtual bool getShieldsActive() { return true; }
76 
77     ///Shield script binding functions
getShieldLevel(int index)78     float getShieldLevel(int index) { if (index < 0 || index >= shield_count) return 0; return shield_level[index]; }
getShieldMax(int index)79     float getShieldMax(int index) { if (index < 0 || index >= shield_count) return 0; return shield_max[index]; }
getShieldCount()80     int getShieldCount() { return shield_count; }
81     void setShields(std::vector<float> amounts);
82     void setShieldsMax(std::vector<float> amounts);
83 
getShieldPercentage(int index)84     int getShieldPercentage(int index) { if (index < 0 || index >= shield_count || shield_max[index] <= 0.0) return 0; return int(100 * shield_level[index] / shield_max[index]); }
85     ESystem getShieldSystemForShieldIndex(int index);
86 
87     ///Deprecated old script functions for shields
getFrontShield()88     float getFrontShield() { return shield_level[0]; }
getFrontShieldMax()89     float getFrontShieldMax() { return shield_max[0]; }
setFrontShield(float amount)90     void setFrontShield(float amount) { if (amount < 0) return; shield_level[0] = amount; }
setFrontShieldMax(float amount)91     void setFrontShieldMax(float amount) { if (amount < 0) return; shield_level[0] = amount; shield_level[0] = std::min(shield_level[0], shield_max[0]); }
getRearShield()92     float getRearShield() { return shield_level[1]; }
getRearShieldMax()93     float getRearShieldMax() { return shield_max[1]; }
setRearShield(float amount)94     void setRearShield(float amount) { if (amount < 0) return; shield_level[1] = amount; }
setRearShieldMax(float amount)95     void setRearShieldMax(float amount) { if (amount < 0) return; shield_max[1] = amount; shield_level[1] = std::min(shield_level[1], shield_max[1]); }
96 
97     // Radar range
getLongRangeRadarRange()98     float getLongRangeRadarRange() { return long_range_radar_range; }
getShortRangeRadarRange()99     float getShortRangeRadarRange() { return short_range_radar_range; }
setLongRangeRadarRange(float range)100     void setLongRangeRadarRange(float range) { range = std::max(range, 100.0f); long_range_radar_range = range; short_range_radar_range = std::min(short_range_radar_range, range); }
setShortRangeRadarRange(float range)101     void setShortRangeRadarRange(float range) { range = std::max(range, 100.0f); short_range_radar_range = range; long_range_radar_range = std::max(long_range_radar_range, range); }
102 
setRadarTrace(string trace)103     void setRadarTrace(string trace) { radar_trace = trace; }
setImpulseSoundFile(string sound)104     void setImpulseSoundFile(string sound) { impulse_sound_file = sound; }
105 
getSharesEnergyWithDocked()106     bool getSharesEnergyWithDocked() { return shares_energy_with_docked; }
setSharesEnergyWithDocked(bool enabled)107     void setSharesEnergyWithDocked(bool enabled) { shares_energy_with_docked = enabled; }
getRepairDocked()108     bool getRepairDocked() { return repair_docked; }
setRepairDocked(bool enabled)109     void setRepairDocked(bool enabled) { repair_docked = enabled; }
getRestocksScanProbes()110     bool getRestocksScanProbes() { return restocks_scan_probes; }
setRestocksScanProbes(bool enabled)111     void setRestocksScanProbes(bool enabled) { restocks_scan_probes = enabled; }
getRestocksMissilesDocked()112     bool getRestocksMissilesDocked() { return restocks_missiles_docked; }
setRestocksMissilesDocked(bool enabled)113     void setRestocksMissilesDocked(bool enabled) { restocks_missiles_docked = enabled; }
114 
115     void onTakingDamage(ScriptSimpleCallback callback);
116     void onDestruction(ScriptSimpleCallback callback);
117 
118     string getShieldDataString();
119 };
120 
121 #endif//SHIP_TEMPLATE_BASED_OBJECT_H
122