FakeOpponentGenerator now works on Gen5 but has issues.

This commit is contained in:
Greg Edwards
2022-09-27 01:36:13 -04:00
parent 8e63ea8416
commit 898d705a16
6 changed files with 320 additions and 152 deletions

View File

@@ -12,7 +12,8 @@ namespace PkmnFoundations.GTS
/// </summary>
public static class FakeOpponentGenerator
{
const int FAKE_OPPONENTS_COUNT = 7;
const int FAKE_OPPONENTS_COUNT_4 = 7;
const int FAKE_OPPONENTS_COUNT_5 = 7;
/// <summary>
/// Randomly selects some fake opponents without repeats (if possible)
@@ -21,9 +22,11 @@ namespace PkmnFoundations.GTS
/// <returns></returns>
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<int> values = Enumerable.Range(0, FAKE_OPPONENTS_COUNT).ToList();
if (count > fakeOpponentsCount) throw new ArgumentOutOfRangeException("count");
List<int> 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);
}
}
}
public override Generations Generation
{
get
{
return Generations.Generation5;
}
}
}
}

View File

@@ -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)

View File

@@ -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<MySqlParameter> ParamsFromBattleTowerRecord4(BattleTowerRecord4 record, bool leader)
{
List<MySqlParameter> result = new List<MySqlParameter>(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<MySqlParameter> ParamsFromBattleSubwayRecord5(BattleSubwayRecord5 record, bool leader)
{
BattleSubwayProfile5 profile = (BattleSubwayProfile5)record.Profile;
List<MySqlParameter> result = new List<MySqlParameter>(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();
}

View File

@@ -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<BattleTowerPokemonBase> 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);

View File

@@ -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<BattleTowerPokemonBase> 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);

View File

@@ -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<BattleTowerPokemonBase> 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; }
}
}