//**************************************************************
// ALBATROSS GUNSHIP FLIER
//**************************************************************
//**************************************************************
// VEHICLE CHARACTERISTICS
//**************************************************************

datablock FlyingVehicleData(AlbatrossFlyer) : HavocDamageProfile
{
   spawnOffset = "0 0 6";
   renderWhenDestroyed = false;

   catagory = "Vehicles";
   shapeFile = "vehicle_air_hapc.dts";
   multipassenger = true;
   computeCRC = true;


   debrisShapeName = "vehicle_air_hapc_debris.dts";
   debris = ShapeDebris;

   drag = 0.2;
   density = 1.0;

   mountPose[0] = sitting;
//   mountPose[1] = sitting;
   numMountPoints = 2;
   isProtectedMountPoint[0] = true;
   isProtectedMountPoint[1] = true;
   isProtectedMountPoint[2] = true;
   isProtectedMountPoint[3] = true;
   isProtectedMountPoint[4] = true;
   isProtectedMountPoint[5] = true;

   cameraMaxDist = 17;
   cameraOffset = 2;
   cameraLag = 8.5;
   explosion = LargeAirVehicleExplosion;
	explosionDamage = 0.5;
	explosionRadius = 5.0;

   maxDamage = 3.00;
   destroyedLevel = 3.00;

   isShielded = true;
   rechargeRate = 1.2;
   energyPerDamagePoint = 200;
   maxEnergy = 500;
   minDrag = 100;                // Linear Drag
   rotationalDrag = 2700;        // Anguler Drag

   // Auto stabilize speed
   maxAutoSpeed = 10;
   autoAngularForce = 3000;      // Angular stabilizer force
   autoLinearForce = 450;        // Linear stabilzer force
   autoInputDamping = 0.95;      // 
                                                        
   // Maneuvering
   maxSteeringAngle = 8;
   horizontalSurfaceForce = 10;  // Horizontal center "wing"
   verticalSurfaceForce = 10;    // Vertical center "wing"
   maneuveringForce = 8000;      // Horizontal jets
   steeringForce = 1500;          // Steering jets
   steeringRollForce = 400;      // Steering jets
   rollForce = 12;               // Auto-roll
   hoverHeight = 8;         // Height off the ground at rest
   createHoverHeight = 6;   // Height off the ground when created
   maxForwardSpeed = 80;  // speed in which forward thrust force is no longer applied (meters/second)

   // Turbo Jet
   jetForce = 7000;
   minJetEnergy = 55;
   jetEnergyDrain = 2.5;
   vertThrustMultiple = 3.0;


   dustEmitter = LargeVehicleLiftoffDustEmitter;
   triggerDustHeight = 4.0;
   dustHeight = 2.0;

   damageEmitter[0] = LightDamageSmoke;
   damageEmitter[1] = HeavyDamageSmoke;
   damageEmitter[2] = DamageBubbles;
   damageEmitterOffset[0] = "3.0 -3.0 0.0 ";
   damageEmitterOffset[1] = "-3.0 -3.0 0.0 ";
   damageLevelTolerance[0] = 0.3;
   damageLevelTolerance[1] = 0.7;
   numDmgEmitterAreas = 2;

   // Rigid body
   mass = 550;
   bodyFriction = 0;
   bodyRestitution = 0.3;
   minRollSpeed = 0;
   softImpactSpeed = 12;       // Sound hooks. This is the soft hit.
   hardImpactSpeed = 15;    // Sound hooks. This is the hard hit.

   // Ground Impact Damage (uses DamageType::Ground)
   minImpactSpeed = 25;      // If hit ground at speed above this then it's an impact. Meters/second
   speedDamageScale = 0.060;

   // Object Impact Damage (uses DamageType::Impact)
   collDamageThresholdVel = 28;
   collDamageMultiplier   = 0.020;

   //
   minTrailSpeed = 15;
   trailEmitter = ContrailEmitter;
   forwardJetEmitter = FlyerJetEmitter;
   downJetEmitter = FlyerJetEmitter;

   //
   jetSound = HAPCFlyerThrustSound;
   engineSound = HAPCFlyerEngineSound;
   softImpactSound = SoftImpactSound;
   hardImpactSound = HardImpactSound;
   //wheelImpactSound = WheelImpactSound;

   //
   softSplashSoundVelocity = 5.0; 
   mediumSplashSoundVelocity = 8.0;   
   hardSplashSoundVelocity = 12.0;   
   exitSplashSoundVelocity = 8.0;
   
   exitingWater      = VehicleExitWaterHardSound;
   impactWaterEasy   = VehicleImpactWaterSoftSound;
   impactWaterMedium = VehicleImpactWaterMediumSound;
   impactWaterHard   = VehicleImpactWaterHardSound;
   waterWakeSound    = VehicleWakeHardSplashSound; 
   
   minMountDist = 4;

   splashEmitter[0] = VehicleFoamDropletsEmitter;
   splashEmitter[1] = VehicleFoamEmitter;

   shieldImpact = VehicleShieldImpact;

   cmdCategory = "Tactical";
   cmdIcon = CMDFlyingHAPCIcon;
   cmdMiniIconName = "commander/MiniIcons/com_hapc_grey";
   targetNameTag = 'Albatross';
   targetTypeTag = 'Gunship';
   sensorData = VehiclePulseSensor;

   checkRadius = 7.8115;
   observeParameters = "1 15 15";

   stuckTimerTicks = 32;   // If the hapc spends more than 1 sec in contact with something
   stuckTimerAngle = 80;   //  with a > 80 deg. pitch, BOOM!

   shieldEffectScale = "1.0 0.9375 0.45";
};

function AlbatrossFlyer::hasDismountOverrides(%data, %obj)
{
   return true;
}

function AlbatrossFlyer::getDismountOverride(%data, %obj, %mounted)
{
   %node = -1;
   for (%i = 0; %i < %data.numMountPoints; %i++)
   {
      if (%obj.getMountNodeObject(%i) == %mounted)
      {
         %node = %i;
         break;
      }
   }
   if (%node == -1)
   {
      warning("Couldn't find object mount point");
      return "0 0 1";
   }

   if (%node == 3 || %node == 2)
   {
      return "-1 0 1";
   }
   else if (%node == 5 || %node == 4)
   {
      return "1 0 1";
   }
   else
   {
      return "0 0 1";
   }
}

//**************************************************************
// WEAPONS
//**************************************************************
function AlbatrossFlyer::onDamage(%this, %obj)
{
   if(isObject(%obj.getMountNodeObject(10)))
      (%obj.getMountNodeObject(10)).setDamagelevel(%obj.getDamageLevel());
   if(isObject(%obj.getMountNodeObject(2)))
      (%obj.getMountNodeObject(2)).setDamagelevel(%obj.getDamageLevel());
   if(isObject(%obj.getMountNodeObject(3)))
      (%obj.getMountNodeObject(2)).setDamagelevel(%obj.getDamageLevel());
   if(isObject(%obj.getMountNodeObject(4)))
      (%obj.getMountNodeObject(4)).setDamagelevel(%obj.getDamageLevel());
   if(isObject(%obj.getMountNodeObject(5)))
      (%obj.getMountNodeObject(5)).setDamagelevel(%obj.getDamageLevel());
   Parent::onDamage(%this, %obj);
}
function AlbatrossFlyer::onDelete(%this, %obj)
{
   if(%obj.turret1Object)
      if(%obj.turret1Object.getControllingClient())
         %obj.turret1Object.getDataBlock().playerDismount(%obj.turret1Object);
   if(%obj.turret2Object)
      if(%obj.turret2Object.getControllingClient())
         %obj.turret2Object.getDataBlock().playerDismount(%obj.turret2Object);
   if(%obj.turret3Object)
      if(%obj.turret3Object.getControllingClient())
         %obj.turret3Object.getDataBlock().playerDismount(%obj.turret3Object);
   if(%obj.turret4Object)
      if(%obj.turret4Object.getControllingClient())
         %obj.turret4Object.getDataBlock().playerDismount(%obj.turret4Object);

   if(isObject(%obj.getMountNodeObject(2))) {
      if (%obj.getMountNodeObject(2).getMountedImage(0))
         (%obj.getMountNodeObject(2)).unmountImage(0);
      (%obj.getMountNodeObject(2)).schedule(200, "delete");
   }
   if(isObject(%obj.getMountNodeObject(3))) {
      if (%obj.getMountNodeObject(3).getMountedImage(0))
         (%obj.getMountNodeObject(3)).unmountImage(0);
      (%obj.getMountNodeObject(3)).schedule(200, "delete");
   }
   if(isObject(%obj.getMountNodeObject(4))) {
      if (%obj.getMountNodeObject(4).getMountedImage(0))
         (%obj.getMountNodeObject(4)).unmountImage(0);
      (%obj.getMountNodeObject(4)).schedule(200, "delete");
   }
   if(isObject(%obj.getMountNodeObject(5))) {
      if (%obj.getMountNodeObject(5).getMountedImage(0))
         (%obj.getMountNodeObject(5)).unmountImage(0);
      (%obj.getMountNodeObject(5)).schedule(200, "delete");
   }
}
function AlbatrossFlyer::onDestroyed(%this, %obj, %prevState)
{
   AlbatrossFlyer::onDelete(%this, %obj);
   Parent::onDestroyed(%this, %obj, %prevState);
}

function AlbatrossFlyer::onAdd(%this, %obj)
{
   Parent::onAdd(%this, %obj);
   %obj.schedule(6000, "playThread", $ActivateThread, "activate");

//TURRET1
   %turret = new turret() {
                  scale = "1 1 1";
                  dataBlock = "EagleTurretBase";
                  lockCount = "0";
                  homingCount = "0";
                  team = %obj.team;
                  offset = "0 0 1";
                  nametag = "Albatross Plasma";
               };     
   MissionCleanup.add(%turret);
   %turret.team = %obj.teamBought;
   %turret.selectedWeapon = 1;
   %turret.setSelfPowered();
   %turret.playThread($PowerThread,"Power");
   %obj.turret1Object = %turret;
   %obj.mountObject(%turret, 2);
   %turret.mountImage(EagleBarrelLarge,0,false);
   %turret.vehicleMounted = %obj;
   %turret.setAutoFire(true);

   // setup the turret's target info
   setTargetSensorGroup(%turret.getTarget(), %turret.team);
   setTargetNeverVisMask(%turret.getTarget(), 0xffffffff);

//TURRET2
   %turret = new turret() {
                  scale = "1 1 1";
                  dataBlock = "EagleTurretBase";
                  lockCount = "0";
                  homingCount = "0";
                  team = %obj.team;
                  offset = "0 0 1";
                  nametag = "Albatross Ion";
               };     
   MissionCleanup.add(%turret);
   %turret.team = %obj.teamBought;
   %turret.selectedWeapon = 1;
   %turret.setSelfPowered();
   %turret.playThread($PowerThread,"Power");
   %obj.turret2Object = %turret;
   %obj.mountObject(%turret, 3);
   %turret.mountImage(IonBarrelLarge,0,false);
   %turret.vehicleMounted = %obj;
   %turret.setAutoFire(true);

   // setup the turret's target info
   setTargetSensorGroup(%turret.getTarget(), %turret.team);
   setTargetNeverVisMask(%turret.getTarget(), 0xffffffff);

//TURRET3
   %turret = new turret() {
                  scale = "1 1 1";
                  dataBlock = "EagleTurretBase";
                  lockCount = "0";
                  homingCount = "0";
                  team = %obj.team;
                  offset = "0 0 1";
                  nametag = "Albatross Ion";
               };     
   MissionCleanup.add(%turret);
   %turret.team = %obj.teamBought;
   %turret.selectedWeapon = 1;
   %turret.setSelfPowered();
   %turret.playThread($PowerThread,"Power");
   %obj.turret3Object = %turret;
   %obj.mountObject(%turret, 4);
   %turret.mountImage(IonBarrelLarge,0,false);
   %turret.vehicleMounted = %obj;
   %turret.setAutoFire(true);

   // setup the turret's target info
   setTargetSensorGroup(%turret.getTarget(), %turret.team);
   setTargetNeverVisMask(%turret.getTarget(), 0xffffffff);

//TURRET4
   %turret = new turret() {
                  scale = "1 1 1";
                  dataBlock = "EagleTurretBase";
                  lockCount = "0";
                  homingCount = "0";
                  team = %obj.team;
                  offset = "0 0 1";
                  nametag = "Albatross Plasma";
               };     
   MissionCleanup.add(%turret);
   %turret.team = %obj.teamBought;
   %turret.selectedWeapon = 1;
   %turret.setSelfPowered();
   %turret.playThread($PowerThread,"Power");
   %obj.turret4Object = %turret;
   %obj.mountObject(%turret, 5);
   %turret.mountImage(EagleBarrelLarge,0,false);
   %turret.vehicleMounted = %obj;
   %turret.setAutoFire(true);

   // setup the turret's target info
   setTargetSensorGroup(%turret.getTarget(), %turret.team);
   setTargetNeverVisMask(%turret.getTarget(), 0xffffffff);


}

function AlbatrossFlyer::playerMounted(%data, %obj, %player, %node)
{
   if(%node == 0) {
      // pilot position
	   commandToClient(%player.client, 'setHudMode', 'Pilot', "HAPC", %node);
   }
   else {
      // all others
	   commandToClient(%player.client, 'setHudMode', 'Passenger', "HAPC", %node);
   }
   // build a space-separated string representing passengers
   // 0 = no passenger; 1 = passenger (e.g. "1 0 0 1 1 0 ")
   %passString = buildPassengerString(%obj);
	// send the string of passengers to all mounted players
	for(%i = 0; %i < %data.numMountPoints; %i++)
		if(%obj.getMountNodeObject(%i) > 0)
		   commandToClient(%obj.getMountNodeObject(%i).client, 'checkPassengers', %passString);

   // update observers who are following this guy...
   if( %player.client.observeCount > 0 )
      resetObserveFollow( %player.client, false );
}

