#include "pch.h"
#include "Mission5.h"
#include "Training.h"
#include "Goal.h"
#include "GoalList.h"
#include "Predicate.h"
#include "TrueCondition.h"
#include "FalseCondition.h"
#include "AndCondition.h"
#include "OrCondition.h"
#include "NotCondition.h"
#include "ElapsedTimeCondition.h"
#include "ObjectMovingTowardsCondition.h"
#include "ObjectWithinRadiusCondition.h"
#include "ObjectPointingAtCondition.h"
#include "ConditionalAction.h"
#include "ConditionList.h"
#include "ActionList.h"
#include "MessageAction.h"
#include "PlaySoundAction.h"
#include "SetCommandAction.h"
#include "NoAction.h"
#include "NTimesCondition.h"
#include "EndMissionAction.h"
#include "ResetAction.h"
#include "ResetShipAction.h"
#include "SoundFinishedCondition.h"
#include "SetDisplayModeAction.h"
#include "TurnShipAboutCondition.h"
#include "GetRadarLODCondition.h"
#include "SetRadarLODAction.h"
#include "GetControlActiveCondition.h"
#include "GetStateBitsCondition.h"
#include "GetShipIsStoppedCondition.h"
#include "SetControlConstraintsAction.h"
#include "GetAutopilotCondition.h"
#include "SetAutopilotAction.h"
#include "GetTargetCondition.h"
#include "CreateDroneAction.h"
#include "GetPickedCondition.h"
#include "GetCommandCondition.h"
#include "GetViewSectorCondition.h"
#include "SetHUDOverlayAction.h"
#include "GetShipIsDestroyedCondition.h"
#include "SetSignatureAction.h"
#include "ShowPaneAction.h"
#include "GetKeyCondition.h"
namespace Training
{
Mission5::~Mission5 (void)
{
}
int Mission5::GetMissionID (void)
{
return c_TM_5_Command_View;
}
SectorID Mission5::GetStartSectorID (void)
{
return 1050;
}
void Mission5::SetupShipAndCamera (void)
{
IshipIGC* pShip = trekClient.GetShip ();
ImissionIGC* pCore = trekClient.GetCore ();
IstationIGC* pStation = pCore->GetStation (1050);
IclusterIGC* pCluster = pCore->GetCluster(GetStartSectorID ());
trekClient.ResetClusterScanners(pShip->GetSide());
pShip->SetStation (pStation);
trekClient.SetViewCluster (pCluster);
TrekWindow* pWindow = GetWindow ();
pWindow->SetViewMode (TrekWindow::vmCommand);
pWindow->PositionCommandView (NULL, 0.0);
pWindow->SetRadarMode (RadarImage::c_rlAll);
pWindow->EnableDisplacementCommandView (true);
}
bool Mission5::RecordKeyPress (TrekKey key)
{
switch (key)
{
case TK_ConModeCombat:
case TK_ConModeInventory:
case TK_ViewExternalOrbit:
case TK_ViewExternalStation:
case TK_ViewExternal:
case TK_ViewFlyby:
case TK_ViewMissile:
case TK_ViewTarget:
case TK_ViewChase:
case TK_ViewTurret:
case TK_ViewBase:
case TK_ViewSector:
return false;
}
return TrainingMission::RecordKeyPress (key);
}
void Mission5::CreateUniverse (void)
{
LoadUniverse ("training_5", 412, 1050); ImissionIGC* pCore = trekClient.GetCore();
ImodelIGC* pStation = pCore->GetModel (OT_station, 1050);
IshipIGC* pCommander = pCore->GetShip (m_commanderID);
pCommander->SetStation (static_cast<IstationIGC*> (pStation));
pCommander->SetCommand (c_cmdAccepted, NULL, c_cidDoNothing);
pCommander->SetCommand (c_cmdCurrent, NULL, c_cidDoNothing);
pCommander->SetAutopilot (false);
}
Condition* Mission5::CreateMission (void)
{
GoalList* pGoalList = new GoalList;
Goal* pGoal = new Goal (pGoalList);
ImissionIGC* pMission = trekClient.GetCore ();
IstationIGC* pStationNeptune = pMission->GetStation (1050);
IstationIGC* pStationMars = pMission->GetStation (1052);
IwarpIGC* pAlephNeptune = pMission->GetWarp (1050);
IwarpIGC* pAlephMars = pMission->GetWarp (1052);
m_enemyScoutID = pMission->GenerateNewShipID ();
m_miner1ID = pMission->GenerateNewShipID ();
m_miner2ID = pMission->GenerateNewShipID ();
m_miner3ID = pMission->GenerateNewShipID ();
m_miner4ID = pMission->GenerateNewShipID ();
m_scoutID = pMission->GenerateNewShipID ();
m_builder1ID = pMission->GenerateNewShipID ();
m_builder2ID = pMission->GenerateNewShipID ();
m_builder3ID = pMission->GenerateNewShipID ();
pGoalList->AddGoal (CreateGoal01 ());
pGoalList->AddGoal (CreateGoal02 ());
pGoalList->AddGoal (CreateGoal03 ());
pGoalList->AddGoal (CreateGoal04 ());
pGoalList->AddGoal (CreateGoal05 ());
Vector pos = pStationNeptune->GetPosition () + Vector (random(-300.0f, 300.0f), random(-300.0f, 300.0f), random(-300.0f, 300.0f));
CreateDroneAction* pCreateDroneAction = new CreateDroneAction ("Tower Layer 01", m_builder1ID, 418, 0, c_ptLayer);
pCreateDroneAction->SetExpendableType (431);
pCreateDroneAction->SetCreatedLocation (GetStartSectorID (), pos);
pGoal->AddStartAction (pCreateDroneAction);
pos = pStationNeptune->GetPosition () + Vector (random(-300.0f, 300.0f), random(-300.0f, 300.0f), random(-300.0f, 300.0f));
pCreateDroneAction = new CreateDroneAction ("Tower Layer 02", m_builder2ID, 418, 0, c_ptLayer);
pCreateDroneAction->SetExpendableType (431);
pCreateDroneAction->SetCreatedLocation (GetStartSectorID (), pos);
pGoal->AddStartAction (pCreateDroneAction);
pos = pStationNeptune->GetPosition () + Vector (random(-300.0f, 300.0f), random(-300.0f, 300.0f), random(-300.0f, 300.0f));
pCreateDroneAction = new CreateDroneAction ("Tower Layer 03", m_builder3ID, 418, 0, c_ptLayer);
pCreateDroneAction->SetExpendableType (431);
pCreateDroneAction->SetCreatedLocation (GetStartSectorID (), pos);
pGoal->AddStartAction (pCreateDroneAction);
pos = pStationNeptune->GetPosition () + Vector (random(-600.0f, 600.0f), random(-600.0f, 600.0f), random(-300.0f, 300.0f));
pCreateDroneAction = new CreateDroneAction ("Miner 01", m_miner1ID, 438, 0, c_ptMiner);
pCreateDroneAction->SetCreatedLocation (GetStartSectorID (), pos);
pGoal->AddStartAction (pCreateDroneAction);
pos = pStationMars->GetPosition () + Vector (random(-600.0f, 600.0f), random(-600.0f, 600.0f), random(-300.0f, 300.0f));
pCreateDroneAction = new CreateDroneAction ("Miner 02", m_miner2ID, 438, 0, c_ptMiner);
pCreateDroneAction->SetCreatedLocation (GetStartSectorID () + 1, pos);
pGoal->AddStartAction (pCreateDroneAction);
pos = pStationMars->GetPosition () + Vector (random(-600.0f, 600.0f), random(-600.0f, 600.0f), random(-300.0f, 300.0f));
pCreateDroneAction = new CreateDroneAction ("Miner 03", m_miner3ID, 438, 0, c_ptMiner);
pCreateDroneAction->SetCreatedLocation (GetStartSectorID () + 1, pos);
pGoal->AddStartAction (pCreateDroneAction);
pos = pStationMars->GetPosition () + Vector (random(-600.0f, 600.0f), random(-600.0f, 600.0f), random(-300.0f, 300.0f));
pCreateDroneAction = new CreateDroneAction ("Miner 04", m_miner4ID, 438, 0, c_ptMiner);
pCreateDroneAction->SetCreatedLocation (GetStartSectorID () + 1, pos);
pGoal->AddStartAction (pCreateDroneAction);
pos = pStationMars->GetPosition () + ((pAlephMars->GetPosition () - pStationMars->GetPosition ()) * random (0.5f, 0.75f));
pCreateDroneAction = new CreateDroneAction ("Stealth Fighter", m_scoutID, 411, 0, c_ptWingman);
pCreateDroneAction->SetCreatedLocation (GetStartSectorID () + 1, pos);
pGoal->AddStartAction (pCreateDroneAction);
pGoal->AddStartAction (new SetCommandAction (m_scoutID, c_cmdAccepted, NULL, c_cidDoNothing));
pGoal->AddStartAction (new SetCommandAction (m_scoutID, c_cmdCurrent, NULL, c_cidDoNothing));
pGoal->AddStartAction (new SetCommandAction (m_miner2ID, c_cmdAccepted, NULL, c_cidDoNothing));
pGoal->AddStartAction (new SetCommandAction (m_miner2ID, c_cmdCurrent, NULL, c_cidDoNothing));
pGoal->AddStartAction (new SetCommandAction (m_miner3ID, c_cmdAccepted, NULL, c_cidDoNothing));
pGoal->AddStartAction (new SetCommandAction (m_miner3ID, c_cmdCurrent, NULL, c_cidDoNothing));
pGoal->AddStartAction (new SetCommandAction (m_miner4ID, c_cmdAccepted, NULL, c_cidDoNothing));
pGoal->AddStartAction (new SetCommandAction (m_miner4ID, c_cmdCurrent, NULL, c_cidDoNothing));
pGoal->AddStartAction (new SetCommandAction (m_builder1ID, c_cmdAccepted, NULL, c_cidDoNothing));
pGoal->AddStartAction (new SetCommandAction (m_builder1ID, c_cmdCurrent, NULL, c_cidDoNothing));
pGoal->AddStartAction (new SetCommandAction (m_builder2ID, c_cmdAccepted, NULL, c_cidDoNothing));
pGoal->AddStartAction (new SetCommandAction (m_builder2ID, c_cmdCurrent, NULL, c_cidDoNothing));
pGoal->AddStartAction (new SetCommandAction (m_builder3ID, c_cmdAccepted, NULL, c_cidDoNothing));
pGoal->AddStartAction (new SetCommandAction (m_builder3ID, c_cmdCurrent, NULL, c_cidDoNothing));
return pGoal;
}
Goal* Mission5::CreateGoal01 (void)
{
GoalList* pGoalList = new GoalList;
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (1.0f)));
pGoalList->AddGoal (CreatePlaySoundGoal (tm_5_01Sound));
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (0.5f)));
{
Goal* pGoal = new Goal (new GetKeyCondition (TK_FireWeapon));
pGoal->AddStartAction (new MessageAction ("Press the SPACEBAR when you are ready to proceed."));
pGoal->AddStartAction (new PlaySoundAction (tm_5_02Sound));
pGoal->AddConstraintCondition (CreateTooLongCondition (30.0f, tm_5_02Sound));
pGoalList->AddGoal (pGoal);
}
pGoalList->AddGoal (CreatePlaySoundGoal (tm_5_03Sound));
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (0.5f)));
{
Condition* pOrConditionA = new OrCondition (new GetPickedCondition (OT_ship, m_builder1ID), new GetPickedCondition (OT_ship, m_builder2ID));
Condition* pConditionB = new GetPickedCondition (OT_ship, m_builder3ID);
Goal* pGoal = new Goal (new OrCondition (pOrConditionA, pConditionB));
pGoal->AddStartAction (new MessageAction ("Left click on a Tower Layer to select it."));
pGoal->AddStartAction (new PlaySoundAction (tm_5_03rSound));
pGoal->AddConstraintCondition (CreateTooLongCondition (30.0f, tm_5_03rSound));
pGoalList->AddGoal (pGoal);
}
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (0.5f)));
{
Goal* pGoal = CreatePlaySoundGoal (tm_5_04Sound);
pGoal->AddStartAction (new MessageAction ("Left click on 'Build' command."));
pGoalList->AddGoal (pGoal);
}
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (0.5f)));
{
Condition* pOrConditionA = new OrCondition (new GetCommandCondition (m_builder1ID, c_cidBuild), new GetCommandCondition (m_builder2ID, c_cidBuild));
Condition* pConditionB = new GetCommandCondition (m_builder3ID, c_cidBuild);
Goal* pGoal = new Goal (new OrCondition (pOrConditionA, pConditionB));
pGoal->AddStartAction (new MessageAction ("Right click in space to deploy tower."));
pGoal->AddStartAction (new PlaySoundAction (tm_5_04rSound));
pGoal->AddConstraintCondition (CreateTooLongCondition (30.0f, tm_5_04rSound));
pGoalList->AddGoal (pGoal);
}
{
Goal* pGoal = CreatePlaySoundGoal (tm_5_05Sound);
pGoal->AddStartAction (new MessageAction ("Order all towers to defend aleph 'Mars'."));
pGoalList->AddGoal (pGoal);
}
{
Condition* pAndCondition = new AndCondition (new GetCommandCondition (m_builder1ID, c_cidBuild), new GetCommandCondition (m_builder2ID, c_cidBuild));
Condition* pConditionB = new GetCommandCondition (m_builder3ID, c_cidBuild);
Goal* pGoal = new Goal (new AndCondition (pAndCondition, pConditionB));
pGoal->AddConstraintCondition (CreateTooLongCondition (30.0f, tm_5_05rSound));
pGoalList->AddGoal (pGoal);
}
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (0.5f)));
return new Goal (pGoalList);
}
Goal* Mission5::CreateGoal02 (void)
{
GoalList* pGoalList = new GoalList;
pGoalList->AddGoal (CreatePlaySoundGoal (tm_5_06Sound));
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (0.5f)));
{
Goal* pGoal = new Goal (new GetViewSectorCondition (GetStartSectorID () + 1));
pGoal->AddStartAction (new MessageAction ("Left click on 'Mars' in the Sector Map to change view."));
pGoal->AddStartAction (new SetHUDOverlayAction (SectorTrainingOverlay));
pGoal->AddStartAction (new PlaySoundAction (tm_5_06rSound));
pGoal->AddConstraintCondition (CreateTooLongCondition (30.0f, tm_5_06rSound));
pGoalList->AddGoal (pGoal);
}
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (0.5f)));
{
Goal* pGoal = CreatePlaySoundGoal (tm_5_07Sound);
pGoal->AddStartAction (new SetHUDOverlayAction (NoTrainingOverlay));
pGoal->AddStartAction (new MessageAction ("Left click on a Miner to select it."));
pGoalList->AddGoal (pGoal);
}
{
Condition* pOrConditionA = new OrCondition (new GetPickedCondition (OT_ship, m_miner2ID), new GetPickedCondition (OT_ship, m_miner3ID));
Condition* pConditionB = new GetPickedCondition (OT_ship, m_miner4ID);
Goal* pGoal = new Goal (new OrCondition (pOrConditionA, pConditionB));
pGoal->AddConstraintCondition (CreateTooLongCondition (30.0f, tm_5_07rSound));
pGoalList->AddGoal (pGoal);
}
{
Goal* pGoal = CreatePlaySoundGoal (tm_5_08Sound);
pGoal->AddStartAction (new MessageAction ("Left click on 'Mine' command, and right click on the He3 asteroid to begin mining."));
pGoalList->AddGoal (pGoal);
}
{
Condition* pOrConditionA = new OrCondition (new GetCommandCondition (m_miner2ID, c_cidMine), new GetCommandCondition (m_miner3ID, c_cidMine));
Condition* pConditionB = new GetCommandCondition (m_miner4ID, c_cidMine);
Goal* pGoal = new Goal (new OrCondition (pOrConditionA, pConditionB));
pGoal->AddConstraintCondition (CreateTooLongCondition (30.0f, tm_5_08rSound));
pGoalList->AddGoal (pGoal);
}
pGoalList->AddGoal (CreatePlaySoundGoal (tm_5_09Sound));
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (0.5f)));
{
Condition* pAndConditionA = new AndCondition (new GetCommandCondition (m_miner2ID, c_cidMine), new GetCommandCondition (m_miner3ID, c_cidMine));
Condition* pConditionB = new GetCommandCondition (m_miner4ID, c_cidMine);
Goal* pGoal = new Goal (new AndCondition (pAndConditionA, pConditionB));
pGoal->AddStartAction (new MessageAction ("Order all the miners to work."));
pGoal->AddStartAction (new PlaySoundAction (tm_5_10Sound));
pGoal->AddConstraintCondition (CreateTooLongCondition (30.0f, tm_5_10Sound));
pGoalList->AddGoal (pGoal);
}
pGoalList->AddGoal (CreatePlaySoundGoal (tm_5_11Sound));
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (0.5f)));
return new Goal (pGoalList);
}
Goal* Mission5::CreateGoal03 (void)
{
GoalList* pGoalList = new GoalList;
{
Goal* pGoal = CreatePlaySoundGoal (tm_5_12Sound);
IwarpIGC* pAlephMars = trekClient.GetCore ()->GetWarp (1052);
Orientation alephMarsOrientation = pAlephMars->GetOrientation ();
Vector pos = pAlephMars->GetPosition () + (alephMarsOrientation.GetForward () * random (800.0f, 1200.0f)) + (alephMarsOrientation.GetRight () * random(-100.0f, 200.0f));
CreateDroneAction* pCreateDroneAction = new CreateDroneAction ("Enemy Scout", m_enemyScoutID, 310, 1, c_ptWingman);
pCreateDroneAction->SetCreatedLocation (GetStartSectorID () + 1, pos);
pGoal->AddStartAction (pCreateDroneAction);
pGoal->AddStartAction (new SetCommandAction (m_enemyScoutID, c_cmdAccepted, NULL, c_cidDoNothing));
pGoal->AddStartAction (new SetCommandAction (m_enemyScoutID, c_cmdCurrent, NULL, c_cidDoNothing));
pGoal->AddStartAction (new SetSignatureAction (OT_ship, m_enemyScoutID, 1.0e6f));
pGoalList->AddGoal (pGoal);
}
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (0.5f)));
pGoalList->AddGoal (CreatePlaySoundGoal (tm_5_13Sound));
{
Condition* pAndConditionA = new AndCondition (new GetCommandCondition (m_miner2ID, c_cidGoto), new GetCommandCondition (m_miner3ID, c_cidGoto));
Condition* pConditionB = new GetCommandCondition (m_miner4ID, c_cidGoto);
Goal* pGoal = new Goal (new AndCondition (pAndConditionA, pConditionB));
pGoal->AddStartAction (new MessageAction ("Order all three miners back to base for safety."));
pGoal->AddConstraintCondition (CreateTooLongCondition (30.0f, tm_5_13rSound));
pGoalList->AddGoal (pGoal);
}
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (0.5f)));
pGoalList->AddGoal (CreatePlaySoundGoal (tm_5_14Sound));
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (0.5f)));
return new Goal (pGoalList);
}
Goal* Mission5::CreateGoal04 (void)
{
GoalList* pGoalList = new GoalList;
{
Goal* pGoal = CreatePlaySoundGoal (tm_5_15Sound);
pGoalList->AddGoal (pGoal);
}
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (0.5f)));
{
Goal* pGoal = new Goal (new GetCommandCondition (m_scoutID, c_cidAttack));
pGoal->AddStartAction (new MessageAction ("Order stealth fighter to attack enemy craft."));
pGoal->AddStartAction (new PlaySoundAction (tm_5_15rSound));
pGoal->AddConstraintCondition (CreateTooLongCondition (30.0f, tm_5_15rSound));
pGoalList->AddGoal (pGoal);
}
pGoalList->AddGoal (CreatePlaySoundGoal (tm_5_16Sound));
pGoalList->AddGoal (new Goal (new GetShipIsDestroyedCondition2(OT_ship, m_enemyScoutID)));
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (0.5f)));
return new Goal (pGoalList);
}
Goal* Mission5::CreateGoal05 (void)
{
GoalList* pGoalList = new GoalList;
pGoalList->AddGoal (CreatePlaySoundGoal (tm_5_17Sound));
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (0.5f)));
{
Goal* pGoal = CreatePlaySoundGoal (tm_5_18Sound);
pGoal->AddStartAction (new ShowPaneAction (ofExpandedTeam));
pGoalList->AddGoal (pGoal);
}
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (0.5f)));
{
Goal* pGoal = new Goal (new GetViewSectorCondition (GetStartSectorID ()));
pGoal->AddStartAction (new MessageAction ("Select Miner 01 in the Team Display, and click on the 'Take Me To' button."));
pGoal->AddStartAction (new PlaySoundAction (tm_5_18rSound));
pGoal->AddConstraintCondition (CreateTooLongCondition (30.0f, tm_5_18rSound));
pGoalList->AddGoal (pGoal);
}
pGoalList->AddGoal (CreatePlaySoundGoal (tm_5_19Sound));
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (0.5f)));
pGoalList->AddGoal (CreatePlaySoundGoal (tm_5_20Sound));
pGoalList->AddGoal (new Goal (new ElapsedTimeCondition (0.5f)));
return new Goal (pGoalList);
}
}