void Attack::Act(IGame& game) const { State attacker = game.Get(actor); auto& targetActor = dynamic_cast<const Identity&>(target); State victim(game.Get(targetActor)); if (!part) { Engage(attacker); game.Adjust(actor, attacker, skill.name); game.Adjust(targetActor, victim, L"Miss " + skill.name); return; } auto skillLevel = attacker.SkillLevel(skill, &victim); if (skillLevel.Value() == 0) { Engage(attacker); game.Adjust(actor, attacker, skill.name); game.Adjust(targetActor, victim, L"Resist " + skill.name + L":" + skillLevel.Description()); return; } auto damage = attacker.AttackDamage(skill, skillLevel); Damage pain = damage - victim.Mitigation(*part); if (!victim.Hurt(*part, pain, actor.Description()+L"'"+skill.description)) { Engage(attacker); game.Adjust(actor, attacker, skill.name); game.Adjust(targetActor, victim, L"Mitigate " + skill.name + L"@" + part->Name() + L":" + pain.ActionDescription()); return; } Engage(attacker); game.Adjust(actor, attacker, skill.name); game.Adjust(targetActor, victim, L"Hit " + skill.name + L"@" + part->Name() + L":" + pain.ActionDescription()); }
void DoEngage( void) { bool stat = IsEngaged(); if (stat == 0) { Engage(); } }
void CAIContainer::Internal_ChangeTarget(uint16 targetid) { auto entity {dynamic_cast<CBattleEntity*>(PEntity)}; if (entity) { if (IsEngaged() || targetid == 0) entity->SetBattleTargetID(targetid); else Engage(targetid); } }
bool CAIContainer::Internal_ChangeTarget(uint16 targetid) { auto entity {dynamic_cast<CBattleEntity*>(PEntity)}; if (entity) { if(IsEngaged() || targetid == 0) { entity->SetBattleTargetID(targetid); return true; } else { return Engage(targetid); } } return false; }
Servo::Servo(CPhidgetAdvancedServoHandle *_servo, int _index) { servo = _servo; index = _index; engaged = false; curr = 0; flagStart = false; mode = Servo::JOG; // ジョグモードで初期化 to = 0; //トライステートポジションの初期化(退避は隣り合ったもの同士の差分が90度以上になるように) if(index == 0){ //100から60でコンタクト,180で退避(外側80度退避) homePosition = 110; readyPosition = 110; contactPosition = 55; }else if(index == 1){ //80から120でコンタクト,90で退避(内側10度退避) homePosition = 70; readyPosition = 70; contactPosition = 140; }else{ std::cout << "[ SERVO ] サーボIDが不正です : " << index << std::endl; } //ランピングオフ CPhidgetAdvancedServo_setSpeedRampingOn(*servo, index, 0); //初期化時にエンゲージしてしまう Engage(true); //ランピングする場合は以下のコードで速度・加速度制限を決定する //Set up some initial acceleration and velocity values //double minAccel, maxVel; //CPhidgetAdvancedServo_getAccelerationMin(servo, index, &minAccel); //CPhidgetAdvancedServo_setAcceleration(servo, index, minAccel*2); //CPhidgetAdvancedServo_getVelocityMax(servo, index, &maxVel); //CPhidgetAdvancedServo_setVelocityLimit(servo, index, maxVel/2); }
void DoCaptureDown( void) { bool stat = IsEngaged(); if (stat == 0) { Engage(); } FrameDown(); stat = LithoIsScanning(); if (stat == 0) { LithoScan(1); } Capture(0,CaptureFlags(0)); WaitForCapture(); LithoScan(0); }
void CMobController::DoRoamTick(time_point tick) { // If there's someone on our enmity list, go from roaming -> engaging if (PMob->PEnmityContainer->GetHighestEnmity() != nullptr && !(PMob->m_roamFlags & ROAMFLAG_IGNORE)) { Engage(PMob->PEnmityContainer->GetHighestEnmity()->targid); return; } else if (PMob->m_OwnerID.id != 0 && !(PMob->m_roamFlags & ROAMFLAG_IGNORE)) { // i'm claimed by someone and need hate towards this person PTarget = (CBattleEntity*)PMob->GetEntity(PMob->m_OwnerID.targid, TYPE_PC | TYPE_MOB | TYPE_PET); battleutils::ClaimMob(PMob, PTarget); Engage(PTarget->targid); return; } //#TODO else if (PMob->GetDespawnTime() > time_point::min() && PMob->GetDespawnTime() < m_Tick) { Despawn(); return; } if (PMob->m_roamFlags & ROAMFLAG_IGNORE) { // don't claim me if I ignore PMob->m_OwnerID.clean(); } //skip roaming if waiting if (m_Tick >= m_WaitTime) { // don't aggro a little bit after I just disengaged PMob->m_neutral = PMob->CanBeNeutral() && m_Tick <= m_NeutralTime + 10s; if (PMob->PAI->PathFind->IsFollowingPath()) { FollowRoamPath(); } else if (m_Tick >= m_LastActionTime + std::chrono::milliseconds(PMob->getBigMobMod(MOBMOD_ROAM_COOL))) { // lets buff up or move around if (PMob->CalledForHelp()) { PMob->CallForHelp(false); } // can't rest with poison or disease if (PMob->CanRest()) { // recover 10% health if (PMob->Rest(0.1f)) { // health updated PMob->updatemask |= UPDATE_HP; } if (PMob->GetHPP() == 100) { // at max health undirty exp PMob->m_giveExp = true; } } // if I just disengaged check if I should despawn if (PMob->IsFarFromHome()) { if (PMob->CanRoamHome() && PMob->PAI->PathFind->PathTo(PMob->m_SpawnPoint)) { // walk back to spawn if too far away // limit total path to just 10 or // else we'll move straight back to spawn PMob->PAI->PathFind->LimitDistance(10.0f); FollowRoamPath(); // move back every 5 seconds m_LastActionTime = m_Tick - (std::chrono::milliseconds(PMob->getBigMobMod(MOBMOD_ROAM_COOL)) + 10s); } else if (!PMob->getMobMod(MOBMOD_NO_DESPAWN) != 0 && !map_config.mob_no_despawn) { PMob->PAI->Despawn(); return; } } else { if (PMob->getMobMod(MOBMOD_SPECIAL_SKILL) != 0 && m_Tick >= m_LastSpecialTime + std::chrono::milliseconds(PMob->getBigMobMod(MOBMOD_SPECIAL_COOL)) && TrySpecialSkill()) { // I spawned a pet } else if (PMob->GetMJob() == JOB_SMN && CanCastSpells() && PMob->SpellContainer->HasBuffSpells() && m_Tick >= m_LastMagicTime + std::chrono::milliseconds(PMob->getBigMobMod(MOBMOD_MAGIC_COOL))) { // summon pet CastSpell(PMob->SpellContainer->GetBuffSpell()); } else if (CanCastSpells() && dsprand::GetRandomNumber(10) < 3 && PMob->SpellContainer->HasBuffSpells()) { // cast buff CastSpell(PMob->SpellContainer->GetBuffSpell()); } else if ((PMob->m_roamFlags & ROAMFLAG_AMBUSH)) { //#TODO: #AIToScript move to scripts // stay underground PMob->HideName(true); PMob->HideModel(true); PMob->animationsub = 0; PMob->updatemask |= UPDATE_HP; } else if ((PMob->m_roamFlags & ROAMFLAG_STEALTH)) { // hidden name PMob->HideName(true); PMob->Untargetable(true); PMob->updatemask |= UPDATE_HP; } else if (PMob->m_roamFlags & ROAMFLAG_EVENT) { // allow custom event action luautils::OnMobRoamAction(PMob); m_LastActionTime = m_Tick; } else if (PMob->CanRoam() && PMob->PAI->PathFind->RoamAround(PMob->m_SpawnPoint, PMob->GetRoamDistance(), PMob->getMobMod(MOBMOD_ROAM_TURNS), PMob->m_roamFlags)) { //#TODO: #AIToScript (event probably) if (PMob->m_roamFlags & ROAMFLAG_WORM) { // move down PMob->animationsub = 1; PMob->HideName(true); // don't move around until i'm fully in the ground Wait(2s); } else { FollowRoamPath(); } } else { m_LastActionTime = m_Tick; } } } } if (m_Tick >= m_LastRoamScript + 3s) { luautils::OnMobRoam(PMob); m_LastRoamScript = m_Tick; } }
/*! * \brief * サーボモータをクローズする * */ void Servo::Close() { Engage(false); }