Shellos and Gastrodom East Sea Form in Gen 4 Encounters (#961)

* Add shellos and gastrodom alt form in east sea locations

* Improved MarkG4AltFormSlots

* Remove inside of truck

* Move code for group by Areas to a propert function, to avoid duplicate code, also group by Areas in gen 2, 6 and 7. Is not needed in gen 1

* Reduce all gen7 areas
This commit is contained in:
javierhimura 2017-03-21 08:20:51 +01:00 committed by Kurt
parent 3027eadb8d
commit 2bb9f61033
3 changed files with 78 additions and 19 deletions

View file

@ -168,6 +168,19 @@ namespace PKHeX.Core
}
return GameSlots;
}
private static void ReduceAreasSize(ref EncounterArea[] Areas)
{
// Group areas by location id, the raw data have areas with different slots but the same location id
Areas = Areas.GroupBy(a => a.Location).Select(a => new EncounterArea
{
Location = a.First().Location,
Slots = a.SelectMany(m => m.Slots).ToArray()
}).ToArray();
}
private static void MarkG2Slots(ref EncounterArea[] Areas)
{
ReduceAreasSize(ref Areas);
}
private static void MarkG3Slots_FRLG(ref EncounterArea[] Areas)
{
// Remove slots for unown, those slots does not contains alt form info, it will be added manually in SlotsRFLGAlt
@ -180,12 +193,7 @@ namespace PKHeX.Core
}
private static void MarkG3Slots_RSE(ref EncounterArea[] Areas)
{
// Group areas by location id, the raw data have areas with different slots but the same location id
Areas = Areas.GroupBy(a => a.Location).Select(a => new EncounterArea
{
Location = a.First().Location,
Slots = a.SelectMany(m => m.Slots).ToArray()
}).ToArray();
ReduceAreasSize(ref Areas);
}
private static void MarkG4SwarmSlots(ref EncounterArea[] Areas, EncounterArea[] SwarmAreas)
{
@ -206,14 +214,21 @@ namespace PKHeX.Core
Area.Slots = Area.Slots.Concat(OutputSlots).Where(a => a.Species > 0).ToArray();
}
}
// Gen 4 raw encounter data does not contains info for alt slots
// Shellos and Gastrodom East Sea form should be modified
private static void MarkG4AltFormSlots(ref EncounterArea[] Areas, int Species, int form, int[] Locations)
{
foreach(EncounterArea Area in Areas.Where(a => Locations.Contains(a.Location)))
{
foreach (EncounterSlot Slot in Area.Slots.Where(s=>s.Species == Species))
{
Slot.Form = form;
}
}
}
private static void MarkG4Slots(ref EncounterArea[] Areas)
{
// Group areas by location id, the raw data have areas with different slots but the same location id
Areas = Areas.GroupBy(a => a.Location).Select(a => new EncounterArea
{
Location = a.First().Location,
Slots = a.SelectMany(m => m.Slots).ToArray()
}).ToArray();
ReduceAreasSize(ref Areas);
}
private static void MarkG5Slots(ref EncounterArea[] Areas)
{
@ -245,12 +260,7 @@ namespace PKHeX.Core
} while (ctr != area.Slots.Length);
area.Slots = area.Slots.Where(slot => slot.Species != 0).ToArray();
}
// Group areas by location id, the raw data have areas with different slots but the same location id
Areas = Areas.GroupBy(a => a.Location).Select(a => new EncounterArea
{
Location = a.First().Location,
Slots = a.SelectMany(m => m.Slots).ToArray()
}).ToArray();
ReduceAreasSize(ref Areas);
}
private static void MarkG6XYSlots(ref EncounterArea[] Areas)
{
@ -260,6 +270,7 @@ namespace PKHeX.Core
for (int i = slotct - 15; i < slotct; i++)
area.Slots[i].Type = SlotType.Horde;
}
ReduceAreasSize(ref Areas);
}
private static void MarkG6AOSlots(ref EncounterArea[] Areas)
{
@ -274,11 +285,17 @@ namespace PKHeX.Core
for (int i = 0; i < slotct; i++)
area.Slots[i].AllowDexNav = area.Slots[i].Type != SlotType.Rock_Smash;
}
ReduceAreasSize(ref Areas);
}
private static void MarkG7REGSlots(ref EncounterArea[] Areas)
{
ReduceAreasSize(ref Areas);
}
private static void MarkG7SMSlots(ref EncounterArea[] Areas)
{
foreach (EncounterSlot s in Areas.SelectMany(area => area.Slots))
s.Type = SlotType.SOS;
ReduceAreasSize(ref Areas);
}
private static EncounterArea[] getTables1()
{
@ -337,6 +354,7 @@ namespace PKHeX.Core
{
StaticRBY = getStaticEncounters(GameVersion.RBY);
SlotsRBY = getTables1();
// Gen 1 is the only gen where ReduceAreasSize is not needed
Evolves1 = new EvolutionTree(new[] { Resources.evos_rby }, GameVersion.RBY, PersonalTable.Y, MaxSpeciesID_1);
}
// Gen 2
@ -347,6 +365,9 @@ namespace PKHeX.Core
SlotsGS = getTables2(GameVersion.GS);
SlotsC = getTables2(GameVersion.C);
SlotsGSC = getTables2(GameVersion.GSC);
MarkG2Slots(ref SlotsGS);
MarkG2Slots(ref SlotsC);
MarkG2Slots(ref SlotsGSC);
Evolves2 = new EvolutionTree(new[] { Resources.evos_gsc }, GameVersion.GSC, PersonalTable.C, MaxSpeciesID_2);
}
// Gen3
@ -413,6 +434,13 @@ namespace PKHeX.Core
MarkG4SwarmSlots(ref HG_Slots, SlotsHG_Swarm);
MarkG4SwarmSlots(ref SS_Slots, SlotsSS_Swarm);
MarkG4AltFormSlots(ref D_Slots, 422, 1, Shellos_EastSeaLocation_DP);
MarkG4AltFormSlots(ref D_Slots, 423, 1, Gastrodon_EastSeaLocation_DP);
MarkG4AltFormSlots(ref P_Slots, 422, 1, Shellos_EastSeaLocation_DP);
MarkG4AltFormSlots(ref P_Slots, 423, 1, Gastrodon_EastSeaLocation_DP);
MarkG4AltFormSlots(ref Pt_Slots, 422, 1, Shellos_EastSeaLocation_Pt);
MarkG4AltFormSlots(ref Pt_Slots, 423, 1, Gastrodon_EastSeaLocation_Pt);
MarkG4Slots(ref D_Slots);
MarkG4Slots(ref P_Slots);
MarkG4Slots(ref Pt_Slots);
@ -481,6 +509,8 @@ namespace PKHeX.Core
var REG_MN = getEncounterTables(GameVersion.MN);
var SOS_SN = getEncounterTables(Resources.encounter_sn_sos, "sm");
var SOS_MN = getEncounterTables(Resources.encounter_mn_sos, "sm");
MarkG7REGSlots(ref REG_SN);
MarkG7REGSlots(ref REG_MN);
MarkG7SMSlots(ref SOS_SN);
MarkG7SMSlots(ref SOS_MN);
SlotsSN = addExtraTableSlots(REG_SN, SOS_SN).Concat(Encounter_Pelago_SM).Concat(Encounter_Pelago_SN).ToArray();

View file

@ -511,7 +511,7 @@ namespace PKHeX.Core
020, 021, 022, 023, 024, 025, 026, 027, 028, 029, 030, 031, 032, 033, 034, 035, 036, 037, 038, 039,
040, 041, 042, 043, 044, 045, 046, 047, 048, 049, 050, 051, 052, 053, 054, 055, 056, 057, 058, 059,
060, 061, 062, 063, 065, 066, 067, 068, 069, 070, 071, 072, 073, 074, 075, 076, 077, 078, 079, 080,
081, 082, 083, 084, 085, 086, 087,
081, 082, 083, 085, 086, 087,
};
internal static readonly int[] ValidMet_FRLG =
{

View file

@ -538,6 +538,35 @@ namespace PKHeX.Core
}).ToArray()
};
private static readonly int[] Shellos_EastSeaLocation_DP = new[]
{
28, // Route 213
34, // Route 224
};
private static readonly int[] Shellos_EastSeaLocation_Pt = new[]
{
11, // Pastoria City
27, // Route 212
28, // Route 213
};
private static readonly int[] Gastrodon_EastSeaLocation_DP = new[]
{
37, // Route 222
39, // Route 224
45, // Route 230
};
private static readonly int[] Gastrodon_EastSeaLocation_Pt = new[]
{
11, // Pastoria City
27, // Route 212
28, // Route 213
39, // Route 224
45, // Route 230
};
private static readonly int[] HoneyTreesLocation = new[]
{
20, // Route 205