From 0361f97881dcf9a54d24564e7be10fffb0225e8e Mon Sep 17 00:00:00 2001 From: rt Date: Sun, 15 Jun 2014 15:52:49 +0200 Subject: [PATCH] fix #4416 get rid of CMD_LOOPBACKATTACK which served as a toggle for allowing aircraft to execute loopings, gadgets can set this now (via passing key "loopbackAttack" to MoveCtrl.SetAirMoveTypeData) --- rts/Game/UI/CursorIcons.cpp | 1 - rts/Lua/LuaConstCMD.cpp | 2 +- rts/Sim/MoveTypes/StrafeAirMoveType.cpp | 240 ++++++++++++------------ rts/Sim/MoveTypes/StrafeAirMoveType.h | 16 +- rts/Sim/Units/CommandAI/AirCAI.cpp | 36 ---- rts/Sim/Units/CommandAI/Command.h | 1 - rts/Sim/Units/CommandAI/CommandAI.cpp | 2 - 7 files changed, 133 insertions(+), 165 deletions(-) diff --git a/rts/Game/UI/CursorIcons.cpp b/rts/Game/UI/CursorIcons.cpp index 1fde44c5ba3..162c81be222 100644 --- a/rts/Game/UI/CursorIcons.cpp +++ b/rts/Game/UI/CursorIcons.cpp @@ -179,7 +179,6 @@ const CMouseCursor* CCursorIcons::GetCursor(int cmd) const case CMD_FIGHT: cursorName = "Fight"; break; case CMD_ATTACK: cursorName = "Attack"; break; case CMD_AREA_ATTACK: cursorName = "Area attack"; break; - case CMD_LOOPBACKATTACK: cursorName = "Attack"; break; case CMD_GUARD: cursorName = "Guard"; break; case CMD_REPAIR: cursorName = "Repair"; break; case CMD_LOAD_ONTO: cursorName = "Load units"; break; diff --git a/rts/Lua/LuaConstCMD.cpp b/rts/Lua/LuaConstCMD.cpp index 54a1bac2613..e4c9979b688 100644 --- a/rts/Lua/LuaConstCMD.cpp +++ b/rts/Lua/LuaConstCMD.cpp @@ -70,7 +70,7 @@ bool LuaConstCMD::PushEntries(lua_State* L) PUSH_CMD(RESURRECT); PUSH_CMD(CAPTURE); PUSH_CMD(AUTOREPAIRLEVEL); - PUSH_CMD(LOOPBACKATTACK); + LuaInsertDualMapPair(L, "LOOPBACKATTACK", CMD_ATTACK); // backward compability (TODO: find a way to print a warning when used!) PUSH_CMD(IDLEMODE); return true; diff --git a/rts/Sim/MoveTypes/StrafeAirMoveType.cpp b/rts/Sim/MoveTypes/StrafeAirMoveType.cpp index 5a51816fea5..d2365d336d7 100644 --- a/rts/Sim/MoveTypes/StrafeAirMoveType.cpp +++ b/rts/Sim/MoveTypes/StrafeAirMoveType.cpp @@ -23,7 +23,7 @@ CR_BIND_DERIVED(CStrafeAirMoveType, AAirMoveType, (NULL)); CR_REG_METADATA(CStrafeAirMoveType, ( - CR_MEMBER(maneuver), + CR_MEMBER(maneuverState), CR_MEMBER(maneuverSubState), CR_MEMBER(loopbackAttack), @@ -53,14 +53,15 @@ CR_REG_METADATA(CStrafeAirMoveType, ( CR_MEMBER(lastElevatorPos), CR_MEMBER(lastAileronPos), - CR_MEMBER(inefficientAttackTime), - CR_MEMBER(exitVector), - CR_RESERVED(63) )); +static float TurnRadius(const float rawRadius, const float rawSpeed) { + return (std::min(1000.0f, rawRadius * rawSpeed)); +} + static float GetAileronDeflection( const CUnit* owner, const CUnit* collidee, @@ -232,7 +233,7 @@ static float GetElevatorDeflection( bool attacking ) { float elevator = 0.0f; - float upside = Sign(updir.y >= -0.3f); + float upside = (updir.y >= -0.3f) * 2.0f - 1.0f; if (attacking) { if (spd.w < 1.5f) { @@ -272,7 +273,7 @@ static float GetElevatorDeflection( } } - if (elevator * upside < minPitch) { + if ((elevator * upside) < minPitch) { elevator = minPitch * upside; } } @@ -317,11 +318,35 @@ static float GetElevatorDeflection( return elevator; } +static int SelectLoopBackManeuver( + const SyncedFloat3& frontdir, + const SyncedFloat3& rightdir, + const float4& spd, + float turnRadius, + float groundDist +) { + // do not start looping if already banked + if (math::fabs(rightdir.y) > 0.05f) + return CStrafeAirMoveType::MANEUVER_FLY_STRAIGHT; + + if (groundDist > TurnRadius(turnRadius, spd.w)) { + if (math::fabs(frontdir.y) <= 0.2f && gs->randFloat() > 0.3f) { + return CStrafeAirMoveType::MANEUVER_IMMELMAN_INV; + } + } else { + if (frontdir.y > -0.2f && gs->randFloat() > 0.7f) { + return CStrafeAirMoveType::MANEUVER_IMMELMAN; + } + } + + return CStrafeAirMoveType::MANEUVER_FLY_STRAIGHT; +} + CStrafeAirMoveType::CStrafeAirMoveType(CUnit* owner): AAirMoveType(owner), - maneuver(0), + maneuverState(MANEUVER_FLY_STRAIGHT), maneuverSubState(0), loopbackAttack(false), isFighter(false), @@ -338,7 +363,6 @@ CStrafeAirMoveType::CStrafeAirMoveType(CUnit* owner): maxAileron(0.04f), maxElevator(0.02f), maxRudder(0.01f), - inefficientAttackTime(0) { assert(owner != NULL); assert(owner->unitDef != NULL); @@ -347,6 +371,7 @@ CStrafeAirMoveType::CStrafeAirMoveType(CUnit* owner): owner->mapSquare += 1; isFighter = owner->unitDef->IsFighterAirUnit(); + loopbackAttack = owner->unitDef->canLoopbackAttack && isFighter; collide = owner->unitDef->collide; wingAngle = owner->unitDef->wingAngle; @@ -389,10 +414,6 @@ CStrafeAirMoveType::CStrafeAirMoveType(CUnit* owner): lastRudderPos = 0.0f; lastElevatorPos = 0.0f; lastAileronPos = 0.0f; - - exitVector = gs->randVector(); - exitVector.y = math::fabs(exitVector.y); - exitVector.y += 1.0f; } @@ -408,7 +429,7 @@ bool CStrafeAirMoveType::Update() // otherwise we might fall through the map when stunned // (the kill-on-impact code is not reached in that case) if ((owner->IsStunned() && !owner->IsCrashing()) || owner->beingBuilt) { - UpdateAirPhysics(0.0f * lastRudderPos, lastAileronPos, lastElevatorPos, 0, ZeroVector); + UpdateAirPhysics(0.0f * lastRudderPos, lastAileronPos, lastElevatorPos, 0.0f, ZeroVector); return (HandleCollisions(collide && !owner->beingBuilt && (padStatus == PAD_STATUS_FLYING) && (aircraftState != AIRCRAFT_TAKEOFF))); } @@ -421,7 +442,6 @@ bool CStrafeAirMoveType::Update() if (aircraftState != AIRCRAFT_CRASHING) { if (owner->UnderFirstPersonControl()) { SetState(AIRCRAFT_FLYING); - inefficientAttackTime = 0; const FPSUnitController& con = owner->fpsControlPlayer->fpsController; @@ -429,13 +449,13 @@ bool CStrafeAirMoveType::Update() float aileron = 0.0f; float elevator = 0.0f; - if (con.forward) { elevator -= 1; } - if (con.back ) { elevator += 1; } - if (con.right ) { aileron += 1; } - if (con.left ) { aileron -= 1; } + if (con.forward) { elevator -= 1.0f; } + if (con.back ) { elevator += 1.0f; } + if (con.right ) { aileron += 1.0f; } + if (con.left ) { aileron -= 1.0f; } - UpdateAirPhysics(0, aileron, elevator, 1, owner->frontdir); - maneuver = 0; + UpdateAirPhysics(0.0f, aileron, elevator, 1.0f, owner->frontdir); + maneuverState = MANEUVER_FLY_STRAIGHT; return (HandleCollisions(collide && !owner->beingBuilt && (padStatus == PAD_STATUS_FLYING) && (aircraftState != AIRCRAFT_TAKEOFF))); } @@ -464,6 +484,7 @@ bool CStrafeAirMoveType::Update() owner->restTime = 0; const CCommandQueue& cmdQue = owner->commandAI->commandQue; + const bool isAttacking = (!cmdQue.empty() && (cmdQue.front()).GetID() == CMD_ATTACK); const bool keepAttacking = ((owner->attackTarget != NULL && !owner->attackTarget->isDead) || owner->userAttackGround); @@ -477,41 +498,47 @@ bool CStrafeAirMoveType::Update() */ { if (isAttacking && allowAttack && keepAttacking) { - inefficientAttackTime = std::min(inefficientAttackTime, float(gs->frameNum) - owner->lastFireWeapon); - if (owner->attackTarget != NULL) { SetGoal(owner->attackTarget->pos); } else { SetGoal(owner->attackPos); } - if (maneuver) { + const bool goalInFront = ((goalPos - lastPos).dot(owner->frontdir) > 0.0f); + const bool goalInRange = (goalPos.SqDistance(lastPos) < Square(owner->maxRange * 4.0f)); + + // NOTE: UpdateAttack changes goalPos + if (maneuverState != MANEUVER_FLY_STRAIGHT) { UpdateManeuver(); - inefficientAttackTime = 0; - } else if (isFighter && goalPos.SqDistance(lastPos) < Square(owner->maxRange * 4)) { - inefficientAttackTime++; - UpdateFighterAttack(); - } else { - inefficientAttackTime = 0; + } else if (goalInFront && goalInRange) { UpdateAttack(); + } else if (!goalInFront) { + if (UpdateFlying(wantedHeight, 1.0f) && loopbackAttack) { + // once yaw and roll are unblocked, semi-randomly decide to turn or loop + const SyncedFloat3& rightdir = owner->rightdir; + const SyncedFloat3& frontdir = owner->frontdir; + + const float altitude = ground->GetHeightAboveWater(owner->pos.x, owner->pos.z) - lastPos.y; + + if ((maneuverState = SelectLoopBackManeuver(frontdir, rightdir, lastSpd, turnRadius, altitude)) == MANEUVER_IMMELMAN_INV) { + maneuverSubState = 0; + } + } } } else { - inefficientAttackTime = 0; - UpdateFlying(wantedHeight, 1); + UpdateFlying(wantedHeight, 1.0f); } } } break; case AIRCRAFT_LANDED: - inefficientAttackTime = 0; UpdateLanded(); break; case AIRCRAFT_LANDING: - inefficientAttackTime = 0; UpdateLanding(); break; case AIRCRAFT_CRASHING: { // NOTE: the crashing-state can only be set (and unset) by scripts - UpdateAirPhysics(crashRudder, crashAileron, crashElevator, 0, owner->frontdir); + UpdateAirPhysics(crashRudder, crashAileron, crashElevator, 0.0f, owner->frontdir); if ((CGround::GetHeightAboveWater(owner->pos.x, owner->pos.z) + 5.0f + owner->radius) > owner->pos.y) { owner->ClearPhysicalStateBit(CSolidObject::PSTATE_BIT_CRASHING); @@ -650,73 +677,74 @@ void CStrafeAirMoveType::UpdateManeuver() { const float speedf = owner->speed.w; - switch (maneuver) { - case 1: { - // Immelman - int aileron = 0; - int elevator = 0; + switch (maneuverState) { + case MANEUVER_IMMELMAN: { + float aileron = 0.0f; + float elevator = 0.0f; if (owner->updir.y > 0.0f) { if (owner->rightdir.y > maxAileron * speedf) { - aileron = 1; + aileron = 1.0f; } else if (owner->rightdir.y < -maxAileron * speedf) { - aileron = -1; + aileron = -1.0f; } } - if (math::fabs(owner->rightdir.y) < maxAileron * 3.0f * speedf || owner->updir.y < 0.0f) { - elevator = 1; - } - UpdateAirPhysics(0, aileron, elevator, 1, owner->frontdir); + if (math::fabs(owner->rightdir.y) < maxAileron * 3.0f * speedf || owner->updir.y < 0.0f) + elevator = 1.0f; + + UpdateAirPhysics(0.0f, aileron, elevator, 1.0f, owner->frontdir); if ((owner->updir.y < 0.0f && owner->frontdir.y < 0.0f) || speedf < 0.8f) { - maneuver = 0; + maneuverState = MANEUVER_FLY_STRAIGHT; } // [?] some seem to report that the "unlimited altitude" thing is because of these maneuvers - if (owner->pos.y - CGround::GetApproximateHeight(owner->pos.x, owner->pos.z) > wantedHeight * 4.0f) { - maneuver = 0; + if ((owner->pos.y - ground->GetApproximateHeight(owner->pos.x, owner->pos.z)) > (wantedHeight * 4.0f)) { + maneuverState = MANEUVER_FLY_STRAIGHT; } - break; - } + } break; - case 2: { + case MANEUVER_IMMELMAN_INV: { // inverted Immelman - int aileron = 0; - int elevator = 0; + float aileron = 0.0f; + float elevator = 0.0f; if (maneuverSubState == 0) { if (owner->rightdir.y >= 0.0f) { - aileron = -1; + aileron = -1.0f; } else { - aileron = 1; + aileron = 1.0f; } } - if (owner->frontdir.y < -0.7f) { + if (owner->frontdir.y < -0.7f) maneuverSubState = 1; - } - if (maneuverSubState == 1 || owner->updir.y < 0.0f) { - elevator = 1; - } + if (maneuverSubState == 1 || owner->updir.y < 0.0f) + elevator = 1.0f; - UpdateAirPhysics(0, aileron, elevator, 1, owner->frontdir); + UpdateAirPhysics(0.0f, aileron, elevator, 1.0f, owner->frontdir); - if ((owner->updir.y > 0.0f && owner->frontdir.y > 0.0f && maneuverSubState == 1) || speedf < 0.2f) - maneuver = 0; - break; - } + if ((owner->updir.y > 0.0f && owner->frontdir.y > 0.0f && maneuverSubState == 1) || speedf < 0.2f) { + maneuverState = MANEUVER_FLY_STRAIGHT; + } + } break; - default: - UpdateAirPhysics(0, 0, 0, 1, owner->frontdir); - maneuver = 0; - break; + default: { + UpdateAirPhysics(0.0f, 0.0f, 0.0f, 1.0f, owner->frontdir); + maneuverState = MANEUVER_FLY_STRAIGHT; + } break; } } -void CStrafeAirMoveType::UpdateFighterAttack() +void CStrafeAirMoveType::UpdateAttack() { + if (!isFighter) { + UpdateFlying(wantedHeight, 1.0f); + return; + } + const float3& pos = owner->pos; const float4& spd = owner->speed; @@ -733,23 +761,6 @@ void CStrafeAirMoveType::UpdateFighterAttack() CheckForCollision(); } - const CUnit* attackee = owner->attackTarget; - - const bool groundTarget = (attackee == NULL) || attackee->unitDef->IsGroundUnit(); - const bool airTarget = (attackee != NULL) && attackee->unitDef->IsStrafingAirUnit(); // only count "real" aircraft (not gunships) - const bool hasFired = (!owner->weapons.empty() && owner->weapons[0]->reloadStatus > gs->frameNum && owner->weapons[0]->salvoLeft == 0); - - if (groundTarget) { - if (frontdir.dot(goalPos - pos) < 0 && (pos - goalPos).SqLength() < (turnRadius * turnRadius * (loopbackAttack ? 4.0f : 1.0f))) { - SetGoal(goalPos + (pos - goalPos).Normalize2D() * turnRadius * 4.0f); - } else if (loopbackAttack && !airTarget) { - if (frontdir.dot(goalPos - pos) < owner->maxRange * (hasFired ? 1.0f : 0.7f)) - maneuver = 1; - } else if (frontdir.dot(goalPos - pos) < owner->maxRange * 0.7f) { - SetGoal(goalPos + exitVector * ((attackee != NULL) ? attackee->radius + owner->radius + 10.0f : owner->radius + 40.0f)); - } - } - float3 rightDir2D = rightdir; const float3 difGoalPos = (goalPos - oldGoalPos) * SQUARE_SIZE; @@ -771,30 +782,21 @@ void CStrafeAirMoveType::UpdateFighterAttack() goalDotRight /= goalDotFront; } - if (goalDir.dot(frontdir) < -0.2f + inefficientAttackTime * 0.002f && frontdir.y > -0.2f && spd.w > 2.0f && gs->randFloat() > 0.996f) - maneuver = 1; + { + const CUnit* attackee = owner->attackTarget; - if (goalDir.dot(frontdir) < -0.2f + inefficientAttackTime * 0.002f && math::fabs(frontdir.y) < 0.2f && gs->randFloat() > 0.996f && gHeightAW + 400 < pos.y) { - maneuver = 2; - maneuverSubState = 0; - } - - const float aileron = GetAileronDeflection (owner, lastColWarning, pos, spd, rightdir, updir, frontdir, goalDir, gHeightAW, wantedHeight, maxAileron, maxBank, goalDotRight, aGoalDotFront, lastColWarningType == 2, true); // roll - const float rudder = GetRudderDeflection (owner, lastColWarning, pos, spd, rightdir, updir, frontdir, goalDir, gHeightAW, wantedHeight, maxRudder, 0.0f, goalDotRight, aGoalDotFront, lastColWarningType == 2, true); // yaw - const float elevator = GetElevatorDeflection(owner, lastColWarning, pos, spd, rightdir, updir, frontdir, goalDir, gHeightAW, wantedHeight, maxElevator, maxPitch, goalDotRight, aGoalDotFront, lastColWarningType == 2, true); // pitch - const float engine = (groundTarget)? 1.0f: std::min(1.0f, (goalDist / owner->maxRange + 1.0f - goalDir.dot(frontdir) * 0.7f)); + const float aileron = GetAileronDeflection (owner, lastColWarning, pos, spd, rightdir, updir, frontdir, goalDir, gHeightAW, wantedHeight, maxAileron, maxBank, goalDotRight, aGoalDotFront, lastColWarningType == 2, true); // roll + const float rudder = GetRudderDeflection (owner, lastColWarning, pos, spd, rightdir, updir, frontdir, goalDir, gHeightAW, wantedHeight, maxRudder, 0.0f, goalDotRight, aGoalDotFront, lastColWarningType == 2, true); // yaw + const float elevator = GetElevatorDeflection(owner, lastColWarning, pos, spd, rightdir, updir, frontdir, goalDir, gHeightAW, wantedHeight, maxElevator, maxPitch, goalDotRight, aGoalDotFront, lastColWarningType == 2, true); // pitch + const float engine = ((attackee == NULL) || attackee->unitDef->IsGroundUnit())? 1.0f: std::min(1.0f, (goalDist / owner->maxRange + 1.0f - goalDir.dot(frontdir) * 0.7f)); - UpdateAirPhysics(rudder, aileron, elevator, engine, owner->frontdir); + UpdateAirPhysics(rudder, aileron, elevator, engine, owner->frontdir); + } } -void CStrafeAirMoveType::UpdateAttack() -{ - UpdateFlying(wantedHeight, 1.0f); -} - -void CStrafeAirMoveType::UpdateFlying(float wantedHeight, float engine) +bool CStrafeAirMoveType::UpdateFlying(float wantedHeight, float engine) { const float3& pos = owner->pos; const float4& spd = owner->speed; @@ -811,8 +813,8 @@ void CStrafeAirMoveType::UpdateFlying(float wantedHeight, float engine) const float3& padPos = (reservedPad->GetUnit())->pos; const float3 padVec = padPos - pos; - if (padVec.dot(frontdir) < -0.1f && padVec.SqLength2D() < Square(std::min(1000.0f, turnRadius * spd.w))) { - SetGoal(pos + frontdir * turnRadius * spd.w); + if (padVec.dot(frontdir) < -0.1f && padVec.SqLength2D() < Square(TurnRadius(turnRadius, spd.w))) { + SetGoal(pos + frontdir * TurnRadius(turnRadius, spd.w)); } else { SetGoal(padPos); } @@ -840,8 +842,13 @@ void CStrafeAirMoveType::UpdateFlying(float wantedHeight, float engine) CheckForCollision(); } + const bool b0 = (goalDist2D >= TurnRadius(turnRadius, spd.w)); + const bool b1 = ((gs->frameNum - owner->lastFireWeapon) >= GAME_SPEED * 3); + + // yaw and roll have to be unblocked after a certain time or aircraft + // can fly straight forever if their target is another chasing aircraft float3 rightDir2D = rightdir; - float3 yprMults = OnesVector * (1.0f + 0.0f * float(goalDist2D < (turnRadius * spd.w))); + float3 yprMults = (XZVector * float(b0 || b1)) + UpVector; float goalDotRight = goalDir2D.dot(rightDir2D.Normalize2D()); @@ -857,7 +864,7 @@ void CStrafeAirMoveType::UpdateFlying(float wantedHeight, float engine) // way --> often insufficient for small turn radii, // also need to fly straight for some distance #if 1 - if (goalDir2D.dot(frontdir) < -0.1f && goalDist2D < turnRadius) { + if (goalDir2D.dot(frontdir) < -0.1f && goalDist2D < TurnRadius(turnRadius, spd.w)) { if (!owner->UnderFirstPersonControl() || owner->fpsControlPlayer->fpsController.mouse2) { goalDotRight *= -1.0f; } @@ -883,6 +890,7 @@ void CStrafeAirMoveType::UpdateFlying(float wantedHeight, float engine) const float elevator = GetElevatorDeflection(owner, lastColWarning, pos, spd, rightdir, updir, frontdir, goalDir2D, gHeight, wantedHeight, maxElevator, maxPitch, goalDotRight, aGoalDotFront, lastColWarningType == 2, false); // pitch UpdateAirPhysics(rudder * yprMults.x, aileron * yprMults.z, elevator * yprMults.y, engine, owner->frontdir); + return (b0 || b1); } @@ -1007,7 +1015,7 @@ void CStrafeAirMoveType::UpdateLanding() owner->Deactivate(); } else { goalPos.ClampInBounds(); - UpdateFlying(wantedHeight, 1); + UpdateFlying(wantedHeight, 1.0f); return; } } @@ -1174,13 +1182,11 @@ void CStrafeAirMoveType::SetState(AAirMoveType::AircraftState newState) assert(newState != AIRCRAFT_HOVERING); // once in crashing, we should never change back into another state - if (aircraftState == AIRCRAFT_CRASHING && newState != AIRCRAFT_CRASHING) { + if (aircraftState == AIRCRAFT_CRASHING && newState != AIRCRAFT_CRASHING) return; - } - if (newState == aircraftState) { + if (newState == aircraftState) return; - } // make sure we only go into takeoff mode when landed if (aircraftState == AIRCRAFT_LANDED) { @@ -1332,8 +1338,9 @@ bool CStrafeAirMoveType::SetMemberValue(unsigned int memberHash, void* memberVal #define MEMBER_LITERAL_HASH(memberName) HsiehHash(memberName, sizeof(memberName) - 1, 0) static const unsigned int boolMemberHashes[] = { - MEMBER_LITERAL_HASH( "collide"), - MEMBER_LITERAL_HASH("useSmoothMesh"), + MEMBER_LITERAL_HASH( "collide"), + MEMBER_LITERAL_HASH( "useSmoothMesh"), + MEMBER_LITERAL_HASH("loopbackAttack"), }; static const unsigned int floatMemberHashes[] = { MEMBER_LITERAL_HASH( "wantedHeight"), @@ -1358,6 +1365,7 @@ bool CStrafeAirMoveType::SetMemberValue(unsigned int memberHash, void* memberVal bool* boolMemberPtrs[] = { &collide, &useSmoothMesh, + &loopbackAttack, }; float* floatMemberPtrs[] = { &wantedHeight, diff --git a/rts/Sim/MoveTypes/StrafeAirMoveType.h b/rts/Sim/MoveTypes/StrafeAirMoveType.h index 6e928356df8..4a713f760ac 100644 --- a/rts/Sim/MoveTypes/StrafeAirMoveType.h +++ b/rts/Sim/MoveTypes/StrafeAirMoveType.h @@ -15,6 +15,12 @@ class CStrafeAirMoveType: public AAirMoveType CR_DECLARE_SUB(DrawLine); public: + enum { + MANEUVER_FLY_STRAIGHT = 0, + MANEUVER_IMMELMAN = 1, + MANEUVER_IMMELMAN_INV = 2, + }; + CStrafeAirMoveType(CUnit* owner); bool Update(); @@ -23,9 +29,8 @@ class CStrafeAirMoveType: public AAirMoveType bool SetMemberValue(unsigned int memberHash, void* memberValue); void UpdateManeuver(); - void UpdateFighterAttack(); void UpdateAttack(); - void UpdateFlying(float wantedHeight, float engine); + bool UpdateFlying(float wantedHeight, float engine); void UpdateLanded(); void UpdateLanding(); void UpdateAirPhysics( @@ -49,7 +54,7 @@ class CStrafeAirMoveType: public AAirMoveType void Takeoff(); - int maneuver; + int maneuverState; int maneuverSubState; bool loopbackAttack; @@ -82,11 +87,6 @@ class CStrafeAirMoveType: public AAirMoveType float lastElevatorPos; float lastAileronPos; - float inefficientAttackTime; - - /// used by fighters to turn away when closing in on ground targets - float3 exitVector; - private: bool HandleCollisions(bool checkCollisions); }; diff --git a/rts/Sim/Units/CommandAI/AirCAI.cpp b/rts/Sim/Units/CommandAI/AirCAI.cpp index 7bddc0ed5c2..be5c96ce2da 100644 --- a/rts/Sim/Units/CommandAI/AirCAI.cpp +++ b/rts/Sim/Units/CommandAI/AirCAI.cpp @@ -76,21 +76,6 @@ CAirCAI::CAirCAI(CUnit* owner) possibleCommands.push_back(c); } - if (owner->unitDef->canLoopbackAttack) { - c.params.clear(); - c.id = CMD_LOOPBACKATTACK; - c.action = "loopbackattack"; - c.type = CMDTYPE_ICON_MODE; - c.name = "Loopback"; - c.mouseicon = c.name; - c.params.push_back("0"); - c.params.push_back("Normal"); - c.params.push_back("Loopback"); - c.tooltip = "Loopback attack: Sets if the aircraft should loopback after an attack instead of overflying target"; - possibleCommands.push_back(c); - nonQueingCommands.insert(CMD_LOOPBACKATTACK); - } - basePos = owner->pos; goalPos = owner->pos; } @@ -158,27 +143,6 @@ void CAirCAI::GiveCommandReal(const Command& c, bool fromSynced) selectedUnitsHandler.PossibleCommandChange(owner); return; } - - if (c.GetID() == CMD_LOOPBACKATTACK) { - if (c.params.empty()) - return; - - switch ((int) c.params[0]) { - case 0: { airMT->loopbackAttack = false; break; } - case 1: { airMT->loopbackAttack = true; break; } - } - - for (unsigned int n = 0; n < possibleCommands.size(); n++) { - if (possibleCommands[n].id != CMD_LOOPBACKATTACK) - continue; - - possibleCommands[n].params[0] = IntToString(int(c.params[0]), "%d"); - break; - } - - selectedUnitsHandler.PossibleCommandChange(owner); - return; - } } if (!(c.options & SHIFT_KEY) diff --git a/rts/Sim/Units/CommandAI/Command.h b/rts/Sim/Units/CommandAI/Command.h index 85fbe5688c2..f2a47ca38d0 100644 --- a/rts/Sim/Units/CommandAI/Command.h +++ b/rts/Sim/Units/CommandAI/Command.h @@ -51,7 +51,6 @@ #define CMD_RESURRECT 125 #define CMD_CAPTURE 130 #define CMD_AUTOREPAIRLEVEL 135 -#define CMD_LOOPBACKATTACK 140 #define CMD_IDLEMODE 145 #define CMD_FAILED 150 diff --git a/rts/Sim/Units/CommandAI/CommandAI.cpp b/rts/Sim/Units/CommandAI/CommandAI.cpp index 608e11947f3..331f00a189e 100644 --- a/rts/Sim/Units/CommandAI/CommandAI.cpp +++ b/rts/Sim/Units/CommandAI/CommandAI.cpp @@ -931,8 +931,6 @@ void CCommandAI::ExecuteInsert(const Command& c, bool fromSynced) } } - // FIXME: handle CMD_LOOPBACKATTACK, etc... - CCommandQueue::iterator insertIt = queue->begin(); if (c.options & ALT_KEY) {