internal UnitStats ScaleMonster(UnitStats unitToScale, float statMulti) { //Get base UnitStats baseStats = LoadStats(1).Copy(); //Get scale UnitStats scaling = LoadStats(2); baseStats.Id = unitToScale.Id; baseStats.Name = unitToScale.Name; //Apply Scale baseStats.MaxHealth = ScaleStat(baseStats.MaxHealth, scaling.MaxHealth, unitToScale.MaxHealth, statMulti); baseStats.MaxMana = ScaleStat(baseStats.MaxMana, scaling.MaxMana, unitToScale.MaxMana, statMulti); baseStats.AttackPower = ScaleStat(baseStats.AttackPower, scaling.AttackPower, unitToScale.AttackPower, statMulti); baseStats.MagicPower = ScaleStat(baseStats.MagicPower, scaling.MagicPower, unitToScale.MagicPower, statMulti); baseStats.AttackDefense = ScaleStat(baseStats.AttackDefense, scaling.AttackDefense, unitToScale.AttackDefense, statMulti); baseStats.MagicDefense = ScaleStat(baseStats.MagicDefense, scaling.MagicDefense, unitToScale.MagicDefense, statMulti); baseStats.Accuracy = ScaleStat(baseStats.Accuracy, scaling.Accuracy, unitToScale.Accuracy, statMulti); baseStats.Evasion = ScaleStat(baseStats.Evasion, scaling.Evasion, unitToScale.Evasion, statMulti); baseStats.CritChance = ScaleStat(baseStats.CritChance, scaling.CritChance, unitToScale.CritChance, statMulti); baseStats.CritMulti = ScaleStat(baseStats.CritMulti, scaling.CritMulti, unitToScale.CritMulti, 1); baseStats.IncCritChance = ScaleStat(baseStats.IncCritChance, scaling.IncCritChance, unitToScale.IncCritChance, 1); baseStats.TypeStatusChance = ScaleStat(baseStats.TypeStatusChance, scaling.TypeStatusChance, unitToScale.TypeStatusChance, statMulti); baseStats.MentalStatusChance = ScaleStat(baseStats.MentalStatusChance, scaling.MentalStatusChance, unitToScale.MentalStatusChance, statMulti); baseStats.StatusPower = ScaleStat(baseStats.StatusPower, scaling.StatusPower, unitToScale.StatusPower, 1); baseStats.IncTypeStatus = ScaleStat(baseStats.IncTypeStatus, scaling.IncTypeStatus, unitToScale.IncTypeStatus, 1); baseStats.IncMentalStatus = ScaleStat(baseStats.IncMentalStatus, scaling.IncMentalStatus, unitToScale.IncMentalStatus, 1); baseStats.ResistPhysical = unitToScale.ResistPhysical; baseStats.ResistProjectile = unitToScale.ResistProjectile; baseStats.ResistElectric = unitToScale.ResistElectric; baseStats.ResistCold = unitToScale.ResistCold; baseStats.ResistFire = unitToScale.ResistFire; baseStats.ResistWind = unitToScale.ResistWind; baseStats.ResistArcane = unitToScale.ResistArcane; baseStats.ResistPsychic = unitToScale.ResistPsychic; baseStats.ResistLight = unitToScale.ResistLight; baseStats.ResistDark = unitToScale.ResistDark; return(baseStats); }
public Player(UnitStats stats, List <SkillStats> skills) : base(stats, skills) { IsPlayer = true; }
public void SetBaseStats(UnitStats stats) { playerBase = stats.Copy(); }
public Monster(UnitStats stats, List <SkillStats> skills) : base(stats, skills) { IsPlayer = false; }
public static void SetStat(UnitStats unit, string propName, float increase) { unit.GetType().GetProperty(propName).SetValue(unit, (float)unit.GetType().GetProperty(propName).GetValue(unit, null) + increase); }
internal static KeyValuePair <bool, int> Status(SkillStats skill, UnitStats attacker, UnitStats defender) { bool status = false; bool playerAttacker = false; bool playerDefender = false; if (attacker.Id == 0) { playerAttacker = true; } else if (defender.Id == 0) { playerDefender = true; } if (skill.StatusType == Constants.StatusTypes.Blast) { float power = attacker.MagicPower; power *= (float)attacker.StatusPower / 100; power *= (float)skill.StatusPower / 100; return(new KeyValuePair <bool, int>(true, (int)power)); } //Check evasion float accuracy = skill.Accuracy * ((float)attacker.Accuracy / 100); //Always hit if evasion <= 0 if (defender.Evasion > 0) { accuracy /= (float)defender.Evasion / 100; int evasionRoll = RandomInt(1, 100); if (ExperimentControl.active) { if (playerDefender) { int evasionRoll2 = RandomInt(1, 100); if (evasionRoll2 > evasionRoll) { evasionRoll = evasionRoll2; } } } if (accuracy < evasionRoll) { return(new KeyValuePair <bool, int> (false, 0)); } } //Check Status float statusChance = skill.StatusChance; int statusDuration = 2; if (statusChance > 0) { bool statusAttempt; if (skill.StatusType >= Constants.StatusTypes.Sleep) { statusAttempt = TryChance(statusChance, attacker.MentalStatusChance, defender.IncMentalStatus, playerAttacker); statusDuration = 4; } else { statusAttempt = TryChance(statusChance, attacker.TypeStatusChance, defender.IncTypeStatus, playerAttacker); } if (statusAttempt) { status = true; } } return(new KeyValuePair <bool, int>(status, statusDuration)); }
internal static DamagePacket Hit(SkillStats skill, UnitStats attacker, UnitStats defender) { bool playerAttacker = false; bool playerDefender = false; if (attacker.Id == 0) { playerAttacker = true; } else if (defender.Id == 0) { playerDefender = true; } //Check evasion float accuracy = skill.Accuracy * ((float)attacker.Accuracy / 100); //Always hit if evasion <= 0 if (defender.Evasion > 0) { accuracy /= (float)defender.Evasion / 100; int evasionRoll = RandomInt(1, 100); if (ExperimentControl.active) { if (playerDefender) { int evasionRoll2 = RandomInt(1, 100); if (evasionRoll2 > evasionRoll) { evasionRoll = evasionRoll2; } } } if (accuracy < evasionRoll) { return(new DamagePacket(false)); } } //Hit //Set Type float power = 0; float defense = 0; float resist = 0; int statusDuration = 2; switch (skill.DamageType) { case Constants.DamageTypes.Physical: power = attacker.AttackPower; defense = defender.AttackDefense; resist = defender.ResistPhysical; break; case Constants.DamageTypes.Projectile: power = attacker.AttackPower; defense = defender.AttackDefense; resist = defender.ResistProjectile; break; case Constants.DamageTypes.Almighty: power = attacker.MagicPower; defense = defender.MagicDefense; break; case Constants.DamageTypes.Electric: power = attacker.MagicPower; defense = defender.MagicDefense; resist = defender.ResistElectric; break; case Constants.DamageTypes.Cold: power = attacker.MagicPower; defense = defender.MagicDefense; resist = defender.ResistCold; break; case Constants.DamageTypes.Fire: power = attacker.MagicPower; defense = defender.MagicDefense; resist = defender.ResistFire; statusDuration = 4; break; case Constants.DamageTypes.Wind: power = attacker.MagicPower; defense = defender.MagicDefense; resist = defender.ResistWind; break; case Constants.DamageTypes.Arcane: power = attacker.MagicPower; defense = defender.MagicDefense; resist = defender.ResistArcane; break; case Constants.DamageTypes.Psychic: power = attacker.MagicPower; defense = defender.MagicDefense; resist = defender.ResistPsychic; break; case Constants.DamageTypes.Light: power = attacker.MagicPower; defense = defender.MagicDefense; resist = defender.ResistLight; break; case Constants.DamageTypes.Dark: power = attacker.MagicPower; defense = defender.MagicDefense; resist = defender.ResistDark; statusDuration = 4; break; } //Check Weakness bool isWeak = false; if (resist <= -50) { isWeak = true; } //Check Technical bool isTechnical = false; bool removeStatus = false; Constants.StatusTypes returnStatus = Constants.StatusTypes.None; switch (defender.Status) { case Constants.StatusTypes.None: break; case Constants.StatusTypes.Shock: if (skill.DamageType == Constants.DamageTypes.Physical) { power = (int)(power * Constants.TECHNICAL_MULTI); isTechnical = true; removeStatus = true; returnStatus = Constants.StatusTypes.Shock; } else if (skill.DamageType == Constants.DamageTypes.Arcane) { power = (int)(power * Constants.TECHNICAL_MULTI); isTechnical = true; removeStatus = true; } break; case Constants.StatusTypes.Freeze: if (skill.DamageType == Constants.DamageTypes.Physical || skill.DamageType == Constants.DamageTypes.Projectile) { power = (int)(power * Constants.TECHNICAL_MULTI); isTechnical = true; removeStatus = true; } else if (skill.DamageType == Constants.DamageTypes.Arcane) { power = (int)(power * Constants.TECHNICAL_MULTI); isTechnical = true; } break; case Constants.StatusTypes.Burn: if (skill.DamageType == Constants.DamageTypes.Arcane) { power = (int)(power * Constants.TECHNICAL_MULTI); isTechnical = true; } break; case Constants.StatusTypes.Sleep: power = (int)(power * Constants.TECHNICAL_MULTI); isTechnical = true; break; case Constants.StatusTypes.Forget: if (skill.DamageType == Constants.DamageTypes.Psychic) { power = (int)(power * Constants.TECHNICAL_MULTI); isTechnical = true; } break; case Constants.StatusTypes.Berserk: if (skill.DamageType == Constants.DamageTypes.Psychic) { power = (int)(power * Constants.TECHNICAL_MULTI); isTechnical = true; } break; case Constants.StatusTypes.Confuse: if (skill.DamageType == Constants.DamageTypes.Psychic) { power = (int)(power * Constants.TECHNICAL_MULTI); isTechnical = true; } break; case Constants.StatusTypes.Brainwash: if (skill.DamageType == Constants.DamageTypes.Psychic) { power = (int)(power * Constants.TECHNICAL_MULTI); isTechnical = true; } break; case Constants.StatusTypes.Fear: if (skill.DamageType == Constants.DamageTypes.Psychic) { power = (int)(power * Constants.TECHNICAL_MULTI); isTechnical = true; } break; } //Check Crit bool isCrit = false; if (TryChance(skill.CritChance, attacker.CritChance, defender.IncCritChance, playerAttacker)) { isCrit = true; float critMulti = attacker.CritMulti * ((float)skill.CritMulti / 100); power *= critMulti / 100; } //Check Status float statusChance = skill.StatusChance; statusChance *= (100 - resist) / 100; Constants.StatusTypes status = Constants.StatusTypes.None; if (!isTechnical) { if (statusChance > 0) { if (isCrit) { statusChance *= Constants.CRITICAL_STATUS_MULTI; } bool statusAttempt; if (skill.StatusType >= Constants.StatusTypes.Sleep) { statusAttempt = TryChance(statusChance, attacker.MentalStatusChance, defender.IncMentalStatus, playerAttacker); } else { statusAttempt = TryChance(statusChance, attacker.TypeStatusChance, defender.IncTypeStatus, playerAttacker); } if (statusAttempt) { status = skill.StatusType; } } } //Calculate final power power *= (100 - resist) / 100; float statusPower = 0; if (status != Constants.StatusTypes.None) { statusPower = power; statusPower *= (float)attacker.StatusPower / 100; statusPower *= (float)skill.StatusPower / 100; } if (defense > 0) { power /= defense / 100; } power *= (float)skill.Power / 100; DamagePacket packet = new DamagePacket(true, (int)power, (int)statusPower, isWeak, isTechnical, removeStatus, status, returnStatus, isCrit, statusDuration); return(packet); }