summaryrefslogtreecommitdiffhomepage
path: root/StarsEx/Drone.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/Drone.cpp
parent8f353abd0bfe18baddd8a8250ab7c4f2d1c83a6e (diff)
downloadstarshatter-3c487c5cd69c53d6fea948643c0a76df03516605.zip
starshatter-3c487c5cd69c53d6fea948643c0a76df03516605.tar.gz
starshatter-3c487c5cd69c53d6fea948643c0a76df03516605.tar.bz2
Moved Stars45 to StarsEx
Diffstat (limited to 'StarsEx/Drone.cpp')
-rw-r--r--StarsEx/Drone.cpp194
1 files changed, 194 insertions, 0 deletions
diff --git a/StarsEx/Drone.cpp b/StarsEx/Drone.cpp
new file mode 100644
index 0000000..b568987
--- /dev/null
+++ b/StarsEx/Drone.cpp
@@ -0,0 +1,194 @@
+/* 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
+ ========
+ Laser and Missile class
+*/
+
+#include "Drone.h"
+#include "Weapon.h"
+#include "Ship.h"
+#include "Sim.h"
+#include "Explosion.h"
+
+#include "Clock.h"
+#include "Bolt.h"
+#include "Sprite.h"
+#include "Solid.h"
+#include "Light.h"
+#include "Bitmap.h"
+#include "DataLoader.h"
+#include "Sound.h"
+
+// +--------------------------------------------------------------------+
+
+Drone::Drone(const Point& pos, const Camera& shot_cam, WeaponDesign* dsn, const Ship* ship)
+ : Shot(pos, shot_cam, dsn, ship),
+ decoy_type(0), iff_code(0)
+{
+ obj_type = SimObject::SIM_DRONE;
+
+ if (dsn) {
+ decoy_type = dsn->decoy_type;
+ probe = dsn->probe;
+ integrity = dsn->integrity;
+ sprintf_s(name, "Drone %04d", Identity());
+ }
+}
+
+// +--------------------------------------------------------------------+
+
+Drone::~Drone()
+{
+}
+
+// +--------------------------------------------------------------------+
+
+void
+Drone::SeekTarget(SimObject* target, System* sub)
+{
+ if (!probe)
+ Shot::SeekTarget(target, sub);
+}
+
+// +--------------------------------------------------------------------+
+
+void
+Drone::ExecFrame(double seconds)
+{
+ Shot::ExecFrame(seconds);
+}
+
+// +--------------------------------------------------------------------+
+
+void
+Drone::Disarm()
+{
+ Shot::Disarm();
+}
+
+// +--------------------------------------------------------------------+
+
+void
+Drone::Destroy()
+{
+ Shot::Destroy();
+}
+
+// +--------------------------------------------------------------------+
+
+double
+Drone::PCS() const
+{
+ if (decoy_type == 0 && !probe)
+ return 10e3;
+
+ return 0;
+}
+
+double
+Drone::ACS() const
+{
+ if (decoy_type == 0 && !probe)
+ return 1e3;
+
+ return 0;
+}
+
+// +--------------------------------------------------------------------+
+
+const char*
+Drone::ClassName() const
+{
+ return Ship::ClassName(decoy_type);
+}
+
+int
+Drone::Class() const
+{
+ return decoy_type;
+}
+
+// +--------------------------------------------------------------------+
+
+int
+Drone::HitBy(Shot* shot, Point& impact)
+{
+ if (life == 0 || !shot->IsArmed()) return 0;
+
+ const int HIT_NOTHING = 0;
+ const int HIT_HULL = 1;
+
+ Point hull_impact;
+ int hit_type = HIT_NOTHING;
+ Point shot_loc = shot->Location();
+ Point shot_org = shot->Origin();
+ Point delta = shot_loc - Location();
+ double dlen = delta.length();
+ double dscale = 1;
+ float scale = design->explosion_scale;
+ Sim* sim = Sim::GetSim();
+
+ if (scale <= 0)
+ scale = design->scale;
+
+ // MISSILE PROCESSING ------------------------------------------------
+
+ if (shot->IsMissile()) {
+ if (dlen < 10 * Radius()) {
+ hull_impact = impact = shot_loc;
+ sim->CreateExplosion(impact, Velocity(), Explosion::HULL_FLASH, 0.3f * scale, scale, region);
+ sim->CreateExplosion(impact, Point(), Explosion::SHOT_BLAST, 2.0f, scale, region);
+ hit_type = HIT_HULL;
+ }
+ }
+
+ // ENERGY WEP PROCESSING ---------------------------------------------
+
+ else {
+ if (shot->IsBeam()) {
+ // check right angle spherical distance:
+ Point d0 = Location() - shot_org;
+ Point w = shot_loc - shot_org; w.Normalize();
+ Point test = shot_org + w * (d0 * w);
+ Point d1 = test - Location();
+ double dlen = d1.length(); // distance of point from line
+
+ if (dlen < 2*Radius()) {
+ hull_impact = impact = test;
+ shot->SetBeamPoints(shot_org, impact);
+ sim->CreateExplosion(impact, Velocity(), Explosion::BEAM_FLASH, 0.30f * scale, scale, region);
+ hit_type = HIT_HULL;
+ }
+ }
+ else if (dlen < 2*Radius()) {
+ hull_impact = impact = shot_loc;
+ sim->CreateExplosion(impact, Velocity(), Explosion::HULL_FLASH, 0.30f * scale, scale, region);
+ hit_type = HIT_HULL;
+ }
+ }
+
+ // DAMAGE RESOLUTION -------------------------------------------------
+
+ if (hit_type != HIT_NOTHING) {
+ double effective_damage = shot->Damage() * dscale;
+
+ if (shot->IsBeam()) {
+ effective_damage *= Clock::GetInstance()->Delta();
+ }
+ else {
+ ApplyTorque(shot->Velocity() * (float) effective_damage * 1e-6f);
+ }
+
+ if (effective_damage > 0)
+ Physical::InflictDamage(effective_damage);
+ }
+
+ return hit_type;
+}