void CMobileCAI::FinishCommand(void) { if (!(commandQue.front().options & INTERNAL_ORDER)) { lastUserGoal = owner->pos; } StopSlowGuard(); CCommandAI::FinishCommand(); }
/** * @brief Executes the guard command c */ void CMobileCAI::ExecuteGuard(Command &c) { assert(owner->unitDef->canGuard); assert(!c.params.empty()); CUnit* guarded = uh->GetUnit(c.params[0]); if (guarded != NULL && UpdateTargetLostTimer(guarded->id)) { if (owner->unitDef->canAttack && guarded->lastAttack + 40 < gs->frameNum && IsValidTarget(guarded->lastAttacker)) { StopSlowGuard(); Command nc; nc.id = CMD_ATTACK; nc.params.push_back(guarded->lastAttacker->id); nc.options = c.options; commandQue.push_front(nc); SlowUpdate(); return; } else { //float3 dif = guarded->speed * guarded->frontdir; float3 dif = guarded->pos - owner->pos; dif.Normalize(); float3 goal = guarded->pos - dif * (guarded->radius + owner->radius + 64); if((goalPos - goal).SqLength2D() > 1600 || (goalPos - owner->pos).SqLength2D() < (owner->maxSpeed*30 + 1 + SQUARE_SIZE*2) * (owner->maxSpeed*30 + 1 + SQUARE_SIZE*2)){ SetGoal(goal, owner->pos); } if((goal - owner->pos).SqLength2D() < 6400) { StartSlowGuard(guarded->maxSpeed); if((goal-owner->pos).SqLength2D() < 1800){ StopMove(); NonMoving(); } } else { StopSlowGuard(); } } } else { FinishCommand(); } return; }
/** * @brief Executes the guard command c */ void CMobileCAI::ExecuteGuard(Command &c) { assert(owner->unitDef->canGuard); assert(!c.params.empty()); const CUnit* guardee = unitHandler->GetUnit(c.params[0]); if (guardee == NULL) { FinishCommand(); return; } if (UpdateTargetLostTimer(guardee->id) == 0) { FinishCommand(); return; } if (guardee->outOfMapTime > (GAME_SPEED * 5)) { FinishCommand(); return; } const bool pushAttackCommand = owner->unitDef->canAttack && (guardee->lastAttackFrame + 40 < gs->frameNum) && IsValidTarget(guardee->lastAttacker); if (pushAttackCommand) { Command nc(CMD_ATTACK, c.options, guardee->lastAttacker->id); commandQue.push_front(nc); StopSlowGuard(); SlowUpdate(); } else { const float3 dif = (guardee->pos - owner->pos).SafeNormalize(); const float3 goal = guardee->pos - dif * (guardee->radius + owner->radius + 64.0f); const bool resetGoal = ((goalPos - goal).SqLength2D() > 1600.0f) || (goalPos - owner->pos).SqLength2D() < Square(owner->moveType->GetMaxSpeed() * GAME_SPEED + 1 + SQUARE_SIZE * 2); if (resetGoal) { SetGoal(goal, owner->pos); } if ((goal - owner->pos).SqLength2D() < 6400.0f) { StartSlowGuard(guardee->moveType->GetMaxSpeed()); if ((goal - owner->pos).SqLength2D() < 1800.0f) { StopMove(); NonMoving(); } } else { StopSlowGuard(); } } }
void CMobileCAI::FinishCommand(void) { if(!(commandQue.front().options & INTERNAL_ORDER)){ lastUserGoal=owner->pos; // logOutput.Print("Reseting user goal"); } StopSlowGuard(); CCommandAI::FinishCommand(); }
void CMobileCAI::GiveCommand(const Command &c) { if (!AllowedCommand(c)) return; if(owner->unitDef->canfly && c.id==CMD_AUTOREPAIRLEVEL){ if(!dynamic_cast<CTAAirMoveType*>(owner->moveType)) return; if(c.params.empty()) return; switch((int)c.params[0]){ case 0: ((CTAAirMoveType*)owner->moveType)->repairBelowHealth=0; break; case 1: ((CTAAirMoveType*)owner->moveType)->repairBelowHealth=0.3f; break; case 2: ((CTAAirMoveType*)owner->moveType)->repairBelowHealth=0.5f; break; } for(vector<CommandDescription>::iterator cdi=possibleCommands.begin();cdi!=possibleCommands.end();++cdi){ if(cdi->id==CMD_AUTOREPAIRLEVEL){ char t[10]; SNPRINTF(t,10,"%d", (int)c.params[0]); cdi->params[0]=t; break; } } selectedUnits.PossibleCommandChange(owner); return; } if(!(c.options & SHIFT_KEY) && nonQueingCommands.find(c.id)==nonQueingCommands.end()){ tempOrder=false; StopSlowGuard(); } CCommandAI::GiveAllowedCommand(c); }
void CBuilderCAI::ExecuteGuard(Command &c) { assert(owner->unitDef->canGuard); CBuilder* fac=(CBuilder*)owner; CUnit* guarded=uh->units[(int)c.params[0]]; if(guarded && guarded!=owner && UpdateTargetLostTimer((int)c.params[0])){ if(CBuilder* b=dynamic_cast<CBuilder*>(guarded)){ if(b->terraforming){ if(fac->pos.distance2D(b->terraformCenter)<fac->buildDistance*0.8f+b->terraformRadius*0.7f){ StopMove(); owner->moveType->KeepPointingTo(b->terraformCenter, fac->buildDistance*0.9f, false); fac->HelpTerraform(b); } else { SetGoal(b->terraformCenter,fac->pos,fac->buildDistance*0.7f+b->terraformRadius*0.6f); } return; } if (b->curBuild && (( b->curBuild->beingBuilt && owner->unitDef->canAssist) || (!b->curBuild->beingBuilt && owner->unitDef->canRepair))) { Command nc; nc.id=CMD_REPAIR; nc.options=c.options; nc.params.push_back(b->curBuild->id); commandQue.push_front(nc); inCommand=false; // SlowUpdate(); return; } } if(CFactory* f=dynamic_cast<CFactory*>(guarded)){ if (f->curBuild && (( f->curBuild->beingBuilt && owner->unitDef->canAssist) || (!f->curBuild->beingBuilt && owner->unitDef->canRepair))) { Command nc; nc.id=CMD_REPAIR; nc.options=c.options; nc.params.push_back(f->curBuild->id); commandQue.push_front(nc); inCommand=false; // SlowUpdate(); return; } } float3 curPos=owner->pos; float3 dif=guarded->pos-curPos; dif.Normalize(); float3 goal=guarded->pos-dif*(fac->buildDistance*.5); if((guarded->pos-curPos).SqLength2D()< (fac->buildDistance*1.9f + guarded->radius) *(fac->buildDistance*1.9f + guarded->radius)){ StartSlowGuard(guarded->maxSpeed); } else { StopSlowGuard(); } if((guarded->pos-curPos).SqLength2D()< (fac->buildDistance*0.9f + guarded->radius) *(fac->buildDistance*0.9f + guarded->radius)){ StopMove(); // logOutput.Print("should point with type 3?"); owner->moveType->KeepPointingTo(guarded->pos, fac->buildDistance*0.9f+guarded->radius, false); if(guarded->health<guarded->maxHealth && ((guarded->beingBuilt && owner->unitDef->canAssist) || (!guarded->beingBuilt && owner->unitDef->canRepair))) fac->SetRepairTarget(guarded); else NonMoving(); }else{ if((goalPos-goal).SqLength2D()>4000 || (goalPos - owner->pos).SqLength2D() < (owner->maxSpeed*30 + 1 + SQUARE_SIZE*2) * (owner->maxSpeed*30 + 1 + SQUARE_SIZE*2)){ SetGoal(goal,curPos); } } } else { FinishCommand(); } return; }
void CBuilderCAI::ExecuteGuard(Command& c) { if (!owner->unitDef->canGuard) return; CBuilder* builder = (CBuilder*) owner; CUnit* guardee = uh->GetUnit(c.params[0]); if (guardee == NULL) { FinishCommand(); return; } if (guardee == owner) { FinishCommand(); return; } if (UpdateTargetLostTimer(guardee->id) == 0) { FinishCommand(); return; } if (guardee->outOfMapTime > (GAME_SPEED * 5)) { FinishCommand(); return; } if (CBuilder* b = dynamic_cast<CBuilder*>(guardee)) { if (b->terraforming) { if (MoveInBuildRange(b->terraformCenter, b->terraformRadius * 0.7f)) { builder->HelpTerraform(b); } else { StopSlowGuard(); } return; } else if (b->curReclaim && owner->unitDef->canReclaim) { StopSlowGuard(); if (!ReclaimObject(b->curReclaim)) { StopMove(); } return; } else if (b->curResurrect && owner->unitDef->canResurrect) { StopSlowGuard(); if (!ResurrectObject(b->curResurrect)) { StopMove(); } return; } else { builder->StopBuild(); } const bool pushRepairCommand = ( b->curBuild != NULL) && ( b->curBuild->soloBuilder == NULL || b->curBuild->soloBuilder == owner) && (( b->curBuild->beingBuilt && owner->unitDef->canAssist) || ( !b->curBuild->beingBuilt && owner->unitDef->canRepair)); if (pushRepairCommand) { StopSlowGuard(); Command nc(CMD_REPAIR, c.options); nc.params.push_back(b->curBuild->id); commandQue.push_front(nc); inCommand = false; SlowUpdate(); return; } } if (CFactory* fac = dynamic_cast<CFactory*>(guardee)) { const bool pushRepairCommand = ( fac->curBuild != NULL) && ( fac->curBuild->soloBuilder == NULL || fac->curBuild->soloBuilder == owner) && (( fac->curBuild->beingBuilt && owner->unitDef->canAssist) || (!fac->curBuild->beingBuilt && owner->unitDef->canRepair)); if (pushRepairCommand) { StopSlowGuard(); Command nc(CMD_REPAIR, c.options); nc.params.push_back(fac->curBuild->id); commandQue.push_front(nc); inCommand = false; // SlowUpdate(); return; } } if (!(c.options & CONTROL_KEY) && IsUnitBeingReclaimed(guardee, owner)) return; const float3 pos = guardee->pos; const float radius = (guardee->immobile) ? guardee->radius : guardee->radius * 0.8f; // in case of mobile units reduce radius a bit if (MoveInBuildRange(pos, radius)) { StartSlowGuard(guardee->moveType->GetMaxSpeed()); const bool pushRepairCommand = ( guardee->health < guardee->maxHealth) && ( guardee->soloBuilder == NULL || guardee->soloBuilder == owner) && (( guardee->beingBuilt && owner->unitDef->canAssist) || (!guardee->beingBuilt && owner->unitDef->canRepair)); if (pushRepairCommand) { StopSlowGuard(); Command nc(CMD_REPAIR, c.options); nc.params.push_back(guardee->id); commandQue.push_front(nc); inCommand = false; return; } else { NonMoving(); } } else { StopSlowGuard(); } }
void CMobileCAI::GiveCommandReal(const Command &c, bool fromSynced) { if (!AllowedCommand(c, fromSynced)) return; if (owner->unitDef->canfly && c.id == CMD_AUTOREPAIRLEVEL) { if (c.params.empty()) { return; } AAirMoveType* airMT = GetAirMoveType<AAirMoveType>(owner); if (!airMT) return; switch ((int) c.params[0]) { case 0: { airMT->repairBelowHealth = 0.0f; break; } case 1: { airMT->repairBelowHealth = 0.3f; break; } case 2: { airMT->repairBelowHealth = 0.5f; break; } case 3: { airMT->repairBelowHealth = 0.8f; break; } } for (vector<CommandDescription>::iterator cdi = possibleCommands.begin(); cdi != possibleCommands.end(); ++cdi) { if (cdi->id == CMD_AUTOREPAIRLEVEL) { char t[10]; SNPRINTF(t, 10, "%d", (int) c.params[0]); cdi->params[0] = t; break; } } selectedUnits.PossibleCommandChange(owner); return; } if (owner->unitDef->canfly && c.id == CMD_IDLEMODE) { if (c.params.empty()) { return; } AAirMoveType* airMT = GetAirMoveType<AAirMoveType>(owner); if (!airMT) return; switch ((int) c.params[0]) { case 0: { airMT->autoLand = false; airMT->Takeoff(); break; } case 1: { airMT->autoLand = true; break; } } for (vector<CommandDescription>::iterator cdi = possibleCommands.begin(); cdi != possibleCommands.end(); ++cdi) { if (cdi->id == CMD_IDLEMODE) { char t[10]; SNPRINTF(t, 10, "%d", (int) c.params[0]); cdi->params[0] = t; break; } } selectedUnits.PossibleCommandChange(owner); return; } if (!(c.options & SHIFT_KEY) && nonQueingCommands.find(c.id) == nonQueingCommands.end()) { tempOrder = false; StopSlowGuard(); } CCommandAI::GiveAllowedCommand(c); }