From e38ab774ed6a82e75069214c3169215b0b3638a9 Mon Sep 17 00:00:00 2001
From: Stijn Buys <ingar@osirion.org>
Date: Mon, 22 Dec 2014 22:45:38 +0000
Subject: Added 'wingmen recall' engine function to make wingmen dock at a
 player's carrier.

---
 src/game/base/game.cc | 40 +++++++++++++++++++++++++++++++---------
 src/game/base/npc.cc  | 25 ++++++++++++++++---------
 src/game/base/ship.h  |  2 +-
 3 files changed, 48 insertions(+), 19 deletions(-)

(limited to 'src/game/base')

diff --git a/src/game/base/game.cc b/src/game/base/game.cc
index 2ec3c62..e198d42 100644
--- a/src/game/base/game.cc
+++ b/src/game/base/game.cc
@@ -724,19 +724,41 @@ void Game::func_wingmen(core::Player *player, const std::string &args)
 				}
 			}
 		}
-	} else if (str.compare("combat") == 0) {
-		if (ship->has_autopilot_flag(Ship::AutoPilotCombat)) {			
+	} else if (str.compare("combat") == 0)
+	{
+		if (ship->has_autopilot_flag(Ship::AutoPilotCombat))
+		{
 			ship->unset_autopilot_flag(Ship::AutoPilotCombat);
-			player->send("Wingmen going into formation!");
-		} else {
+			player->send("^BWingmen going into formation!");
+		} else
+		{
 			ship->set_autopilot_flag(Ship::AutoPilotCombat);
-			player->send("Wingmen entering combat!");
+			player->send("^BWingmen entering combat!");
+		}
+		
+	} else if ((str.compare("recall") == 0) || (str.compare("laucnh") == 0))
+	{
+		if (ship->has_flag(core::Entity::Dockable)) {
+			if (ship->has_autopilot_flag(Ship::AutoPilotRecall))
+			{
+				ship->unset_autopilot_flag(Ship::AutoPilotRecall);
+				player->send("^BLaunching wingmen!");
+			} else
+			{
+				ship->set_autopilot_flag(Ship::AutoPilotRecall);
+				player->send("^BRecalling wingmen to dock!");
+				
+			}
+		} else
+		{
+			player->send("^WWingmen can't dock at your ship!");
 		}
-		
-		
-	} else {
+	} else 
+	{
 		player->send("Usage: wingmen add [faction label] [amount]");
-		player->send("       wingmen combat");
+		player->send("       wingmen combat   switch wingmen between formation flying and combat mode");
+		player->send("       wingmen recall   switched wingmend between docked and laucnhed");
+		player->send("       wingmen launch   alias for recall");
 	}
 }
 
diff --git a/src/game/base/npc.cc b/src/game/base/npc.cc
index f327f16..f9a600e 100644
--- a/src/game/base/npc.cc
+++ b/src/game/base/npc.cc
@@ -302,13 +302,12 @@ void NPC::frame(const unsigned long elapsed)
 							if (dock()->moduletype() == ship_enttype)
 							{
 								Ship *carrier = static_cast<Ship *>(dock());
+								set_location(carrier->location());
+								set_axis(carrier->axis());
 								if (zone() != carrier->zone())
 								{
 									set_zone(carrier->zone());
-								}
-								set_location(carrier->location());
-								set_axis(carrier->axis());
-								
+								}								
 								if (carrier->state() == core::Entity::Destroyed)
 								{
 									explode();
@@ -331,7 +330,7 @@ void NPC::frame(const unsigned long elapsed)
 								} else
 								{
 									npc_repair_timestamp = 0;
-									if (carrier->state() == core::Entity::Normal)
+									if ( (carrier->state() == core::Entity::Normal) && ((carrier != leader()) || !leader()->has_autopilot_flag(Ship::AutoPilotRecall)) )
 									{
 										launch();
 									}
@@ -341,7 +340,7 @@ void NPC::frame(const unsigned long elapsed)
 							}
 						}
 					} else {
-						if (leader()->has_flag(core::Entity::Dockable) && (health() < NPC_REPAIR_WIMPY))
+						if (leader()->has_flag(core::Entity::Dockable) && ((health() < NPC_REPAIR_WIMPY) || leader()->has_autopilot_flag(Ship::AutoPilotRecall)) )
 						{
 							set_autopilot_target(leader());
 							
@@ -382,10 +381,18 @@ void NPC::frame(const unsigned long elapsed)
 				}
 				
 			} else {
-				
 				// leader is not in this zone
-				if (!autopilot_target()) {
-					
+				if ((state() == core::Entity::Docked) && (dock()) && (dock()->moduletype() == ship_enttype))
+				{
+					Ship *carrier = static_cast<Ship *>(dock());
+					set_location(carrier->location());
+					set_axis(carrier->axis());
+					if (zone() != carrier->zone())
+					{
+						set_zone(carrier->zone());
+					}
+				} else if (!autopilot_target()) 
+				{
 					target_direction = 0;
 					target_pitch = 0;
 					target_roll = 0;
diff --git a/src/game/base/ship.h b/src/game/base/ship.h
index db41ba0..eba2b2a 100644
--- a/src/game/base/ship.h
+++ b/src/game/base/ship.h
@@ -29,7 +29,7 @@ const float 		COMBAT_DISTANCE = 100.0f;
 class Ship : public core::EntityControlable
 {
 public:
-	enum AutoPilotFlags { AutoPilotDisabled = 0, AutoPilotEnabled = 1, AutoPilotDock = 2, AutoPilotFormation = 4, AutoPilotCombat = 8 };
+	enum AutoPilotFlags { AutoPilotDisabled = 0, AutoPilotEnabled = 1, AutoPilotDock = 2, AutoPilotFormation = 4, AutoPilotCombat = 8, AutoPilotRecall = 16 };
 	
 	Ship(core::Player *owner, const ShipModel *shipmodel);
 	~Ship();
-- 
cgit v1.2.3