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