/*
** Copyright (C) 1996, 1997 Microsoft Corporation. All Rights Reserved.
**
** File: stationTypeIGC.cpp
**
** Author:
**
** Description:
** Implementation of the CstationTypeIGC class. This file was initially created by
** the ATL wizard for the core object.
**
** History:
*/
// stationTypeIGC.cpp : Implementation of CstationTypeIGC
#include "pch.h"
#include "stationTypeIGC.h"
/////////////////////////////////////////////////////////////////////////////
// CstationTypeIGC
HRESULT CstationTypeIGC::Initialize(ImissionIGC* pMission,
Time now,
const void* data,
int dataSize)
{
assert (pMission);
m_pMission = pMission;
ZRetailAssert (data && (dataSize >= sizeof(DataStationTypeIGC)));
m_data = *((DataStationTypeIGC*)data);
pMission->GetIgcSite()->Preload(m_data.modelName, iswalpha(m_data.textureName[0])
? m_data.textureName
: NULL);
m_pdtConstruction = pMission->GetDroneType(m_data.constructionDroneTypeID);
assert (m_pdtConstruction);
m_pdtConstruction->AddRef();
assert (m_pdtConstruction->GetPilotType() == c_ptBuilder);
MultiHullBase* pmhb = HitTest::Load(m_data.modelName);
m_nLandSlots = 0;
m_nCapLandSlots = 0;
m_nLaunchSlots = 0;
#ifdef DREAMCAST
if (pmhb)
#else
assert (pmhb);
#endif
{
float scale = (m_data.radius / pmhb->GetOriginalRadius());
{
//Get the stations launch slots
static char bfrLaunch[] = "launchX";
while (true)
{
//Do we have a launch slot?
bfrLaunch[6] = '1' + m_nLaunchSlots;
const FrameDataUTL* pfd = pmhb->GetFrame(bfrLaunch);
if (pfd)
{
assert (m_nLaunchSlots < c_maxLaunchSlots);
m_positionLaunches[m_nLaunchSlots] = pfd->position * scale;
m_directionLaunches[m_nLaunchSlots++] = pfd->forward;
}
else
break;
}
}
{
//debugf("Station %s/%s\n", GetName(), m_data.modelName);
//Refigure the stations launch slots
static char bfrLand[] = "capgarageXA";
while (true)
{
//Do we have a launch slot?
bfrLand[9] = '1' + m_nLandSlots;
bfrLand[10] = 'A';
const FrameDataUTL* pfd = pmhb->GetFrame(bfrLand);
if (pfd)
{
assert (m_nLandSlots < c_maxLandSlots);
int i = 0;
do
{
assert (i < c_maxLandPlanes);
m_positionLandPlanes[m_nLandSlots][i] = pfd->position * scale;
m_directionLandPlanes[m_nLandSlots][i] = pfd->forward;
//debugf("\t%s %f %f %f\n", bfrLand, m_positionLandPlanes[m_nLandSlots][i].x, m_positionLandPlanes[m_nLandSlots][i].y, m_positionLandPlanes[m_nLandSlots][i].z);
bfrLand[10] = 'A' + ++i;
pfd = pmhb->GetFrame(bfrLand);
}
while (pfd);
m_nLandPlanes[m_nLandSlots++] = i;
}
else
break;
}
m_nCapLandSlots = m_nLandSlots;
}
{
//debugf("Station %s/%s\n", GetName(), m_data.modelName);
//Refigure the stations launch slots
static char bfrLand[] = "garageXA";
while (true)
{
//Do we have a launch slot?
bfrLand[6] = '1' + m_nLandSlots;
bfrLand[7] = 'A';
const FrameDataUTL* pfd = pmhb->GetFrame(bfrLand);
if (pfd)
{
assert (m_nLandSlots < c_maxLandSlots);
int i = 0;
do
{
assert (i < c_maxLandPlanes);
m_positionLandPlanes[m_nLandSlots][i] = pfd->position * scale;
m_directionLandPlanes[m_nLandSlots][i] = pfd->forward;
//debugf("\t%s %f %f %f\n", bfrLand, m_positionLandPlanes[m_nLandSlots][i].x, m_positionLandPlanes[m_nLandSlots][i].y, m_positionLandPlanes[m_nLandSlots][i].z);
bfrLand[7] = 'A' + ++i;
pfd = pmhb->GetFrame(bfrLand);
}
while (pfd);
m_nLandPlanes[m_nLandSlots++] = i;
}
else
break;
}
}
}
pMission->AddStationType(this);
{
//Create a station upgrade (if this station has an upgrade)
if (m_data.successorStationTypeID != NA)
{
m_pstSuccessor = pMission->GetStationType(m_data.successorStationTypeID);
assert (m_pstSuccessor);
m_pstSuccessor->AddRef();
}
else
assert (m_pstSuccessor == NULL);
}
return S_OK;
}
void CstationTypeIGC::Terminate(void)
{
if (m_pstSuccessor)
{
m_pstSuccessor->Release();
m_pstSuccessor = NULL;
}
assert (m_pdtConstruction);
m_pdtConstruction->Release();
m_pdtConstruction = NULL;
m_pMission->DeleteStationType(this);
}
int CstationTypeIGC::Export(void* data) const
{
if (data)
*((DataStationTypeIGC*)data) = m_data;
return sizeof(DataStationTypeIGC);
}