PKHeX/PKHeX.Core/Saves/Substructures/G1OverworldSpawner.cs
2017-09-25 23:06:16 -07:00

132 lines
5.2 KiB
C#

using System.Collections.Generic;
// ReSharper disable UnusedAutoPropertyAccessor.Local
namespace PKHeX.Core
{
public class G1OverworldSpawner
{
private readonly SAV1 SAV;
private readonly bool[] EventFlags;
private readonly bool[] SpawnFlags;
public G1OverworldSpawner(SAV1 sav)
{
SAV = sav;
EventFlags = sav.EventFlags;
SpawnFlags = sav.EventSpawnFlags;
bool yellow = SAV.Yellow;
// FlagPairs set for Red/Blue when appropriate.
FlagEevee = new FlagPair {SpawnFlag = 0x45};
FlagAerodactyl = new FlagPair {EventFlag = 0x069, SpawnFlag = 0x34};
FlagHitmonlee = new FlagPair {EventFlag = 0x356, SpawnFlag = 0x4A};
FlagHitmonchan = new FlagPair {EventFlag = 0x357, SpawnFlag = 0x4B};
FlagVoltorb_1 = new FlagPair {EventFlag = 0x461, SpawnFlag = 0x4D};
FlagVoltorb_2 = new FlagPair {EventFlag = 0x462, SpawnFlag = 0x4E};
FlagVoltorb_3 = new FlagPair { EventFlag = 0x463, SpawnFlag = 0x4F};
FlagElectrode_1 = new FlagPair {EventFlag = 0x464, SpawnFlag = 0x50};
FlagVoltorb_4 = new FlagPair {EventFlag = 0x465, SpawnFlag = 0x51};
FlagVoltorb_5 = new FlagPair {EventFlag = 0x466, SpawnFlag = 0x52};
FlagElectrode_2 = new FlagPair {EventFlag = 0x467, SpawnFlag = 0x53};
FlagVoltorb_6 = new FlagPair {EventFlag = 0x468, SpawnFlag = 0x54};
FlagZapdos = new FlagPair {EventFlag = 0x469, SpawnFlag = 0x55};
FlagMoltres = new FlagPair {EventFlag = 0x53E, SpawnFlag = 0x5B};
FlagKabuto = new FlagPair {EventFlag = 0x57E, SpawnFlag = 0x6D};
FlagOmanyte = new FlagPair {EventFlag = 0x57F, SpawnFlag = 0x6E};
FlagMewtwo = new FlagPair {EventFlag = 0x8C1, SpawnFlag = 0xD1};
FlagArticuno = new FlagPair {EventFlag = 0x9DA, SpawnFlag = 0xE3};
if (yellow) // slightly different
{
FlagKabuto.EventFlag = 0x578;
FlagAerodactyl.SpawnFlag = 0x33;
FlagMewtwo.SpawnFlag = 0xD7;
FlagArticuno.SpawnFlag = 0xEB;
FlagKabuto.SpawnFlag += 2;
FlagOmanyte.SpawnFlag += 2;
FlagBulbasaur = new FlagPair { EventFlag = 0x0A8, SpawnFlag = 0x34 };
FlagSquirtle = new FlagPair { EventFlag = 0x147 }; // Given by Officer Jenny after badged
FlagCharmander = new FlagPair { EventFlag = 0x54F }; // Given by Damian, doesn't despawn
}
}
private FlagPair FlagMewtwo { get; }
private FlagPair FlagArticuno { get; }
private FlagPair FlagZapdos { get; }
private FlagPair FlagMoltres { get; }
private FlagPair FlagVoltorb_1 { get; }
private FlagPair FlagVoltorb_2 { get; }
private FlagPair FlagVoltorb_3 { get; }
private FlagPair FlagVoltorb_4 { get; }
private FlagPair FlagVoltorb_5 { get; }
private FlagPair FlagVoltorb_6 { get; }
private FlagPair FlagElectrode_1 { get; }
private FlagPair FlagElectrode_2 { get; }
private FlagPair FlagHitmonchan { get; }
private FlagPair FlagHitmonlee { get; }
private FlagPair FlagEevee { get; }
private FlagPair FlagKabuto { get; }
private FlagPair FlagOmanyte { get; }
private FlagPair FlagAerodactyl { get; }
private FlagPair FlagBulbasaur { get; }
private FlagPair FlagSquirtle { get; }
private FlagPair FlagCharmander { get; }
public class FlagPair
{
public string Name { get; internal set; }
internal int SpawnFlag { get; set; }
internal int EventFlag { get; set; }
internal bool[] Event { get; set; }
internal bool[] Spawn { get; set; }
public void Invert() => SetState(!IsDespawned);
public void Reset() => SetState(false);
public void SetState(bool despawned)
{
if (EventFlag != 0)
Event[EventFlag] = despawned;
if (SpawnFlag != 0)
Spawn[SpawnFlag] = despawned;
}
public bool IsDespawned
{
get
{
bool result = false;
if (EventFlag != 0)
result |= Event[EventFlag];
if (SpawnFlag != 0)
result |= Spawn[SpawnFlag];
return result;
}
}
internal FlagPair() { }
}
public void Save()
{
SAV.EventFlags = EventFlags;
SAV.EventSpawnFlags = SpawnFlags;
}
public IEnumerable<FlagPair> GetFlagPairs()
{
var pz = ReflectUtil.GetPropertiesStartWithPrefix(GetType(), "Flag");
foreach (var pair in pz)
{
var p = ReflectUtil.GetValue(this, pair) as FlagPair;
if (p == null)
continue;
p.Name = pair;
p.Event = EventFlags;
p.Spawn = SpawnFlags;
yield return p;
}
}
}
}