public List <int>[] TriggeredStates(Battler u, Battler t, double effectMagnitude = 1.0) { List <int>[] stateIds = new List <int>[] { new List <int>(), new List <int>() }; for (int i = 0; i < StatesGiveRate.Length; i++) { if (StatesGiveRate[i] <= 0) { continue; } double tAttr = (t.StateRates[i] + 100) * u.Luk() / (100 * t.Luk()); double result = (StatesGiveRate[i] + 100) * tAttr / 100.0 * effectMagnitude; if (Chance((int)result)) { stateIds[0].Add(i); } } for (int i = 0; i < StatesReceiveRate.Length; i++) { if (StatesReceiveRate[i] <= 0) { continue; } double result = (StatesReceiveRate[i] + 100) * (u.StateRates[i] + 100) / 10000.0; if (Chance((int)result)) { stateIds[1].Add(i); } } return(stateIds); }
private List <int> ApplyToolEffects(Battler b, Tool t, double effectMagnitude = 1.0, ApplyExtra extraFunc = null) { List <int> oneTarget = new List <int>(); if (t.Hit(this, b, effectMagnitude)) { CriticalHitRatio = t.CriticalHitRatio(this, b, effectMagnitude); oneTarget.Add(CriticalHitRatio); oneTarget.Add(t.ElementMagnitude(b)); oneTarget.Add(t.GetToolFormula(this, b, effectMagnitude)); List <int>[] states = t.TriggeredStates(this, b, effectMagnitude); oneTarget.Add(states[0].Count); foreach (int stateGiveId in states[0]) { oneTarget.Add(stateGiveId); } oneTarget.Add(states[1].Count); foreach (int stateReceiveId in states[1]) { oneTarget.Add(stateReceiveId); } if (extraFunc != null) { oneTarget = extraFunc(oneTarget, b, effectMagnitude); } } else { oneTarget.Add(-t.Type); } return(oneTarget); }
private List <int> ExecuteSteal(List <int> oneActResult, Battler target, double effectMagnitude) { double willSteal = effectMagnitude * 100 * Luk() / target.Luk(); oneActResult.Add(SelectedSkill.Steal && Chance((int)willSteal) ? 1 : 0); return(oneActResult); }
public bool Hit(Battler u, Battler t, double effectMagnitude = 1.0) { double toolAcc = Accuracy * (u.SelectedWeapon != null ? u.SelectedWeapon.Accuracy : 100) / 10000.0; double def = t.Spd() * t.Eva(); double result = 95 * toolAcc * u.Tec() * u.Acc() / (def != 0 ? def : 0.01) * effectMagnitude; return(Chance((int)result)); }
public int CriticalHitRatio(Battler u, Battler t, double effectMagnitude = 1.0) { if (effectMagnitude < 0.5) { return(1); } double toolCrt = CritcalRate * (u.SelectedWeapon != null ? u.SelectedWeapon.CritcalRate : 100) / 10000.0; double def = t.Tec() * t.Cev(); double result = 2 * Math.Pow(u.Tec() * toolCrt, 1.1) * u.Crt() / (def != 0 ? def : 0.01) * effectMagnitude; return(Chance((int)result) ? 3 : 1); }
public Battler(Battler original) : base(original) { Class = Clone(original.Class, o => new BattlerClass(o)); HP = original.HP; SP = original.SP; Level = original.Level; ZPosition = original.ZPosition; XPosition = original.XPosition; Stats = Clone(original.Stats, o => new Stats(o)); StatBoosts = Clone(original.StatBoosts, o => new Stats(o)); ElementRates = Clone(original.ElementRates); StateRates = Clone(original.StateRates); Skills = Clone(original.Skills, o => new Skill(o)); Items = Clone(original.Items, o => new Item(o)); Weapons = Clone(original.Weapons, o => new Weapon(o)); PassiveSkills = Clone(original.PassiveSkills, o => new PassiveSkill(o)); Type = original.Type; ComboPartners = original.ComboPartners; SelectedSkill = Clone(original.SelectedSkill, o => new Skill(o)); SelectedItem = Clone(original.SelectedItem, o => new Item(o)); SelectedWeapon = Clone(original.SelectedWeapon, o => new Weapon(o)); SelectedTargets = original.SelectedTargets; States = Clone(original.States, o => new State(o)); MovingLocation = original.MovingLocation; ExecutedAction = original.ExecutedAction; CriticalHitRatio = original.CriticalHitRatio; TargetResults = Clone(original.TargetResults, o => new List <List <int> >(o)); EffectResults = Clone(original.EffectResults, o => new List <int>(o)); StatModifiers = Clone(original.StatModifiers, o => new Stats(o)); IsConscious = original.IsConscious; CannotMove = original.CannotMove; SPConsumeRate = original.SPConsumeRate; ComboDifficulty = original.ComboDifficulty; Counter = original.Counter; Reflect = original.Reflect; ExtraTurns = original.ExtraTurns; DisabledToolTypes = Clone(original.DisabledToolTypes, o => new List <int>(o)); ContactSpread = Clone(original.ContactSpread, o => new List <int>(o)); RemoveByHit = Clone(original.RemoveByHit, o => new List <int>(o)); }
public int ElementMagnitude(Battler b) { int rate = b.ElementRates[Element]; if (rate == 0) { return(0); } if (rate < 100) { return(1); } if (rate >= 100) { return(2); } if (rate > -100) { return(-1); } return(-2); }
public int GetToolFormula(Battler u, Battler t, double effectMagnitude = 1.0) { double total = 0; double power = Power * (u.SelectedWeapon != null ? u.SelectedWeapon.Power : 10) / 100.0; double rates = power * u.CriticalHitRatio * (t.ElementRates[Element] + 100) / 100.0; switch (Formula) { case 1: total = (1.5 * u.Atk() - 1.25 * t.Def()) * rates; break; // Physical standard case 2: total = (1.5 * u.Map() - 1.25 * t.Mar()) * rates; break; // Magical standard case 3: total = (1.5 * (u.Atk() + u.Map()) / 2 - 1.25 * (t.Def() + t.Mar()) / 2) * rates; break; // Mixed standard case 4: total = (1.5 * (u.Atk() / 4 + u.Tec() * 3 / 4) - 1.25 * t.Def()) * rates; break; // Physical gun case 5: total = (1.5 * (u.Map() / 4 + u.Tec() * 3 / 4) - 1.25 * t.Mar()) * rates; break; // Magical gun } int intTotal = (int)(total * effectMagnitude); int variance = Conversion.NaturalNumber(intTotal) / 10; int formulaValue = intTotal + RandInt(-variance, variance); return(Formula > 0 ? Conversion.NaturalNumber(formulaValue) : formulaValue); }