mirror of
https://github.com/mm201/pkmn-classic-framework.git
synced 2026-03-22 01:44:20 -05:00
131 lines
4.0 KiB
C#
131 lines
4.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
|
|
namespace PkmnFoundations.Structures
|
|
{
|
|
public class IvStatValues : ByteStatValues
|
|
{
|
|
public IvStatValues(byte hp, byte attack, byte defense, byte speed, byte special_attack, byte special_defense)
|
|
: base(hp, attack, defense, speed, special_attack, special_defense)
|
|
{
|
|
}
|
|
|
|
public IvStatValues(IEnumerable<byte> s) : base(s)
|
|
{
|
|
foreach (byte b in s)
|
|
{
|
|
if (b > 31) throw new ArgumentOutOfRangeException();
|
|
}
|
|
}
|
|
|
|
public IvStatValues(int ivs) : base(new byte[6])
|
|
{
|
|
for (int x = 0; x < 6; x++)
|
|
{
|
|
Stats[x] = (byte)(ivs & 31);
|
|
ivs >>= 5;
|
|
}
|
|
}
|
|
|
|
public override byte this[Stats stat]
|
|
{
|
|
get
|
|
{
|
|
return base[stat];
|
|
}
|
|
set
|
|
{
|
|
if (value > 31) throw new ArgumentOutOfRangeException();
|
|
base[stat] = value;
|
|
}
|
|
}
|
|
|
|
public int ToInt32()
|
|
{
|
|
int shift = 0;
|
|
int result = 0;
|
|
foreach (byte iv in Stats)
|
|
{
|
|
result |= iv << shift;
|
|
shift += 5;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static byte UnpackIV(uint ivs, Stats stat)
|
|
{
|
|
int shift = (int)stat * 5 - 5;
|
|
return (byte)(ivs << shift & 0x1f);
|
|
}
|
|
|
|
public static uint PackIVs(byte HP, byte Attack, byte Defense, byte Speed, byte SpAttack, byte SpDefense)
|
|
{
|
|
return (uint)((HP & 31) |
|
|
((Attack & 31) << 5) |
|
|
((Defense & 31) << 10) |
|
|
((Speed & 31) << 15) |
|
|
((SpAttack & 31) << 20) |
|
|
((SpDefense & 31) << 25));
|
|
}
|
|
|
|
public JudgeSummary JudgeSummary
|
|
{
|
|
get
|
|
{
|
|
Potential overall = Potential.Decent;
|
|
int overallInt = Stats.Sum(s => (int)s);
|
|
if (overallInt > 90) overall = Potential.AboveAverage;
|
|
if (overallInt > 120) overall = Potential.RelativelySuperior;
|
|
if (overallInt > 150) overall = Potential.Outstanding;
|
|
|
|
byte bestIvValue = 0;
|
|
StatFlags bestIvs = StatFlags.None;
|
|
StatFlags zeroIvs = StatFlags.None;
|
|
int current = 1;
|
|
for (int x = 0; x < Stats.Length; x++)
|
|
{
|
|
if (Stats[x] > bestIvValue)
|
|
{
|
|
bestIvValue = Stats[x];
|
|
bestIvs = (StatFlags)current;
|
|
}
|
|
else if (Stats[x] == bestIvValue)
|
|
{
|
|
bestIvs |= (StatFlags)current;
|
|
}
|
|
if (Stats[x] == 0)
|
|
{
|
|
zeroIvs |= (StatFlags)current;
|
|
}
|
|
current <<= 1;
|
|
}
|
|
|
|
Potential bestPotential = Potential.Decent;
|
|
if (bestIvValue > 15) bestPotential = Potential.AboveAverage;
|
|
if (bestIvValue > 25) bestPotential = Potential.RelativelySuperior;
|
|
if (bestIvValue > 30) bestPotential = Potential.Outstanding;
|
|
|
|
return new JudgeSummary(overall, bestIvs, bestPotential, zeroIvs);
|
|
}
|
|
}
|
|
}
|
|
|
|
public struct JudgeSummary
|
|
{
|
|
public Potential OverallPotential;
|
|
public StatFlags BestIvs;
|
|
public Potential BestPotential;
|
|
public StatFlags ZeroIvs;
|
|
|
|
public JudgeSummary(Potential overall_potential, StatFlags best_ivs, Potential best_potential, StatFlags zero_ivs)
|
|
{
|
|
OverallPotential = overall_potential;
|
|
BestIvs = best_ivs;
|
|
BestPotential = best_potential;
|
|
ZeroIvs = zero_ivs;
|
|
}
|
|
}
|
|
}
|