summaryrefslogtreecommitdiffhomepage
path: root/StarsEx/CampaignPlanMovement.cpp
diff options
context:
space:
mode:
authorAki <please@ignore.pl>2022-04-01 21:23:39 +0200
committerAki <please@ignore.pl>2022-04-01 21:23:39 +0200
commit3c487c5cd69c53d6fea948643c0a76df03516605 (patch)
tree72730c7b8b26a5ef8fc9a987ec4c16129efd5aac /StarsEx/CampaignPlanMovement.cpp
parent8f353abd0bfe18baddd8a8250ab7c4f2d1c83a6e (diff)
downloadstarshatter-3c487c5cd69c53d6fea948643c0a76df03516605.zip
starshatter-3c487c5cd69c53d6fea948643c0a76df03516605.tar.gz
starshatter-3c487c5cd69c53d6fea948643c0a76df03516605.tar.bz2
Moved Stars45 to StarsEx
Diffstat (limited to 'StarsEx/CampaignPlanMovement.cpp')
-rw-r--r--StarsEx/CampaignPlanMovement.cpp166
1 files changed, 166 insertions, 0 deletions
diff --git a/StarsEx/CampaignPlanMovement.cpp b/StarsEx/CampaignPlanMovement.cpp
new file mode 100644
index 0000000..8d692aa
--- /dev/null
+++ b/StarsEx/CampaignPlanMovement.cpp
@@ -0,0 +1,166 @@
+/* Starshatter: The Open Source Project
+ Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors
+ Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors
+ Copyright (c) 1997-2006, Destroyer Studios LLC.
+
+ AUTHOR: John DiCamillo
+
+
+ OVERVIEW
+ ========
+ CampaignPlanMovement simulates random patrol movements
+ of starship groups between missions.
+*/
+
+#include "CampaignPlanMovement.h"
+#include "Campaign.h"
+#include "Combatant.h"
+#include "CombatGroup.h"
+#include "CombatUnit.h"
+#include "CombatZone.h"
+#include "Random.h"
+#include "ShipDesign.h"
+
+// +--------------------------------------------------------------------+
+
+void
+CampaignPlanMovement::ExecFrame()
+{
+ if (campaign && campaign->IsActive()) {
+ if (Campaign::Stardate() - exec_time < 7200)
+ return;
+
+ campaign->GetAllCombatUnits(-1, all_units);
+
+ ListIter<CombatUnit> iter = all_units;
+ while (++iter) {
+ CombatUnit* u = iter.value();
+
+ if (u->IsStarship() && !u->IsStatic())
+ MoveUnit(u);
+ }
+
+ all_units.clear();
+
+ exec_time = Campaign::Stardate();
+ }
+}
+
+// +--------------------------------------------------------------------+
+
+void
+CampaignPlanMovement::MoveUnit(CombatUnit* u)
+{
+ if (u) {
+ // starship repair:
+ double damage = u->GetSustainedDamage();
+
+ if (damage > 0 && u->GetDesign()) {
+ int percent = (int) (100 * damage / u->GetDesign()->integrity);
+
+ if (percent > 50) {
+ u->SetSustainedDamage(0.90 * damage);
+ }
+ }
+
+ Point loc = u->Location();
+ Point dir = loc;
+ double dist = dir.Normalize();
+
+ const double MAX_RAD = 320e3;
+ const double MIN_DIST = 150e3;
+
+ if (dist < MAX_RAD) {
+ double scale = 1 - dist/MAX_RAD;
+
+ loc += dir * (Random(30e3, 90e3) * scale) + RandomDirection() * 10e3;
+
+ if (fabs(loc.z) > 20e3)
+ loc.z *= 0.1;
+
+ u->MoveTo(loc);
+
+ CombatGroup* g = u->GetCombatGroup();
+ if (g && g->Type() > CombatGroup::FLEET && g->GetFirstUnit() == u) {
+ g->MoveTo(loc);
+
+ if (g->IntelLevel() > Intel::KNOWN)
+ g->SetIntelLevel(Intel::KNOWN);
+ }
+ }
+
+ else if (dist > 1.25 * MAX_RAD) {
+ double scale = 1 - dist/MAX_RAD;
+
+ loc += dir * (Random(80e3, 120e3) * scale) + RandomDirection() * 3e3;
+
+ if (fabs(loc.z) > 20e3)
+ loc.z *= 0.1;
+
+ u->MoveTo(loc);
+
+ CombatGroup* g = u->GetCombatGroup();
+ if (g && g->Type() > CombatGroup::FLEET && g->GetFirstUnit() == u) {
+ g->MoveTo(loc);
+
+ if (g->IntelLevel() > Intel::KNOWN)
+ g->SetIntelLevel(Intel::KNOWN);
+ }
+ }
+
+ else {
+ loc += RandomDirection() * 30e3;
+
+ if (fabs(loc.z) > 20e3)
+ loc.z *= 0.1;
+
+ u->MoveTo(loc);
+
+ CombatGroup* g = u->GetCombatGroup();
+ if (g && g->Type() > CombatGroup::FLEET && g->GetFirstUnit() == u) {
+ g->MoveTo(loc);
+
+ if (g->IntelLevel() > Intel::KNOWN)
+ g->SetIntelLevel(Intel::KNOWN);
+ }
+ }
+
+ CombatUnit* closest_unit = 0;
+ double closest_dist = 1e6;
+
+ ListIter<CombatUnit> iter = all_units;
+ while (++iter) {
+ CombatUnit* unit = iter.value();
+
+ if (unit->GetCombatGroup() != u->GetCombatGroup() && unit->GetRegion() == u->GetRegion() && !unit->IsDropship()) {
+ Point delta = loc - unit->Location();
+ dist = delta.Normalize();
+
+ if (dist < closest_dist) {
+ closest_unit = unit;
+ closest_dist = dist;
+ }
+ }
+ }
+
+ if (closest_unit && closest_dist < MIN_DIST) {
+ Point delta = loc - closest_unit->Location();
+ dist = delta.Normalize();
+
+ loc += delta * 1.1 * (MIN_DIST - closest_dist);
+
+ if (fabs(loc.z) > 20e3)
+ loc.z *= 0.1;
+
+ u->MoveTo(loc);
+
+ CombatGroup* g = u->GetCombatGroup();
+ if (g && g->Type() > CombatGroup::FLEET && g->GetFirstUnit() == u) {
+ g->MoveTo(loc);
+
+ if (g->IntelLevel() > Intel::KNOWN)
+ g->SetIntelLevel(Intel::KNOWN);
+ }
+ }
+ }
+}