Skip to content

restockMissile on playerships #1993

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion scripts/shiptemplates/exuari.lua
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ template:setSpeed(20, 1.5, 3)
template:setDockClasses(_("class", "Exuari"))
template:setSharesEnergyWithDocked(true)
template:setRepairDocked(true)
template:setRestocksMissilesDocked(true)
template:setRestocksMissilesDocked("all")
template:setRestocksScanProbes(true)

variation = template:copy("Fortress")
Expand Down
7 changes: 5 additions & 2 deletions src/ai/ai.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -449,7 +449,7 @@ void ShipAI::runOrders()
{
P<ShipTemplateBasedObject> target = owner->getOrderTarget();
bool allow_undock = true;
if (target->restocks_missiles_docked)
if (target->canRestockMissiles(owner))
{
for(int n = 0; n < MW_Count; n++)
{
Expand Down Expand Up @@ -829,7 +829,10 @@ P<SpaceObject> ShipAI::findBestMissileRestockTarget(glm::vec2 position, float ra
P<SpaceObject> space_object = obj;
if (!space_object || !owner->isFriendly(space_object) || space_object == target)
continue;
if (space_object->canBeDockedBy(owner) == DockStyle::None || !space_object->canRestockMissiles())
if (space_object->canBeDockedBy(owner) == DockStyle::None)
continue;
P<ShipTemplateBasedObject> stbo = space_object;
if (stbo && !stbo->canRestockMissiles(owner))
continue;
//calculate score
auto position_difference = space_object->getPosition() - owner_position;
Expand Down
16 changes: 15 additions & 1 deletion src/screenComponents/missileTubeControls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ GuiMissileTubeControls::GuiMissileTubeControls(GuiContainer* owner, string id)
rows[n] = row;
}


for (int n = MW_Count-1; n >= 0; n--)
{
load_type_rows[n].layout = new GuiElement(this, id + "_ROW_" + string(n));
Expand All @@ -83,6 +82,12 @@ GuiMissileTubeControls::GuiMissileTubeControls(GuiContainer* owner, string id)
load_type_rows[MW_EMP].button->setIcon("gui/icons/weapon-emp.png");
load_type_rows[MW_Nuke].button->setIcon("gui/icons/weapon-nuke.png");
load_type_rows[MW_HVLI].button->setIcon("gui/icons/weapon-hvli.png");

docked_loading_bar= new GuiProgressbar(this, id + "_DOCKED_LOADING_PROGRESS", 0, 1.0, 0);
docked_loading_bar->setColor(glm::u8vec4(128, 128, 128, 255))->setSize(200, 50);
docked_loading_label = new GuiLabel(docked_loading_bar, id + "_DOCKED_LOADING_PROGRESS_LABEL", "Loading", 35);
docked_loading_label->setSize(GuiElement::GuiSizeMax, GuiElement::GuiSizeMax)->hide();

}

void GuiMissileTubeControls::onUpdate()
Expand Down Expand Up @@ -152,6 +157,15 @@ void GuiMissileTubeControls::onUpdate()
for(int n=my_spaceship->weapon_tube_count; n<max_weapon_tubes; n++)
rows[n].layout->hide();

if (my_spaceship->missile_resupply_delay < my_spaceship->missile_resupply_time){
docked_loading_bar->show();
docked_loading_label->show();
docked_loading_bar->setValue((my_spaceship->missile_resupply_time-my_spaceship->missile_resupply_delay) / my_spaceship->missile_resupply_time);
} else {
docked_loading_bar->hide();
docked_loading_label->hide();
}

if (keys.weapons_select_homing.getDown())
selectMissileWeapon(MW_Homing);
if (keys.weapons_select_nuke.getDown())
Expand Down
2 changes: 2 additions & 0 deletions src/screenComponents/missileTubeControls.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ class GuiMissileTubeControls : public GuiElement
EMissileWeapons load_type;
bool manual_aim;
float missile_target_angle;
GuiProgressbar* docked_loading_bar;
GuiLabel* docked_loading_label;
public:
GuiMissileTubeControls(GuiContainer* owner, string id);

Expand Down
7 changes: 6 additions & 1 deletion src/screens/crew6/engineeringScreen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,12 @@ void EngineeringScreen::onDraw(sp::RenderTarget& renderer)
}
break;
case SYS_MissileSystem:
addSystemEffect(tr("missile","Reload rate"), toNearbyIntString(effectiveness * 100) + "%");
if (my_spaceship->weapon_tube_count > 0)
addSystemEffect(tr("missile","Reload rate"), toNearbyIntString(effectiveness * 100) + "%");
if (my_spaceship->restocks_missiles_docked == R_Fighters)
addSystemEffect(tr("fighter missile","Fighter missile reload rate"), toNearbyIntString(effectiveness * 100) + "%");
else if (my_spaceship->restocks_missiles_docked != R_None)
addSystemEffect(tr("fighter missile","Docked missile reload rate"), toNearbyIntString(effectiveness * 100) + "%");
break;
case SYS_Maneuver:
addSystemEffect(tr("Turning speed"), toNearbyIntString(effectiveness * 100) + "%");
Expand Down
18 changes: 12 additions & 6 deletions src/screens/gm/tweak.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -158,11 +158,17 @@ GuiTweakShipTemplateBasedObject::GuiTweakShipTemplateBasedObject(GuiContainer* o
});
restocks_scan_probes_toggle->setSize(GuiElement::GuiSizeMax, 40);

// Restocks cpuship weapons bool
restocks_cpuship_weapons_toggle = new GuiToggleButton(left_col, "", tr("Restocks cpuship missiles"), [this](bool value) {
target->setRestocksMissilesDocked(value);
});
restocks_cpuship_weapons_toggle->setSize(GuiElement::GuiSizeMax, 40);
// Restocks missiles selector
restocks_cpuship_weapons_selector= new GuiSelector(left_col, "", [this](int index, string value) {
target->setRestocksMissilesDocked(ERestockMissileBehaviour(index));
});
restocks_cpuship_weapons_selector->setSize(GuiElement::GuiSizeMax, 40);
restocks_cpuship_weapons_selector->addEntry(tr("Does not restock missiles"),R_None);
restocks_cpuship_weapons_selector->addEntry(tr("Restocks cpuship missiles"),R_CpuShips);
restocks_cpuship_weapons_selector->addEntry(tr("Restocks fighter missiles"),R_Fighters);
restocks_cpuship_weapons_selector->addEntry(tr("Restocks player missiles"),R_PlayerShips);
restocks_cpuship_weapons_selector->addEntry(tr("Restocks missiles for all"),R_All);
restocks_cpuship_weapons_selector->setSelectionIndex(R_None);

// Right column
// Hull max and state sliders
Expand Down Expand Up @@ -205,7 +211,7 @@ void GuiTweakShipTemplateBasedObject::onDraw(sp::RenderTarget& renderer)
shares_energy_with_docked_toggle->setValue(target->getSharesEnergyWithDocked());
repairs_docked_toggle->setValue(target->getRepairDocked());
restocks_scan_probes_toggle->setValue(target->getRestocksScanProbes());
restocks_cpuship_weapons_toggle->setValue(target->getRestocksMissilesDocked());
restocks_cpuship_weapons_selector->setSelectionIndex(target->getRestocksMissilesDocked());
hull_slider->setValue(target->hull_strength);
hull_max_slider->setValue(target->hull_max);
can_be_destroyed_toggle->setValue(target->getCanBeDestroyed());
Expand Down
2 changes: 1 addition & 1 deletion src/screens/gm/tweak.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ class GuiTweakShipTemplateBasedObject : public GuiTweakPage
GuiToggleButton* shares_energy_with_docked_toggle;
GuiToggleButton* repairs_docked_toggle;
GuiToggleButton* restocks_scan_probes_toggle;
GuiToggleButton* restocks_cpuship_weapons_toggle;
GuiSelector* restocks_cpuship_weapons_selector;
GuiSlider* hull_max_slider;
GuiSlider* hull_slider;
GuiToggleButton* can_be_destroyed_toggle;
Expand Down
6 changes: 3 additions & 3 deletions src/shipTemplate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ ShipTemplate::ShipTemplate()
shares_energy_with_docked = true;
repair_docked = false;
restocks_scan_probes = false;
restocks_missiles_docked = false;
restocks_missiles_docked = R_None;
energy_storage_amount = 1000;
repair_crew_count = 3;
weapon_tube_count = 0;
Expand Down Expand Up @@ -653,9 +653,9 @@ void ShipTemplate::setRestocksScanProbes(bool enabled)
restocks_scan_probes = enabled;
}

void ShipTemplate::setRestocksMissilesDocked(bool enabled)
void ShipTemplate::setRestocksMissilesDocked(ERestockMissileBehaviour behaviour)
{
restocks_missiles_docked = enabled;
restocks_missiles_docked = behaviour;
}

void ShipTemplate::setJumpDrive(bool enabled)
Expand Down
17 changes: 15 additions & 2 deletions src/shipTemplate.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,18 @@ enum ESystem
/* Define script conversion function for the ESystem enum. */
template<> void convert<ESystem>::param(lua_State* L, int& idx, ESystem& es);

enum ERestockMissileBehaviour
{
R_None = 0,
R_CpuShips,
R_Fighters,
R_PlayerShips,
R_All
};

/* Define script conversion function for the ERestockMissileBehaviour enum. */
template<> void convert<ERestockMissileBehaviour>::param(lua_State* L, int& idx, ERestockMissileBehaviour& er);

class ShipRoomTemplate
{
public:
Expand Down Expand Up @@ -97,7 +109,7 @@ class ShipTemplate : public PObject
bool shares_energy_with_docked;
bool repair_docked;
bool restocks_scan_probes;
bool restocks_missiles_docked;
ERestockMissileBehaviour restocks_missiles_docked;
bool can_scan = true;
bool can_hack = true;
bool can_dock = true;
Expand Down Expand Up @@ -146,7 +158,7 @@ class ShipTemplate : public PObject
void setSharesEnergyWithDocked(bool enabled);
void setRepairDocked(bool enabled);
void setRestocksScanProbes(bool enabled);
void setRestocksMissilesDocked(bool enabled);
void setRestocksMissilesDocked(ERestockMissileBehaviour behaviour);
void setCanScan(bool enabled) { can_scan = enabled; }
void setCanHack(bool enabled) { can_hack = enabled; }
void setCanDock(bool enabled) { can_dock = enabled; }
Expand Down Expand Up @@ -207,6 +219,7 @@ class ShipTemplate : public PObject
string getSystemName(ESystem system);
string getLocaleSystemName(ESystem system);
REGISTER_MULTIPLAYER_ENUM(ESystem);
REGISTER_MULTIPLAYER_ENUM(ERestockMissileBehaviour);

/* Define script conversion function for the ShipTemplate::TemplateType enum. */
template<> void convert<ShipTemplate::TemplateType>::param(lua_State* L, int& idx, ShipTemplate::TemplateType& tt);
Expand Down
15 changes: 15 additions & 0 deletions src/shipTemplate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,19 @@ template<> void convert<ShipTemplate::TemplateType>::param(lua_State* L, int& id
tt = ShipTemplate::Ship;
}

/* Define script conversion function for the ERestockMissileBehaviour enum. */
template<> void convert<ERestockMissileBehaviour>::param(lua_State* L, int& idx, ERestockMissileBehaviour& er)
{
string str = string(luaL_checkstring(L, idx++)).lower();
if (str == "all")
er = R_All;
else if (str == "cpuships")
er = R_CpuShips;
else if (str == "fighters")
er = R_Fighters;
else if (str == "playerships")
er = R_PlayerShips;
else
er = R_None;
}
#endif /* _SHIPTEMPLATE_HPP_ */
34 changes: 1 addition & 33 deletions src/spaceObjects/cpuShip.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,11 +112,9 @@ CpuShip::CpuShip()
setRotation(random(0, 360));
target_rotation = getRotation();

restocks_missiles_docked = true;
restocks_missiles_docked = R_CpuShips;
comms_script_name = "comms_ship.lua";

missile_resupply = 0.0;

new_ai_name = "default";
ai = nullptr;
}
Expand Down Expand Up @@ -146,36 +144,6 @@ void CpuShip::update(float delta)
}
if (ai)
ai->run(delta);

//recharge missiles of CPU ships docked to station. Can be disabled setting the restocks_missiles_docked flag to false.
if (docking_state == DS_Docked)
{
P<ShipTemplateBasedObject> docked_with_template_based = docking_target;
P<SpaceShip> docked_with_ship = docking_target;

if (docked_with_template_based && docked_with_template_based->restocks_missiles_docked)
{
bool needs_missile = 0;

for(int n=0; n<MW_Count; n++)
{
if (weapon_storage[n] < weapon_storage_max[n])
{
if (missile_resupply >= missile_resupply_time)
{
weapon_storage[n] += 1;
missile_resupply = 0.0;
break;
}
else
needs_missile = 1;
}
}

if (needs_missile)
missile_resupply += delta;
}
}
}

void CpuShip::applyTemplateValues()
Expand Down
3 changes: 0 additions & 3 deletions src/spaceObjects/cpuShip.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ class ShipAI;
class CpuShip : public SpaceShip
{
static constexpr float auto_system_repair_per_second = 0.005f;
static constexpr float missile_resupply_time = 10.0f;

EAIOrder orders; //Server only
glm::vec2 order_target_location{}; //Server only
Expand Down Expand Up @@ -61,8 +60,6 @@ class CpuShip : public SpaceShip
virtual std::unordered_map<string, string> getGMInfo() override;

virtual string getExportLine() override;

float missile_resupply;
};
string getAIOrderString(EAIOrder order);
string getLocaleAIOrderString(EAIOrder order);
Expand Down
28 changes: 27 additions & 1 deletion src/spaceObjects/shipTemplateBasedObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

#include "tween.h"
#include "i18n.h"
#include "cpuShip.h"
#include "playerSpaceship.h"

/// A ShipTemplateBasedObject (STBO) is an object class created from a ShipTemplate.
/// This is the parent class of SpaceShip (CpuShip, PlayerSpaceship) and SpaceStation objects, which inherit all STBO functions and can be created by scripts.
Expand Down Expand Up @@ -128,7 +130,7 @@ REGISTER_SCRIPT_SUBCLASS_NO_CREATE(ShipTemplateBasedObject, SpaceObject)
REGISTER_SCRIPT_CLASS_FUNCTION(ShipTemplateBasedObject, getRestocksMissilesDocked);
/// Defines whether this STBO restocks missiles for docked CpuShips.
/// To restock docked PlayerSpaceships' weapons, use a comms script. See ShipTemplateBasedObject:setCommsScript() and :setCommsFunction().
/// Example: stbo:setRestocksMissilesDocked(true)
/// Example: stbo:setRestocksMissilesDocked("Fighter")
REGISTER_SCRIPT_CLASS_FUNCTION(ShipTemplateBasedObject, setRestocksMissilesDocked);
/// Returns this STBO's long-range radar range.
/// Example: stbo:getLongRangeRadarRange()
Expand Down Expand Up @@ -196,6 +198,7 @@ ShipTemplateBasedObject::ShipTemplateBasedObject(float collision_range, string m

long_range_radar_range = 30000.0f;
short_range_radar_range = 5000.0f;
restocks_missiles_docked = R_None;

registerMemberReplication(&template_name);
registerMemberReplication(&type_name);
Expand Down Expand Up @@ -346,6 +349,29 @@ std::unordered_map<string, string> ShipTemplateBasedObject::getGMInfo()
return ret;
}

bool ShipTemplateBasedObject::canRestockMissiles(P<SpaceShip> receiver) {
switch (restocks_missiles_docked) {
case R_None:
return false;
case R_All:
return true;
case R_CpuShips:
if (P<CpuShip>(receiver))
return true;
else
return false;
case R_PlayerShips:
if (P<PlayerSpaceship>(receiver))
return true;
else
return false;
case R_Fighters:
// assume that internal docking ships are fighters
return (canBeDockedBy(receiver) == DockStyle::Internal);
}
return false;
}

bool ShipTemplateBasedObject::hasShield()
{
for(int n=0; n<shield_count; n++)
Expand Down
10 changes: 6 additions & 4 deletions src/spaceObjects/shipTemplateBasedObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
#include "spaceObject.h"
#include "shipTemplate.h"

class SpaceShip;

/**
An object which is based on a ship template. Contains generic behaviour for:
* Hull damage
Expand Down Expand Up @@ -34,7 +36,7 @@ class ShipTemplateBasedObject : public SpaceObject, public Updatable
bool shares_energy_with_docked; //[config]
bool repair_docked; //[config]
bool restocks_scan_probes;
bool restocks_missiles_docked; //only restocks cpuships; playerships should use comms
ERestockMissileBehaviour restocks_missiles_docked;

ScriptSimpleCallback on_destruction;
ScriptSimpleCallback on_taking_damage;
Expand All @@ -46,7 +48,7 @@ class ShipTemplateBasedObject : public SpaceObject, public Updatable
virtual void update(float delta) override;

virtual std::unordered_map<string, string> getGMInfo() override;
virtual bool canRestockMissiles() override { return restocks_missiles_docked; }
bool canRestockMissiles(P<SpaceShip> receiver);
virtual bool canBeTargetedBy(P<SpaceObject> other) override { return true; }
virtual bool hasShield() override;
virtual string getCallSign() override { return callsign; }
Expand Down Expand Up @@ -107,8 +109,8 @@ class ShipTemplateBasedObject : public SpaceObject, public Updatable
void setRepairDocked(bool enabled) { repair_docked = enabled; }
bool getRestocksScanProbes() { return restocks_scan_probes; }
void setRestocksScanProbes(bool enabled) { restocks_scan_probes = enabled; }
bool getRestocksMissilesDocked() { return restocks_missiles_docked; }
void setRestocksMissilesDocked(bool enabled) { restocks_missiles_docked = enabled; }
ERestockMissileBehaviour getRestocksMissilesDocked() { return restocks_missiles_docked; }
void setRestocksMissilesDocked(ERestockMissileBehaviour behaviour) { restocks_missiles_docked = behaviour; }

void onTakingDamage(ScriptSimpleCallback callback);
void onDestruction(ScriptSimpleCallback callback);
Expand Down
1 change: 0 additions & 1 deletion src/spaceObjects/spaceObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,6 @@ class SpaceObject : public Collisionable, public MultiplayerObject
virtual string getCallSign() { return callsign; }
virtual DockStyle canBeDockedBy(P<SpaceObject> obj) { return DockStyle::None; }
virtual DockStyle getDockedStyle() { return DockStyle::None; }
virtual bool canRestockMissiles() { return false; }
virtual bool hasShield() { return false; }
virtual bool canHideInNebula() { return true; }
virtual bool canBeTargetedBy(P<SpaceObject> other);
Expand Down
2 changes: 1 addition & 1 deletion src/spaceObjects/spaceStation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ SpaceStation::SpaceStation()
: ShipTemplateBasedObject(300, "SpaceStation")
{
restocks_scan_probes = true;
restocks_missiles_docked = true;
restocks_missiles_docked = R_CpuShips;
comms_script_name = "comms_station.lua";
setRadarSignatureInfo(0.2, 0.5, 0.5);

Expand Down
Loading