From 898d705a16bad075ab7841a8d162b4663ea2d8de Mon Sep 17 00:00:00 2001 From: Greg Edwards Date: Tue, 27 Sep 2022 01:36:13 -0400 Subject: [PATCH] FakeOpponentGenerator now works on Gen5 but has issues. --- gts/src/FakeOpponentGenerator.cs | 209 +++++++++++--------- gts/syachi2ds.ashx.cs | 8 +- library/Data/DataMysql.cs | 84 ++++---- library/Structures/BattleSubwayRecord5.cs | 80 +++++++- library/Structures/BattleTowerRecord4.cs | 82 +++++++- library/Structures/BattleTowerRecordBase.cs | 9 + 6 files changed, 320 insertions(+), 152 deletions(-) diff --git a/gts/src/FakeOpponentGenerator.cs b/gts/src/FakeOpponentGenerator.cs index 434b44ba..fcf0b28b 100644 --- a/gts/src/FakeOpponentGenerator.cs +++ b/gts/src/FakeOpponentGenerator.cs @@ -12,7 +12,8 @@ namespace PkmnFoundations.GTS /// public static class FakeOpponentGenerator { - const int FAKE_OPPONENTS_COUNT = 7; + const int FAKE_OPPONENTS_COUNT_4 = 7; + const int FAKE_OPPONENTS_COUNT_5 = 7; /// /// Randomly selects some fake opponents without repeats (if possible) @@ -21,9 +22,11 @@ namespace PkmnFoundations.GTS /// public static BattleTowerRecordBase[] GenerateFakeOpponents(FakeOpponentFactory factory, int count) { + int fakeOpponentsCount = (factory.Generation < Generations.Generation5) ? FAKE_OPPONENTS_COUNT_4 : FAKE_OPPONENTS_COUNT_5; + // todo: allow more with repeats - if (count > FAKE_OPPONENTS_COUNT) throw new ArgumentOutOfRangeException("count"); - List values = Enumerable.Range(0, FAKE_OPPONENTS_COUNT).ToList(); + if (count > fakeOpponentsCount) throw new ArgumentOutOfRangeException("count"); + List values = Enumerable.Range(0, fakeOpponentsCount).ToList(); BattleTowerRecordBase[] result = new BattleTowerRecordBase[count]; Random rand = new Random(); @@ -42,17 +45,15 @@ namespace PkmnFoundations.GTS public static BattleTowerRecordBase GenerateFakeOpponent(FakeOpponentFactory factory, Pokedex.Pokedex pokedex, int index) { - if (index >= FAKE_OPPONENTS_COUNT) throw new ArgumentOutOfRangeException("index"); - - BattleTowerRecord4 record = new BattleTowerRecord4(pokedex); - record.Party = new BattleTowerPokemon4[3]; - record.Unknown3 = 7983; + BattleTowerRecordBase record = factory.CreateRecord(pokedex); switch (index) { - case 0: default: - record.Party[0] = new BattleTowerPokemon4(pokedex, + throw new ArgumentOutOfRangeException("index"); + + case 0: + record.Party[0] = factory.CreatePokemon(pokedex, 9, // Blastoise 234, // Leftovers new ushort[] { @@ -65,10 +66,10 @@ namespace PkmnFoundations.GTS IvStatValues.PackIVs(31, 10, 20, 31, 31, 20), new byte[] { 6, 0, 0, 252, 252, 0 }, 0, Languages.English, 67, // Torrent - 255, new EncodedString4("Leonardo", 22) + 255, "Leonardo" ); - record.Party[1] = new BattleTowerPokemon4(pokedex, + record.Party[1] = factory.CreatePokemon(pokedex, 389, // Torterra 287, // Choice scarf new ushort[] { @@ -81,10 +82,10 @@ namespace PkmnFoundations.GTS IvStatValues.PackIVs(31, 31, 20, 31, 10, 20), new byte[] { 6, 252, 0, 252, 0, 0 }, 0, Languages.English, 65, // Overgrow - 255, new EncodedString4("Donatello", 22) + 255, "Donatello" ); - record.Party[2] = new BattleTowerPokemon4(pokedex, + record.Party[2] = factory.CreatePokemon(pokedex, 324, // Torkoal 217, // Quick claw new ushort[] { @@ -97,24 +98,24 @@ namespace PkmnFoundations.GTS IvStatValues.PackIVs(31, 10, 31, 20, 10, 31), new byte[] { 252, 0, 6, 0, 0, 252 }, 0, Languages.English, 73, // White smoke - 255, new EncodedString4("Raphael", 22) + 255, "Raphael" ); - record.Profile = new BattleTowerProfile4( - new EncodedString4("Splnter", 16), + record.Profile = factory.CreateProfile( + "Splnter", Versions.Platinum, Languages.English, 0, 0, 0x01020304, - new TrendyPhrase4(0, 16, 291, 7), // Ninjask! Squirtle power! + factory.CreateTrendyPhrase(0, 16, 291, 7), // Ninjask! Squirtle power! 0, 14 // Black belt ); - record.PhraseChallenged = new TrendyPhrase4(0, 16, 291, 7); - record.PhraseWon = new TrendyPhrase4(1, 11, 766, 65535); // I might have won with HELPING HAND! - record.PhraseLost = new TrendyPhrase4(2, 8, 1406, 65535); // You're INCREDIBLE, aren't you? + record.PhraseChallenged = factory.CreateTrendyPhrase(0, 16, 291, 7); + record.PhraseWon = factory.CreateTrendyPhrase(1, 11, 766, 65535); // I might have won with HELPING HAND! + record.PhraseLost = factory.CreateTrendyPhrase(2, 8, 1406, 65535); // You're INCREDIBLE, aren't you? break; case 1: - record.Party[0] = new BattleTowerPokemon4(pokedex, + record.Party[0] = factory.CreatePokemon(pokedex, 376, // Metagross 268, // Expert belt new ushort[] { @@ -127,10 +128,10 @@ namespace PkmnFoundations.GTS 493780176, // Actual IVs which are crap. new byte[] { 252, 238, 0, 20, 0, 0 }, 0, Languages.English, 29, // Clear body - 255, new EncodedString4("Goldfinger", 22) + 255, "Goldfinger" ); - record.Party[1] = new BattleTowerPokemon4(pokedex, + record.Party[1] = factory.CreatePokemon(pokedex, 282, // Gardevoir 297, // Choice specs new ushort[] { @@ -143,10 +144,10 @@ namespace PkmnFoundations.GTS 663420771, // Actual IVs, should be decent new byte[] { 254, 0, 56, 144, 56, 0 }, 0, Languages.English, 36, // Trace - 255, new EncodedString4("Curly", 22) + 255, "Curly" ); - record.Party[2] = new BattleTowerPokemon4(pokedex, + record.Party[2] = factory.CreatePokemon(pokedex, 134, // Vaporeon 234, // Leftovers new ushort[] { @@ -159,24 +160,25 @@ namespace PkmnFoundations.GTS 514292539, new byte[] { 204, 0, 254, 0, 52, 0 }, 0, Languages.English, 11, // Water absorb - 255, new EncodedString4("Seabiscuit", 22) + 255, "Seabiscuit" ); - record.Profile = new BattleTowerProfile4( - new EncodedString4("Megan", 16), + // fixme: Trendy phrases and trainer classes are nonsense on Gen5 because the magic numbers are only valid for Gen4. + record.Profile = factory.CreateProfile( + "Megan", Versions.Platinum, Languages.English, 0, 0, 0x02030405, - new TrendyPhrase4(3, 8, 1487, 65535), // There's only WI-FI left! + factory.CreateTrendyPhrase(3, 8, 1487, 65535), // There's only WI-FI left! 2, 33 // Lady ); - record.PhraseChallenged = new TrendyPhrase4(3, 8, 1487, 65535); - record.PhraseWon = new TrendyPhrase4(3, 3, 1492, 1439); // This BATTLE TOWER is DIFFICULT, isn't it? - record.PhraseLost = new TrendyPhrase4(3, 2, 1493, 1492); // I love GTS! I love BATTLE TOWER too! + record.PhraseChallenged = factory.CreateTrendyPhrase(3, 8, 1487, 65535); + record.PhraseWon = factory.CreateTrendyPhrase(3, 3, 1492, 1439); // This BATTLE TOWER is DIFFICULT, isn't it? + record.PhraseLost = factory.CreateTrendyPhrase(3, 2, 1493, 1492); // I love GTS! I love BATTLE TOWER too! break; case 2: - record.Party[0] = new BattleTowerPokemon4(pokedex, + record.Party[0] = factory.CreatePokemon(pokedex, 392, // Infernape 275, // Focus sash new ushort[] { @@ -189,10 +191,10 @@ namespace PkmnFoundations.GTS IvStatValues.PackIVs(31, 31, 20, 31, 10, 20), new byte[] { 6, 252, 0, 252, 0, 0 }, 0, Languages.English, 66, // Blaze - 255, new EncodedString4("FunkyMunky", 22) + 255, "FunkyMunky" ); - record.Party[1] = new BattleTowerPokemon4(pokedex, + record.Party[1] = factory.CreatePokemon(pokedex, 235, // Smeargle 210, // Custap new ushort[] { @@ -205,10 +207,10 @@ namespace PkmnFoundations.GTS IvStatValues.PackIVs(31, 10, 31, 31, 10, 20), new byte[] { 252, 0, 6, 252, 0, 0 }, 0, Languages.English, 101, // Technician - 255, new EncodedString4("Yourself", 22) + 255, "Yourself" ); - record.Party[2] = new BattleTowerPokemon4(pokedex, + record.Party[2] = factory.CreatePokemon(pokedex, 365, // Walrein 217, // Quick claw new ushort[] { @@ -221,24 +223,24 @@ namespace PkmnFoundations.GTS IvStatValues.PackIVs(31, 10, 20, 31, 10, 31), new byte[] { 252, 0, 0, 252, 0, 6 }, 0, Languages.English, 47, // Thick fat - 255, new EncodedString4("Problem?", 22) + 255, "Problem?" ); - record.Profile = new BattleTowerProfile4( - new EncodedString4("Dennis", 16), + record.Profile = factory.CreateProfile( + "Dennis", Versions.Platinum, Languages.English, 0, 0, 0x02030405, - new TrendyPhrase4(1, 12, 1147, 65535), // I get the happiest with MOTHER + factory.CreateTrendyPhrase(1, 12, 1147, 65535), // I get the happiest with MOTHER 0, 32 // Rich boy ); - record.PhraseChallenged = new TrendyPhrase4(1, 12, 1147, 65535); - record.PhraseWon = new TrendyPhrase4(2, 8, 1140, 65535); // You're WEAK, aren't you? - record.PhraseLost = new TrendyPhrase4(2, 6, 1421, 65535); // ROFL! How awful! + record.PhraseChallenged = factory.CreateTrendyPhrase(1, 12, 1147, 65535); + record.PhraseWon = factory.CreateTrendyPhrase(2, 8, 1140, 65535); // You're WEAK, aren't you? + record.PhraseLost = factory.CreateTrendyPhrase(2, 6, 1421, 65535); // ROFL! How awful! break; case 3: - record.Party[0] = new BattleTowerPokemon4(pokedex, + record.Party[0] = factory.CreatePokemon(pokedex, 248, // Tyranitar 189, // Chople new ushort[] { @@ -251,10 +253,10 @@ namespace PkmnFoundations.GTS IvStatValues.PackIVs(31, 31, 20, 31, 10, 20), new byte[] { 6, 252, 0, 252, 0, 0 }, 0, Languages.English, 45, // Sand stream - 255, new EncodedString4("Tyranitar", 22) + 255, "Tyranitar" ); - record.Party[1] = new BattleTowerPokemon4(pokedex, + record.Party[1] = factory.CreatePokemon(pokedex, 212, // Scizor 270, // Life orb new ushort[] { @@ -267,10 +269,10 @@ namespace PkmnFoundations.GTS IvStatValues.PackIVs(31, 31, 20, 31, 10, 20), new byte[] { 6, 252, 0, 252, 0, 0 }, 0, Languages.English, 101, // Technician - 255, new EncodedString4("Scizor", 22) + 255, "Scizor" ); - record.Party[2] = new BattleTowerPokemon4(pokedex, + record.Party[2] = factory.CreatePokemon(pokedex, 485, // Heatran 234, // Leftovers new ushort[] { @@ -284,24 +286,24 @@ namespace PkmnFoundations.GTS IvStatValues.PackIVs(31, 10, 20, 20, 31, 31), new byte[] { 250, 0, 0, 0, 56, 204 }, 0, Languages.English, 18, // Flash fire - 255, new EncodedString4("Heatran", 22) + 255, "Heatran" ); - record.Profile = new BattleTowerProfile4( - new EncodedString4("Dusty", 16), + record.Profile = factory.CreateProfile( + "Dusty", Versions.Platinum, Languages.English, 0, 0, 0x03040506, - new TrendyPhrase4(3, 4, 1342, 65535), // I can do anything for TREASURE + factory.CreateTrendyPhrase(3, 4, 1342, 65535), // I can do anything for TREASURE 0, 48 // Ruin Maniac ); - record.PhraseChallenged = new TrendyPhrase4(3, 4, 1342, 65535); - record.PhraseWon = new TrendyPhrase4(3, 6, 1148, 1107); // GRANDFATHER is the real NO.1 - record.PhraseLost = new TrendyPhrase4(3, 10, 1389, 65535); // I prefer VACATION after all + record.PhraseChallenged = factory.CreateTrendyPhrase(3, 4, 1342, 65535); + record.PhraseWon = factory.CreateTrendyPhrase(3, 6, 1148, 1107); // GRANDFATHER is the real NO.1 + record.PhraseLost = factory.CreateTrendyPhrase(3, 10, 1389, 65535); // I prefer VACATION after all break; case 4: - record.Party[0] = new BattleTowerPokemon4(pokedex, + record.Party[0] = factory.CreatePokemon(pokedex, 460, // Abomasnow 287, // Scarf new ushort[] { @@ -316,10 +318,10 @@ namespace PkmnFoundations.GTS // Adjusted for Hidden Power IVs, sacrificing some Attack new byte[] { 0, 148, 0, 234, 128, 0 }, 0, Languages.English, 117, // Snow warning - 255, new EncodedString4("Abomasnow", 22) + 255, "Abomasnow" ); - record.Party[1] = new BattleTowerPokemon4(pokedex, + record.Party[1] = factory.CreatePokemon(pokedex, 471, // Glaceon 246, // Nevermeltice new ushort[] { @@ -332,10 +334,10 @@ namespace PkmnFoundations.GTS IvStatValues.PackIVs(31, 10, 20, 31, 31, 20), new byte[] { 6, 0, 0, 252, 252, 0 }, 0, Languages.English, 81, // Snow cloak - 255, new EncodedString4("Glaceon", 22) + 255, "Glaceon" ); - record.Party[2] = new BattleTowerPokemon4(pokedex, + record.Party[2] = factory.CreatePokemon(pokedex, 461, // Weavile 275, // Focus sash new ushort[] { @@ -348,24 +350,24 @@ namespace PkmnFoundations.GTS IvStatValues.PackIVs(31, 31, 20, 31, 10, 20), new byte[] { 40, 252, 0, 218, 0, 0 }, 0, Languages.English, 46, // Pressure - 255, new EncodedString4("Weavile", 22) + 255, "Weavile" ); - record.Profile = new BattleTowerProfile4( - new EncodedString4("Frosty", 16), + record.Profile = factory.CreateProfile( + "Frosty", Versions.Platinum, Languages.English, 0, 0, 0x04050607, - new TrendyPhrase4(3, 3, 677, 1438), // This POWDER SNOW is NICE, isn't it? + factory.CreateTrendyPhrase(3, 3, 677, 1438), // This POWDER SNOW is NICE, isn't it? 2, 35 // Socialite ); - record.PhraseChallenged = new TrendyPhrase4(3, 3, 677, 1438); - record.PhraseWon = new TrendyPhrase4(1, 14, 797, 65535); // This ICE BALL was really good - record.PhraseLost = new TrendyPhrase4(2, 5, 752, 65535); // Could it be? HEAT WAVE + record.PhraseChallenged = factory.CreateTrendyPhrase(3, 3, 677, 1438); + record.PhraseWon = factory.CreateTrendyPhrase(1, 14, 797, 65535); // This ICE BALL was really good + record.PhraseLost = factory.CreateTrendyPhrase(2, 5, 752, 65535); // Could it be? HEAT WAVE break; case 5: - record.Party[0] = new BattleTowerPokemon4(pokedex, + record.Party[0] = factory.CreatePokemon(pokedex, 437, // Bronzong 234, // Leftovers new ushort[] { @@ -378,10 +380,10 @@ namespace PkmnFoundations.GTS IvStatValues.PackIVs(31, 20, 31, 0, 10, 20), new byte[] { 252, 0, 252, 0, 0, 6 }, 0, Languages.English, 26, // Levitate - 255, new EncodedString4("Bronzong", 22) + 255, "Bronzong" ); - record.Party[1] = new BattleTowerPokemon4(pokedex, + record.Party[1] = factory.CreatePokemon(pokedex, 464, // Rhyperior 270, // Life orb new ushort[] { @@ -394,10 +396,10 @@ namespace PkmnFoundations.GTS IvStatValues.PackIVs(31, 31, 31, 10, 10, 20), new byte[] { 248, 252, 10, 0, 0, 0 }, 0, Languages.English, 116, // Solid rock - 255, new EncodedString4("Rhyperior", 22) + 255, "Rhyperior" ); - record.Party[2] = new BattleTowerPokemon4(pokedex, + record.Party[2] = factory.CreatePokemon(pokedex, 462, // Magnezone 268, // Expert belt new ushort[] { @@ -410,24 +412,24 @@ namespace PkmnFoundations.GTS IvStatValues.PackIVs(31, 10, 31, 10, 31, 20), new byte[] { 252, 0, 6, 0, 252, 0 }, 0, Languages.English, 42, // Magnet pull - 255, new EncodedString4("Magnezone", 22) + 255, "Magnezone" ); - record.Profile = new BattleTowerProfile4( - new EncodedString4("Cassie", 16), + record.Profile = factory.CreateProfile( + "Cassie", Versions.Platinum, Languages.English, 0, 0, 0x05060708, - new TrendyPhrase4(2, 3, 1146, 65535), // I want to go home with YOU... + factory.CreateTrendyPhrase(2, 3, 1146, 65535), // I want to go home with YOU... 2, 85 // Idol ); - record.PhraseChallenged = new TrendyPhrase4(2, 3, 1146, 65535); - record.PhraseWon = new TrendyPhrase4(4, 10, 1245, 65535); // Let's GO AHEAD! - record.PhraseLost = new TrendyPhrase4(4, 11, 1348, 65535); // Want to DATE? + record.PhraseChallenged = factory.CreateTrendyPhrase(2, 3, 1146, 65535); + record.PhraseWon = factory.CreateTrendyPhrase(4, 10, 1245, 65535); // Let's GO AHEAD! + record.PhraseLost = factory.CreateTrendyPhrase(4, 11, 1348, 65535); // Want to DATE? break; case 6: - record.Party[0] = new BattleTowerPokemon4(pokedex, + record.Party[0] = factory.CreatePokemon(pokedex, 65, // Alakazam 275, // Focus sash new ushort[] { @@ -440,10 +442,10 @@ namespace PkmnFoundations.GTS IvStatValues.PackIVs(31, 10, 20, 31, 31, 20), new byte[] { 6, 0, 0, 252, 252, 6 }, 0, Languages.English, 39, // Inner focus - 255, new EncodedString4("Alakazam", 22) + 255, "Alakazam" ); - record.Party[1] = new BattleTowerPokemon4(pokedex, + record.Party[1] = factory.CreatePokemon(pokedex, 445, // Garchomp 270, // Life orb new ushort[] { @@ -456,10 +458,10 @@ namespace PkmnFoundations.GTS IvStatValues.PackIVs(31, 31, 20, 31, 10, 20), new byte[] { 6, 252, 0, 252, 0, 0 }, 0, Languages.English, 8, // Sand veil - 255, new EncodedString4("Garchomp", 22) + 255, "Garchomp" ); - record.Party[2] = new BattleTowerPokemon4(pokedex, + record.Party[2] = factory.CreatePokemon(pokedex, 242, // Blissey 234, // Leftovers new ushort[] { @@ -472,20 +474,20 @@ namespace PkmnFoundations.GTS IvStatValues.PackIVs(31, 10, 31, 31, 20, 20), new byte[] { 252, 0, 252, 6, 0, 0 }, 0, Languages.English, 30, // Natural cure - 255, new EncodedString4("Blissey", 22) + 255, "Blissey" ); - record.Profile = new BattleTowerProfile4( - new EncodedString4("Evan", 16), + record.Profile = factory.CreateProfile( + "Evan", Versions.Platinum, Languages.English, 0, 0, 0x06070809, - new TrendyPhrase4(0, 2, 566, 65535), // I'll battle with STRENGTH! + factory.CreateTrendyPhrase(0, 2, 566, 65535), // I'll battle with STRENGTH! 0, 24 // Ace trainer M ); - record.PhraseChallenged = new TrendyPhrase4(0, 2, 566, 65535); - record.PhraseWon = new TrendyPhrase4(1, 1, 1418, 65535); // I won! I won with SKILLFUL! - record.PhraseLost = new TrendyPhrase4(2, 17, 1428, 65535); // The way I lost... It's like RARE... + record.PhraseChallenged = factory.CreateTrendyPhrase(0, 2, 566, 65535); + record.PhraseWon = factory.CreateTrendyPhrase(1, 1, 1418, 65535); // I won! I won with SKILLFUL! + record.PhraseLost = factory.CreateTrendyPhrase(2, 17, 1428, 65535); // The way I lost... It's like RARE... break; } @@ -506,6 +508,8 @@ namespace PkmnFoundations.GTS TrendyPhraseBase phrase_leader, byte gender, byte unknown); public abstract TrendyPhraseBase CreateTrendyPhrase(ushort mood, ushort index, ushort word1, ushort word2); + + public abstract Generations Generation { get; } } public class FakeOpponentFactory4 : FakeOpponentFactory @@ -554,6 +558,14 @@ namespace PkmnFoundations.GTS { return new TrendyPhrase4(mood, index, word1, word2); } + + public override Generations Generation + { + get + { + return Generations.Generation4; + } + } } public class FakeOpponentFactory5 : FakeOpponentFactory @@ -601,6 +613,13 @@ namespace PkmnFoundations.GTS { return new TrendyPhrase5(mood, index, word1, word2); } - } -} \ No newline at end of file + public override Generations Generation + { + get + { + return Generations.Generation5; + } + } + } +} diff --git a/gts/syachi2ds.ashx.cs b/gts/syachi2ds.ashx.cs index 1752736b..af7bae49 100644 --- a/gts/syachi2ds.ashx.cs +++ b/gts/syachi2ds.ashx.cs @@ -518,14 +518,14 @@ namespace PkmnFoundations.GTS return; } + FakeOpponentFactory5 fact = new FakeOpponentFactory5(); BattleSubwayRecord5[] opponents = Database.Instance.BattleSubwayGetOpponents5(pokedex, pid, rank, roomNum); BattleSubwayProfile5[] leaders = Database.Instance.BattleSubwayGetLeaders5(pokedex, rank, roomNum); + BattleTowerRecordBase[] fakeOpponents = FakeOpponentGenerator.GenerateFakeOpponents(fact, 7 - opponents.Length); - if (opponents.Length != 7) + foreach (BattleSubwayRecord5 record in fakeOpponents) { - // todo: Implement fake trainers on Gen5 too. - ShowError(context, 500); - return; + response.Write(record.Save(), 0, 240); } foreach (BattleSubwayRecord5 record in opponents) diff --git a/library/Data/DataMysql.cs b/library/Data/DataMysql.cs index d20e204b..5ec4314c 100644 --- a/library/Data/DataMysql.cs +++ b/library/Data/DataMysql.cs @@ -686,9 +686,9 @@ namespace PkmnFoundations.Data "TimeUpdated = UTC_TIMESTAMP() WHERE id = @id", _params.ToArray()); - UpdateBattleTowerPokemon4(tran, record.Party[0], pkey, 0); - UpdateBattleTowerPokemon4(tran, record.Party[1], pkey, 1); - UpdateBattleTowerPokemon4(tran, record.Party[2], pkey, 2); + UpdateBattleTowerPokemon4(tran, (BattleTowerPokemon4)record.Party[0], pkey, 0); + UpdateBattleTowerPokemon4(tran, (BattleTowerPokemon4)record.Party[1], pkey, 1); + UpdateBattleTowerPokemon4(tran, (BattleTowerPokemon4)record.Party[2], pkey, 2); } else { @@ -707,9 +707,9 @@ namespace PkmnFoundations.Data "SELECT LAST_INSERT_ID()", _params.ToArray())); - InsertBattleTowerPokemon4(tran, record.Party[0], pkey, 0); - InsertBattleTowerPokemon4(tran, record.Party[1], pkey, 1); - InsertBattleTowerPokemon4(tran, record.Party[2], pkey, 2); + InsertBattleTowerPokemon4(tran, (BattleTowerPokemon4)record.Party[0], pkey, 0); + InsertBattleTowerPokemon4(tran, (BattleTowerPokemon4)record.Party[1], pkey, 1); + InsertBattleTowerPokemon4(tran, (BattleTowerPokemon4)record.Party[2], pkey, 2); } return pkey; @@ -754,16 +754,17 @@ namespace PkmnFoundations.Data private List ParamsFromBattleTowerRecord4(BattleTowerRecord4 record, bool leader) { List result = new List(15); + BattleTowerProfile4 profile = (BattleTowerProfile4)record.Profile; result.Add(new MySqlParameter("@pid", record.PID)); - result.Add(new MySqlParameter("@name", record.Profile.Name.RawData)); - result.Add(new MySqlParameter("@version", (byte)record.Profile.Version)); - result.Add(new MySqlParameter("@language", (byte)record.Profile.Language)); - result.Add(new MySqlParameter("@country", record.Profile.Country)); - result.Add(new MySqlParameter("@region", record.Profile.Region)); - result.Add(new MySqlParameter("@trainer_id", record.Profile.OT)); - result.Add(new MySqlParameter("@phrase_leader", record.Profile.PhraseLeader.Data)); - result.Add(new MySqlParameter("@gender", record.Profile.Gender)); - result.Add(new MySqlParameter("@unknown2", record.Profile.Unknown)); + result.Add(new MySqlParameter("@name", profile.Name.RawData)); + result.Add(new MySqlParameter("@version", (byte)profile.Version)); + result.Add(new MySqlParameter("@language", (byte)profile.Language)); + result.Add(new MySqlParameter("@country", profile.Country)); + result.Add(new MySqlParameter("@region", profile.Region)); + result.Add(new MySqlParameter("@trainer_id", profile.OT)); + result.Add(new MySqlParameter("@phrase_leader", profile.PhraseLeader.Data)); + result.Add(new MySqlParameter("@gender", profile.Gender)); + result.Add(new MySqlParameter("@unknown2", profile.Unknown)); result.Add(new MySqlParameter("@rank", record.Rank)); result.Add(new MySqlParameter("@room", record.RoomNum)); if (!leader) @@ -870,6 +871,7 @@ namespace PkmnFoundations.Data if (oPkey == null) { + BattleTowerProfile4 profile = (BattleTowerProfile4)record.Profile; // PID isn't found. Try to match one of Pikachu025's saved // records based on unchanging properties of the savegame. oPkey = tran.ExecuteScalar("SELECT id FROM " + tblName + @@ -878,10 +880,10 @@ namespace PkmnFoundations.Data "AND Language = @language AND TrainerID = @trainer_id", new MySqlParameter("@rank", record.Rank), new MySqlParameter("@room", record.RoomNum), - new MySqlParameter("@name", record.Profile.Name.RawData), - new MySqlParameter("@version", (byte)record.Profile.Version), - new MySqlParameter("@language", (byte)record.Profile.Language), - new MySqlParameter("@trainer_id", record.Profile.OT) + new MySqlParameter("@name", profile.Name.RawData), + new MySqlParameter("@version", (byte)profile.Version), + new MySqlParameter("@language", (byte)profile.Language), + new MySqlParameter("@trainer_id", profile.OT) ); } @@ -1000,7 +1002,7 @@ namespace PkmnFoundations.Data new MySqlParameter("@room", roomNum))) { while (reader.Read()) - profiles.Add(BattleTowerRecord4FromReader(reader, pokedex).Profile); + profiles.Add((BattleTowerProfile4)BattleTowerRecord4FromReader(reader, pokedex).Profile); reader.Close(); } @@ -1915,9 +1917,9 @@ namespace PkmnFoundations.Data "TimeUpdated = UTC_TIMESTAMP() WHERE id = @id", _params.ToArray()); - UpdateBattleSubwayPokemon5(tran, record.Party[0], pkey, 0); - UpdateBattleSubwayPokemon5(tran, record.Party[1], pkey, 1); - UpdateBattleSubwayPokemon5(tran, record.Party[2], pkey, 2); + UpdateBattleSubwayPokemon5(tran, (BattleSubwayPokemon5)record.Party[0], pkey, 0); + UpdateBattleSubwayPokemon5(tran, (BattleSubwayPokemon5)record.Party[1], pkey, 1); + UpdateBattleSubwayPokemon5(tran, (BattleSubwayPokemon5)record.Party[2], pkey, 2); } else { @@ -1936,9 +1938,9 @@ namespace PkmnFoundations.Data "SELECT LAST_INSERT_ID()", _params.ToArray())); - InsertBattleSubwayPokemon5(tran, record.Party[0], pkey, 0); - InsertBattleSubwayPokemon5(tran, record.Party[1], pkey, 1); - InsertBattleSubwayPokemon5(tran, record.Party[2], pkey, 2); + InsertBattleSubwayPokemon5(tran, (BattleSubwayPokemon5)record.Party[0], pkey, 0); + InsertBattleSubwayPokemon5(tran, (BattleSubwayPokemon5)record.Party[1], pkey, 1); + InsertBattleSubwayPokemon5(tran, (BattleSubwayPokemon5)record.Party[2], pkey, 2); } return pkey; @@ -1978,17 +1980,18 @@ namespace PkmnFoundations.Data private List ParamsFromBattleSubwayRecord5(BattleSubwayRecord5 record, bool leader) { + BattleSubwayProfile5 profile = (BattleSubwayProfile5)record.Profile; List result = new List(15); result.Add(new MySqlParameter("@pid", record.PID)); - result.Add(new MySqlParameter("@name", record.Profile.Name.RawData)); - result.Add(new MySqlParameter("@version", (byte)record.Profile.Version)); - result.Add(new MySqlParameter("@language", (byte)record.Profile.Language)); - result.Add(new MySqlParameter("@country", record.Profile.Country)); - result.Add(new MySqlParameter("@region", record.Profile.Region)); - result.Add(new MySqlParameter("@trainer_id", record.Profile.OT)); - result.Add(new MySqlParameter("@phrase_leader", record.Profile.PhraseLeader.Data)); - result.Add(new MySqlParameter("@gender", record.Profile.Gender)); - result.Add(new MySqlParameter("@unknown2", record.Profile.Unknown)); + result.Add(new MySqlParameter("@name", profile.Name.RawData)); + result.Add(new MySqlParameter("@version", (byte)profile.Version)); + result.Add(new MySqlParameter("@language", (byte)profile.Language)); + result.Add(new MySqlParameter("@country", profile.Country)); + result.Add(new MySqlParameter("@region", profile.Region)); + result.Add(new MySqlParameter("@trainer_id", profile.OT)); + result.Add(new MySqlParameter("@phrase_leader", profile.PhraseLeader.Data)); + result.Add(new MySqlParameter("@gender", profile.Gender)); + result.Add(new MySqlParameter("@unknown2", profile.Unknown)); result.Add(new MySqlParameter("@rank", record.Rank)); result.Add(new MySqlParameter("@room", record.RoomNum)); if (!leader) @@ -2097,6 +2100,7 @@ namespace PkmnFoundations.Data if (oPkey == null) { + BattleSubwayProfile5 profile = (BattleSubwayProfile5)record.Profile; // PID isn't found. Try to match one of Pikachu025's saved // records based on unchanging properties of the savegame. oPkey = tran.ExecuteScalar("SELECT id FROM " + tblName + @@ -2105,10 +2109,10 @@ namespace PkmnFoundations.Data "AND Language = @language AND TrainerID = @trainer_id", new MySqlParameter("@rank", record.Rank), new MySqlParameter("@room", record.RoomNum), - new MySqlParameter("@name", record.Profile.Name.RawData), - new MySqlParameter("@version", (byte)record.Profile.Version), - new MySqlParameter("@language", (byte)record.Profile.Language), - new MySqlParameter("@trainer_id", record.Profile.OT) + new MySqlParameter("@name", profile.Name.RawData), + new MySqlParameter("@version", (byte)profile.Version), + new MySqlParameter("@language", (byte)profile.Language), + new MySqlParameter("@trainer_id", profile.OT) ); } @@ -2235,7 +2239,7 @@ namespace PkmnFoundations.Data new MySqlParameter("@room", roomNum))) { while (reader.Read()) - profiles.Add(BattleSubwayRecord5FromReader(reader, pokedex).Profile); + profiles.Add((BattleSubwayProfile5)BattleSubwayRecord5FromReader(reader, pokedex).Profile); reader.Close(); } diff --git a/library/Structures/BattleSubwayRecord5.cs b/library/Structures/BattleSubwayRecord5.cs index 60dcb908..5cc23af7 100644 --- a/library/Structures/BattleSubwayRecord5.cs +++ b/library/Structures/BattleSubwayRecord5.cs @@ -28,12 +28,80 @@ namespace PkmnFoundations.Structures public Pokedex.Pokedex Pokedex { get; set; } - public BattleSubwayPokemon5[] Party; - public BattleSubwayProfile5 Profile; + private BattleSubwayPokemon5[] m_party; + private BattleSubwayProfile5 m_profile; + private TrendyPhrase5 m_phrase_challenged; + private TrendyPhrase5 m_phrase_won; + private TrendyPhrase5 m_phrase_lost; + + public override IList Party + { + get + { + return m_party; + } + set + { + if (!(value is BattleSubwayPokemon5[])) throw new ArgumentException("value must be BattleSubwayPokemon5[]"); + BattleSubwayPokemon5[] party = (BattleSubwayPokemon5[])value; + if (party.Length != 3) throw new ArgumentException("value must have length 3"); + m_party = party; + } + } + + + public override BattleTowerProfileBase Profile + { + get + { + return m_profile; + } + + set + { + m_profile = (BattleSubwayProfile5)value; + } + } + + public override TrendyPhraseBase PhraseChallenged + { + get + { + return m_phrase_challenged; + } + + set + { + m_phrase_challenged = (TrendyPhrase5)value; + } + } + + public override TrendyPhraseBase PhraseWon + { + get + { + return m_phrase_won; + } + + set + { + m_phrase_won = (TrendyPhrase5)value; + } + } + + public override TrendyPhraseBase PhraseLost + { + get + { + return m_phrase_lost; + } + + set + { + m_phrase_lost = (TrendyPhrase5)value; + } + } - public TrendyPhrase5 PhraseChallenged; - public TrendyPhrase5 PhraseWon; - public TrendyPhrase5 PhraseLost; public ushort Unknown3; public byte Rank; @@ -53,7 +121,7 @@ namespace PkmnFoundations.Structures { writer.Write(Party[x].Save()); } - writer.Write(Profile.Save()); + writer.Write(((BattleSubwayProfile5)Profile).Save()); writer.Write(PhraseChallenged.Data); writer.Write(PhraseWon.Data); writer.Write(PhraseLost.Data); diff --git a/library/Structures/BattleTowerRecord4.cs b/library/Structures/BattleTowerRecord4.cs index 4dc0f6a2..87b12da3 100644 --- a/library/Structures/BattleTowerRecord4.cs +++ b/library/Structures/BattleTowerRecord4.cs @@ -28,12 +28,80 @@ namespace PkmnFoundations.Structures public Pokedex.Pokedex Pokedex { get; set; } - public BattleTowerPokemon4[] Party; - public BattleTowerProfile4 Profile; + private BattleTowerPokemon4[] m_party; + private BattleTowerProfile4 m_profile; + private TrendyPhrase4 m_phrase_challenged; + private TrendyPhrase4 m_phrase_won; + private TrendyPhrase4 m_phrase_lost; + + public override IList Party + { + get + { + return m_party; + } + set + { + if (!(value is BattleTowerPokemon4[])) throw new ArgumentException("value must be BattleTowerPokemon4[]"); + BattleTowerPokemon4[] party = (BattleTowerPokemon4[])value; + if (party.Length != 3) throw new ArgumentException("value must have length 3"); + m_party = party; + } + } + + public override BattleTowerProfileBase Profile + { + get + { + return m_profile; + } + + set + { + m_profile = (BattleTowerProfile4)value; + } + } + + public override TrendyPhraseBase PhraseChallenged + { + get + { + return m_phrase_challenged; + } + + set + { + m_phrase_challenged = (TrendyPhrase4)value; + } + } + + public override TrendyPhraseBase PhraseWon + { + get + { + return m_phrase_won; + } + + set + { + m_phrase_won = (TrendyPhrase4)value; + } + } + + public override TrendyPhraseBase PhraseLost + { + get + { + return m_phrase_lost; + } + + set + { + m_phrase_lost = (TrendyPhrase4)value; + } + } + - public TrendyPhrase4 PhraseChallenged; - public TrendyPhrase4 PhraseWon; - public TrendyPhrase4 PhraseLost; public ushort Unknown3; // Seems to be some sort of Elo rating. Goes up to about 8000. public byte Rank; @@ -52,7 +120,7 @@ namespace PkmnFoundations.Structures { writer.Write(Party[x].Save()); } - writer.Write(Profile.Save()); + writer.Write(((BattleTowerProfile4)Profile).Save()); writer.Write(PhraseChallenged.Data); writer.Write(PhraseWon.Data); writer.Write(PhraseLost.Data); @@ -67,7 +135,7 @@ namespace PkmnFoundations.Structures { if (start + 0xe4 > data.Length) throw new ArgumentOutOfRangeException("start"); - Party = new BattleTowerPokemon4[3]; + m_party = new BattleTowerPokemon4[3]; for (int x = 0; x < 3; x++) { Party[x] = new BattleTowerPokemon4(Pokedex, data, start + x * 0x38); diff --git a/library/Structures/BattleTowerRecordBase.cs b/library/Structures/BattleTowerRecordBase.cs index 4626a1f3..05dd833c 100644 --- a/library/Structures/BattleTowerRecordBase.cs +++ b/library/Structures/BattleTowerRecordBase.cs @@ -2,11 +2,20 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using PkmnFoundations.Support; namespace PkmnFoundations.Structures { public abstract class BattleTowerRecordBase { // todo: move much of implementation in here from derived classes + + public abstract IList Party { get; set; } + + public abstract BattleTowerProfileBase Profile { get; set; } + + public abstract TrendyPhraseBase PhraseChallenged { get; set; } + public abstract TrendyPhraseBase PhraseWon { get; set; } + public abstract TrendyPhraseBase PhraseLost { get; set; } } }