WIP PK1 -> PK7 Transfers.

Still needs language/3ds country region
and memories, because I'm not sure how
to do those in the void of a save file
context.
This commit is contained in:
Michael Scire 2017-01-25 03:29:38 -08:00
parent 038fe4c3fc
commit 792f7ce04c
11 changed files with 132 additions and 28 deletions

View File

@ -267,6 +267,7 @@ public string[] getItemStrings(int generation, GameVersion game)
public static List<ComboItem> MoveDataSource, ItemDataSource, SpeciesDataSource, BallDataSource, NatureDataSource, AbilityDataSource, VersionDataSource;
public static List<ComboItem> HaXMoveDataSource;
private static List<ComboItem> metGen2, metGen3, metGen3CXD, metGen4, metGen5, metGen6, metGen7;
public static void InitializeDataSources(GameStrings s)
{
int[] ball_nums = { 007, 576, 013, 492, 497, 014, 495, 493, 496, 494, 011, 498, 008, 006, 012, 015, 009, 005, 499, 010, 001, 016, 851 };
@ -275,7 +276,7 @@ public static void InitializeDataSources(GameStrings s)
SpeciesDataSource = Util.getCBList(s.specieslist, null);
NatureDataSource = Util.getCBList(s.natures, null);
AbilityDataSource = Util.getCBList(s.abilitylist, null);
VersionDataSource = Util.getCBList(s.gamelist, Legal.Games_7sm, Legal.Games_6oras, Legal.Games_6xy, Legal.Games_5, Legal.Games_4, Legal.Games_4e, Legal.Games_4r, Legal.Games_3, Legal.Games_3e, Legal.Games_3r, Legal.Games_3s);
VersionDataSource = Util.getCBList(s.gamelist, Legal.Games_7vc, Legal.Games_7go, Legal.Games_7sm, Legal.Games_6oras, Legal.Games_6xy, Legal.Games_5, Legal.Games_4, Legal.Games_4e, Legal.Games_4r, Legal.Games_3, Legal.Games_3e, Legal.Games_3r, Legal.Games_3s);
HaXMoveDataSource = Util.getCBList(s.movelist, null);
MoveDataSource = HaXMoveDataSource.Where(m => !Legal.Z_Moves.Contains(m.Value)).ToList();
@ -415,6 +416,10 @@ public static List<ComboItem> getLocationList(GameVersion Version, int SaveForma
case GameVersion.SN:
case GameVersion.MN:
case GameVersion.RD:
case GameVersion.BU:
case GameVersion.YW:
case GameVersion.GN:
return metGen7.Take(3).Concat(metGen7.Skip(3).OrderByDescending(loc => loc.Value < 200)).ToList(); // Secret Base
}

View File

@ -12,7 +12,14 @@ public static GameVersion getMetLocationVersionGroup(GameVersion Version)
case GameVersion.CXD:
return GameVersion.CXD;
case GameVersion.GO:
return GameVersion.GO;
case GameVersion.RBY:
case GameVersion.RD:
case GameVersion.BU:
case GameVersion.YW:
case GameVersion.GN:
return GameVersion.RBY;
case GameVersion.GS:

View File

@ -21,6 +21,8 @@ public enum GameVersion
/*Gen5*/ W = 20, B = 21, W2 = 22, B2 = 23,
/*Gen6*/ X = 24, Y = 25, AS = 26, OR = 27,
/*Gen7*/ SN = 30, MN = 31,
/* GO */ GO = 34,
/* VC */ RD = 35, BU = 36, GN = 37, YW = 38,
// Game Groupings (SaveFile type)
RBY = 98,

View File

@ -215,6 +215,8 @@ public static partial class Legal
#region Games
public static readonly int[] Games_7vc = { 35, 36, 37, 38 };
public static readonly int[] Games_7go = { 34 };
public static readonly int[] Games_7sm = { 30, 31 };
public static readonly int[] Games_6xy = { 24, 25 };
public static readonly int[] Games_6oras = { 26, 27 };

View File

@ -111,6 +111,16 @@ public override bool IsNicknamed
set { }
}
public bool IsNicknamedBank
{
get
{
var spName = PKX.getSpeciesName(Species, Japanese ? 1 : 2).ToUpper();
spName = spName.Replace(" ", ""); // Gen I/II didn't have a space for Mr. Mime
return Nickname != spName;
}
}
public void setNotNicknamed()
{
string spName = PKX.getSpeciesName(Species, Japanese ? 1 : 2).ToUpper();
@ -299,6 +309,78 @@ public PK2 convertToPK2()
return pk2;
}
public PK7 convertToPK7()
{
var pk7 = new PK7
{
EncryptionConstant = Util.rnd32(),
Species = Species,
TID = TID,
EXP = EXP,
CurrentLevel = CurrentLevel,
Met_Level = CurrentLevel,
Nature = (int) (EXP%25),
PID = Util.rnd32(),
AbilityNumber = 4,
Ball = 4,
MetDate = DateTime.Now,
Version = (int)GameVersion.RD, // Default to red, for now?
Move1 = Move1,
Move2 = Move2,
Move3 = Move3,
Move4 = Move4,
Move1_PPUps = Move1_PPUps,
Move2_PPUps = Move2_PPUps,
Move3_PPUps = Move3_PPUps,
Move4_PPUps = Move4_PPUps,
Move1_PP = Move1_PP,
Move2_PP = Move2_PP,
Move3_PP = Move3_PP,
Move4_PP = Move4_PP,
CurrentFriendship = PersonalTable.SM[Species].BaseFriendship,
Met_Location = 30013, // "Kanto region", hardcoded.
Gender = PersonalTable.SM[Species].RandomGender,
OT_Name = PKX.getG1ConvertedString(otname, Japanese),
Nickname = Util.getSpeciesList(Japanese ? "jp" : "en")[Species],
IsNicknamed = false
};
// IVs
var new_ivs = new int[6];
for (var i = 0; i < new_ivs.Length; i++) new_ivs[i] = (int)(Util.rnd32() & 31);
for (var i = 0; i < (Species == 151 ? 5 : 3); i++) new_ivs[i] = 31;
Util.Shuffle(new_ivs);
pk7.IVs = new_ivs;
// Really? :(
if (IsShiny)
pk7.setShinyPID();
if (new[] {92, 93, 94, 151, 109, 110}.Contains(Species))
pk7.AbilityNumber = 1;
if (IsNicknamedBank)
{
pk7.IsNicknamed = true;
pk7.Nickname = PKX.getG1ConvertedString(nick, Japanese);
}
// TODO: Language, 3DS Country/Region Info, Memories (Link Trade/Somewhere, remembers feeling {rnd})
if (Species == 151) // Mew gets special treatment.
{
pk7.FatefulEncounter = true;
pk7.AbilityNumber = 1;
pk7.Egg_Location = 0;
pk7.Nickname = Util.getSpeciesList(Japanese ? "jp" : "en")[Species];
pk7.IsNicknamed = false;
}
pk7.RefreshChecksum();
return pk7;
}
}
public class PokemonList1

View File

@ -620,26 +620,6 @@ public PKM convertToPK3()
return pk;
}
public PKM convertPK1toPK7()
{
if (Format != 1)
return null;
if (Species > 151)
return null;
var pk = new PK7();
TransferPropertiesWithReflection(this, pk);
pk.EVs = new int[6];
pk.Nature = IVs.Sum() % 25;
pk.IVs = new[] {31,31,31,31,31,31};
pk.RefreshChecksum();
if (!IsNicknamed)
pk.Nickname = Nickname.ToLower();
pk.Version = -1;
pk.Ability = PersonalTable.SM[Species].Abilities[0];
do PID = PKX.getRandomPID(Species, Gender, Version, Nature, AltForm, PID); while (!IsShiny);
return pk;
}
protected void TransferPropertiesWithReflection(PKM Source, PKM Destination)
{
var SourceProperties = ReflectUtil.getPropertiesCanWritePublic(Source.GetType());

View File

@ -160,7 +160,7 @@ public static PKM convertToFormat(PKM pk, Type PKMType, out string comment)
break;
}
if (toFormat == 7)
pkm = null; // pkm.convertPK1toPK7();
pkm = ((PK1) pk).convertToPK7();
break;
case nameof(PK2):
if (PKMType == typeof (PK1))

View File

@ -2408,6 +2408,14 @@ public static string getG1Str(byte[] strdata, bool jp)
.Aggregate("", (current, cur) => current + cur);
}
public static string getG1ConvertedString(byte[] strdata, bool jp)
{
var us_table = new ushort[] { 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0000, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x0028, 0x0029, 0x003A, 0x003B, 0x0028, 0x0029, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x00C4, 0x00D6, 0x00DC, 0x00E4, 0x00F6, 0x00FC, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0050, 0x004D, 0x002D, 0x0020, 0x0020, 0x003F, 0x0021, 0x002D, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0xE08E, 0x0020, 0x0078, 0x002E, 0x002F, 0x002C, 0xE08F, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020 };
var jp_table = new ushort[] { 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x30AC, 0x30AE, 0x30B0, 0x30B2, 0x30B4, 0x30B6, 0x30B8, 0x30BA, 0x30BC, 0x30BE, 0x30C0, 0x30C2, 0x30C5, 0x30C7, 0x30C9, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x30D0, 0x30D3, 0x30D6, 0x30DC, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x304C, 0x304E, 0x3050, 0x3052, 0x3054, 0x3056, 0x3058, 0x305A, 0x305C, 0x305E, 0x3060, 0x3062, 0x3065, 0x3067, 0x3069, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3070, 0x3073, 0x3076, 0x30D9, 0x307C, 0x3000, 0x30D1, 0x30D4, 0x30D7, 0x30DD, 0x3071, 0x3074, 0x3077, 0x30DA, 0x307D, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x0000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F2, 0x30F3, 0x30C3, 0x30E3, 0x30E5, 0x30E7, 0x30A3, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3072, 0x3075, 0x30D8, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x30EA, 0x308B, 0x308C, 0x308D, 0x308F, 0x3092, 0x3093, 0x3063, 0x3083, 0x3085, 0x3087, 0x30FC, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x30A1, 0x30A5, 0x30A7, 0x3000, 0x3000, 0x3000, 0x2642, 0x3000, 0x3000, 0x3000, 0x3000, 0x30A9, 0x2640, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000 };
var table = jp ? jp_table : us_table;
return Util.TrimFromZero(new string(strdata.Select(b => (char)table[b]).ToArray()));
}
public static byte[] setG1Str(string str, bool jp)
{
Dictionary<string, byte> dict = jp ? U2RBY_J : U2RBY_U;

View File

@ -29,4 +29,11 @@ OR
Sun
Moon
Moon
Go
Red
Blue
Green
Yellow

View File

@ -85,7 +85,7 @@ public SAV7(byte[] data = null)
public override int MaxItemID => 920;
public override int MaxAbilityID => 232;
public override int MaxBallID => 0x1A; // 26
public override int MaxGameID => 31; // MN
public override int MaxGameID => 38; // Yellow VC
public int QRSaveData;

View File

@ -205,12 +205,23 @@ public static List<ComboItem> getOffsetCBList(List<ComboItem> cbList, string[] i
Array.Copy(unsortedChoices, sortedChoices, unsortedChoices.Length);
Array.Sort(sortedChoices);
var indices = new Dictionary<string, int>();
foreach (var str in unsortedChoices.Where(str => !indices.ContainsKey(str)))
indices.Add(str, 0);
// Add the rest of the items
cbList.AddRange(sortedChoices.Select(s => new ComboItem
foreach (var s in sortedChoices)
{
Text = s,
Value = allowed[Array.IndexOf(unsortedChoices, s)]
}));
var index = Array.IndexOf(unsortedChoices, s, indices[s]);
cbList.Add(new ComboItem
{
Text = s,
Value = allowed[index]
});
indices[s] = index + 1;
}
return cbList;
}
public static List<ComboItem> getVariedCBList(string[] inStrings, int[] stringNum, int[] stringVal)