mirror of
https://github.com/exogen/t2-mapper.git
synced 2026-01-20 04:35:05 +00:00
568 lines
14 KiB
C#
568 lines
14 KiB
C#
// don't want this executing when building graphs
|
|
if($OFFLINE_NAV_BUILD)
|
|
return;
|
|
|
|
// script fror training mission 3
|
|
//-------------------------------------------------------------
|
|
|
|
//init
|
|
//-------------------------------------------------------------
|
|
echo("Running Mission 3 Script");
|
|
activatePackage(Training3);
|
|
|
|
|
|
$numberOfEnemies[1] = 5;
|
|
$numberOfEnemies[2] = 7;
|
|
$numberOfEnemies[3] = 7;
|
|
$numberOfTeammates = 0;
|
|
$missionBotSkill[1] = 0.0;
|
|
$missionBotSkill[2] = 0.5;
|
|
$missionBotSkill[3] = 0.9;
|
|
$missionEnemyThreshold[1] = 0;
|
|
$missionEnemyThreshold[2] = 3;
|
|
$missionEnemyThreshold[3] = 7;
|
|
|
|
|
|
//the Scout is very important
|
|
$Shrike = nameToId("Ride");
|
|
// activate the wings on the flyer
|
|
$Shrike.playThread($ActivateThread, "activate");
|
|
|
|
// for the distance checking
|
|
addMessageCallback('MsgWeaponMount', playerMountWeapon);
|
|
|
|
package training3 {
|
|
//===============================================begin the training 3 package stuff====
|
|
|
|
function SinglePlayerGame::initGameVars(%game)
|
|
{
|
|
// for many of the objectives we are going to periodically
|
|
// check the players distance vs some object
|
|
// you could do this much prettier but its going to be very specific
|
|
// so a cut and paste eyesore will be fine
|
|
echo("initializing training3 game vars");
|
|
%game.base = nameToId("Shield");
|
|
%game.baseLocation = game.base.getTransform();
|
|
%game.base.threshold = 400;
|
|
%game.end = nameToId("PlayerDropPoint");
|
|
%game.endLocation = game.end.getTransform();
|
|
}
|
|
|
|
function MP3Audio::play(%this)
|
|
{
|
|
//too bad...no mp3 in training
|
|
}
|
|
|
|
// force always scope for testing
|
|
function singlePlayerGame::onAIRespawn(%game, %client)
|
|
{
|
|
if(! isObject("MissionCleanup/TeamDrops2")) {
|
|
//this is the snippet of script from default games that puts teamdrops
|
|
// into the mission cleanup group...slightly modified to suit our needs
|
|
%dropSet = new SimSet("TeamDrops2");
|
|
MissionCleanup.add(%dropSet);
|
|
|
|
%spawns = nameToID("MissionGroup/Teams/team2/TeamDrops");
|
|
if(%spawns != -1)
|
|
{
|
|
%count = %spawns.getCount();
|
|
for(%i = 0; %i < %count; %i++)
|
|
%dropSet.add(%spawns.getObject(%i));
|
|
}
|
|
}
|
|
|
|
// error("Forcing AI Scope!!!!!!!!!!!!!");
|
|
// %client.player.scopeToClient($player);
|
|
|
|
parent:: onAIRespawn(%game, %client);
|
|
}
|
|
|
|
function getTeammateGlobals()
|
|
{
|
|
echo("You have no teammates in this mission");
|
|
}
|
|
|
|
function toggleScoreScreen(%val)
|
|
{
|
|
if ( %val )
|
|
//error("No Score Screen in training.......");
|
|
messageClient($player, 0, $player.miscMsg[noScoreScreen]);
|
|
}
|
|
|
|
function toggleCommanderMap(%val)
|
|
{
|
|
if ( %val )
|
|
messageClient($player, 0, $player.miscMsg[noCC]);
|
|
}
|
|
|
|
function toggleTaskListDlg( %val )
|
|
{
|
|
if ( %val )
|
|
messageClient( $player, 0, $player.miscMsg[noTaskListDlg] );
|
|
}
|
|
|
|
function toggleNetDisplayHud( %val )
|
|
{
|
|
// Hello, McFly? This is training! There's no net in training!
|
|
}
|
|
|
|
function voiceCapture( %val )
|
|
{
|
|
// Uh, who do you think you are talking to?
|
|
}
|
|
|
|
function giveall()
|
|
{
|
|
error("When the going gets tough...wussies like you start cheating!");
|
|
messageClient($player, 0, "Cheating eh? What\'s next? Camping?");
|
|
}
|
|
|
|
function kobayashi_maru()
|
|
{
|
|
$testcheats = true;
|
|
commandToServer('giveAll');
|
|
}
|
|
|
|
function AIEngageTask::assume(%task, %client)
|
|
{
|
|
Parent::assume(%task, %client);
|
|
|
|
if(%client.team != $playerTeam)
|
|
game.biodermAssume(%client);
|
|
}
|
|
|
|
function countTurretsAllowed(%type)
|
|
{
|
|
return $TeamDeployableMax[%type];
|
|
}
|
|
|
|
|
|
function FlipFlop::objectiveInit(%data, %flipflop)
|
|
{
|
|
}
|
|
|
|
function ClientCmdSetHudMode(%mode, %type, %node)
|
|
{
|
|
parent::ClientCmdSetHudMode(%mode, %type, %node);
|
|
//TrainingMap.push();
|
|
}
|
|
|
|
|
|
// get the ball rolling
|
|
function startCurrentMission(%game)
|
|
{
|
|
|
|
//just in case
|
|
setFlipFlopSkins();
|
|
schedule(5000, %game, opening);
|
|
schedule(30000, %game, objectiveDistanceChecks);
|
|
updateTrainingObjectiveHud(obj1);
|
|
|
|
if($pref::trainingDifficulty == 1) {
|
|
nameToId(BackEnterSentry).hide(true);
|
|
freeTarget(nameToId(BackEnterSentry).getTarget());
|
|
}
|
|
}
|
|
|
|
function opening()
|
|
{
|
|
if(game.vehicleMount)
|
|
return;
|
|
doText(T3_01);
|
|
//doText(T3_02);
|
|
doText(T3_cloaking);
|
|
doText(T3_tipCloaking01);
|
|
doText(T3_tipCloaking02);
|
|
}
|
|
|
|
function SinglePlayerGame::equip(%game, %player)
|
|
{
|
|
//ya start with nothing...NOTHING!
|
|
%player.clearInventory();
|
|
|
|
for(%i =0; %i<$InventoryHudCount; %i++)
|
|
%player.client.setInventoryHudItem($InventoryHudData[%i, itemDataName], 0, 1);
|
|
%player.client.clearBackpackIcon();
|
|
|
|
//echo("Light Assassin Config");
|
|
|
|
%player.setArmor("Light");
|
|
|
|
%player.setInventory(CloakingPack, 1);
|
|
|
|
%player.setInventory(RepairKit,1);
|
|
%player.setInventory(FlashGrenade,5);
|
|
%player.setInventory(Mine,3);
|
|
|
|
%player.setInventory(Plasma, 1);
|
|
%player.setInventory(PlasmaAmmo, 20);
|
|
%player.setInventory(Disc,1);
|
|
%player.setInventory(DiscAmmo, 15);
|
|
%player.setInventory(TargetingLaser, 1);
|
|
%player.setInventory(ShockLance,1);
|
|
%player.weaponCount = 3;
|
|
|
|
%player.use("Disc");
|
|
}
|
|
|
|
// ============================================================================
|
|
function singlePlayerGame::onAIKilled(%game, %clVictim, %clAttacker, %damageType, %implement)
|
|
{
|
|
%teamCount = getPlayersOnTeam(%clVictim.team);
|
|
//echo("Team count:" SPC %teamCount);
|
|
%maintNum = $missionEnemyThreshold[$pref::trainingDifficulty];
|
|
//echo("Maintain:" SPC %maintNum);
|
|
|
|
%clVictim.useSpawnSphere = true;
|
|
|
|
// this will respawn the AI if
|
|
if( %teamCount < %maintNum )
|
|
DefaultGame::onAIKilled(%game, %clVictim, %clAttacker, %damageType, %implement);
|
|
|
|
}
|
|
|
|
function singleplayerGame::pickTeamSpawn(%game, %client, %respawn)
|
|
{
|
|
if(%client.useSpawnSphere)
|
|
DefaultGame::pickTeamSpawn(%game, %client.team);
|
|
else
|
|
parent::pickTeamSpawn(%game, %client, %respawn);
|
|
}
|
|
|
|
|
|
|
|
|
|
function clientCmdVehicleMount()
|
|
{
|
|
if(game.vehicleMount++ == 1) {
|
|
doText(Any_Waypoint01, 2000);
|
|
//doText(Any_Waypoint03, 4000);
|
|
doText(T3_tipPiloting01);
|
|
doText(T3_02);
|
|
doText(T3_05);
|
|
schedule(4000, game, setWaypointAt, game.baseLocation, "Icefell Ridge Base");
|
|
updateTrainingObjectiveHud(obj2);
|
|
|
|
game.pilotingTips = schedule(60000, game, PilotingTips);
|
|
}
|
|
if(game.phase == 4) {
|
|
setWaypointAt(game.endLocation, "Extraction Point");
|
|
updateTrainingObjectiveHud(obj3);
|
|
doText(T3_11);
|
|
doText(T3_12);
|
|
game.phase = 5;
|
|
|
|
if(!nameToId(AATurretGen).isDisabled())
|
|
doText(t3_12a);
|
|
}
|
|
}
|
|
|
|
function RepairPack::onCollision(%this,%obj,%col)
|
|
{
|
|
if($player.player.getInventory(CloakingPack) && $player.player.getDamageLevel() > 0.2
|
|
&& !game.msgtipEquip && %col == $player.player) {
|
|
game.msgTipEquip = true;
|
|
doText(T3_tipEquipment02);
|
|
}
|
|
|
|
parent::onCollision(%this,%obj,%col);
|
|
}
|
|
|
|
|
|
// 86 the vehicle removal on dying
|
|
function vehicleAbandonTimeOut(%vehicle)
|
|
{
|
|
// dont mess it up
|
|
}
|
|
|
|
function playerMountWeapon(%tag, %text, %image, %player, %slot)
|
|
{
|
|
if( game.firstTime++ < 2)
|
|
return; // initial weapon mount doesnt count
|
|
|
|
if(%image.getName() $= "ShockLanceImage" && !game.msgShock) {
|
|
game.msgShock = true;
|
|
//doText(T3_TipShockLance);
|
|
}
|
|
}
|
|
|
|
function FlipFlop::playerTouch(%data, %flipFlop, %player )
|
|
{
|
|
|
|
//echo("singlePlayer::playerTouchFlipFlop");
|
|
%client = %player.client;
|
|
%flipTeam = %flipflop.team;
|
|
|
|
if(%flipTeam == %client.team)
|
|
return false;
|
|
|
|
nameToId(Shield).delete();
|
|
|
|
//just the sound
|
|
messageAll( 'MsgClaimFlipFlop', '~wfx/misc/flipflop_taken.wav', %client.name, Game.cleanWord( %flipflop.name ), $TeamName[%client.team] );
|
|
|
|
if(%player == $player.player)
|
|
schedule( 1500, game, flipFlopFlipped);
|
|
|
|
objectiveDistanceChecks();
|
|
|
|
//change the skin on the switch to claiming team's logo
|
|
setTargetSkin(%flipflop.getTarget(), $teamSkin[%player.team]);
|
|
setTargetSensorGroup(%flipflop.getTarget(), %player.team);
|
|
|
|
// convert the resources associated with the flipflop
|
|
Game.claimFlipflopResources(%flipflop, %client.team);
|
|
|
|
Game.AIplayerCaptureFlipFlop(%player, %flipflop);
|
|
|
|
return true;
|
|
}
|
|
|
|
function scoutFlyer::onRemove(%this, %obj)
|
|
{
|
|
error("scoutFlyer::onRemove("@ %obj@") called");
|
|
if ( ! isObject( ServerConnection ) )
|
|
return;
|
|
if(%obj == $Shrike ) {
|
|
// we dont want the player to die hitting the ground
|
|
cancel(game.pilotingTips);
|
|
$player.player.invincible = true;
|
|
missionFailed($player.miscMsg[training3shrikeLoss]);
|
|
}
|
|
}
|
|
|
|
function WeaponImage::onMount(%this,%obj,%slot)
|
|
{
|
|
messageClient(%obj.client, 'MsgWeaponMount', "", %this, %obj, %slot);
|
|
Parent::onMount(%this,%obj,%slot);
|
|
}
|
|
|
|
function GeneratorLarge::onDestroyed(%dataBlock, %destroyedObj, %prevState)
|
|
{
|
|
if(%destroyedObj == nameToId("PrisonGen") && !game.msgGenDestroyed)
|
|
{
|
|
game.msgGenDestroyed = true;
|
|
doText(Any_ObjComplete01);
|
|
updateTrainingObjectiveHud(obj6);
|
|
}
|
|
else if(%destroyedObj == nameToId(AATurretGen))
|
|
$player.AAGenWaypoint.delete();
|
|
|
|
}
|
|
|
|
// If the forcefield is shot we play this little wav file
|
|
function ProjectileData::onCollision(%data, %projectile, %targetObject, %modifier, %position, %normal)
|
|
{
|
|
//error("ProjectileData::onCollision("@%data@", "@%projectile@", "@%targetObject@", "@%modifier@", "@%position@", "@%normal@")");
|
|
parent::onCollision(%data, %projectile, %targetObject, %modifier, %position, %normal);
|
|
|
|
if(game.msgGenDestroyed)
|
|
return;
|
|
else if(%targetObject.getDataBlock().getName() $= nameToId(Shield).dataBlock) {
|
|
//error("someone shot the force field");
|
|
if(%projectile.sourceObject == $player.player){
|
|
//error("it was you f00");
|
|
if(!game.msgMustDestroyGen) {
|
|
game.msgMustDestroyGen = true;
|
|
doText(T3_07b);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function addTraining3Waypoints()
|
|
{
|
|
//do the hud updating also
|
|
$player.currentWaypoint.delete();
|
|
updateTrainingObjectiveHud(obj5);
|
|
|
|
%Training3WaypointsGroup = new simGroup(Training3Waypoints);
|
|
MissionCleanup.add(%Training3WaypointsGroup);
|
|
|
|
%waypoint = new WayPoint() {
|
|
position = nameToId(FF).position;
|
|
rotation = "1 0 0 0";
|
|
scale = "1 1 1";
|
|
dataBlock = "WayPointMarker";
|
|
lockCount = "0";
|
|
homingCount = "0";
|
|
name = "Control Point";
|
|
team = "0";
|
|
locked = "true";
|
|
};
|
|
%Training3WaypointsGroup.add(%waypoint);
|
|
|
|
%waypoint = new WayPoint() {
|
|
position = nameToId(BaseGen).getWorldBoxCenter();
|
|
rotation = "1 0 0 0";
|
|
scale = "1 1 1";
|
|
dataBlock = "WayPointMarker";
|
|
lockCount = "0";
|
|
homingCount = "0";
|
|
name = "Main Base Power";
|
|
team = "0";
|
|
locked = "true";
|
|
};
|
|
%Training3WaypointsGroup.add(%waypoint);
|
|
|
|
%waypoint = new WayPoint() {
|
|
position = nameToId(sensorNetGen).getWorldBoxCenter();
|
|
rotation = "1 0 0 0";
|
|
scale = "1 1 1";
|
|
dataBlock = "WayPointMarker";
|
|
lockCount = "0";
|
|
homingCount = "0";
|
|
name = "Sensor Power";
|
|
team = "0";
|
|
locked = "true";
|
|
};
|
|
%Training3WaypointsGroup.add(%waypoint);
|
|
|
|
%waypoint = new WayPoint() {
|
|
position = nameToId(AATurretGen).getWorldBoxCenter();
|
|
rotation = "1 0 0 0";
|
|
scale = "1 1 1";
|
|
dataBlock = "WayPointMarker";
|
|
lockCount = "0";
|
|
homingCount = "0";
|
|
name = "AntiAircraft Turret Power";
|
|
team = "0";
|
|
locked = "true";
|
|
};
|
|
//%Training3WaypointsGroup.add(%waypoint);
|
|
$player.AAGenWaypoint = %waypoint;
|
|
|
|
%waypoint = new WayPoint() {
|
|
position = nameToId(prisonGen).getWorldBoxCenter();
|
|
rotation = "1 0 0 0";
|
|
scale = "1 1 1";
|
|
dataBlock = "WayPointMarker";
|
|
lockCount = "0";
|
|
homingCount = "0";
|
|
name = "Forcefield Power";
|
|
team = "0";
|
|
locked = "true";
|
|
};
|
|
%Training3WaypointsGroup.add(%waypoint);
|
|
}
|
|
|
|
function RandomPilotingTips()
|
|
{
|
|
// this is unused as testers claimed it sounded 'disjointed and random'
|
|
|
|
if(pilotingTips())
|
|
game.pilotingTips = schedule(20000, $player.player, RandomPilotingTips);
|
|
}
|
|
|
|
function pilotingTips()
|
|
{
|
|
%num = 2;
|
|
if(game.Training3tips == %num)
|
|
return false;
|
|
%tip = getRandom(1, %num);
|
|
if( game.training3TipUsed[%tip] )
|
|
return true;
|
|
switch(%tip){
|
|
case 1:
|
|
doText(T3_tipfreelook);
|
|
case 2:
|
|
doText(T3_tipPiloting04);
|
|
// case 3:
|
|
// doText(T3_tipPiloting02);
|
|
// case 4:
|
|
// doText(T3_tipUnderwater01);
|
|
}
|
|
game.training3Tips++;
|
|
game.training3TipUsed[%tip] = true;
|
|
return true;
|
|
}
|
|
|
|
|
|
//misc
|
|
//-------------------------------------------------------------
|
|
|
|
function objectiveDistanceChecks()
|
|
{
|
|
%playerPos = $player.player.getTransform();
|
|
if(!%playerPos) {
|
|
schedule(2000, game, objectiveDistanceChecks);
|
|
return;
|
|
}
|
|
|
|
%cont = true;
|
|
%basedistance = vectorDist( %playerPos, game.baseLocation );
|
|
|
|
if(game.phase == 0 && %basedistance < game.base.threshold ) {
|
|
doText(T3_06, 4000);
|
|
doText(T3_tipCloaking03);
|
|
doText(T3_07);
|
|
game.phase = 1;
|
|
%cont = false;
|
|
cancel(game.pilotingTips);
|
|
addTraining3Waypoints();
|
|
game.respawnPoint = 1;
|
|
|
|
}
|
|
if(game.phase == 5 && vectorDist(%playerPos, game.baseLocation) > 1000 )
|
|
{
|
|
game.phase = 6;
|
|
serverConnection.setBlackout(true, 3000);
|
|
schedule(3000, game, finishMission);
|
|
}
|
|
|
|
if(%cont)
|
|
schedule(2000, game, objectiveDistanceChecks);
|
|
}
|
|
|
|
function finishMission()
|
|
{
|
|
$shrike.setFrozenState(true);
|
|
nameToId(AATurretGen).setDamageState(Disabled); //hack! cheating!
|
|
doText(T3_13);
|
|
//messageAll(0, "Nya, nya, nyanyanay...this missions oh-ohover!");
|
|
missionComplete($player.miscMsg[training3win]);
|
|
%cont = false;
|
|
}
|
|
|
|
|
|
function flipFlopFlipped()
|
|
{
|
|
//error("flip flop flipped");
|
|
if(!game.flipFlopped) {
|
|
game.flipFlopped = true;
|
|
|
|
// if we need a message modify this.
|
|
//messageTeam( %client.team, 'MsgClaimFlipFlop', '\c2%1 claimed %2 for %3.~wfx/misc/flipflop_taken.wav', %client.name, Game.cleanWord( %flipflop.name ), $TeamName[%client.team] );
|
|
|
|
doText(T3_09, 8000);
|
|
doText(T3_10);
|
|
game.phase = 4;
|
|
|
|
if(!nameToId(AATurretGen).isDisabled())
|
|
doText(t3_09a);
|
|
|
|
// new waypoint at the shrike
|
|
setWaypointAt($shrike.getTransform(), "Shrike");
|
|
updateTrainingObjectiveHud(obj4);
|
|
|
|
//get rid of the other waypoints
|
|
nameToId(Training3Waypoints).delete();
|
|
}
|
|
}
|
|
|
|
// Mission area is pointless this time out
|
|
function SinglePlayerGame::leaveMissionArea(%game, %player)
|
|
{
|
|
}
|
|
function SinglePlayerGame::enterMissionArea(%game, %player)
|
|
{
|
|
}
|
|
|
|
//===============================================END the training 3 package stuff====
|
|
};
|
|
|
|
|
|
|
|
|