private string GetStringFirstLine(string form) { string specForm = Strings.Species[Species]; if (!string.IsNullOrWhiteSpace(form)) { specForm += $"-{form.Replace("Mega ", "Mega-")}"; } string result = Nickname != null && PKX.GetSpeciesNameGeneration(Species, LanguageID, Format) != Nickname ? $"{Nickname} ({specForm})" : specForm; if (!string.IsNullOrEmpty(Gender)) { result += $" ({Gender})"; } if (HeldItem > 0) { var items = Strings.GetItemStrings(Format); if (HeldItem < items.Count) { result += $" @ {items[HeldItem]}"; } } return(result); }
public PKM ConvertToPKM(ITrainerInfo SAV, EncounterCriteria criteria) { int gen = Version.GetGeneration(); if (gen < 2) { gen = 2; Version = GameVersion.C; } var pk = PKMConverter.GetBlank(gen, Version); SAV.ApplyToPKM(pk); pk.Species = Species; pk.Nickname = PKX.GetSpeciesNameGeneration(Species, SAV.Language, gen); pk.CurrentLevel = Level; pk.Version = (int)Version; pk.Ball = 4; int[] moves = GetCurrentEggMoves(pk); pk.Moves = moves; pk.SetMaximumPPCurrent(moves); pk.OT_Friendship = pk.PersonalInfo.BaseFriendship; pk.SetRandomIVs(flawless: 3); if (pk.Format <= 2 && Version != GameVersion.C) { return(pk); } SetMetData(pk); if (pk.Format < 3) { return(pk); } SetNatureGenderAbility(pk, criteria); if (pk.GenNumber >= 4) { pk.SetEggMetData(Version, (GameVersion)SAV.Game); } if (pk.Format < 6) { return(pk); } if (pk.Gen6) { pk.SetHatchMemory6(); } SetAltForm(pk, SAV); pk.SetRandomEC(); pk.RelearnMoves = moves; return(pk); }
private bool VerifyUnNicknamedEncounter(LegalityAnalysis data, PKM pkm, string nickname) { if (pkm.IsNicknamed) { for (int i = 0; i < PKX.SpeciesLang.Length; i++) { if (!PKX.SpeciesDict[i].TryGetValue(nickname, out int index)) { continue; } var msg = index == pkm.Species && i != pkm.Language ? V15 : V16; data.AddLine(Get(msg, Severity.Fishy)); return(true); } if (StringConverter.HasEastAsianScriptCharacters(nickname)) // East Asian Scripts { data.AddLine(GetInvalid(V222)); return(true); } data.AddLine(GetValid(V17)); } else if (pkm.Format < 3) { // pk1/pk2 IsNicknamed getter checks for match, logic should only reach here if matches. data.AddLine(GetValid(V18)); } else { var EncounterMatch = data.EncounterMatch; // Can't have another language name if it hasn't evolved or wasn't a language-traded egg. bool evolved = EncounterMatch.Species != pkm.Species; bool match = PKX.GetSpeciesNameGeneration(pkm.Species, pkm.Language, pkm.Format) == nickname; if (pkm.WasTradedEgg || evolved) { match |= !PKX.IsNicknamedAnyLanguage(pkm.Species, nickname, pkm.Format); } if (!match && pkm.Format == 5 && !pkm.IsNative) // transfer { if (evolved) { match |= !PKX.IsNicknamedAnyLanguage(pkm.Species, nickname, 4); } else { match |= PKX.GetSpeciesNameGeneration(pkm.Species, pkm.Language, 4) == nickname; } } if (!match) { if (EncounterMatch is WC7 wc7 && wc7.IsAshGreninjaWC7(pkm)) { data.AddLine(GetValid(V19)); } else { data.AddLine(GetInvalid(V20)); } }
public PKM ConvertToPKM(ITrainerInfo SAV, EncounterCriteria criteria) { int gen = Version.GetGeneration(); var version = Version; if (gen < 2) { gen = 2; version = GameVersion.C; } var pk = PKMConverter.GetBlank(gen, version); SAV.ApplyToPKM(pk); pk.Species = Species; pk.Nickname = PKX.GetSpeciesNameGeneration(Species, SAV.Language, gen); pk.CurrentLevel = Level; pk.Version = (int)version; pk.Ball = 4; pk.OT_Friendship = pk.PersonalInfo.BaseFriendship; int[] moves = SetEncounterMoves(pk, version); SetPINGA(pk, criteria); if (pk.Format <= 2 && version != GameVersion.C) { return(pk); } SetMetData(pk); if (pk.Format < 3) { return(pk); } if (pk.GenNumber >= 4) { pk.SetEggMetData(version, (GameVersion)SAV.Game); } if (pk.Format < 6) { return(pk); } if (pk.Format == 6) { pk.SetHatchMemory6(); } SetAltForm(pk, SAV); pk.SetRandomEC(); pk.RelearnMoves = moves; return(pk); }
/// <summary> /// Clears the <see cref="PKM.Nickname"/> to the default value. /// </summary> /// <param name="pk"></param> public static void ClearNickname(this PKM pk) { pk.IsNicknamed = false; pk.Nickname = PKX.GetSpeciesNameGeneration(pk.Species, pk.Language, pk.Format); if (pk is _K12 pk12) { pk12.SetNotNicknamed(); } }
/// <summary> /// Force hatches a PKM by applying the current species name and a valid Met Location from the origin game. /// </summary> /// <param name="pkm">PKM to apply hatch details to</param> /// <remarks> /// <see cref="PKM.IsEgg"/> is not checked; can be abused to re-hatch already hatched <see cref="PKM"/> inputs. /// <see cref="PKM.MetDate"/> is not modified; must be updated manually if desired. /// </remarks> private static void ForceHatchPKM(PKM pkm) { pkm.IsEgg = false; pkm.Nickname = PKX.GetSpeciesNameGeneration(pkm.Species, pkm.Language, pkm.Format); var loc = EncounterSuggestion.GetSuggestedEggMetLocation(pkm); if (loc >= 0) { pkm.Met_Location = loc; } }
/// <summary> /// Clears the <see cref="PKM.Nickname"/> to the default value. /// </summary> /// <param name="pk"></param> public static string ClearNickname(this PKM pk) { pk.IsNicknamed = false; string nick = PKX.GetSpeciesNameGeneration(pk.Species, pk.Language, pk.Format); pk.Nickname = nick; if (pk is _K12 pk12) { pk12.SetNotNicknamed(); } return(nick); }
private string GetSpeciesNickname(string specForm) { if (Nickname == null) { return(specForm); } var name = PKX.GetSpeciesNameGeneration(Species, LanguageID, Format); if (name == Nickname) { return(specForm); } return($"{Nickname} ({specForm})"); }
/// <summary> /// Sets the <see cref="PKM"/> property to a non-specific smart value. /// </summary> /// <param name="pkm">Pokémon to modify.</param> /// <param name="cmd">Modification</param> private static bool SetComplexProperty(PKM pkm, StringInstruction cmd) { if (cmd.PropertyName == nameof(pkm.MetDate)) { pkm.MetDate = DateTime.ParseExact(cmd.PropertyValue, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None); } else if (cmd.PropertyName == nameof(pkm.EggMetDate)) { pkm.EggMetDate = DateTime.ParseExact(cmd.PropertyValue, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None); } else if (cmd.PropertyName == nameof(pkm.EncryptionConstant) && cmd.PropertyValue == CONST_RAND) { pkm.EncryptionConstant = Util.Rand32(); } else if ((cmd.PropertyName == nameof(pkm.Ability) || cmd.PropertyName == nameof(pkm.AbilityNumber)) && cmd.PropertyValue.StartsWith("$")) { pkm.RefreshAbility(Convert.ToInt16(cmd.PropertyValue[1]) - 0x30); } else if (cmd.PropertyName == nameof(pkm.PID) && cmd.PropertyValue == CONST_RAND) { pkm.SetPIDGender(pkm.Gender); } else if (cmd.PropertyName == nameof(pkm.EncryptionConstant) && cmd.PropertyValue == nameof(pkm.PID)) { pkm.EncryptionConstant = pkm.PID; } else if (cmd.PropertyName == nameof(pkm.PID) && cmd.PropertyValue == CONST_SHINY) { pkm.SetShinyPID(); } else if (cmd.PropertyName == nameof(pkm.Species) && cmd.PropertyValue == "0") { pkm.Data = new byte[pkm.Data.Length]; } else if (cmd.PropertyName.StartsWith("IV") && cmd.PropertyValue == CONST_RAND) { SetRandomIVs(pkm, cmd); } else if (cmd.PropertyName == nameof(pkm.IsNicknamed) && string.Equals(cmd.PropertyValue, "false", StringComparison.OrdinalIgnoreCase)) { pkm.IsNicknamed = false; pkm.Nickname = PKX.GetSpeciesNameGeneration(pkm.Species, pkm.Language, pkm.Format); } else { return(false); } return(true); }
/// <summary> /// Sets the <see cref="PKM.Nickname"/> to the provided value. /// </summary> /// <param name="pk">Pokémon to modify.</param> /// <param name="nick"><see cref="PKM.Nickname"/> to set. If no nickname is provided, the <see cref="PKM.Nickname"/> is set to the default value for its current language and format.</param> public static void SetNickname(this PKM pk, string nick = null) { if (nick != null) { pk.IsNicknamed = true; pk.Nickname = nick; } else { pk.IsNicknamed = false; pk.Nickname = PKX.GetSpeciesNameGeneration(pk.Species, pk.Language, pk.Format); if (pk is _K12 pk12) { pk12.SetNotNicknamed(); } } }
private void VerifyNicknameEgg(LegalityAnalysis data) { var Info = data.Info; var pkm = data.pkm; var EncounterMatch = Info.EncounterMatch; switch (pkm.Format) { case 4: if (pkm.IsNicknamed) // gen4 doesn't use the nickname flag for eggs { data.AddLine(GetInvalid(LNickFlagEggNo, CheckIdentifier.Egg)); } break; case 7: if (EncounterMatch is EncounterStatic ^ !pkm.IsNicknamed) // gen7 doesn't use for ingame gifts { data.AddLine(GetInvalid(pkm.IsNicknamed ? LNickFlagEggNo : LNickFlagEggYes, CheckIdentifier.Egg)); } break; default: if (!pkm.IsNicknamed) { data.AddLine(GetInvalid(LNickFlagEggYes, CheckIdentifier.Egg)); } break; } if (pkm.Format == 2 && pkm.IsEgg && !PKX.IsNicknamedAnyLanguage(0, pkm.Nickname, 2)) { data.AddLine(GetValid(LNickMatchLanguageEgg, CheckIdentifier.Egg)); } else if (PKX.GetSpeciesNameGeneration(0, pkm.Language, Info.Generation) != pkm.Nickname) { data.AddLine(GetInvalid(LNickMatchLanguageEggFail, CheckIdentifier.Egg)); } else { data.AddLine(GetValid(LNickMatchLanguageEgg, CheckIdentifier.Egg)); } }
private string GetStringFirstLine(string form) { string specForm = species[Species]; if (!string.IsNullOrWhiteSpace(form)) { specForm += $"-{form.Replace("Mega ", "Mega-")}"; } string result = Nickname != null && PKX.GetSpeciesNameGeneration(Species, LanguageID, Format) != Nickname ? $"{Nickname} ({specForm})" : specForm; if (!string.IsNullOrEmpty(Gender)) { result += $" ({Gender})"; } if (HeldItem > 0) { switch (Format) { case 2: if (HeldItem < g2items.Length) { result += $" @ {g2items[HeldItem]}"; } break; case 3: if (HeldItem < g3items.Length) { result += $" @ {g3items[HeldItem]}"; } break; default: if (HeldItem < items.Length) { result += $" @ {items[HeldItem]}"; } break; } } return(result); }
private bool IsNicknameValid(PKM pkm, IEncounterable EncounterMatch, string nickname) { if (PKX.GetSpeciesNameGeneration(pkm.Species, pkm.Language, pkm.Format) == nickname) { return(true); } // Can't have another language name if it hasn't evolved or wasn't a language-traded egg. bool evolved = EncounterMatch.Species != pkm.Species; bool canHaveAnyLanguage = evolved || pkm.WasTradedEgg; if (canHaveAnyLanguage && !PKX.IsNicknamedAnyLanguage(pkm.Species, nickname, pkm.Format)) { return(true); } switch (EncounterMatch) { case WC7 wc7 when wc7.IsAshGreninjaWC7(pkm): return(true); case ILangNick loc: if (loc.Language != 0 && !loc.IsNicknamed && !PKX.IsNicknamedAnyLanguage(pkm.Species, nickname, pkm.Format)) { return(true); // fixed language without nickname, nice job event maker! } break; } if (pkm.Format == 5 && !pkm.IsNative) // transfer { if (canHaveAnyLanguage) { return(!PKX.IsNicknamedAnyLanguage(pkm.Species, nickname, 4)); } return(PKX.GetSpeciesNameGeneration(pkm.Species, pkm.Language, 4) == nickname); } return(false); }
public PKM ConvertToPKM(ITrainerInfo SAV) { int gen = Math.Max(2, Version.GetGeneration()); var pk = PKMConverter.GetBlank(gen); SAV.ApplyToPKM(pk); pk.Species = Species; pk.Nickname = PKX.GetSpeciesNameGeneration(Species, SAV.Language, gen); pk.CurrentLevel = Level; pk.Version = (int)Version; var moves = Legal.GetEggMoves(pk, Species, pk.AltForm, Version); if (moves.Length == 0) { moves = Legal.GetEncounterMoves(pk, Level, Version); } pk.Moves = moves; pk.SetMaximumPPCurrent(moves); pk.OT_Friendship = pk.PersonalInfo.BaseFriendship; pk.SetRandomIVs(flawless: 3); if (pk.Format <= 2 && Version != GameVersion.C) { return(pk); } pk.Met_Level = EncounterSuggestion.GetSuggestedEncounterEggMetLevel(pk); pk.Met_Location = Math.Max(0, EncounterSuggestion.GetSuggestedEggMetLocation(pk)); if (pk.Format < 3) { return(pk); } pk.Ball = 4; int gender = Util.Rand.Next(2); int nature = Util.Rand.Next(25); gender = pk.GetSaneGender(gender); if (pk.Format <= 5) { pk.SetPIDGender(gender); pk.SetPIDNature(nature); pk.RefreshAbility(pk.PIDAbility); } else { pk.PID = Util.Rand32(); pk.Nature = nature; pk.Gender = gender; pk.RefreshAbility(Util.Rand.Next(2)); } bool traded = (int)Version == SAV.Game; var today = pk.MetDate = DateTime.Today; if (pk.GenNumber >= 4) { pk.Egg_Location = EncounterSuggestion.GetSuggestedEncounterEggLocationEgg(pk, traded); pk.EggMetDate = today; } if (pk.Format < 6) { return(pk); } if (pk.Gen6) { pk.SetHatchMemory6(); } pk.SetRandomEC(); pk.RelearnMoves = moves; return(pk); }
public PKM ConvertToPKM(ITrainerInfo SAV) { int gen = Version.GetGeneration(); if (gen < 2) { gen = 2; Version = GameVersion.C; } var pk = PKMConverter.GetBlank(gen); SAV.ApplyToPKM(pk); pk.Species = Species; pk.Nickname = PKX.GetSpeciesNameGeneration(Species, SAV.Language, gen); pk.CurrentLevel = Level; pk.Version = (int)Version; int[] moves = GetCurrentEggMoves(pk); pk.Moves = moves; pk.SetMaximumPPCurrent(moves); pk.OT_Friendship = pk.PersonalInfo.BaseFriendship; pk.SetRandomIVs(flawless: 3); if (pk.Format <= 2 && Version != GameVersion.C) { return(pk); } pk.Met_Level = EncounterSuggestion.GetSuggestedEncounterEggMetLevel(pk); pk.Met_Location = Math.Max(0, EncounterSuggestion.GetSuggestedEggMetLocation(pk)); if (pk.Format < 3) { return(pk); } pk.Ball = 4; int gender = pk.PersonalInfo.RandomGender; int nature = Util.Rand.Next(25); if (pk.Format <= 5) { pk.SetPIDGender(gender); pk.Gender = gender; pk.SetPIDNature(nature); pk.Nature = nature; pk.RefreshAbility(pk.PIDAbility); } else { pk.PID = Util.Rand32(); pk.Nature = nature; pk.Gender = gender; pk.RefreshAbility(Util.Rand.Next(2)); } bool traded = (int)Version == SAV.Game; var today = pk.MetDate = DateTime.Today; if (pk.GenNumber >= 4) { pk.Egg_Location = EncounterSuggestion.GetSuggestedEncounterEggLocationEgg(pk, traded); pk.EggMetDate = today; } if (pk.Format < 6) { return(pk); } if (pk.Gen6) { pk.SetHatchMemory6(); } switch (Species) { case 774: // Minior pk.AltForm = Util.Rand.Next(7, 14); break; case 664: // Scatterbug pk.AltForm = Legal.GetVivillonPattern(SAV.Country, SAV.SubRegion); break; } pk.SetRandomEC(); pk.RelearnMoves = moves; return(pk); }
public static PKM ConvertToType(PKM pk, Type PKMType, out string comment) { if (pk == null || pk.Species == 0) { comment = "Null input. Aborting."; return(null); } Type fromType = pk.GetType(); int fromFormat = int.Parse(fromType.Name.Last().ToString()); int toFormat = int.Parse(PKMType.Name.Last().ToString()); Debug.WriteLine($"Trying to convert {fromType.Name} to {PKMType.Name}."); PKM pkm = null; if (fromType == PKMType) { comment = "No need to convert, current format matches requested format."; return(pk); } if (fromFormat <= toFormat || fromFormat == 2) { pkm = pk.Clone(); if (pkm.IsEgg) // force hatch { pkm.IsEgg = false; if (pkm.AO) { pkm.Met_Location = 318; // Battle Resort } else if (pkm.XY) { pkm.Met_Location = 38; // Route 7 } else if (pkm.Gen5) { pkm.Met_Location = 16; // Route 16 } else { pkm.Met_Location = 30001; // Pokétransfer } pkm.IsNicknamed = false; pkm.Nickname = PKX.GetSpeciesNameGeneration(pkm.Species, pkm.Language, fromFormat); } switch (fromType.Name) { case nameof(PK1): if (toFormat == 2) { pkm = PKMType == typeof(PK2) ? ((PK1)pk).ConvertToPK2() : null; break; } if (toFormat == 7) { pkm = ((PK1)pk).ConvertToPK7(); } break; case nameof(PK2): if (PKMType == typeof(PK1)) { if (pk.Species > 151) { comment = $"Cannot convert a {PKX.GetSpeciesName(pkm.Species, ((PK2)pkm).Japanese ? 1 : 2)} to {PKMType.Name}"; return(null); } pkm = ((PK2)pk).ConvertToPK1(); pkm.ClearInvalidMoves(); } else { pkm = null; } break; case nameof(CK3): case nameof(XK3): // interconverting C/XD needs to visit main series format // ends up stripping purification/shadow etc stats pkm = pkm.ConvertToPK3(); goto case nameof(PK3); // fall through case nameof(PK3): if (toFormat == 3) // Gen3 Inter-trading { switch (PKMType.Name) { case nameof(CK3): pkm = pkm.ConvertToCK3(); break; case nameof(XK3): pkm = pkm.ConvertToXK3(); break; case nameof(PK3): pkm = pkm.ConvertToPK3(); break; // already converted, instantly returns default: throw new FormatException(); } break; } if (fromType.Name != nameof(PK3)) { pkm = pkm.ConvertToPK3(); } pkm = ((PK3)pkm).ConvertToPK4(); if (toFormat == 4) { break; } goto case nameof(PK4); case nameof(BK4): pkm = ((BK4)pkm).ConvertToPK4(); if (toFormat == 4) { break; } goto case nameof(PK4); case nameof(PK4): if (PKMType == typeof(BK4)) { pkm = ((PK4)pkm).ConvertToBK4(); break; } if (pkm.Species == 172 && pkm.AltForm != 0) { comment = "Cannot transfer Spiky-Eared Pichu forward."; return(null); } pkm = ((PK4)pkm).ConvertToPK5(); if (toFormat == 5) { break; } goto case nameof(PK5); case nameof(PK5): pkm = ((PK5)pkm).ConvertToPK6(); if (toFormat == 6) { break; } goto case nameof(PK6); case nameof(PK6): if (pkm.Species == 25 && pkm.AltForm != 0) // cosplay pikachu { comment = "Cannot transfer Cosplay Pikachu forward."; return(null); } pkm = ((PK6)pkm).ConvertToPK7(); if (toFormat == 7) { break; } goto case nameof(PK7); case nameof(PK7): break; } } comment = pkm == null ? $"Cannot convert a {fromType.Name} to a {PKMType.Name}." : $"Converted from {fromType.Name} to {PKMType.Name}."; return(pkm); }