///////////////////////////////////////////////////////////////////////////// // CprobeTypeIGC HRESULT CprobeTypeIGC::Initialize(ImissionIGC* pMission, Time now, const void* data, int dataSize) { assert (pMission); m_pMission = pMission; ZRetailAssert (data && (dataSize == sizeof(DataProbeTypeIGC))); { m_data = *((DataProbeTypeIGC*)data); assert (iswalpha(m_data.modelName[0])); pMission->GetIgcSite()->Preload(m_data.modelName, iswalpha(m_data.textureName[0]) ? m_data.textureName : NULL); MultiHullBase* pmhb = HitTest::Load(m_data.modelName); if (m_data.projectileTypeID != NA) { m_projectileType = pMission->GetProjectileType(m_data.projectileTypeID); assert (m_projectileType); m_projectileType->AddRef(); if (pmhb) { float scale = (m_data.radius / pmhb->GetOriginalRadius()); m_emissionPt = pmhb->GetFrameOffset("wepemt") * scale; } else { m_emissionPt = Vector::GetZero(); } } pMission->AddExpendableType(this); } return S_OK; }
///////////////////////////////////////////////////////////////////////////// // ChullTypeIGC HRESULT ChullTypeIGC::Initialize(ImissionIGC* pMission, Time now, const void* data, int dataSize) { assert (pMission); m_pMission = pMission; ZRetailAssert (data && (dataSize >= sizeof(DataHullTypeIGC))); //Note ... we need to allocate & copy the DataHullTypeIGC + the variable length fields m_data = (DataHullTypeIGC*)(new char [dataSize]); assert (m_data); memcpy(m_data, data, dataSize); { for (int i = 0; ((i < c_cMaxPreferredPartTypes) && (m_data->preferredPartsTypes[i] != NA)); i++) { IpartTypeIGC* ppt = pMission->GetPartType(m_data->preferredPartsTypes[i]); assert (ppt); ppt->AddRef(); m_preferredPartTypes.last(ppt); } } IIgcSite* pigc = pMission->GetIgcSite(); pigc->Preload(m_data->modelName, iswalpha(m_data->textureName[0]) ? m_data->textureName : NULL); m_poIcon = pigc->LoadRadarIcon(m_data->iconName); { static const Vector z(0.0f, 0.0f, 1.0f); MultiHullBase* pmhb = HitTest::Load(m_data->modelName); assert (pmhb); { { float r = pmhb->GetOriginalRadius(); m_scale = (0.5f * m_data->length / r); #if 0 { const Vector& ellipseEquation = pmhb->GetEllipseEquation(); debugf("%s/%d %f %f %f\n", m_data->name, m_data->hullID, ellipseEquation.x * m_scale, ellipseEquation.y * m_scale, ellipseEquation.z * m_scale); double v = ellipseEquation.x * ellipseEquation.y * ellipseEquation.z; debugf("%s/%d\t(%s)\n\tOld length = %f\n\tNew Length = %f\n\tFrontal area = %f\n\tVolume = %f\n", m_data->name, m_data->hullID, m_data->modelName, float(m_data->length), float(m_data->length) * r * float(pow(v, -1.0/3.0)), pmhb->GetEllipseEquation().x * pmhb->GetEllipseEquation().y * m_scale * m_scale, pmhb->GetEllipseEquation().x * pmhb->GetEllipseEquation().y * pmhb->GetEllipseEquation().z * m_scale * m_scale * m_scale); debugf("\tDensity %f\n", m_data->mass / (0.2f * (pmhb->GetEllipseEquation().x * pmhb->GetEllipseEquation().y * pmhb->GetEllipseEquation().z * m_scale * m_scale * m_scale))); } #endif } { const FrameDataUTL* pfd = pmhb->GetFrame("cockpt"); m_cockpit = pfd ? (pfd->position * m_scale) : z; } { // TurkeyXIII 11/09 #94 const FrameDataUTL* pfd = pmhb->GetFrame("chaff"); m_chaff = pfd ? (pfd->position * m_scale) : Vector::GetZero(); } for (Mount i = m_data->maxWeapons - 1; (i >= 0); i--) { const HardpointData& hd = GetHardpointData(i); const FrameDataUTL* pfd = pmhb->GetFrame(hd.frameName); // KGJV: temp fix assert (pfd); //Note: still need to handle pfd == NULL semi-gracefully in retail // mmf added debugf to log what would have been the above assert that KGJV commented out // this seems to happen a lot at core load, no sense logging it // if (pfd==NULL) debugf("mmf hullTypeIGC.cpp ln 96 pfd == NULL would have called assert\n"); if (hd.bFixed) { assert (i < m_data->maxFixedWeapons); m_positionWeapons[i] = pfd ? (pfd->position * m_scale) : Vector::GetZero(); } else { // mmf debug build failing on this assert with newer cores like plus14b or rps55 // dn 4.05 and zone core work // this has been logged sufficiently to provide core authors enough info // if they wanted to try and resolve the 'errors' they seem not to be problematic // if (i < m_data->maxFixedWeapons) { // debugf("mmf hullTypeIGC.cpp would have called assert\n"); // debugf("mmf i=%d, maxFixedWeapons=%d, hullID = %d\n",i,m_data->maxFixedWeapons,m_data->hullID); // } // end mmf // mmf comment out this assert so debug build will work // assert (i >= m_data->maxFixedWeapons); if (pfd) { m_positionWeapons[i] = pfd->position * m_scale; static const Vector up(0.0f, 1.0f, 0.0f); if (fabs(pfd->forward * up) < 0.9f) m_orientationWeapons[i].Set(pfd->forward, up); else { m_orientationWeapons[i].Set(pfd->forward, z); } } else { m_positionWeapons[i] = Vector::GetZero(); m_orientationWeapons[i].Set(z); } } } #if 0 if (m_data->maxFixedWeapons > 1) { debugf("\n%s/%d\t%s\t%f\n", GetName(), GetObjectID(), m_data->modelName, m_data->length); for (Mount i = 0; (i < m_data->maxFixedWeapons); i++) { for (Mount j = i+1; (j < m_data->maxFixedWeapons); j++) { debugf("%d <-> %d\t%f %s %s\n", i, j, (m_positionWeapons[i] - m_positionWeapons[j]).Length(), GetHardpointData(i).frameName, GetHardpointData(j).frameName); } } } #endif m_nLandSlots = 0; m_nLaunchSlots = 0; { //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_maxShipLaunchSlots); m_positionLaunches[m_nLaunchSlots] = pfd->position * m_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[] = "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_maxShipLandSlots); int i = 0; do { assert (i < c_maxLandPlanes); m_positionLandPlanes[m_nLandSlots][i] = pfd->position * m_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; } } } } if (m_data->successorHullID != NA) { m_phtSuccessor = pMission->GetHullType(m_data->successorHullID); // mmf this assert causing plus15b2 core to exit // comment out for now so this core can be tested with debug build // assert (m_phtSuccessor); // add debugf // this has been logged enough if core devs want to resolve it // does not seem to be problem // debugf("mmf hullTypeIGC.cpp m_phtSuccessor == NULL would have called assert\n"); // debugf("mmf m_data->successorHullID = %d, hullID = %d\n",m_data->successorHullID,m_data->hullID); } pMission->AddHullType(this); /* if (this->GetRechargeRate() > 0.0f) { float eTotal = 0.0f; for (Mount i = 0; (i < this->GetMaxWeapons()); i++) { const HardpointData& hd = this->GetHardpointData(i); float eMax = 0.0f; for (PartTypeLinkIGC* ppl = pMission->GetPartTypes()->first(); (ppl != NULL); ppl = ppl->next()) { IpartTypeIGC* pt = ppl->data(); if ((pt->GetEquipmentType() == ET_Weapon) && ((pt->GetPartMask() & ~hd.partMask) == 0)) { DataWeaponTypeIGC* dwt = (DataWeaponTypeIGC*)(pt->GetData()); float e = dwt->energyPerShot / dwt->dtimeBurst; if (e > eMax) eMax = e; } } eTotal += eMax; } if (this->GetPartMask(ET_Cloak, 0) != 0) { debugf("\n%s (%d)\n\t%8.3f%8.0f%8.0f\n\t%8.3f (120)\n\t%8.3f (180)\n\t%8.3f (200)\n\t%8.3f (%8.3f) %8.3f\n", GetName(), GetObjectID(), this->GetMaxEnergy() / this->GetRechargeRate(), this->GetMaxEnergy(), this->GetRechargeRate(), this->GetMaxEnergy() / (120.0f - this->GetRechargeRate()), this->GetMaxEnergy() / (180.0f - this->GetRechargeRate()), this->GetMaxEnergy() / (200.0f - this->GetRechargeRate()), (eTotal > this->GetRechargeRate()) ? this->GetMaxEnergy() / (eTotal - this->GetRechargeRate()) : -1.0f, eTotal, eTotal/this->GetRechargeRate()); } else { debugf("\n%s (%d)\n\t%8.3f%8.0f%8.0f\n\t%8.3f (%8.3f) %8.3f\n", GetName(), GetObjectID(), this->GetMaxEnergy() / this->GetRechargeRate(), this->GetMaxEnergy(), this->GetRechargeRate(), (eTotal > this->GetRechargeRate()) ? this->GetMaxEnergy() / (eTotal - this->GetRechargeRate()) : -1.0f, eTotal, eTotal/this->GetRechargeRate()); } } */ return S_OK; }