// Escape Pod Pack

datablock AudioProfile(EscapePodChargeSound) {
	filename = "fx/misc/cannonstart.wav";
	description = AudioDefault3d;
	preload = true;
};

datablock AudioProfile(EscapePodBeepSound) {
	filename = "fx/misc/warning_beep.wav";
	description = AudioClosest3d;
	preload = true;
};

datablock AudioProfile(EscapePodLaunchSound) {
	filename = "fx/Bonuses/high-level4-blazing.wav";
	description = AudioBIGExplosion3d;
	preload = true;
};

datablock AudioProfile(EscapePodLaunchSound2) {
	filename = "fx/Bonuses/down_passback3_rocket.wav";
	description = AudioBIGExplosion3d;
	preload = true;
};

datablock AudioProfile(EscapePodReloadSound) {
	filename = "fx/powered/turret_heavy_reload.wav";
	description = AudioClose3d;
	preload = true;
};

datablock AudioProfile(EscapePodFadeSound) {
	filename = "fx/Bonuses/upward_perppass2_quark.wav";
	description = AudioClose3d;
	preload = true;
};

datablock StaticShapeData(DeployedEscapePod) : StaticShapeDamageProfile {
	className = "escapepod";
	shapeFile = "TR2weapon_mortar.dts";

	maxDamage      = 1;
	destroyedLevel = 1;
	disabledLevel  = 1;

	isShielded = true;
	energyPerDamagePoint = 75;
	maxEnergy = 50;
	rechargeRate = 0.35;

	explosion    = ShapeExplosion;
	expDmgRadius = 8.0;
	expDamage    = 0.4;
	expImpulse   = 1500;

	dynamicType = $TypeMasks::StaticShapeObjectType;
	deployedObject = true;
	cmdCategory = "DSupport";
	cmdIcon = CMDSensorIcon;
	cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
	targetNameTag = 'Deployed';
	targetTypeTag = 'Escape Pod';
	deployAmbientThread = false;
	debrisShapeName = "debris_generic.dts";
	debris = DeployableDebris;
	heatSignature = 1;
	emap = true;
};

datablock ShapeBaseImageData(EscapePodDeployableImage) {
	mass = 20;
	emap = true;
	shapeFile = "stackable1s.dts";
	item = EscapePodDeployable;
	mountPoint = 1;
	offset = "0 0 0";
	deployed = DeployedEscapePod;
	heatSignature = 0;

	stateName[0] = "Idle";
	stateTransitionOnTriggerDown[0] = "Activate";

	stateName[1] = "Activate";
	stateScript[1] = "onActivate";
	stateTransitionOnTriggerUp[1] = "Idle";

	isLarge = true;
	maxDepSlope = 360;
	deploySound = ItemPickupSound;

	minDeployDis = 0.25;
	maxDeployDis = 5;
};

datablock ItemData(EscapePodDeployable) {
	className = Pack;
	catagory = "Deployables";
	shapeFile = "stackable1s.dts";
	mass = 5.0;
	elasticity = 0.2;
	friction = 0.6;
	pickupRadius = 3;
	rotate = true;
	image = "EscapePodDeployableImage";
	pickUpName = "an escape pod pack";
	heatSignature = 0;
	emap = true;
};

function EscapePodDeployableImage::testNoTerrainFound(%item) {
	// don't check this for non-Landspike turret deployables
}

function EscapePodDeployable::onPickup(%this, %obj, %shape, %amount) {
	// created to prevent console errors
}

function EscapePodDeployableImage::onDeploy(%item, %plyr, %slot) {
	%className = "StaticShape";

	%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");

	if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
		%item.surfaceNrm2 = %playerVector;
	else
		%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));

	%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);

	%deplObj = new (%className)() {
		dataBlock = DeployedEscapePod;
		scale = "4 6 4"; // L/R - F/B - T/B
		impulse = $packSetting["escapepod",%plyr.packSet];
	};

	%deplObj.lTarget = new StaticShape () {
		datablock = DeployedLTarget;
		scale = vectorMultiply("1 3 0.25",1/4 SPC 1/3 SPC 2);
	};

	%deplObj.lTarget.lMain = %deplObj;

	// set orientation
	%deplObj.lTarget.setTransform(%item.surfacePt SPC %rot);
	adjustEscapePod(%deplObj);
	escapePodLoop(%deplObj);

	// set the recharge rate right away
	if (%deplObj.getDatablock().rechargeRate)
		%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);

	// set team, owner, and handle
	%deplObj.team = %plyr.client.Team;
	%deplObj.setOwner(%plyr);
	if (%deplObj.lTarget) {
		%deplObj.lTarget.team = %plyr.client.Team;
		%deplObj.lTarget.setOwner(%plyr);
	}

	// set the sensor group if it needs one
	if (%deplObj.getTarget() != -1)
		setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);

	// place the deployable in the MissionCleanup/Deployables group (AI reasons)
	addToDeployGroup(%deplObj);
	if (%deplObj.lTarget)
		addToDeployGroup(%deplObj.lTarget);

	//let the AI know as well...
	AIDeployObject(%plyr.client, %deplObj);
	if (%deplObj.lTarget)
		AIDeployObject(%plyr.client,%deplObj.lTarget);

	// play the deploy sound
	serverplay3D(%item.deploySound, %deplObj.getTransform());

	// increment the team count for this deployed object
	$TeamDeployedCount[%plyr.team, %item.item]++;

	%deplObj.deploy();

	addDSurface(%item.surface,%deplObj);
	if (%deplObj.lTarget)
		addDSurface(%deplObj,%deplObj.lTarget);

	// take the deployable off the player's back and out of inventory
	%plyr.unmountImage(%slot);
	%plyr.decInventory(%item.item, 1);
	%deplObj.canreload = 1;

	return %deplObj;
}

function DeployedEscapePod::onDestroyed(%this,%obj,%prevState) {
	if (%obj.isRemoved)
		return;
	%obj.isRemoved = true;
	Parent::onDestroyed(%this,%obj,%prevState);
	$TeamDeployedCount[%obj.team, EscapePodDeployable]--;
	remDSurface(%obj);
	%obj.schedule(500, "delete");
	if (isObject(%obj.lTarget))
		%obj.lTarget.schedule(500, "delete");
	if (isObject(%obj.podVehicle))
		%obj.podVehicle.schedule(500,setDamageState,Destroyed);
}

function DeployedEscapePod::disassemble(%data,%plyr,%obj) {
	if (isObject(%obj.podVehicle))
		%obj.podVehicle.startFade(500,0,1);
		%obj.podVehicle.schedule(500,delete);
	disassemble(%data,%plyr,%obj);
}

function adjustEscapePod(%obj) {
	if (!isObject(%obj))
		return;
	%lTarget = %obj.lTarget;
	%pos = %lTarget.getPosition();
	%rot = %lTarget.getRotation();
	%nrm = realVec(%lTarget,"0 0 1");
	%obj.setTransform(vectorAdd(%pos,vectorScale(%nrm,1.25)) SPC %rot);
}

function escapePodLoop(%obj) {
	if (!isObject(%obj))
		return;
	if (%obj.getDamageState() !$= "Enabled")
		return;
	cancel(%obj.escapePodLoop);
	%lTarget = %obj.lTarget;
	%pos = %lTarget.getPosition();
	%nrm = realVec(%lTarget,"0 0 1");
	%nrm2 = realVec(%lTarget,"1 0 0");
	%epod = %obj.podVehicle;
	if (isObject(%epod)) {
		if (%epod.player) {
			%player = %epod.GetControllingObject();
			if (isObject(%player)) {
				if (%player.getState() $= "Dead") {
					%remove = true;
					if (!%player.podFaded) {
						%player.startFade(2000,0,1);
						%player.podFaded = true;
					}
				}
			}
			else
				%remove = true;
		}
		else {
			// Remove when launched manually (no player)
			if (%epod.launched)
				%remove = true;
		}
		if (%remove == true)
			%epod.getDataBlock().fadeOutVehicle(%epod);
	}
	else if(%obj.canreload == 1 && $host::Purebuild == 0){
		%epod = new FlyingVehicle() {
			dataBlock = "EscapePodVehicle";
			scale = "1 1 1";
			team = %obj.team;
			mountable = "1";
			selfpower = "1";
		};
		%obj.podVehicle = %epod;
		setTargetSensorGroup(%epod.getTarget(),%epod.team);
		%epod.launcher = %obj;
		%epod.setFrozenState(true);
		%epod.setTransform(vectorAdd(%pos,vectorScale(%nrm,1)) SPC fullRot(%nrm,vectorScale(%nrm2,-1)));
		%obj.play3D(EscapePodReloadSound);
		%obj.stopThread($AmbientThread);
		%obj.setThreadDir($AmbientThread,0);
		%obj.playThread($AmbientThread,"recoil");
		%obj.schedule(1000,stopThread,$AmbientThread);
	}
	%obj.escapePodLoop = schedule(1000,0,escapePodLoop,%obj);
}

function EscapePodDeployableImage::onMount(%data, %obj, %node) {
	%obj.hasEscapePod = true; // set for podcheck
	%obj.packSet = 7;
	%obj.expertSet = 0;
}

function EscapePodDeployableImage::onUnmount(%data, %obj, %node) {
	%obj.packSet = 0;
	%obj.expertSet = 0;
	%obj.hasEscapePod = "";
}

function EscapePodVehicle::isBlocked(%data,%obj,%player) {
	%pos = %obj.getPosition();
	%startPos = vectorAdd(%pos,vectorScale(realVec(%obj,"0 -1 0"),2));
	%endPos = vectorAdd(%pos,vectorScale(realVec(%obj,"0 1 0"),2));
	%mask = $TypeMasks::VehicleObjectType | $TypeMasks::StationObjectType | $TypeMasks::GeneratorObjectType | $TypeMasks::SensorObjectType | $TypeMasks::TurretObjectType | $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::StaticObjectType | $TypeMasks::MoveableObjectType | $TypeMasks::DamagableItemObjectType;
	%res = containerRayCast(%startPos,%endPos,%mask,%obj);
	if (%res)
		return 1;
	return 0;
}

function EscapePodVehicle::playerMounted(%data, %obj, %player, %node) {
	if (%obj.player)
		return;
	%obj.player = %player;
	%obj.lastPilot = %player;
	%obj.playerMountedTime = getSimTime();
//	commandToClient(%player.client, 'setHudMode', 'Pilot', "Hoverbike", %node);

	// update observers who are following this guy...
	if ( %player.client.observeCount > 0 )
		resetObserveFollow( %player.client, false );

	%obj.play3D(EscapePodBeepSound);
	%data.schedule(1000,actionThreadPlayer,%player,"scoutRoot");
	%obj.schedule(1500,play3D,EscapePodChargeSound);
	%data.schedule(3000,launchPod,%obj,%player,%node);
}

function EscapePodVehicle::actionThreadPlayer(%data,%player,%thread) {
	if (!isObject(%player))
		return;
	if (%player.getState() $= "Dead") {
		%player.startFade(2000,0,1);
		%player.podFaded = true;
	}
	else
		%player.setActionThread(%thread,true);
}

function EscapePodVehicle::launchPod(%data,%obj,%player,%node) {
	if (!isObject(%obj))
		return;
	%obj.launched = true;
	%obj.play3D(EscapePodLaunchSound);
	%obj.play3D(EscapePodLaunchSound2);
	%launcher = %obj.launcher;
	if (isObject(%launcher)) {
		%launcher.stopThread($AmbientThread);
		%launcher.setThreadDir($AmbientThread,1);
		%launcher.playThread($AmbientThread,"recoil");
		%launcher.schedule(1000,stopThread,$AmbientThread);
	}
	%obj.setFrozenState(false);
	%obj.applyImpulse(%obj.getPosition(),vectorScale(realVec(%obj,"0 1 0"),%launcher.impulse));
	for(%i = 0; %i < 10; %i++)
		%data.schedule((%i * %i) * 10,emitLaunchPuff,%obj);
	schedule(30000, 0, "escapepodsetreload", %obj.launcher);
	%obj.launcher.canreload = 0;
}

function escapepodsetreload(%obj){
   if(!isObject(%obj))
	return;
   %obj.canreload = 1;
}

function EscapePodVehicle::emitLaunchPuff(%data,%obj) {
	if (!isObject(%obj))
		return;
	%em = new ParticleEmissionDummy() {
		dataBlock = "defaultEmissionDummy";
		emitter = "VehicleLGESmokeEMitter";
		position = %obj.getPosition();
		scale = "1 1 1";
		velocity = "1";
	};
	MissionCleanup.add(%em);
	%em.schedule(1000,"delete");
}

//function EscapePodVehicle::onDestroyed(%data, %obj, %prevState) {
//	Parent::onDestroyed(%data, %obj, %prevState);
//}


//function EscapePodVehicle::playerDismounted(%data, %obj, %player) {
//	Parent::playerDismounted(%data, %obj, %player);
//}

function EscapePodVehicle::fadeOutVehicle(%data,%obj) {
	if (%obj.faded)
		return;
	%obj.faded = true;
	%obj.startFade(1000,4000,1);
	%obj.schedule(5000,delete);
	%obj.schedule(4000,play3D,EscapePodFadeSound);
}

function displayEscapePodBoostPower(%plyr) {
		%line = $packSetting["escapepod",%plyr.packSet];
		%max = $packSetting["escapepod",$packSettings["escapepod"]];
		%power = mAbs(mFloatLength(100 / %max * %line,1));
		bottomPrint(%plyr.client,"Escape Pod booster set to " @ %power @ "% power" ,2,1);
}
