PKHeX/PKHeX.Core/Saves/Substructures/Gen7/GP1.cs
Kurt 383d4b7700 "" -> string.Empty
be explicit that the string is empty rather than possibly missing
disallow encrypted export for BK4 (they're not encrypted), removes type
check
simplify replaceall in showdownset (don't call ReplaceAll 4x, just get
valid chars and rebuild)
simplify get ribbon sprite name (precompute ToLower and appended values
2019-02-07 21:40:20 -08:00

178 lines
No EOL
6.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
namespace PKHeX.Core
{
/// <summary>
/// Go Park Entity transferred to <see cref="GameVersion.GG"/>.
/// </summary>
public class GP1
{
public const int SIZE = 0x1B0;
public byte[] Data { get; }
public GP1() => Data = (byte[])Blank.Clone();
public void WriteTo(byte[] data, int offset) => Data.CopyTo(data, offset);
public GP1(byte[] data) => Data = data;
public static GP1 FromData(byte[] data, int offset)
{
var gpkm = new GP1();
Array.Copy(data, offset, gpkm.Data, 0, SIZE);
return gpkm;
}
private static readonly byte[] Blank20 =
{
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0x3F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x80, 0x3F,
0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x85, 0xEC, 0x33, 0x01,
};
public static readonly byte[] Blank = GetBlank();
public static byte[] GetBlank()
{
byte[] data = new byte[SIZE];
Blank20.CopyTo(data, 0x20);
return data;
}
public string Username1 => Util.TrimFromZero(Encoding.ASCII.GetString(Data, 0x00, 0x10));
public string Username2 => Util.TrimFromZero(Encoding.ASCII.GetString(Data, 0x10, 0x20));
public int Species => BitConverter.ToInt32(Data, 0x28);
public int CP => BitConverter.ToInt32(Data, 0x2C);
public float LevelF => BitConverter.ToSingle(Data, 0x30);
public int Level => Math.Max(1, (int)Math.Round(LevelF));
public float HeightF => BitConverter.ToSingle(Data, 0x48);
public float WeightF => BitConverter.ToSingle(Data, 0x4C);
public byte HeightScalar
{
get
{
var height = HeightF * 100f;
var pi = PersonalTable.GG.GetFormeEntry(Species, AltForm);
var avgHeight = pi.Height;
return PB7.GetHeightScalar(height, avgHeight);
}
}
public byte WeightScalar
{
get
{
var height = HeightF * 100f;
var weight = WeightF * 10f;
var pi = PersonalTable.GG.GetFormeEntry(Species, AltForm);
var avgHeight = pi.Height;
var avgWeight = pi.Weight;
return PB7.GetWeightScalar(height, weight, avgHeight, avgWeight);
}
}
public int IV1 => BitConverter.ToInt32(Data, 0x50);
public int IV2 => BitConverter.ToInt32(Data, 0x54);
public int IV3 => BitConverter.ToInt32(Data, 0x58);
public int Date => BitConverter.ToInt32(Data, 0x5C); // ####.##.## YYYY.MM.DD
public int Year => Date / 1_00_00;
public int Month => (Date / 1_00) % 1_00;
public int Day => Date % 1_00;
public int Gender => Data[0x70] - 1; // M=1, F=2, G=3 ;; shift down by 1.
public int AltForm => Data[0x72];
public bool IsShiny => Data[0x73] == 1;
// https://bulbapedia.bulbagarden.net/wiki/List_of_moves_in_Pok%C3%A9mon_GO
public int Move1 => BitConverter.ToInt32(Data, 0x74); // uses Go Indexes
public int Move2 => BitConverter.ToInt32(Data, 0x78); // uses Go Indexes
public string GeoCityName => Util.TrimFromZero(Encoding.ASCII.GetString(Data, 0x7C, 0x60)); // dunno length
public string Nickname => Util.TrimFromZero(Encoding.ASCII.GetString(Data, 0x12D, 0x20)); // dunno length
public static readonly IReadOnlyList<string> Genders = GameInfo.GenderSymbolASCII;
public string GenderString => (uint) Gender >= Genders.Count ? string.Empty : Genders[Gender];
public string ShinyString => IsShiny ? "★ " : string.Empty;
public string FormString => AltForm != 0 ? $"-{AltForm}" : string.Empty;
private string NickStr => string.IsNullOrWhiteSpace(Nickname) ? PKX.GetSpeciesNameGeneration(Species, (int)LanguageID.English, 7) : Nickname;
public string FileName => $"{FileNameWithoutExtension}.gp1";
public string FileNameWithoutExtension
{
get
{
string form = AltForm > 0 ? $"-{AltForm:00}" : string.Empty;
string star = IsShiny ? " ★" : string.Empty;
return $"{Species:000}{form}{star} - {NickStr} - lv{Level} - {IV1:00}.{IV2:00}.{IV3:00}, Move1 {Move1}, Move2 {Move2} (CP {CP})";
}
}
public string GeoTime => $"Captured in {GeoCityName} by {Username1} on {Year}/{Month}/{Day}";
public string StatMove => $"{IV1:00}/{IV2:00}/{IV3:00}, Move1 {Move1}, Move2 {Move2}, CP={CP}";
public string Dump(IReadOnlyList<string> speciesNames, int index) => $"{index:000} {Nickname} ({speciesNames[Species]}{FormString} {ShinyString}[{GenderString}]) @ lv{Level} - {StatMove}, {GeoTime}.";
public PB7 ConvertToPB7(ITrainerInfo sav)
{
var pk = new PB7
{
Version = (int) GameVersion.GO,
Species = Species,
AltForm = AltForm,
Gender = Gender,
Met_Location = 50, // Go complex
Met_Year = Year - 2000,
Met_Month = Month,
Met_Day = Day,
CurrentLevel = Level,
Met_Level = Level,
TID = sav.TID,
SID = sav.SID,
OT_Name = sav.OT,
Ball = 4,
Language = sav.Language,
Nature = Util.Rand.Next(25),
PID = Util.Rand32(),
};
var nick = Nickname;
if (!string.IsNullOrWhiteSpace(nick))
{
pk.Nickname = nick;
pk.IsNicknamed = true;
}
else
{
pk.Nickname = PKX.GetSpeciesNameGeneration(Species, sav.Language, 7);
}
pk.IV_DEF = pk.IV_SPD = (IV3 * 2) + 1;
pk.IV_ATK = pk.IV_SPA = (IV2 * 2) + 1;
pk.IV_HP = (IV1 * 2) + 1;
pk.IV_SPE = Util.Rand.Next(32);
pk.RefreshAbility(Util.Rand.Next(2));
if (IsShiny)
pk.SetShiny();
var moves = MoveLevelUp.GetEncounterMoves(pk, Level, GameVersion.GO);
pk.Moves = moves;
pk.SetMaximumPPCurrent(moves);
pk.OT_Friendship = pk.PersonalInfo.BaseFriendship;
pk.HeightScalar = HeightScalar;
pk.WeightScalar = WeightScalar;
pk.AwakeningSetAllTo(2);
pk.ResetCalculatedValues();
pk.SetRandomEC();
return pk;
}
}
}