#include "pch.h"
#include "Training.h"
#include <agc.h>
#include <AllSrvModuleIDL.h>
#include "AdminSessionSecure.h"
#include "AdminSessionSecureHost.h"
TRef<ModifiableNumber> g_pnumberMissionNumber;
class TrainingScreen :
public Screen,
public EventTargetContainer<TrainingScreen>,
public TrekClientEventSink,
public IItemEvent::Sink
{
private:
TRef<Pane> m_ppane;
TRef<ButtonPane> m_pbuttonBack;
TRef<ButtonPane> m_pbuttonTrainMission1;
TRef<ButtonPane> m_pbuttonTrainMission2;
TRef<ButtonPane> m_pbuttonTrainMission3;
TRef<ButtonPane> m_pbuttonTrainMission4;
TRef<ButtonPane> m_pbuttonTrainMission5;
TRef<ButtonPane> m_pbuttonTrainMission6;
TRef<ButtonPane> m_pbuttonTrainMission7;
TRef<ButtonPane> m_pbuttonTrainMission8; TRef<ButtonPane> m_pbuttonTrain;
static IAdminGamesPtr m_spAdminGamesPtr;
static IAdminGamePtr m_spAdminGamePtr;
static int m_iMissionNext;
public:
int m_civID;
class TrainLiveDialogPopup :
public IPopup,
public EventTargetContainer<TrainLiveDialogPopup>,
public TrekClientEventSink
{
private:
TRef<Pane> m_ppane;
TRef<ButtonPane> m_pbuttonOk;
TRef<ButtonPane> m_pbuttonCancel;
TRef<ButtonPane> m_pbuttonCancel2;
TRef<ComboPane> m_pcomboCiv;
TrainingScreen* m_pparent;
public:
TrainLiveDialogPopup (TRef<INameSpace> pns, TrainingScreen* pparent)
{
m_pparent = pparent;
CastTo (m_ppane, pns->FindMember("TrainLiveDialog"));
CastTo (m_pbuttonOk, pns->FindMember("okButtonPane"));
CastTo (m_pbuttonCancel, pns->FindMember("cancelButtonPane"));
CastTo (m_pbuttonCancel2, pns->FindMember("cancelButtonPane2"));
CastTo (m_pcomboCiv, pns->FindMember("civComboPane"));
AddEventTarget(&TrainingScreen::TrainLiveDialogPopup::OnButtonOk, m_pbuttonOk->GetEventSource());
AddEventTarget(&TrainingScreen::TrainLiveDialogPopup::OnButtonCancel, m_pbuttonCancel->GetEventSource());
AddEventTarget(&TrainingScreen::TrainLiveDialogPopup::OnButtonCancel, m_pbuttonCancel2->GetEventSource());
m_pcomboCiv->AddItem("Iron Coalition", 25);
m_pcomboCiv->AddItem("Bios", 35);
m_pcomboCiv->AddItem("Gigacorp", 18);
}
virtual void OnClose()
{
IPopup::OnClose();
debugf("train live popup closed\n");
}
Pane* GetPane()
{
return m_ppane;
}
void CloseThePopup (void)
{
if (m_ppopupOwner) {
m_ppopupOwner->ClosePopup(this);
} else if (m_pcontainer) {
m_pcontainer->ClosePopup(this);
}
GetWindow()->RestoreCursor();
}
bool OnButtonOk()
{
CloseThePopup ();
m_pparent->m_civID = m_pcomboCiv->GetSelection ();
m_pparent->DoTrainLive ();
return true;
}
bool OnButtonCancel()
{
CloseThePopup ();
return true;
}
};
TRef<TrainLiveDialogPopup> m_pTrainLivePopup;
public:
TrainingScreen(Modeler* pmodeler)
{
KillStandaloneGame ();
TRef<INameSpace> pnsTrainingData = pmodeler->CreateNameSpace("trainingdata", pmodeler->GetNameSpace("gamepanes"));
pnsTrainingData->AddMember("missionNumber", g_pnumberMissionNumber = new ModifiableNumber(m_iMissionNext));
TRef<INameSpace> pns = pmodeler->GetNameSpace("TrainingScreen");
CastTo(m_ppane, pns->FindMember("screen" ));
CastTo(m_pbuttonBack, pns->FindMember("backButtonPane" ));
CastTo(m_pbuttonTrainMission1, pns->FindMember("trainMission1ButtonPane" ));
CastTo(m_pbuttonTrainMission2, pns->FindMember("trainMission2ButtonPane" ));
CastTo(m_pbuttonTrainMission3, pns->FindMember("trainMission3ButtonPane" ));
CastTo(m_pbuttonTrainMission4, pns->FindMember("trainMission4ButtonPane" ));
CastTo(m_pbuttonTrainMission5, pns->FindMember("trainMission5ButtonPane" ));
CastTo(m_pbuttonTrainMission6, pns->FindMember("trainMission6ButtonPane" ));
CastTo(m_pbuttonTrainMission7, pns->FindMember("trainMission7ButtonPane" ));
CastTo(m_pbuttonTrainMission8, pns->FindMember("trainMission8ButtonPane" )); CastTo(m_pbuttonTrain, pns->FindMember("trainButtonPane" ));
m_pTrainLivePopup = new TrainLiveDialogPopup(pns, this);
pmodeler->UnloadNameSpace("TrainingScreen");
AddEventTarget(&TrainingScreen::OnButtonBack, m_pbuttonBack->GetEventSource());
AddEventTarget(&TrainingScreen::OnButtonTrain, m_pbuttonTrain->GetEventSource());
AddEventTarget(&TrainingScreen::OnButtonTrainMission1, m_pbuttonTrainMission1->GetEventSource());
AddEventTarget(&TrainingScreen::OnButtonTrainMission2, m_pbuttonTrainMission2->GetEventSource());
AddEventTarget(&TrainingScreen::OnButtonTrainMission3, m_pbuttonTrainMission3->GetEventSource());
AddEventTarget(&TrainingScreen::OnButtonTrainMission4, m_pbuttonTrainMission4->GetEventSource());
AddEventTarget(&TrainingScreen::OnButtonTrainMission5, m_pbuttonTrainMission5->GetEventSource());
AddEventTarget(&TrainingScreen::OnButtonTrainMission6, m_pbuttonTrainMission6->GetEventSource());
AddEventTarget(&TrainingScreen::OnButtonTrainMission7, m_pbuttonTrainMission7->GetEventSource());
AddEventTarget(&TrainingScreen::OnButtonTrainMission8, m_pbuttonTrainMission8->GetEventSource()); AddEventTarget(&TrainingScreen::OnButtonTrain, m_pbuttonTrainMission1->GetDoubleClickEventSource());
AddEventTarget(&TrainingScreen::OnButtonTrain, m_pbuttonTrainMission2->GetDoubleClickEventSource());
AddEventTarget(&TrainingScreen::OnButtonTrain, m_pbuttonTrainMission3->GetDoubleClickEventSource());
AddEventTarget(&TrainingScreen::OnButtonTrain, m_pbuttonTrainMission4->GetDoubleClickEventSource());
AddEventTarget(&TrainingScreen::OnButtonTrain, m_pbuttonTrainMission5->GetDoubleClickEventSource());
AddEventTarget(&TrainingScreen::OnButtonTrain, m_pbuttonTrainMission6->GetDoubleClickEventSource());
AddEventTarget(&TrainingScreen::OnButtonTrain, m_pbuttonTrainMission7->GetDoubleClickEventSource());
AddEventTarget(&TrainingScreen::OnButtonTrain, m_pbuttonTrainMission8->GetDoubleClickEventSource()); switch (m_iMissionNext)
{
case Training::c_TM_1_Introduction:
m_pbuttonTrainMission1->SetChecked (true);
break;
case Training::c_TM_2_Basic_Flight:
m_pbuttonTrainMission2->SetChecked (true);
break;
case Training::c_TM_3_Basic_Weaponry:
m_pbuttonTrainMission3->SetChecked (true);
break;
case Training::c_TM_4_Enemy_Engagement:
m_pbuttonTrainMission4->SetChecked (true);
break;
case Training::c_TM_5_Command_View:
m_pbuttonTrainMission5->SetChecked (true);
break;
case Training::c_TM_6_Practice_Arena:
m_pbuttonTrainMission6->SetChecked (true);
break;
case Training::c_TM_8_Nanite:
m_pbuttonTrainMission8->SetChecked (true);
break;
case Training::c_TM_7_Live:
default:
m_pbuttonTrainMission7->SetChecked (true);
break;
}
m_pbuttonTrain->SetChecked (true);
}
~TrainingScreen()
{
}
bool OnEvent(IItemEvent::Source *pevent, ItemID pitem)
{
return true;
}
bool OnButtonBack()
{
GetWindow()->screen(ScreenIDIntroScreen);
return false;
}
bool OnButtonTrain()
{
HKEY hKey;
DWORD dwHasRunTraining = 1;
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, ALLEGIANCE_REGISTRY_KEY_ROOT, 0, KEY_WRITE, &hKey))
{
RegSetValueEx (hKey, "HasTrained", NULL, REG_DWORD, (const BYTE*) &dwHasRunTraining, sizeof (dwHasRunTraining));
RegCloseKey (hKey);
}
int iMission = static_cast<int> (g_pnumberMissionNumber->GetValue ());
if (iMission == m_iMissionNext)
{
m_iMissionNext++;
if (m_iMissionNext > Training::c_TM_8_Nanite) m_iMissionNext = Training::c_TM_8_Nanite;
}
switch (iMission)
{
case Training::c_TM_1_Introduction:
GetWindow ()->screen (ScreenIDPostTrainSlideshow);
break;
case Training::c_TM_2_Basic_Flight:
case Training::c_TM_3_Basic_Weaponry:
case Training::c_TM_4_Enemy_Engagement:
case Training::c_TM_5_Command_View:
case Training::c_TM_6_Practice_Arena:
case Training::c_TM_8_Nanite: GetWindow ()->screen (ScreenIDTrainSlideshow);
break;
case Training::c_TM_7_Live:
TrainLive ();
break;
}
return true;
}
bool OnButtonTrainMission1()
{
g_pnumberMissionNumber->SetValue (Training::c_TM_1_Introduction);
m_pbuttonTrainMission1->SetChecked (true);
m_pbuttonTrainMission2->SetChecked (false);
m_pbuttonTrainMission3->SetChecked (false);
m_pbuttonTrainMission4->SetChecked (false);
m_pbuttonTrainMission5->SetChecked (false);
m_pbuttonTrainMission6->SetChecked (false);
m_pbuttonTrainMission7->SetChecked (false);
m_pbuttonTrainMission8->SetChecked (false);
m_pbuttonTrain->SetEnabled (true);
m_pbuttonTrain->SetChecked (true);
return true;
}
bool OnButtonTrainMission2()
{
g_pnumberMissionNumber->SetValue (Training::c_TM_2_Basic_Flight);
m_pbuttonTrainMission1->SetChecked (false);
m_pbuttonTrainMission2->SetChecked (true);
m_pbuttonTrainMission3->SetChecked (false);
m_pbuttonTrainMission4->SetChecked (false);
m_pbuttonTrainMission5->SetChecked (false);
m_pbuttonTrainMission6->SetChecked (false);
m_pbuttonTrainMission7->SetChecked (false);
m_pbuttonTrainMission8->SetChecked (false);
m_pbuttonTrain->SetEnabled (true);
m_pbuttonTrain->SetChecked (true);
return true;
}
bool OnButtonTrainMission3()
{
g_pnumberMissionNumber->SetValue (Training::c_TM_3_Basic_Weaponry);
m_pbuttonTrainMission1->SetChecked (false);
m_pbuttonTrainMission2->SetChecked (false);
m_pbuttonTrainMission3->SetChecked (true);
m_pbuttonTrainMission4->SetChecked (false);
m_pbuttonTrainMission5->SetChecked (false);
m_pbuttonTrainMission6->SetChecked (false);
m_pbuttonTrainMission7->SetChecked (false);
m_pbuttonTrainMission8->SetChecked (false);
m_pbuttonTrain->SetEnabled (true);
m_pbuttonTrain->SetChecked (true);
return true;
}
bool OnButtonTrainMission4()
{
g_pnumberMissionNumber->SetValue (Training::c_TM_4_Enemy_Engagement);
m_pbuttonTrainMission1->SetChecked (false);
m_pbuttonTrainMission2->SetChecked (false);
m_pbuttonTrainMission3->SetChecked (false);
m_pbuttonTrainMission4->SetChecked (true);
m_pbuttonTrainMission5->SetChecked (false);
m_pbuttonTrainMission6->SetChecked (false);
m_pbuttonTrainMission7->SetChecked (false);
m_pbuttonTrainMission8->SetChecked (false);
m_pbuttonTrain->SetEnabled (true);
m_pbuttonTrain->SetChecked (true);
return true;
}
bool OnButtonTrainMission5()
{
g_pnumberMissionNumber->SetValue (Training::c_TM_5_Command_View);
m_pbuttonTrainMission1->SetChecked (false);
m_pbuttonTrainMission2->SetChecked (false);
m_pbuttonTrainMission3->SetChecked (false);
m_pbuttonTrainMission4->SetChecked (false);
m_pbuttonTrainMission5->SetChecked (true);
m_pbuttonTrainMission6->SetChecked (false);
m_pbuttonTrainMission7->SetChecked (false);
m_pbuttonTrainMission8->SetChecked (false);
m_pbuttonTrain->SetEnabled (true);
m_pbuttonTrain->SetChecked (true);
return true;
}
bool OnButtonTrainMission6()
{
g_pnumberMissionNumber->SetValue (Training::c_TM_6_Practice_Arena);
m_pbuttonTrainMission1->SetChecked (false);
m_pbuttonTrainMission2->SetChecked (false);
m_pbuttonTrainMission3->SetChecked (false);
m_pbuttonTrainMission4->SetChecked (false);
m_pbuttonTrainMission5->SetChecked (false);
m_pbuttonTrainMission6->SetChecked (true);
m_pbuttonTrainMission7->SetChecked (false);
m_pbuttonTrainMission8->SetChecked (false);
m_pbuttonTrain->SetEnabled (true);
m_pbuttonTrain->SetChecked (true);
return true;
}
bool OnButtonTrainMission7()
{
g_pnumberMissionNumber->SetValue (Training::c_TM_7_Live);
m_pbuttonTrainMission1->SetChecked (false);
m_pbuttonTrainMission2->SetChecked (false);
m_pbuttonTrainMission3->SetChecked (false);
m_pbuttonTrainMission4->SetChecked (false);
m_pbuttonTrainMission5->SetChecked (false);
m_pbuttonTrainMission6->SetChecked (false);
m_pbuttonTrainMission7->SetChecked (true);
m_pbuttonTrainMission8->SetChecked (false);
m_pbuttonTrain->SetEnabled (true);
m_pbuttonTrain->SetChecked (true);
return true;
}
bool OnButtonTrainMission8()
{
g_pnumberMissionNumber->SetValue (Training::c_TM_8_Nanite);
m_pbuttonTrainMission1->SetChecked (false);
m_pbuttonTrainMission2->SetChecked (false);
m_pbuttonTrainMission3->SetChecked (false);
m_pbuttonTrainMission4->SetChecked (false);
m_pbuttonTrainMission5->SetChecked (false);
m_pbuttonTrainMission6->SetChecked (false);
m_pbuttonTrainMission7->SetChecked (false);
m_pbuttonTrainMission8->SetChecked (true);
m_pbuttonTrain->SetEnabled (true);
m_pbuttonTrain->SetChecked (true);
return true;
}
Pane* GetPane()
{
return m_ppane;
}
#define TRAINING_MISSION_7_GAME_NAME "Training Mission 7"
static
bool Error (HRESULT hr)
{
if (FAILED (hr))
{
IErrorInfoPtr spErr;
::GetErrorInfo(0, &spErr);
_com_error e (hr, spErr, true);
_bstr_t strError (e.Description().length() ? e.Description() : _bstr_t (e.ErrorMessage()));
TRef<IMessageBox> pMsgBox = CreateMessageBox (ZString ("Unable to create a game. The home server may not be properly installed. Install the home server from your Allegiance CD.\n\nReason for failure: ") + (LPCTSTR)strError, NULL, true);
GetWindow()->GetPopupContainer()->OpenPopup (pMsgBox, false);
return true;
}
return false;
}
void TrainLive (void)
{
if (g_bAskForCDKey && trekClient.GetCDKey ().IsEmpty () )
{
TRef<IPopup> ppopupCDKey = CreateCDKeyPopup ();
GetWindow ()->GetPopupContainer ()->OpenPopup (ppopupCDKey, false);
}
else
{
GetWindow ()->GetPopupContainer ()->OpenPopup (m_pTrainLivePopup, false);
}
}
bool DoTrainLive (void)
{
GetWindow()->SetWaitCursor ();
TRef<IMessageBox> pMsgBox = CreateMessageBox ("Creating game...", NULL, false);
GetWindow ()->GetPopupContainer ()->OpenPopup (pMsgBox, false);
AddEventTarget(&TrainingScreen::OnTrainLive, GetWindow(), 0.1f);
return false;
}
bool OnTrainLive (void)
{
while (!GetWindow()->GetPopupContainer()->IsEmpty())
GetWindow()->GetPopupContainer()->ClosePopup(NULL);
GetWindow()->RestoreCursor();
CreateStandaloneGame ();
return false;
}
void CheckForExistingGames (void)
{
m_spAdminGamesPtr->get_Item (& (_variant_t) (0L), &m_spAdminGamePtr);
if (m_spAdminGamePtr)
{
TRef<IMessageBox> pMsgBox = CreateMessageBox ("The training mission game could not be created because there is already a server running on this machine with an active game.");
GetWindow ()->GetPopupContainer ()->OpenPopup (pMsgBox, false);
m_spAdminGamePtr = 0;
m_spAdminGamesPtr = 0;
}
else
{
CreateTrainingMissionGame ();
}
}
HRESULT CreateTrainingMissionGame (void)
{
HRESULT hr;
assert (m_spAdminGamesPtr);
IAGCGameParametersPtr spParams;
if (!Error (hr = spParams.CreateInstance (CLSID_AGCGameParameters)))
{
spParams->put_MinPlayers (1);
spParams->put_TotalMaxPlayers (1);
spParams->put_CivIDs (0, m_civID); spParams->put_CivIDs (1, 35); spParams->put_GameName (_bstr_t (TRAINING_MISSION_7_GAME_NAME));
spParams->put_LockTeamSettings (true);
if (!Error (hr = m_spAdminGamesPtr->Add (spParams)))
{
if (!Error (hr = m_spAdminGamesPtr->get_Item (& (_variant_t) (0L), &m_spAdminGamePtr)))
{
m_spAdminGamePtr->SetTeamName (0, _bstr_t ("Training Academy"));
m_spAdminGamePtr->SetTeamName (1, _bstr_t ("Bios"));
GetWindow()->SetWaitCursor ();
TRef<IMessageBox> pMsgBox = CreateMessageBox ("Connecting...", NULL, false);
GetWindow ()->GetPopupContainer ()->OpenPopup (pMsgBox, false);
AddEventTarget(&TrainingScreen::OnTryLogon, GetWindow(), 0.1f);
}
}
}
m_spAdminGamesPtr = 0;
return hr;
}
HRESULT CreateStandaloneGame (void)
{
HRESULT hr;
IAdminSessionClassPtr spClass;
if (!Error (hr = CoGetClassObject (__uuidof(AdminSession), CLSCTX_LOCAL_SERVER, NULL, __uuidof(spClass), (void**)&spClass)))
{
AdminSessionSecureHost xHost;
IAdminSessionPtr spSession;
hr = spClass->CreateSession (&xHost, &spSession);
::CoDisconnectObject(&xHost, 0);
if (!Error (hr))
{
IAdminServerPtr spServer;
if (!Error (hr = spSession->get_Server (&spServer)))
{
if (!Error (hr = spServer->get_Games (&m_spAdminGamesPtr)))
{
CheckForExistingGames ();
}
}
}
}
return hr;
}
static
HRESULT KillStandaloneGame (void)
{
HRESULT hr = S_OK;
m_spAdminGamesPtr = 0;
if (m_spAdminGamePtr)
{
if (CoIsHandlerConnected (m_spAdminGamePtr))
hr = m_spAdminGamePtr->Kill ();
m_spAdminGamePtr = 0;
}
return hr;
}
bool OnTryLogon (void)
{
TList<TRef<LANServerInfo> > listResults;
int iTryCount = 10;
while (iTryCount-- && (listResults.GetCount () == 0))
{
trekClient.FindStandaloneServersByName ("127.0.0.1", listResults);
for (int i = 0; (i < 12) && (listResults.GetCount () == 0); i++)
{
Sleep (500);
trekClient.FindStandaloneServersByName (NULL, listResults);
}
}
if (listResults.GetCount () == 1)
{
TList<TRef<LANServerInfo> >::Iterator iterNew(listResults);
if (iterNew.Value ()->strGameName == TRAINING_MISSION_7_GAME_NAME)
{
trekClient.SetIsLobbied(false);
trekClient.SetIsZoneClub(false);
BaseClient::ConnectInfo ci;
ci.guidSession = iterNew.Value ()->guidSession;
strcpy (ci.szName, "Cadet");
iTryCount = 5;
while (iTryCount-- && !trekClient.m_fm.IsConnected ())
{
while (!GetWindow()->GetPopupContainer()->IsEmpty())
GetWindow()->GetPopupContainer()->ClosePopup(NULL);
GetWindow()->RestoreCursor();
trekClient.ConnectToServer (ci, NA, Time::Now(), "", true);
}
}
}
if (!trekClient.m_fm.IsConnected ())
{
while (!GetWindow()->GetPopupContainer()->IsEmpty())
GetWindow()->GetPopupContainer()->ClosePopup(NULL);
GetWindow()->RestoreCursor();
TRef<IMessageBox> pmsgBox = CreateMessageBox("Connection to standalone server failed.");
GetWindow()->GetPopupContainer()->OpenPopup(pmsgBox, false);
KillStandaloneGame ();
#ifdef _DEBUG
char szBuffer[256];
sprintf (szBuffer, "Found %d servers.\n", listResults.GetCount ());
debugf (szBuffer);
#endif
}
else
{
Training::StartMission (Training::c_TM_7_Live);
}
return false;
}
void OnLogonGameServer()
{
GetWindow()->SetWaitCursor();
TRef<IMessageBox> pmsgBox =
CreateMessageBox("Joining mission....", NULL, false, false);
GetWindow()->GetPopupContainer()->OpenPopup(pmsgBox, false);
}
void OnLogonGameServerFailed(bool bRetry, const char* szReason)
{
TRef<IMessageBox> pmsgBox = CreateMessageBox(szReason);
GetWindow()->GetPopupContainer()->OpenPopup(pmsgBox, false);
}
void OnAddPlayer(MissionInfo* pMissionInfo, SideID sideID, PlayerInfo* pPlayerInfo)
{
if ((Training::GetTrainingMissionID () == Training::c_TM_7_Live) && pMissionInfo && (pPlayerInfo == trekClient.MyPlayerInfo()))
{
debugf ("Player was added, waiting for the game to start\n");
Error (m_spAdminGamePtr->StartGame ());
}
}
void OnEnterMission (void)
{
debugf ("Game has started!\n");
GetWindow ()->SetCluster (trekClient.GetShip ()->GetCluster ());
GetWindow ()->screen (ScreenIDCombat);
IstationIGC* pstation = trekClient.GetShip ()->GetStation();
if (pstation)
trekClient.ReplaceLoadout (pstation);
}
};
int TrainingScreen::m_iMissionNext = Training::c_TM_1_Introduction;
IAdminGamesPtr TrainingScreen::m_spAdminGamesPtr = 0;
IAdminGamePtr TrainingScreen::m_spAdminGamePtr = 0;
TRef<Screen> CreateTrainingScreen(Modeler* pmodeler)
{
return new TrainingScreen(pmodeler);
}
void KillTrainingStandaloneGame (void)
{
TrainingScreen::KillStandaloneGame ();
}