From 65cc463f1d91fe99acf1c4dd9bce7e0038593022 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Tue, 3 Jul 2007 04:20:36 +0000 Subject: Fixed Logging, minor fixes, got rid of NatureEffect, and started migration from wxGTK to Qt git-svn-id: https://pokegen.svn.sourceforge.net/svnroot/pokegen/trunk@22 6ecfd1a5-f3ed-3746-8530-beee90d26b22 --- pokemod/Dialog.cpp | 563 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 394 insertions(+), 169 deletions(-) (limited to 'pokemod/Dialog.cpp') diff --git a/pokemod/Dialog.cpp b/pokemod/Dialog.cpp index 53e3afc0..6f7210d9 100644 --- a/pokemod/Dialog.cpp +++ b/pokemod/Dialog.cpp @@ -45,11 +45,7 @@ PokeGen::PokeMod::Dialog::~Dialog() LogDtor("Dialog", id); } -#ifdef PG_DEBUG_WINDOW -void PokeGen::PokeMod::Dialog::Validate(const wxListBox &output) -#else void PokeGen::PokeMod::Dialog::Validate() -#endif { LogValidateStart("Dialog", id); if (dialog == "") @@ -59,7 +55,7 @@ void PokeGen::PokeMod::Dialog::Validate() } if (dialog.Count('%') % 2) { - Log(String("Dialog: Command delimiter mismatch in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Command delimiter mismatch in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } else @@ -76,14 +72,14 @@ void PokeGen::PokeMod::Dialog::Validate() case DC_FLIP_FLAG ... DC_EXIT: if (numArgs != DialogCommandNumArgs[curCmd]) { - Log(String("Dialog: Invalid number of arguments (%u) for %s (%u wanted) in %u", numArgs, DialogCommandStr[curCmd], DialogCommandNumArgs[curCmd], id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid number of arguments (%u) for %s (%u wanted) in %u", numArgs, DialogCommandStr[curCmd], DialogCommandNumArgs[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } break; case DC_MENU: if (!(numArgs % 2)) { - Log(String("Dialog: Argument mismatch for Menu in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Argument mismatch for Menu in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } break; @@ -95,13 +91,14 @@ void PokeGen::PokeMod::Dialog::Validate() { if (curCmdStr != "") { - Log(String("Dialog: Invalid command \"%s\" in %u", curCmdStr.c_str(), id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid command \"%s\" in %u", curCmdStr.c_str(), id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } curCmd = DC_END; } numArgs = 0; } + break; case '#': if (curCmd != DC_END) { @@ -112,7 +109,6 @@ void PokeGen::PokeMod::Dialog::Validate() for (; (dialog[i] != '%') && (dialog[i] != '#'); ++i) arg.append(1, dialog[i]); ++numArgs; - // TODO (Ben#1#): Argument parsing checks switch (curCmd) { case DC_FLIP_FLAG: @@ -123,73 +119,53 @@ void PokeGen::PokeMod::Dialog::Validate() { if (!arg.Convert(tempUL)) { - Log(String("Dialog: Bad flag in \"%s\" on %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Bad flag in \"%s\" on %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } } - else - { - Log(String("Dialog: Too many arguments (%u) for \"%s\" in %u", numArgs, DialogCommandStr[curCmd], id), PM_DEBUG_ERROR); - isValid = false; - } break; case DC_TEST_FLAG: switch (numArgs) { case 1: - if ((arg != "Call") || (arg != "Goto") || (arg != "0") || (arg != "1")) + if ((arg != "Call") && (arg != "Goto") && (arg != "0") && (arg != "1")) { - Log(String("Dialog: Invalid argument #1 in \"Test Flag\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Test Flag\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } break; case 2: - if ((arg != "Unset") || (arg != "Set") || (arg != "0") || (arg != "1")) - { - Log(String("Dialog: Invalid argument #2 in \"Test Flag\" in %u", id), PM_DEBUG_ERROR); - isValid = false; - } - break; - case 3: if (!arg.Convert(tempUL)) { - Log(String("Dialog: Bad flag in \"Test Flag\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Bad flag in \"Test Flag\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } break; + case 3: case 4: - case 5: if (!arg.Convert(tempU) || !pokemod->GetDialog(tempU)) { - Log(String("Dialog: Invalid argument #%u in \"Test Flag\" in %u", numArgs, id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #%u in \"Test Flag\" in %u", numArgs, id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } - break; - default: - Log(String("Dialog: Too many arguments (%u) for \"Test Flag\" in %u", numArgs, id), PM_DEBUG_ERROR); - isValid = false; } break; case DC_DIALOG: - switch (numArgs) + if (numArgs == 1) { - case 1: - if ((arg != "Call") || (arg != "Goto") || (arg != "0") || (arg != "1")) - { - Log(String("Dialog: Invalid argument #1 in \"Dialog\" in %u", id), PM_DEBUG_ERROR); - isValid = false; - } - break; - case 2: - if (!arg.Convert(tempU) || !pokemod->GetDialog(tempU)) - { - Log(String("Dialog: Invalid argument #%u in \"Dialog\" in %u", numArgs, id), PM_DEBUG_ERROR); - isValid = false; - } - break; - default: - Log(String("Dialog: Too many arguments (%u) for \"Dialog\" in %u", numArgs, id), PM_DEBUG_ERROR); + if ((arg != "Call") && (arg != "Goto") && (arg != "0") && (arg != "1")) + { + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Dialog\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } + else if (numArgs == 2) + { + if (!arg.Convert(tempU) || !pokemod->GetDialog(tempU)) + { + Log::Write(String("Dialog Validation: Invalid argument #%u in \"Dialog\" in %u", numArgs, id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; + } } break; case DC_YES_NO: @@ -197,9 +173,9 @@ void PokeGen::PokeMod::Dialog::Validate() switch (numArgs) { case 1: - if ((arg != "Call") || (arg != "Goto") || (arg != "0") || (arg != "1")) + if ((arg != "Call") && (arg != "Goto") && (arg != "0") && (arg != "1")) { - Log(String("Dialog: Invalid argument #1 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #1 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } break; @@ -207,13 +183,9 @@ void PokeGen::PokeMod::Dialog::Validate() case 3: if (!arg.Convert(tempU) || !pokemod->GetDialog(tempU)) { - Log(String("Dialog: Invalid argument #%u in \"%s\" in %u", numArgs, DialogCommandStr[curCmd], id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #%u in \"%s\" in %u", numArgs, DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } - break; - default: - Log(String("Dialog: Too many arguments (%u) for \"%s\" in %u", numArgs, DialogCommandStr[curCmd], id), PM_DEBUG_ERROR); - isValid = false; } break; case DC_ITEM_SHOP: @@ -221,15 +193,10 @@ void PokeGen::PokeMod::Dialog::Validate() { if (!(arg.Convert(tempU) ? pokemod->GetStore(tempU) : pokemod->GetStore(arg))) { - Log(String("Dialog: Invalid argument #1 in \"Test Flag\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Test Flag\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } } - else - { - Log(String("Dialog: Too many arguments (%u) for \"Test Flag\" in %u", numArgs, id), PM_DEBUG_ERROR); - isValid = false; - } break; case DC_GIVE_ITEM: case DC_TAKE_ITEM: @@ -237,16 +204,16 @@ void PokeGen::PokeMod::Dialog::Validate() switch (numArgs) { case 1: - if ((arg != "Call") || (arg != "Goto") || (arg != "0") || (arg != "1")) + if ((arg != "Call") && (arg != "Goto") && (arg != "0") && (arg != "1")) { - Log(String("Dialog: Invalid argument #1 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #1 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } break; case 2: if (!(arg.Convert(tempU) ? pokemod->GetItem(tempU) : pokemod->GetItem(arg))) { - Log(String("Dialog: Invalid argument #2 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #2 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } break; @@ -254,13 +221,9 @@ void PokeGen::PokeMod::Dialog::Validate() case 4: if (!arg.Convert(tempU) || !pokemod->GetDialog(tempU)) { - Log(String("Dialog: Invalid argument #%u in \"%s\" in %u", numArgs, DialogCommandStr[curCmd], id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #%u in \"%s\" in %u", numArgs, DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } - break; - default: - Log(String("Dialog: Too many arguments (%u) for \"%s\" in %u", numArgs, DialogCommandStr[curCmd], id), PM_DEBUG_ERROR); - isValid = false; } break; case DC_COIN_LIST: @@ -268,30 +231,25 @@ void PokeGen::PokeMod::Dialog::Validate() { if (!(arg.Convert(tempU) ? pokemod->GetCoinList(tempU) : pokemod->GetCoinList(arg))) { - Log(String("Dialog: Invalid argument #1 in \"Coin List\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Coin List\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } } - else - { - Log(String("Dialog: Too many arguments (%u) for \"Coin List\" in %u", numArgs, id), PM_DEBUG_ERROR); - isValid = false; - } break; case DC_TEACH_MOVE: switch (numArgs) { case 1: - if ((arg != "Call") || (arg != "Goto") || (arg != "0") || (arg != "1")) + if ((arg != "Call") && (arg != "Goto") && (arg != "0") && (arg != "1")) { - Log(String("Dialog: Invalid argument #1 in \"Teach Move\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Teach Move\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } break; case 2: if (!(arg.Convert(tempU) ? pokemod->GetMove(tempU) : pokemod->GetMove(arg))) { - Log(String("Dialog: Invalid argument #2 in \"Teach Move\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #2 in \"Teach Move\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } break; @@ -300,36 +258,32 @@ void PokeGen::PokeMod::Dialog::Validate() case 5: if (!arg.Convert(tempU) || !pokemod->GetDialog(tempU)) { - Log(String("Dialog: Invalid argument #%u in \"Teach Move\" in %u", numArgs, id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #%u in \"Teach Move\" in %u", numArgs, id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } - break; - default: - Log(String("Dialog: Too many arguments (%u) for \"Teach Move\" in %u", numArgs, id), PM_DEBUG_ERROR); - isValid = false; } break; case DC_CHECK_MOVE: switch (numArgs) { case 1: - if ((arg != "Call") || (arg != "Goto") || (arg != "0") || (arg != "1")) + if ((arg != "Call") && (arg != "Goto") && (arg != "0") && (arg != "1")) { - Log(String("Dialog: Invalid argument #1 in \"Check Move\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Check Move\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } break; case 2: - if ((arg != "Lead") || (arg != "All") || (arg != "0") || (arg != "1")) + if ((arg != "Lead") && (arg != "All") && (arg != "0") && (arg != "1")) { - Log(String("Dialog: Invalid argument #2 in \"Check Move\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #2 in \"Check Move\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } break; case 3: if (!(arg.Convert(tempU) ? pokemod->GetMove(tempU) : pokemod->GetMove(arg))) { - Log(String("Dialog: Invalid argument #3 in \"Check Move\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #3 in \"Check Move\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } break; @@ -337,22 +291,103 @@ void PokeGen::PokeMod::Dialog::Validate() case 5: if (!arg.Convert(tempU) || !pokemod->GetDialog(tempU)) { - Log(String("Dialog: Invalid argument #%u in \"Check Move\" in %u", numArgs, id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #%u in \"Check Move\" in %u", numArgs, id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } - break; - default: - Log(String("Dialog: Too many arguments (%u) for \"Check Move\" in %u", numArgs, id), PM_DEBUG_ERROR); - isValid = false; } break; case DC_GIVE_POKEMON: + switch (numArgs) + { + case 1: + if ((arg != "Call") && (arg != "Goto") && (arg != "0") && (arg != "1")) + { + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Give Pokémon\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + break; + case 2: + if (!(arg.Convert(tempU) ? pokemod->GetPokemon(tempU) : pokemod->GetPokemon(arg))) + { + Log::Write(String("Dialog Validation: Invalid argument #3 in \"Give Pokémon\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + break; + case 3: + if ((arg != "false") && (arg != "true") && (arg != "0") && (arg != "1")) + { + Log::Write(String("Dialog Validation: Invalid argument #3 in \"Give Pokémon\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + break; + case 4: + if (arg.Convert(tempUL)) + { + if (pokemod->GetMaxLevel() < tempUL) + { + Log::Write(String("Dialog Validation: Higher level than allowed in \"Give Pokémon\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } + else + { + Log::Write(String("Dialog Validation: Invalid argument #4 in \"Give Pokémon\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + break; + case 5: + if (!arg.Convert(tempUL)) + { + Log::Write(String("Dialog Validation: Invalid argument #5 in \"Give Pokémon\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + break; + case 6: + case 7: + if (!arg.Convert(tempU) || !pokemod->GetDialog(tempU)) + { + Log::Write(String("Dialog Validation: Invalid argument #%u in \"Give Pokémon\" in %u", numArgs, id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } break; case DC_TAKE_POKEMON: + case DC_VIEW_POKEMON: + case DC_CHECK_SPECIES: + switch (numArgs) + { + case 1: + if ((arg != "Call") && (arg != "Goto") && (arg != "0") && (arg != "1")) + { + Log::Write(String("Dialog Validation: Invalid argument #1 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + break; + case 2: + if (!(arg.Convert(tempU) ? pokemod->GetPokemon(tempU) : pokemod->GetPokemon(arg))) + { + Log::Write(String("Dialog Validation: Invalid argument #2 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + break; + case 3: + case 4: + if (!arg.Convert(tempU) || !pokemod->GetDialog(tempU)) + { + Log::Write(String("Dialog Validation: Invalid argument #%u in \"%s\" in %u", numArgs, DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } break; case DC_SHOW_POKEMON: - break; - case DC_VIEW_POKEMON: + if (numArgs == 1) + { + if (!(arg.Convert(tempU) ? pokemod->GetPokemon(tempU) : pokemod->GetPokemon(arg))) + { + Log::Write(String("Dialog Validation: Invalid argument #2 in \"Show Pokémon\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } break; case DC_GIVE_MONEY: if (numArgs == 1) @@ -361,29 +396,24 @@ void PokeGen::PokeMod::Dialog::Validate() { if (pokemod->GetMaxMoney() < tempUL) { - Log(String("Dialog: More money given than can be held in \"Give Money\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: More money given than can be held in \"Give Money\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } } else { - Log(String("Dialog: Invalid argument #1 in \"Give Money\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Give Money\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } } - else - { - Log(String("Dialog: Too many arguments (%u) for \"Give Money\" in %u", numArgs, id), PM_DEBUG_ERROR); - isValid = false; - } break; case DC_TAKE_MONEY: switch (numArgs) { case 1: - if ((arg != "Call") || (arg != "Goto") || (arg != "0") || (arg != "1")) + if ((arg != "Call") && (arg != "Goto") && (arg != "0") && (arg != "1")) { - Log(String("Dialog: Invalid argument #1 in \"Take Money\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Take Money\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } break; @@ -392,13 +422,13 @@ void PokeGen::PokeMod::Dialog::Validate() { if (pokemod->GetMaxMoney() < tempUL) { - Log(String("Dialog: More money taken than can be held in \"Take Money\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: More money taken than can be held in \"Take Money\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } } else { - Log(String("Dialog: Invalid argument #2 in \"Take Money\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #2 in \"Take Money\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } break; @@ -406,58 +436,118 @@ void PokeGen::PokeMod::Dialog::Validate() case 4: if (!arg.Convert(tempU) || !pokemod->GetDialog(tempU)) { - Log(String("Dialog: Invalid argument #%u in \"Take Money\" in %u", numArgs, id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #%u in \"Take Money\" in %u", numArgs, id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } - break; - default: - Log(String("Dialog: Too many arguments (%u) for \"Take Money\" in %u", numArgs, id), PM_DEBUG_ERROR); - isValid = false; } break; case DC_MOVE_EFFECT: + case DC_CHECK_DIRECTION: + switch (numArgs) + { + case 1: + if ((arg != "Call") && (arg != "Goto") && (arg != "0") && (arg != "1")) + { + Log::Write(String("Dialog Validation: Invalid argument #1 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + break; + case 2: + if (!(map = (arg.Convert(tempU) ? (Map *)pokemod->GetMap(tempU) : (Map *)pokemod->GetMap(arg)))) + { + Log::Write(String("Dialog Validation: Invalid argument #2 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + break; + case 3: + if (map) + { + if (!(arg.Convert(tempU) ? map->GetMapEffect(tempU) : map->GetMapEffect(arg))) + { + Log::Write(String("Dialog Validation: Invalid argument #3 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } + else if ((arg != "Player") && (arg != "-1")) + Log::Write(String("Dialog Validation: Unable to validate argument #3 in \"%s\" in %u", id), PM_DEBUG_ERROR); + break; + case 4: + if ((arg != "Up") && (arg != "Down") && (arg != "Left") && (arg != "Right") && ((arg != "Random") || (curCmd == DC_CHECK_DIRECTION)) && (arg != "0") && (arg != "1") && (arg != "2") && (arg != "3") && ((arg != "4") || (curCmd == DC_CHECK_DIRECTION))) + { + Log::Write(String("Dialog Validation: Invalid argument #4 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + break; + case 5: + case 6: + if (!arg.Convert(tempU) || !pokemod->GetDialog(tempU)) + { + Log::Write(String("Dialog Validation: Invalid argument #%u in \"%s\" in %u", numArgs, DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } break; case DC_TURN_EFFECT: - break; - case DC_CHECK_DIRECTION: + switch (numArgs) + { + case 1: + if (!(map = (arg.Convert(tempU) ? (Map *)pokemod->GetMap(tempU) : (Map *)pokemod->GetMap(arg)))) + { + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Turn Effect\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + break; + case 2: + if (map) + { + if (!(arg.Convert(tempU) ? map->GetMapEffect(tempU) : map->GetMapEffect(arg))) + { + Log::Write(String("Dialog Validation: Invalid argument #2 in \"Turn Effect\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } + else if ((arg != "Player") && (arg != "-1")) + Log::Write(String("Dialog Validation: Unable to validate argument #2 in \"Turn Effect\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + break; + case 4: + if ((arg != "Up") && (arg != "Down") && (arg != "Left") && (arg != "Right") && (arg != "Random") && (arg != "0") && (arg != "1") && (arg != "2") && (arg != "3") && (arg != "4")) + { + Log::Write(String("Dialog Validation: Invalid argument #3 in \"Turn Effect\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } break; case DC_CHECK_ROSTER: - break; case DC_CHECK_LEVELS: - break; - case DC_CHECK_SPECIES: - break; - case DC_CHECK_HELD_ITEMS: - break; case DC_CHECK_MONEY: switch (numArgs) { case 1: - if ((arg != "Call") || (arg != "Goto") || (arg != "0") || (arg != "1")) + if ((arg != "Call") && (arg != "Goto") && (arg != "0") && (arg != "1")) { - Log(String("Dialog: Invalid argument #1 in \"Check Money\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #1 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } break; case 2: - if ((arg != "<") || (arg != ">") || (arg != "=")) + if ((arg != "<") && (arg != ">") && (arg != "=")) { - Log(String("Dialog: Invalid argument #2 in \"Check Money\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #2 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } break; case 3: if (arg.Convert(tempUL)) { - if (pokemod->GetMaxMoney() < tempUL) + if (((curCmd == DC_CHECK_ROSTER) ? pokemod->GetMaxParty() : ((curCmd == DC_CHECK_LEVELS) ? pokemod->GetMaxLevel() : pokemod->GetMaxMoney())) < tempUL) { - Log(String("Dialog: More money than can be held in \"Check Money\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: More %s than can be carried in \"%s\" in %u", (curCmd == DC_CHECK_ROSTER) ? "party members" : ((curCmd == DC_CHECK_LEVELS) ? "level" : "money"), DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } } else { - Log(String("Dialog: Invalid argument #3 in \"Check Money\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #3 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } break; @@ -465,63 +555,140 @@ void PokeGen::PokeMod::Dialog::Validate() case 5: if (!arg.Convert(tempU) || !pokemod->GetDialog(tempU)) { - Log(String("Dialog: Invalid argument #%u in \"Check Money\" in %u", numArgs, id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #%u in \"%s\" in %u", numArgs, DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } + break; + case DC_CHECK_HELD_ITEMS: + switch (numArgs) + { + case 1: + if ((arg != "Call") && (arg != "Goto") && (arg != "0") && (arg != "1")) + { + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Check Held Items\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } break; - default: - Log(String("Dialog: Too many arguments (%u) for \"Check Money\" in %u", numArgs, id), PM_DEBUG_ERROR); - isValid = false; + case 2: + case 3: + case 4: + if (!arg.Convert(tempU) || !pokemod->GetDialog(tempU)) + { + Log::Write(String("Dialog Validation: Invalid argument #%u in \"Check Held Items\" in %u", numArgs, id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } } break; case DC_TRADE: + switch (numArgs) + { + case 1: + if ((arg != "Call") && (arg != "Goto") && (arg != "0") && (arg != "1")) + { + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Trade\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + break; + case 2: + case 3: + if (!(arg.Convert(tempU) ? pokemod->GetPokemon(tempU) : pokemod->GetPokemon(arg))) + { + Log::Write(String("Dialog Validation: Invalid argument #%u in \"Trade\" in %u", numArgs, id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + case 4: + if (!arg.Convert(tempUL)) + { + Log::Write(String("Dialog Validation: Invalid argument #4 in \"Trade\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + break; + case 5: + case 6: + if (!arg.Convert(tempU) || !pokemod->GetDialog(tempU)) + { + Log::Write(String("Dialog Validation: Invalid argument #%u in \"Trade\" in %u", numArgs, id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } break; case DC_DAYCARE: + if (numArgs == 1) + { + if (!arg.Convert(tempUL)) + { + Log::Write(String("Dialog Validation: Invalid argument #4 in \"Daycare\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } break; case DC_BATTLE: + if (numArgs == 1) + { + if (!(map = (arg.Convert(tempU) ? (Map *)pokemod->GetMap(tempU) : (Map *)pokemod->GetMap(arg)))) + { + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Battle\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } + else if (numArgs == 2) + { + if (map) + { + if (!(arg.Convert(tempU) ? map->GetMapTrainer(tempU) : map->GetMapTrainer(arg))) + { + Log::Write(String("Dialog Validation: Invalid argument #2 in \"Battle\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } + else + Log::Write(String("Dialog Validation: Unable to validate argument #2 in \"Battle\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + } break; case DC_BADGE: + if (numArgs == 1) + { + if (!(arg.Convert(tempU) ? pokemod->GetBadge(tempU) : pokemod->GetBadge(arg))) + { + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Badge\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } break; case DC_WARP: if (numArgs == 1) { - if (!(map = (arg.Convert(tempU) ? (Map *)pokemod->GetMap(tempU) : (Map *)pokemod->GetMap(arg))) + if (!(map = (arg.Convert(tempU) ? (Map *)pokemod->GetMap(tempU) : (Map *)pokemod->GetMap(arg)))) { - Log(String("Dialog: Invalid argument #1 in \"Warp\" in %u", id), PM_DEBUG_ERROR); - isValid = false; + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Warp\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; } } else if (numArgs == 2) { if (map) { - if (!(arg.Convert(tempU) ? map->GetWarp(tempU) : map->GetWarp(arg))) + if (!(arg.Convert(tempU) ? map->GetMapWarp(tempU) : map->GetMapWarp(arg))) { - Log(String("Dialog: Invalid argument #3 in \"Warp\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #2 in \"Warp\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } } else - Log(String("Dialog: Unable to validate argument #2 in \"Warp\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Unable to validate argument #2 in \"Warp\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); } - else - Log(String("Dialog: Too many arguments (%u) for \"Warp\" in %u", numArgs, id), PM_DEBUG_ERROR); - isValid = false; break; case DC_NAME: + case DC_MAP_SIGN: if (numArgs == 1) { if (arg == "") { - Log(String("Dialog: Invalid argument #1 in \"Name\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #1 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } } - else - { - Log(String("Dialog: Too many arguments (%u) for \"Name\" in %u", numArgs, id), PM_DEBUG_ERROR); - isValid = false; - } break; case DC_MUSIC: case DC_SOUND_EFFECT: @@ -529,39 +696,97 @@ void PokeGen::PokeMod::Dialog::Validate() { if (!Path(pokemod->GetPath() + "sound/" + arg).DoesExist()) { - Log(String("Dialog: Invalid argument #1 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #1 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } } - else - { - Log(String("Dialog: Too many arguments (%u) for \"%s\" in %u", numArgs, DialogCommandStr[curCmd], id), PM_DEBUG_ERROR); - isValid = false; - } break; case DC_TIMER: - break; - case DC_MAP_SIGN: + switch (numArgs) + { + case 1: + if ((arg != "Time") && (arg != "Step") && (arg != "0") && (arg != "1")) + { + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Timer\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + break; + case 2: + if (!arg.Convert(tempU)) + { + Log::Write(String("Dialog Validation: Invalid argument #2 in \"Timer\" in %u", numArgs, id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + break; + case 3: + if (!arg.Convert(tempU) || !pokemod->GetDialog(tempU)) + { + Log::Write(String("Dialog Validation: Invalid argument #3 in \"Timer\" in %u", numArgs, id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } break; case DC_WILD_SCOPE: + if (numArgs == 1) + { + if (!arg.Convert(tempU)) + { + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Wild Scope\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } break; case DC_SAFARI: - break; - case DC_HEAL_PARTY: - case DC_REFRESH: - case DC_CLEAR: - case DC_PAUSE: - case DC_NEW_LINE: - case DC_EXIT: - Log(String("Dialog: Too many arguments (%u) for \"%s\" in %u", numArgs, DialogCommandStr[curCmd], id), PM_DEBUG_ERROR); - isValid = false; + switch (numArgs) + { + case 1: + if (const Item *item = (arg.Convert(tempU) ? pokemod->GetItem(tempU) : pokemod->GetItem(arg))) + { + unsigned i = 0; + unsigned j = 0; + bool temp = false; + while ((i < item->GetItemEffectCount()) || !temp) + { + if (const ItemEffect *e = item->GetItemEffect(j++)) + { + ++i; + if (e->GetEffect() == IE_BALL) + temp = true; + } + } + if (!temp) + { + Log::Write(String("Dialog Validation: Item in argument #1 in \"Safari\" in %u isn\'t a PokéBall", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } + else + { + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Safari\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + break; + case 2: + if (!arg.Convert(tempU)) + { + Log::Write(String("Dialog Validation: Invalid argument #2 in \"Safari\" in %u", numArgs, id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + break; + case 3: + if (!arg.Convert(tempU) || (pokemod->GetMaxParty() < tempU)) + { + Log::Write(String("Dialog Validation: Invalid argument #3 in \"Safari\" in %u", numArgs, id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); + isValid = false; + } + } break; case DC_MENU: if (numArgs == 1) { - if ((arg != "Call") || (arg != "Goto") || (arg != "0") || (arg != "1")) + if ((arg != "Call") && (arg != "Goto") && (arg != "0") && (arg != "1")) { - Log(String("Dialog: Invalid argument #1 in \"Menu\" in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #1 in \"Menu\" in %u", id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } } @@ -571,19 +796,19 @@ void PokeGen::PokeMod::Dialog::Validate() { if (!pokemod->GetDialog(tempU)) { - Log(String("Dialog: Invalid argument #%u in \"Menu\" in %u", numArgs, id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #%u in \"Menu\" in %u", numArgs, id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } } else { - Log(String("Dialog: Invalid argument #%u in \"Menu\" in %u", numArgs, id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #%u in \"Menu\" in %u", numArgs, id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } } else if (arg == "") { - Log(String("Dialog: Invalid argument #%u in \"Menu\" in %u", numArgs, id), PM_DEBUG_ERROR); + Log::Write(String("Dialog Validation: Invalid argument #%u in \"Menu\" in %u", numArgs, id), PM_DEBUG_ERROR | PM_DEBUG_VALIDATION); isValid = false; } } @@ -633,10 +858,10 @@ PokeGen::PokeMod::String PokeGen::PokeMod::Dialog::GetDialog() const void PokeGen::PokeMod::Dialog::InsertDialogCommand(const String &cmd, const unsigned pos) { - Log(String("Dialog: Inserting dialog command %s into %u at %u", cmd.c_str(), id, pos), PM_DEBUG_INFO); + Log::Write(String("Dialog: Inserting dialog command %s into %u at %u", cmd.c_str(), id, pos), PM_DEBUG_INFO); if (dialog.length() < pos) { - Log(String("Dialog: Position out-of-range in %u", id), PM_DEBUG_ERROR); + Log::Write(String("Dialog: Position out-of-range in %u", id), PM_DEBUG_ERROR); return; } dialog.insert(pos, cmd); -- cgit