From: Daniel Karbach Date: Tue, 21 Aug 2012 21:27:32 +0000 (+0200) Subject: added target selection type detection for weapons X-Git-Url: https://git.localhorst.tv/?a=commitdiff_plain;h=b53c2ec2621ccc654e819cb203dc26e0a482bd41;p=l2e.git added target selection type detection for weapons --- diff --git a/src/battle/TargetSelection.cpp b/src/battle/TargetSelection.cpp index 1906c2b..5fbf785 100644 --- a/src/battle/TargetSelection.cpp +++ b/src/battle/TargetSelection.cpp @@ -8,6 +8,7 @@ #include "TargetSelection.h" #include "BattleState.h" +#include "../common/TargetingMode.h" namespace battle { @@ -23,6 +24,21 @@ TargetSelection::TargetSelection(BattleState *battle, bool multiple, bool atEnem } } + +void TargetSelection::ReadMode(const common::TargetingMode &tm) { + if (tm.TargetsEnemy()) { + SelectEnemies(); + } else { + SelectHeroes(); + } + if (tm.TargetsSingle()) { + SelectSingle(); + } else if (tm.TargetsMultiple()) { + SelectMultiple(); + } +} + + void TargetSelection::SelectEnemies() { if (TargetsEnemies()) return; enemy = true; diff --git a/src/battle/TargetSelection.h b/src/battle/TargetSelection.h index 70c95b5..b57a41d 100644 --- a/src/battle/TargetSelection.h +++ b/src/battle/TargetSelection.h @@ -10,6 +10,8 @@ #include +namespace common { class TargetingMode; } + namespace battle { class BattleState; @@ -31,6 +33,8 @@ public: bool SelectSingle() const { return !SelectMultiple(); } void SetSingle() { multiple = false; } + void ReadMode(const common::TargetingMode &); + void SelectEnemies(); void SelectHeroes(); void Select(int index) { selected[index].type = State::SELECTED; selection = index; } diff --git a/src/battle/states/SelectAttackType.cpp b/src/battle/states/SelectAttackType.cpp index 4bac0bb..a6e288a 100644 --- a/src/battle/states/SelectAttackType.cpp +++ b/src/battle/states/SelectAttackType.cpp @@ -16,12 +16,14 @@ #include "../BattleState.h" #include "../../app/Application.h" #include "../../app/Input.h" +#include "../../common/Item.h" #include "../../geometry/operators.h" #include using app::Application; using app::Input; +using common::Item; using geometry::Point; using geometry::Vector; @@ -69,21 +71,33 @@ void SelectAttackType::HandleEvents(const Input &input) { battle->GetAttackTypeMenu().Select(AttackChoice::SWORD); } + Hero &hero(battle->ActiveHero()); + AttackChoice &ac(hero.GetAttackChoice()); if (input.JustPressed(Input::ACTION_A)) { switch (battle->GetAttackTypeMenu().Selected()) { case AttackChoice::SWORD: - // TODO: detect single/multiple/all attack mode - battle->ActiveHero().GetAttackChoice().Selection().SetSingle(); - battle->ActiveHero().GetAttackChoice().Selection().Reset(); - ctrl->PushState(new SelectTarget(battle, this, &battle->ActiveHero().GetAttackChoice().Selection(), battle->Res().weaponTargetCursor)); + if (hero.HasWeapon()) { + if (hero.Weapon()->GetTargetingMode().TargetsAll()) { + ac.SetType(AttackChoice::SWORD); + battle->NextHero(); + break; + } else { + ac.Selection().ReadMode(hero.Weapon()->GetTargetingMode()); + } + } else { + ac.Selection().SetSingle(); + } + ac.Selection().Reset(); + ctrl->PushState(new SelectTarget(battle, this, &ac.Selection(), battle->Res().weaponTargetCursor)); break; case AttackChoice::MAGIC: + // TODO: detect single/multiple/all attack mode if (battle->ActiveHero().CanUseMagic()) { ctrl->PushState(new SelectSpell(battle, this)); } break; case AttackChoice::DEFEND: - battle->ActiveHero().GetAttackChoice().SetType(AttackChoice::DEFEND); + ac.SetType(AttackChoice::DEFEND); battle->NextHero(); break; case AttackChoice::IKARI: @@ -96,12 +110,12 @@ void SelectAttackType::HandleEvents(const Input &input) { throw std::logic_error("selected invalid attack type"); } } else if (input.JustPressed(Input::ACTION_B)) { - battle->ActiveHero().GetAttackChoice().Reset(); + ac.Reset(); battle->PreviousHero(); if (battle->BeforeFirstHero()) { ctrl->ChangeState(new SelectMoveAction(battle)); } else { - battle->ActiveHero().GetAttackChoice().Reset(); + ac.Reset(); } }