public void AddBuff(BuffImage prefab, string buff_name, int remain_counter, double effect_value, double effect_value2) { bool detect = false; if (prefab == null) { return; } // unity潜在バグの可能性。null合体演算子、厳密にはnull判定かどうかを行おうとした時、 // missing exceptionが発生するので、null合体演算子はここでは使わない。 //BuffImage[] buffList = this.GetComponentsInChildren<BuffImage>() ?? null; BuffImage[] buffList = this.GetComponentsInChildren <BuffImage>(); if (buffList == null) { return; } // 既に該当BUFFがあるかどうかを確認。 for (int ii = 0; ii < buffList.Length; ii++) { if (buffList[ii].BuffName == buff_name) { detect = true; if (buff_name == Fix.BUFF_PD_DOWN) { buffList[ii].CumulativeUp(remain_counter, 1); } else { buffList[ii].UpdateBuff(buff_name, remain_counter, effect_value, effect_value2); } break; } } if (detect) { return; } // 該当BUFFが無い場合は、BUFFオブジェクトを追加する。 BuffImage buff = Instantiate(prefab) as BuffImage; buff.UpdateBuff(buff_name, remain_counter, effect_value, effect_value2); buff.gameObject.SetActive(true); buff.transform.SetParent(this.gameObject.transform); RectTransform rect = buff.GetComponent <RectTransform>(); rect.transform.localPosition = new Vector3(0, 0); rect.anchoredPosition = new Vector2(0, 0); rect.anchorMin = new Vector2(0, 0); rect.anchorMax = new Vector2(1, 1); }
/// <summary> /// 物理防御の算出 /// </summary> public static double PhysicalDefense(Character player) { double result = 1 + player.TotalStrength * Potential(player) * 0.20f; result += (player.MainWeapon?.PhysicalDefense ?? 0); result += (player.SubWeapon?.PhysicalDefense ?? 0); result += (player.MainArmor?.PhysicalDefense ?? 0); result += (player.Accessory1?.PhysicalDefense ?? 0); result += (player.Accessory2?.PhysicalDefense ?? 0); result += (player.Artifact?.PhysicalDefense ?? 0); if (player.IsHunterShot) { result *= player.IsHunterShot.EffectValue; } if (player.IsPhysicalDefenseDown) { double decrease = (1.00f - player.IsPhysicalDefenseDown.EffectValue * player.IsPhysicalDefenseDown.Cumulative); if (decrease <= 0.0f) { decrease = 0.0f; } result *= decrease; Debug.Log("IsPhysicalDefenseDown phase: " + result); } BuffImage stanceOfTheShield = player.IsStanceOfTheGuard; if (stanceOfTheShield) { result = result * (1.00f + player.IsStanceOfTheGuard.EffectValue * stanceOfTheShield.Cumulative); } if (result <= 0.0f) { result = 0.0f; } return(result); }
/// <summary> /// 基本ロジックを内包した物理攻撃実行コマンド /// </summary> private bool ExecNormalAttack(Character player, Character target, double magnify, CriticalType critical) { Debug.Log(MethodBase.GetCurrentMethod()); // ターゲットが既に死んでいる場合 if (target.Dead) { StartAnimation(target.objGroup.gameObject, Fix.BATTLE_MISS, Fix.COLOR_NORMAL); this.NowAnimationMode = true; return(false); } // ターゲットに対して命中していない場合 if (player.IsDizzy) { if (AP.Math.RandomInteger(100) > (int)player.IsDizzy.EffectValue) { StartAnimation(target.objGroup.gameObject, Fix.BATTLE_DIZZY_MISS, Fix.COLOR_NORMAL); this.NowAnimationMode = true; return(false); } } // 攻撃コマンドのダメージを算出 double damageValue = PhysicalDamageLogic(player, target, magnify, Fix.DamageSource.Physical, critical); // ディバイン・フィールドによる効果 BuffField panelField = GetPanelFieldFromPlayer(target); if (panelField != null) { BuffImage buffImage = PreCheckFieldEffect(panelField.gameObject, Fix.DIVINE_CIRCLE); if (buffImage != null) { Debug.Log("DivineShiled: " + player.FullName + " -> " + damageValue.ToString("F2") + " " + buffImage.EffectValue.ToString("F2")); buffImage.EffectValue -= damageValue; StartAnimationGroupPanel(buffImage.gameObject, Fix.BATTLE_DIVINE + "\r\n " + (int)(buffImage.EffectValue), Fix.COLOR_NORMAL); if (buffImage.EffectValue <= 0) { buffImage.RemoveBuff(); } return(false); // ディバイン・フィールドで吸収された場合はヒットしたことにならない。 } } // ダメージ適用 ApplyDamage(player, target, damageValue); // 追加効果 if (player.IsFlameBlade && player.Dead == false) { double addDamageValue = MagicDamageLogic(player, target, SecondaryLogic.MagicAttack(player), Fix.DamageSource.Fire, critical); ApplyDamage(player, target, addDamageValue); } BuffImage stanceOfTheBlade = player.IsStanceOfTheBlade; if (stanceOfTheBlade != null) { stanceOfTheBlade.Cumulative++; } BuffImage stanceOfTheGuard = target.IsStanceOfTheGuard; if (target.IsStanceOfTheGuard && target.IsDefense && target.Dead == false) { stanceOfTheGuard.Cumulative++; } return(true); }
/// <summary> /// 物理攻撃の算出 /// </summary> public static double PhysicalAttack(Character player, ValueType value_type) { double min = 1 + player.TotalStrength * Potential(player) * 1.00f; double max = 1 + player.TotalStrength * Potential(player) * 1.00f; min += (player.MainWeapon?.PhysicalAttack ?? 0); min += (player.SubWeapon?.PhysicalAttack ?? 0); min += (player.MainArmor?.PhysicalAttack ?? 0); min += (player.Accessory1?.PhysicalAttack ?? 0); min += (player.Accessory2?.PhysicalAttack ?? 0); min += (player.Artifact?.PhysicalAttack ?? 0); max += (player.MainWeapon?.PhysicalAttackMax ?? 0); max += (player.SubWeapon?.PhysicalAttackMax ?? 0); max += (player.MainArmor?.PhysicalAttackMax ?? 0); max += (player.Accessory1?.PhysicalAttackMax ?? 0); max += (player.Accessory2?.PhysicalAttackMax ?? 0); max += (player.Artifact?.PhysicalAttackMax ?? 0); double result = 0.0f; int debug = 999; int debug_min = 999999999; int debug_max = 0; double debug_avg = 0; for (int ii = 0; ii < debug; ii++) { result = CoreDamage(player, value_type, min, max); //Debug.Log("CoreDamage: " + Convert.ToInt32(result).ToString()); if (debug_min >= result) { debug_min = Convert.ToInt32(result); } if (debug_max <= result) { debug_max = Convert.ToInt32(result); } debug_avg += result; } debug_avg /= debug; //Debug.Log("AVG: " + Convert.ToInt32(debug_avg).ToString()); //Debug.Log("MIN: " + Convert.ToInt32(debug_min).ToString()); //Debug.Log("MAX: " + Convert.ToInt32(debug_max).ToString()); // double result = CoreDamage(player, value_type, min, max); if (player.IsAuraOfPower) { result *= player.IsAuraOfPower.EffectValue; } BuffImage stanceOfTheBlade = player.IsStanceOfTheBlade; if (stanceOfTheBlade) { result = result * (1.00f + (player.IsStanceOfTheBlade.EffectValue * stanceOfTheBlade.Cumulative)); } if (result <= 0.0f) { result = 0.0f; } return(result); }