[Gcblue-commits] gcb_wx/src/sim tcBallisticWeapon.cpp,1.10,1.11 tcGameObject.cpp,1.31,1.32 tcLaunche
Status: Alpha
Brought to you by:
ddcforge
|
From: Dewitt C. <ddc...@us...> - 2005-03-25 03:48:18
|
Update of /cvsroot/gcblue/gcb_wx/src/sim In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv349/src/sim Modified Files: tcBallisticWeapon.cpp tcGameObject.cpp tcLauncher.cpp tcSimState.cpp tcWeaponObject.cpp Log Message: OpenAL++ updates, added point defense Index: tcSimState.cpp =================================================================== RCS file: /cvsroot/gcblue/gcb_wx/src/sim/tcSimState.cpp,v retrieving revision 1.72 retrieving revision 1.73 diff -C2 -d -r1.72 -r1.73 *** tcSimState.cpp 10 Mar 2005 03:28:29 -0000 1.72 --- tcSimState.cpp 25 Mar 2005 03:48:08 -0000 1.73 *************** *** 547,550 **** --- 547,590 ---- /** + * Temporary special case for point defense ballistic weaps + */ + void tcSimState::EvaluatePointDefenseWeaponHit(tcWeaponObject* weapon) + { + wxASSERT(weapon); + + tcGameObject* target = GetObject(weapon->GetIntendedTarget()); + if (target == 0) return; + + float dx, dy, dz, tclosest; + tclosest = target->mcKin.CalculateCollisionPoint(weapon->mcKin, dx, dy, dz); + + if (tclosest > 0.03) return; // defer until future time step + + float trueRange2 = dx*dx + dy*dy + dz*dz; + if (trueRange2 < 2500.0f) // 50.0 m range + { + float fDamage = weapon->GetDamage(); + float fDamageFract = GetFractionalDamage(fDamage, target); + target->mfDamageLevel += fDamageFract; + weapon->mfDamageLevel += 1.0f; // destroys itself on impact + + if (fDamageFract > 0) + { + if (mpUserInfo->IsOwnAlliance(target->mnAlliance)) + { + ReportDamage(target); + } + else + { + tcSound::Get()->PlayEffect("Explosion2"); + } + } + } + + } + + + + /** * JUL2004 This was modified to use EvaluateGuidedMissileHit and * EvaluateImpactMissileHit. *************** *** 591,600 **** else if (tcWeaponObject* weapon = dynamic_cast<tcWeaponObject*>(obj)) { ! if ((weapon->mcKin.mfAlt_m < weapon->mcTerrain.mfHeight_m + 200.0) ! || (weapon->mcKin.mfAlt_m < 100.0)) ! { ! EvaluateImpactWeaponHit(weapon); ! } ! } } --- 631,644 ---- else if (tcWeaponObject* weapon = dynamic_cast<tcWeaponObject*>(obj)) { ! if (weapon->IsGroundFused()) ! { ! bool evaluate = (weapon->mcKin.mfAlt_m < weapon->mcTerrain.mfHeight_m + 200.0) || ! (weapon->mcKin.mfAlt_m < 100.0); ! if (evaluate) EvaluateImpactWeaponHit(weapon); ! } ! else ! { ! EvaluatePointDefenseWeaponHit(weapon); ! } } } *************** *** 1534,1537 **** --- 1578,1585 ---- tcSound::Get()->PlayEffect("NavalGun1"); } + else if (ballistic->IsPointDefense()) + { + tcSound::Get()->PlayEffect("Gatling"); + } } } *************** *** 2236,2239 **** --- 2284,2345 ---- /** + * Populates <track> with track from sensor map or truth data + * if <id> is own-alliance. + * @param alliance alliance of requesting entity + * @return true if successful, false if id not found + */ + bool tcSimState::GetTrack(long id, unsigned alliance, tcSensorMapTrack& track) + { + tcGameObject* obj = GetObject(id); + if (obj == 0) return false; // target not found + + // return truth data if own alliance + if (alliance == obj->mnAlliance) + { + tcKinematics *kin = &obj->mcKin; + track.mfAlt_m = kin->mfAlt_m; + track.mfHeading_rad = kin->mfHeading_rad; + track.mfLat_rad = (float)kin->mfLat_rad; + track.mfLon_rad = (float)kin->mfLon_rad; + track.mfSpeed_kts = kin->mfSpeed_kts; + track.mnClassification = obj->mpDBObject->mnType; + track.mnID = obj->mnID; + track.mnAffiliation = FRIENDLY; + } + else + { + tcSensorMapTrack *pTrack = + mcSensorMap.GetSensorMapTrack(obj->mnID, alliance); + if (pTrack) track = *pTrack; + } + + return true; + } + + + /** + * Populates <track> with truth data + * @return true if successful, false if id not found + */ + bool tcSimState::GetTruthTrack(long id, tcTrack& track) + { + tcGameObject* obj = GetObject(id); + if (obj == 0) return false; // target not found + + tcKinematics *kin = &obj->mcKin; + track.mfAlt_m = kin->mfAlt_m; + track.mfHeading_rad = kin->mfHeading_rad; + track.mfClimbAngle_rad = kin->mfClimbAngle_rad; + track.mfLat_rad = (float)kin->mfLat_rad; + track.mfLon_rad = (float)kin->mfLon_rad; + track.mfSpeed_kts = kin->mfSpeed_kts; + track.mnClassification = obj->mpDBObject->mnType; + track.mnID = obj->mnID; + track.mnAffiliation = FRIENDLY; + + return true; + } + + /** * @return true if valid scenario is loaded */ Index: tcWeaponObject.cpp =================================================================== RCS file: /cvsroot/gcblue/gcb_wx/src/sim/tcWeaponObject.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** tcWeaponObject.cpp 5 Dec 2004 02:49:48 -0000 1.10 --- tcWeaponObject.cpp 25 Mar 2005 03:48:08 -0000 1.11 *************** *** 88,91 **** --- 88,96 ---- } + bool tcWeaponObject::IsGroundFused() const + { + return (fuseMode == FuseMode::GROUND_FUSE); + } + bool tcWeaponObject::IsIntendedTarget(long id) { *************** *** 99,102 **** --- 104,112 ---- } + void tcWeaponObject::SetFuseMode(FuseMode mode) + { + fuseMode = mode; + } + void tcWeaponObject::SetIntendedTarget(long targetId) { *************** *** 123,127 **** tcWeaponObject::tcWeaponObject() : fuseHasTriggered(false), fuseDelay(0), intendedTarget(-1), ! mpDBObject(0) { --- 133,138 ---- tcWeaponObject::tcWeaponObject() : fuseHasTriggered(false), fuseDelay(0), intendedTarget(-1), ! mpDBObject(0), ! fuseMode(FuseMode::GROUND_FUSE) { *************** *** 142,146 **** : tcGameObject(obj), fuseHasTriggered(false), fuseDelay(0), intendedTarget(-1), ! mpDBObject(obj) { wxASSERT(simState); --- 153,158 ---- : tcGameObject(obj), fuseHasTriggered(false), fuseDelay(0), intendedTarget(-1), ! mpDBObject(obj), ! fuseMode(FuseMode::GROUND_FUSE) { wxASSERT(simState); Index: tcGameObject.cpp =================================================================== RCS file: /cvsroot/gcblue/gcb_wx/src/sim/tcGameObject.cpp,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -d -r1.31 -r1.32 *** tcGameObject.cpp 10 Mar 2005 03:28:29 -0000 1.31 --- tcGameObject.cpp 25 Mar 2005 03:48:07 -0000 1.32 *************** *** 80,83 **** --- 80,91 ---- /** + * Call to destroy object as name suggests + */ + void tcGameObject::SelfDestruct() + { + mfDamageLevel += 1.0f; + } + + /** * */ Index: tcBallisticWeapon.cpp =================================================================== RCS file: /cvsroot/gcblue/gcb_wx/src/sim/tcBallisticWeapon.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** tcBallisticWeapon.cpp 10 Mar 2005 03:28:29 -0000 1.10 --- tcBallisticWeapon.cpp 25 Mar 2005 03:48:07 -0000 1.11 *************** *** 98,101 **** --- 98,103 ---- mcKin.mfPitch_rad += pLauncher->pointingElevation; + distFromLaunch_m = 0; + // For gun round, set az and el to intercept target datum if (mpDBObject->IsGunRound()) *************** *** 119,124 **** range_m, mpDBObject->launchSpeed_mps); */ - } wxString s = wxString::Format("Ball %d-%d", obj->mnID, rand() % 1000); --- 121,146 ---- range_m, mpDBObject->launchSpeed_mps); */ } + else if (mpDBObject->IsPointDefense()) + { + mcKin.mfSpeed_kts = C_MPSTOKTS * mpDBObject->launchSpeed_mps; + + /* get intercept az and el to target, if target is bad then launch + ** at 0 deg az, 45 deg el, and write error */ + tcTrack targetTrack; + float launchAz_rad = 0; + float launchEl_rad = 1.0f; + float tti_s; + float range_km; + if (simState->GetTruthTrack(pLauncher->mnTargetID, targetTrack)) + { + mcKin.GetInterceptData3D(targetTrack, launchAz_rad, launchEl_rad, tti_s, range_km); + } + mcKin.mfHeading_rad = launchAz_rad; + mcKin.mfPitch_rad = launchEl_rad; + mcKin.mfClimbAngle_rad = launchEl_rad; + + SetFuseMode(FuseMode::TARGET_FUSE); + } wxString s = wxString::Format("Ball %d-%d", obj->mnID, rand() % 1000); *************** *** 135,140 **** SetIntendedTarget(pLauncher->mnTargetID); - - } --- 157,160 ---- *************** *** 163,173 **** } ! vz_mps += -C_G * dt_s; ! float dist = C_MTORAD * dt_s * vxy_mps; float dlon = dist * sinf(mcKin.mfHeading_rad) / cosf(mcKin.mfLat_rad); float dlat = dist * cosf(mcKin.mfHeading_rad); mcKin.mfLon_rad += dlon; mcKin.mfLat_rad += dlat; --- 183,200 ---- } ! // point defense rounds magically defy gravity ! if (!IsPointDefense()) ! { ! vz_mps += -C_G * dt_s; ! } ! float distxy_m = dt_s * vxy_mps; ! float dist = C_MTORAD * distxy_m; float dlon = dist * sinf(mcKin.mfHeading_rad) / cosf(mcKin.mfLat_rad); float dlat = dist * cosf(mcKin.mfHeading_rad); + distFromLaunch_m += distxy_m; + mcKin.mfLon_rad += dlon; mcKin.mfLat_rad += dlat; *************** *** 178,199 **** mcKin.mfSpeed_kts = C_MPSTOKTS * sqrtf(vxy_mps*vxy_mps + vz_mps*vz_mps); if (clientMode) return; ! /*** check for impact ***/ ! float terrainHeight_m = mcTerrain.mfHeight_m; ! if (terrainHeight_m < 0) terrainHeight_m = 0; ! float dz = terrainHeight_m - mcKin.mfAlt_m; // height above ground or sea level ! float t_impact = dz / vz_mps; ! if ((vz_mps < 0)&&(t_impact <= 0.03f)) ! { ! Detonate(t_impact); ! } } /** --- 205,265 ---- mcKin.mfSpeed_kts = C_MPSTOKTS * sqrtf(vxy_mps*vxy_mps + vz_mps*vz_mps); + if ((mpDBObject->maxRange_km > 0) && + (distFromLaunch_m > 1000.0f * mpDBObject->maxRange_km)) + { + SelfDestruct(); + } + if (clientMode) return; ! /*** check for impact ***/ ! if (IsPointDefense()) ! { ! UpdateTargetFuse(); ! } ! else ! { ! UpdateGroundFuse(); ! } ! } ! void tcBallisticWeapon::UpdateGroundFuse() ! { ! // check for impact with ground ! float terrainHeight_m = mcTerrain.mfHeight_m; ! if (terrainHeight_m < 0) terrainHeight_m = 0; ! float dz = terrainHeight_m - mcKin.mfAlt_m; // height above ground or sea level ! float t_impact = dz / vz_mps; ! ! if ((vz_mps < 0)&&(t_impact <= 0.03f)) ! { ! Detonate(t_impact); ! } } + void tcBallisticWeapon::UpdateTargetFuse() + { + const float checkInterceptRange = 0.2f; + + if (tcGameObject* target = simState->GetObject(intendedTarget)) + { + float range_km = mcKin.RangeToKmAlt(target->mcKin); + if (range_km <= checkInterceptRange) + { + Detonate(0); // not really a detonation, but a signal for simstate to check for hit + } + else + { + fuseHasTriggered = false; + } + } + else + { + } + } /** *************** *** 206,209 **** --- 272,276 ---- vz_mps = 0; vxy_mps = 0; + distFromLaunch_m = 0; } *************** *** 262,265 **** --- 329,337 ---- } + bool tcBallisticWeapon::IsPointDefense() const + { + return mpDBObject->IsPointDefense(); + } + /** * *************** *** 284,287 **** --- 356,360 ---- vz_mps = o.vz_mps; vxy_mps = o.vxy_mps; + distFromLaunch_m = o.distFromLaunch_m; } *************** *** 292,296 **** : tcWeaponObject(obj), vz_mps(0), ! vxy_mps(0) { mnModelType = MTYPE_BALLISTIC; --- 365,370 ---- : tcWeaponObject(obj), vz_mps(0), ! vxy_mps(0), ! distFromLaunch_m(0) { mnModelType = MTYPE_BALLISTIC; Index: tcLauncher.cpp =================================================================== RCS file: /cvsroot/gcblue/gcb_wx/src/sim/tcLauncher.cpp,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** tcLauncher.cpp 10 Mar 2005 03:28:29 -0000 1.13 --- tcLauncher.cpp 25 Mar 2005 03:48:08 -0000 1.14 *************** *** 22,25 **** --- 22,26 ---- #include "tcLauncher.h" #include "tcDatabase.h" + #include "tcBallisticDBObject.h" #include "tcGenericDBObject.h" #include "tcLauncherDBObject.h" *************** *** 254,257 **** --- 255,260 ---- } + bool hasTarget = (mnTargetID != NULL_INDEX); + if (meLaunchMode == DATUM_ONLY) // needs a datum programmed to launch { *************** *** 265,270 **** } } ! ! --- 268,283 ---- } } ! else if (meLaunchMode == TARGET_ONLY) ! { ! if (hasTarget) ! { ! return LAUNCHER_READY; ! } ! else ! { ! return NO_TARGET; ! } ! } ! *************** *** 273,277 **** { bool hasDatum = (msDatum.mfLat_rad != 0) || (msDatum.mfLon_rad != 0); - bool hasTarget = (mnTargetID == NULL_INDEX); if ((!hasDatum) && (!hasTarget)) { --- 286,289 ---- *************** *** 384,387 **** --- 396,401 ---- } + bool hasTarget = (mnTargetID != NULL_INDEX); + if (meLaunchMode == DATUM_ONLY) // needs a datum programmed to launch { *************** *** 395,399 **** } } ! --- 409,423 ---- } } ! else if (meLaunchMode == TARGET_ONLY) ! { ! if (hasTarget) ! { ! return LAUNCHER_READY; ! } ! else ! { ! return NO_TARGET; ! } ! } *************** *** 403,407 **** { bool hasDatum = (msDatum.mfLat_rad != 0) || (msDatum.mfLon_rad != 0); ! bool hasTarget = (mnTargetID == NULL_INDEX); if ((!hasDatum) && (!hasTarget)) { --- 427,431 ---- { bool hasDatum = (msDatum.mfLat_rad != 0) || (msDatum.mfLon_rad != 0); ! if ((!hasDatum) && (!hasTarget)) { *************** *** 614,621 **** } ! else // assume ballistic vs. land (TODO rework this) { ! meLaunchMode = DATUM_ONLY; ! mnTargetFlags = SURFACE_TARGET | LAND_TARGET; } --- 638,657 ---- } ! else if (tcBallisticDBObject* ballisticDBObj = ! dynamic_cast<tcBallisticDBObject*>(mpChildDBObj)) { ! if (ballisticDBObj->IsPointDefense()) ! { ! meLaunchMode = TARGET_ONLY; ! } ! else ! { ! meLaunchMode = DATUM_ONLY; ! } ! mnTargetFlags = ballisticDBObj->targetFlags; ! } ! else // sonobuoy ! { ! meLaunchMode = DATUM_ONLY; } |