summaryrefslogtreecommitdiffhomepage
path: root/Stars45/CombatUnit.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 /Stars45/CombatUnit.cpp
parent8f353abd0bfe18baddd8a8250ab7c4f2d1c83a6e (diff)
downloadstarshatter-3c487c5cd69c53d6fea948643c0a76df03516605.zip
starshatter-3c487c5cd69c53d6fea948643c0a76df03516605.tar.gz
starshatter-3c487c5cd69c53d6fea948643c0a76df03516605.tar.bz2
Moved Stars45 to StarsEx
Diffstat (limited to 'Stars45/CombatUnit.cpp')
-rw-r--r--Stars45/CombatUnit.cpp384
1 files changed, 0 insertions, 384 deletions
diff --git a/Stars45/CombatUnit.cpp b/Stars45/CombatUnit.cpp
deleted file mode 100644
index b7af000..0000000
--- a/Stars45/CombatUnit.cpp
+++ /dev/null
@@ -1,384 +0,0 @@
-/* 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
- ========
- A ship, station, or ground unit in the dynamic campaign.
-*/
-
-#include "CombatUnit.h"
-#include "CombatGroup.h"
-#include "Campaign.h"
-#include "ShipDesign.h"
-#include "Ship.h"
-
-#include "Game.h"
-#include "ContentBundle.h"
-
-// +----------------------------------------------------------------------+
-#undef random
-inline double random() { return (double) rand() / (double) RAND_MAX; }
-
-// +----------------------------------------------------------------------+
-
-CombatUnit::CombatUnit(const char* n, const char* reg, int t, const char* d, int c, int i)
-: name(n), regnum(reg), type(t), design_name(d), design(0),
-count(c), iff(i), leader(false), dead_count(0), available(c),
-carrier(0), plan_value(0), launch_time(-1e6), jump_time(0),
-sustained_damage(0), target(0), group(0), heading(0)
-{ }
-
-CombatUnit::CombatUnit(const CombatUnit& u)
-: name(u.name), regnum(u.regnum), type(u.type), design_name(u.design_name),
-design(u.design), count(u.count), iff(u.iff),
-dead_count(u.dead_count), available(u.available),
-leader(u.leader), region(u.region), location(u.location),
-carrier(u.carrier), plan_value(0), launch_time(u.launch_time),
-jump_time(u.jump_time), sustained_damage(u.sustained_damage),
-target(0), group(0), heading(u.heading)
-{ }
-
-// +----------------------------------------------------------------------+
-
-const ShipDesign*
-CombatUnit::GetDesign()
-{
- if (!design)
- design = ShipDesign::Get(design_name);
-
- return design;
-}
-
-int
-CombatUnit::GetShipClass() const
-{
- if (design)
- return design->type;
-
- return type;
-}
-
-int
-CombatUnit::GetValue() const
-{
- return GetSingleValue() * LiveCount();
-}
-
-int
-CombatUnit::GetSingleValue() const
-{
- return Ship::Value(GetShipClass());
-}
-
-// +----------------------------------------------------------------------+
-
-const char*
-CombatUnit::GetDescription() const
-{
- if (!design) {
- CombatUnit* pThis = (CombatUnit*) this; // cast-away const
- pThis->GetDesign();
- }
-
- static char desc[256];
-
- if (!design) {
- strcpy_s(desc, ContentBundle::GetInstance()->GetText("[unknown]").data());
- }
-
- else if (count > 1) {
- sprintf_s(desc, "%dx %s %s", LiveCount(), design->abrv, design->DisplayName());
- }
-
- else {
- if (regnum.length() > 0)
- sprintf_s(desc, "%s-%s %s", design->abrv, (const char*) regnum, (const char*) name);
- else
- sprintf_s(desc, "%s %s", design->abrv, (const char*) name);
-
- if (dead_count > 0) {
- strcat_s(desc, " ");
- strcat_s(desc, ContentBundle::GetInstance()->GetText("killed.in.action"));
- }
- }
-
- return desc;
-}
-
-// +----------------------------------------------------------------------+
-
-bool
-CombatUnit::CanLaunch() const
-{
- bool result = false;
-
- switch (type) {
- case Ship::FIGHTER:
- case Ship::ATTACK: result = (Campaign::Stardate() - launch_time) >= 300;
- break;
-
- case Ship::CORVETTE:
- case Ship::FRIGATE:
- case Ship::DESTROYER:
- case Ship::CRUISER:
- case Ship::CARRIER: result = true;
- break;
- }
-
- return result;
-}
-
-// +----------------------------------------------------------------------+
-
-Color
-CombatUnit::MarkerColor() const
-{
- return Ship::IFFColor(iff);
-}
-
-bool
-CombatUnit::IsGroundUnit() const
-{
- return (design && (design->type & Ship::GROUND_UNITS)) ? true : false;
-}
-
-bool
-CombatUnit::IsStarship() const
-{
- return (design && (design->type & Ship::STARSHIPS)) ? true : false;
-}
-
-bool
-CombatUnit::IsDropship() const
-{
- return (design && (design->type & Ship::DROPSHIPS)) ? true : false;
-}
-
-bool
-CombatUnit::IsStatic() const
-{
- return design && (design->type >= Ship::STATION);
-}
-
-// +----------------------------------------------------------------------+
-
-double
-CombatUnit::MaxRange() const
-{
- return 100e3;
-}
-
-double CombatUnit::MaxEffectiveRange() const
-{
- return 50e3;
-}
-
-double CombatUnit::OptimumRange() const
-{
- if (type == Ship::FIGHTER || type == Ship::ATTACK)
- return 15e3;
-
- return 30e3;
-}
-
-// +----------------------------------------------------------------------+
-
-bool CombatUnit::CanDefend(CombatUnit* unit) const
-{
- if (unit == 0 || unit == this)
- return false;
-
- if (type > Ship::STATION)
- return false;
-
- double distance = (location - unit->location).length();
-
- if (type > unit->type)
- return false;
-
- if (distance > MaxRange())
- return false;
-
- return true;
-}
-
-// +----------------------------------------------------------------------+
-
-double CombatUnit::PowerVersus(CombatUnit* tgt) const
-{
- if (tgt == 0 || tgt == this || available < 1)
- return 0;
-
- if (type > Ship::STATION)
- return 0;
-
- double effectiveness = 1;
- double distance = (location - tgt->location).length();
-
- if (distance > MaxRange())
- return 0;
-
- if (distance > MaxEffectiveRange())
- effectiveness = 0.5;
-
- if (type == Ship::FIGHTER) {
- if (tgt->type == Ship::FIGHTER || tgt->type == Ship::ATTACK)
- return Ship::FIGHTER * 2 * available * effectiveness;
- else
- return 0;
- }
- else if (type == Ship::ATTACK) {
- if (tgt->type > Ship::ATTACK)
- return Ship::ATTACK * 3 * available * effectiveness;
- else
- return 0;
- }
- else if (type == Ship::CARRIER) {
- return 0;
- }
- else if (type == Ship::SWACS) {
- return 0;
- }
- else if (type == Ship::CRUISER) {
- if (tgt->type <= Ship::ATTACK)
- return type * effectiveness;
-
- else
- return 0;
- }
- else {
- if (tgt->type > Ship::ATTACK)
- return type * effectiveness;
- else
- return type * 0.1 * effectiveness;
- }
-
- return 0;
-}
-
-// +----------------------------------------------------------------------+
-
-int
-CombatUnit::AssignMission()
-{
- int assign = count;
-
- if (count > 4)
- assign = 4;
-
- if (assign > 0) {
- available -= assign;
- launch_time = Campaign::Stardate();
- return assign;
- }
-
- return 0;
-}
-
-// +----------------------------------------------------------------------+
-
-void
-CombatUnit::CompleteMission()
-{
- Disengage();
-
- if (count > 4)
- available += 4;
-
- else
- available += count;
-}
-
-// +----------------------------------------------------------------------+
-
-void
-CombatUnit::MoveTo(const Point& loc)
-{
- if (!carrier)
- location = loc;
- else
- location = carrier->location;
-}
-
-// +----------------------------------------------------------------------+
-
-void
-CombatUnit::Engage(CombatUnit* tgt)
-{
- if (!tgt)
- Disengage();
-
- else if (!tgt->attackers.contains(this))
- tgt->attackers.append(this);
-
- target = tgt;
-}
-
-void
-CombatUnit::Disengage()
-{
- if (target)
- target->attackers.remove(this);
-
- target = 0;
-}
-
-// +----------------------------------------------------------------------+
-
-static int KillGroup(CombatGroup* group)
-{
- int value_killed = 0;
-
- if (group) {
- ListIter<CombatUnit> u_iter = group->GetUnits();
- while (++u_iter) {
- CombatUnit* u = u_iter.value();
- value_killed += u->Kill(u->LiveCount());
- }
-
- ListIter<CombatGroup> g_iter = group->GetComponents();
- while (++g_iter) {
- CombatGroup* g = g_iter.value();
- value_killed += KillGroup(g);
- }
- }
-
- return value_killed;
-}
-
-int
-CombatUnit::Kill(int n)
-{
- int killed = n;
-
- if (killed > LiveCount())
- killed = LiveCount();
-
- dead_count += killed;
-
- int value_killed = killed * GetSingleValue();
-
- if (killed) {
- // if unit could support children, kill them too:
- if (type == Ship::CARRIER ||
- type == Ship::STATION ||
- type == Ship::STARBASE) {
-
- if (group) {
- ListIter<CombatGroup> iter = group->GetComponents();
- while (++iter) {
- CombatGroup* g = iter.value();
- value_killed += KillGroup(g);
- }
- }
- }
- }
-
- return value_killed;
-}
-