//エフェクト再生を1フレームぶん進める void proceedEffectPlay() { //再生中ならとりあえずそれが終了するまでエフェクトの再生を続けてもらう if (remainingEffectAnimationframes > 0) { remainingEffectAnimationframes--; return; } //再生終わり、まだエフェクトが残ってるなら次のエフェクトの再生に移る else if (effectList.Count > 0) { PlayableEffect pe = effectList.First.Value; effectList.RemoveFirst(); //エフェクト再生しようとするけど死んでる敵のものは再生しない //自分→敵の順に行動するから味方側は考慮する必要なし if (pe.actortype == ActorType.ENEMY && enemies[pe.actorIndex].isDead()) { Debug.Log("ちょうど死んだ敵なのでパスしました"); } else { consumeEffect(pe); remainingEffectAnimationframes = pe.blockingFrames; } } }
void checkEnchantedAttack(BattleCharacter actor, Effect effect) { //エンチャントファイアによる追加攻撃 //エンチャントファイア状態を持ってて魔法攻撃でないなら追加攻撃 //この効果を使うのは自分のみなのでActorTypeにPLAYERを決め撃ちしてる if (actor.hasBuff(Buff.BuffID.ENCHANT_FIRE) && !effect.hasAttribute(Effect.Attribute.MAGIC)) { List <Effect.Attribute> attributes = new List <Effect.Attribute>() { Effect.Attribute.MAGIC, Effect.Attribute.FIRE }; Effect fire = new Effect("響火起動", Effect.TargetType.TARGET_SINGLE_RANDOM, 65, Effect.EffectType.DAMAGE, 30, attributes); PlayableEffect pe = new PlayableEffect(fire, ActorType.PLAYER, 0); effectList.AddFirst(pe); } }
//どっち陣営の誰がを指定してエフェクト一つを消化する void consumeEffect(PlayableEffect pe) { switch (pe.effect.targetType) { //敵リストのインデックス指定を行っているところ、 //list内の要素はrefで渡せないのでコピーして渡して結果を戻してる //遅くなったら対策を考えよう... case Effect.TargetType.ALLY_ALL: switch (pe.actortype) { case ActorType.PLAYER: //自分が味方全体行動→自分自身のみ resolveEffect(player, ref player, pe.effect); break; case ActorType.ENEMY: //敵が味方全体行動 → 敵全体になにかが起こる for (int i = 0; i < enemies.Count; ++i) { BattleCharacter target = enemies[i]; resolveEffect(enemies[pe.actorIndex], ref target, pe.effect); enemies[i] = target; } break; } break; case Effect.TargetType.ALLY_SINGLE_RANDOM: switch (pe.actortype) { case ActorType.PLAYER: //自分が味方ランダム行動→自分自身のみ resolveEffect(player, ref player, pe.effect); break; case ActorType.ENEMY: //敵が味方ランダム行動 → 敵のうちどれか int targetIndex = Random.Range(0, enemies.Count); BattleCharacter target = enemies[targetIndex]; resolveEffect(enemies[pe.actorIndex], ref target, pe.effect); enemies[targetIndex] = target; break; } break; case Effect.TargetType.ME: switch (pe.actortype) { case ActorType.PLAYER: //自分が自分自身 Debug.Log("自分になんかした"); resolveEffect(player, ref player, pe.effect); break; case ActorType.ENEMY: //敵が自分自身 BattleCharacter target = enemies[pe.actorIndex]; resolveEffect(enemies[pe.actorIndex], ref target, pe.effect); enemies[pe.actorIndex] = target; break; } break; case Effect.TargetType.TARGET_ALL: switch (pe.actortype) { case ActorType.PLAYER: //敵全部をちまちま殴る for (int i = 0; i < enemies.Count; ++i) { BattleCharacter target = enemies[i]; resolveEffect(player, ref target, pe.effect); enemies[i] = target; } break; case ActorType.ENEMY: //敵が全体攻撃 → 味方は一人なので自分狙い resolveEffect(enemies[pe.actorIndex], ref player, pe.effect); break; } break; case Effect.TargetType.TARGET_SINGLE: switch (pe.actortype) { case ActorType.PLAYER: //自分が敵一体狙う → 今のターゲットを狙う BattleCharacter target = enemies.Find(x => x.GetHashCode() == currentTargettingEnemyHash); resolveEffect(player, ref target, pe.effect); break; case ActorType.ENEMY: //敵が敵一体狙う → 自分狙い resolveEffect(enemies[pe.actorIndex], ref player, pe.effect); break; } break; case Effect.TargetType.TARGET_SINGLE_RANDOM: switch (pe.actortype) { case ActorType.PLAYER: //自分が敵ランダムを狙う int targetIndex = Random.Range(0, enemies.Count); BattleCharacter target = enemies[targetIndex]; resolveEffect(player, ref target, pe.effect); enemies[targetIndex] = target; break; case ActorType.ENEMY: //敵がランダムで狙ってくる → 味方は一人なので自分狙い resolveEffect(enemies[pe.actorIndex], ref player, pe.effect); break; } break; } }