/// <summary> /// Returns the name's character values as array. /// </summary> /// <param name="Name">Trainer name.</param> /// <param name="Korean">Use Korean character encoding.</param> /// <returns></returns> private static byte[] GetBytes(string Name, bool Korean) { byte[] chars = new byte[Korean ? Name.Length * 2 : Name.Length]; if (Korean) { for (int x = 0; x < Name.Length; x++) { if (Table_KO.TryGetValue(Name[x].ToString(), out ushort b)) { chars[x * 2] = (byte)(b >> 8); chars[x * 2 + 1] = (byte)(b & 0xFF); } } } else { for (int x = 0; x < Name.Length; x++) { if (Table.TryGetValue(Name[x].ToString(), out byte b)) { chars[x] = b; } } } return(chars); }
/// <summary> /// Calculates and returns the password to reset the clock. /// </summary> /// <param name="Name">Trainer name.</param> /// <param name="TID">Trainer ID.</param> /// <param name="Money">Amount of money the player is currently carrying.</param> /// <param name="Korean">Use Korean character encoding.</param> /// <returns></returns> public static ushort GetPassword(string Name, int TID, int Money, bool Korean = false) { if (Korean) { foreach (char c in Name) { if (!Table_KO.ContainsKey(c.ToString())) { throw new ArgumentOutOfRangeException("Name", c.ToString(), "Unexpected character."); } } } else { foreach (char c in Name) { if (!Table.ContainsKey(c.ToString())) { throw new ArgumentOutOfRangeException("Name", c.ToString(), "Unexpected character."); } } } if (TID < 0 || TID > 65535) { throw new ArgumentOutOfRangeException("TID", TID, "Expected a value between 0 and 65535."); } if (Money < 0 || Money > 999999) { throw new ArgumentOutOfRangeException("Money", Money, "Expected a value between 0 and 999999."); } ; ushort pass = 0; byte[] nameBytes = GetBytes(Name, Korean); for (int x = 0; x < nameBytes.Length && x < 5; x++) // only the first 5 characters are taken into account { pass += nameBytes[x]; } pass += (ushort)((TID >> 8) + (TID & 0xFF) + ((Money >> 16) & 0xFF) + ((Money >> 8) & 0xFF) + (Money & 0xFF)); return(pass); }