/* ** 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); }