summaryrefslogtreecommitdiffstats
path: root/pokemod/Dialog.cpp
diff options
context:
space:
mode:
authorBen Boeckel <MathStuf@gmail.com>2007-06-28 15:25:39 +0000
committerBen Boeckel <MathStuf@gmail.com>2007-06-28 15:25:39 +0000
commit9102febc37475af113681eaaee02ecc2ea04b4da (patch)
treead08b65668913258d28022f79b202ceaeddfb7c8 /pokemod/Dialog.cpp
parent5c3ca621f75587173bab3d946aee81dd2d36f495 (diff)
downloadsigen-9102febc37475af113681eaaee02ecc2ea04b4da.tar.gz
sigen-9102febc37475af113681eaaee02ecc2ea04b4da.tar.xz
sigen-9102febc37475af113681eaaee02ecc2ea04b4da.zip
Minor various fixes, Dialog validation started, GUI fixes, String methods added
git-svn-id: https://pokegen.svn.sourceforge.net/svnroot/pokegen/trunk@21 6ecfd1a5-f3ed-3746-8530-beee90d26b22
Diffstat (limited to 'pokemod/Dialog.cpp')
-rw-r--r--pokemod/Dialog.cpp545
1 files changed, 541 insertions, 4 deletions
diff --git a/pokemod/Dialog.cpp b/pokemod/Dialog.cpp
index 0ff37cef..53e3afc0 100644
--- a/pokemod/Dialog.cpp
+++ b/pokemod/Dialog.cpp
@@ -51,9 +51,546 @@ void PokeGen::PokeMod::Dialog::Validate(const wxListBox &output)
void PokeGen::PokeMod::Dialog::Validate()
#endif
{
- LogValidateStart("Dialog", id);
- // TODO (Validation#1#): Dialog Validation
-# warning "Dialog Validation"
+ LogValidateStart("Dialog", id);
+ if (dialog == "")
+ {
+ LogVarNotSet("Dialog", id, "dialog");
+ isValid = false;
+ }
+ if (dialog.Count('%') % 2)
+ {
+ Log(String("Dialog: Command delimiter mismatch in %u", id), PM_DEBUG_ERROR);
+ isValid = false;
+ }
+ else
+ {
+ unsigned curCmd = DC_END;
+ unsigned numArgs = 0;
+ for (unsigned i = 0; i < dialog.length(); ++i)
+ {
+ switch (dialog[i])
+ {
+ case '%':
+ switch (curCmd)
+ {
+ 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);
+ isValid = false;
+ }
+ break;
+ case DC_MENU:
+ if (!(numArgs % 2))
+ {
+ Log(String("Dialog: Argument mismatch for Menu in %u", id), PM_DEBUG_ERROR);
+ isValid = false;
+ }
+ break;
+ case DC_END:
+ String curCmdStr;
+ for (; (dialog[i] != '%') && (dialog[i] != '#'); ++i)
+ curCmdStr.append(1, dialog[i]);
+ if (((curCmd = FindIn(DC_END, curCmdStr, DialogCommandAbbrStr)) == DC_END))
+ {
+ if (curCmdStr != "")
+ {
+ Log(String("Dialog: Invalid command \"%s\" in %u", curCmdStr.c_str(), id), PM_DEBUG_ERROR);
+ isValid = false;
+ }
+ curCmd = DC_END;
+ }
+ numArgs = 0;
+ }
+ case '#':
+ if (curCmd != DC_END)
+ {
+ String arg;
+ unsigned tempU;
+ unsigned long tempUL;
+ Map *map = NULL;
+ for (; (dialog[i] != '%') && (dialog[i] != '#'); ++i)
+ arg.append(1, dialog[i]);
+ ++numArgs;
+ // TODO (Ben#1#): Argument parsing checks
+ switch (curCmd)
+ {
+ case DC_FLIP_FLAG:
+ case DC_SET_FLAG:
+ case DC_UNSET_FLAG:
+ case DC_RANDOMIZE_FLAG:
+ if (numArgs == 1)
+ {
+ if (!arg.Convert(tempUL))
+ {
+ Log(String("Dialog: Bad flag in \"%s\" on %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR);
+ 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"))
+ {
+ Log(String("Dialog: Invalid argument #1 in \"Test Flag\" in %u", id), PM_DEBUG_ERROR);
+ 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);
+ isValid = false;
+ }
+ break;
+ 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);
+ 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)
+ {
+ 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);
+ isValid = false;
+ }
+ break;
+ case DC_YES_NO:
+ case DC_DELETE_MOVE:
+ switch (numArgs)
+ {
+ case 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);
+ isValid = false;
+ }
+ break;
+ case 2:
+ 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);
+ 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:
+ if (numArgs == 1)
+ {
+ 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);
+ 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:
+ case DC_CHECK_ITEM:
+ switch (numArgs)
+ {
+ case 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);
+ 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);
+ isValid = false;
+ }
+ break;
+ case 3:
+ 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);
+ 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:
+ if (numArgs == 1)
+ {
+ 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);
+ 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"))
+ {
+ Log(String("Dialog: Invalid argument #1 in \"Teach Move\" in %u", id), PM_DEBUG_ERROR);
+ 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);
+ isValid = false;
+ }
+ break;
+ case 3:
+ case 4:
+ 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);
+ 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"))
+ {
+ Log(String("Dialog: Invalid argument #1 in \"Check Move\" in %u", id), PM_DEBUG_ERROR);
+ isValid = false;
+ }
+ break;
+ case 2:
+ if ((arg != "Lead") || (arg != "All") || (arg != "0") || (arg != "1"))
+ {
+ Log(String("Dialog: Invalid argument #2 in \"Check Move\" in %u", id), PM_DEBUG_ERROR);
+ 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);
+ isValid = false;
+ }
+ break;
+ case 4:
+ 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);
+ 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:
+ break;
+ case DC_TAKE_POKEMON:
+ break;
+ case DC_SHOW_POKEMON:
+ break;
+ case DC_VIEW_POKEMON:
+ break;
+ case DC_GIVE_MONEY:
+ if (numArgs == 1)
+ {
+ if (arg.Convert(tempUL))
+ {
+ if (pokemod->GetMaxMoney() < tempUL)
+ {
+ Log(String("Dialog: More money given than can be held in \"Give Money\" in %u", id), PM_DEBUG_ERROR);
+ isValid = false;
+ }
+ }
+ else
+ {
+ Log(String("Dialog: Invalid argument #1 in \"Give Money\" in %u", id), PM_DEBUG_ERROR);
+ 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"))
+ {
+ Log(String("Dialog: Invalid argument #1 in \"Take Money\" in %u", id), PM_DEBUG_ERROR);
+ isValid = false;
+ }
+ break;
+ case 2:
+ if (arg.Convert(tempUL))
+ {
+ if (pokemod->GetMaxMoney() < tempUL)
+ {
+ Log(String("Dialog: More money taken than can be held in \"Take Money\" in %u", id), PM_DEBUG_ERROR);
+ isValid = false;
+ }
+ }
+ else
+ {
+ Log(String("Dialog: Invalid argument #2 in \"Take Money\" in %u", id), PM_DEBUG_ERROR);
+ isValid = false;
+ }
+ break;
+ case 3:
+ 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);
+ 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:
+ break;
+ case DC_TURN_EFFECT:
+ break;
+ case DC_CHECK_DIRECTION:
+ 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"))
+ {
+ Log(String("Dialog: Invalid argument #1 in \"Check Money\" in %u", id), PM_DEBUG_ERROR);
+ isValid = false;
+ }
+ break;
+ case 2:
+ if ((arg != "<") || (arg != ">") || (arg != "="))
+ {
+ Log(String("Dialog: Invalid argument #2 in \"Check Money\" in %u", id), PM_DEBUG_ERROR);
+ isValid = false;
+ }
+ break;
+ case 3:
+ if (arg.Convert(tempUL))
+ {
+ if (pokemod->GetMaxMoney() < tempUL)
+ {
+ Log(String("Dialog: More money than can be held in \"Check Money\" in %u", id), PM_DEBUG_ERROR);
+ isValid = false;
+ }
+ }
+ else
+ {
+ Log(String("Dialog: Invalid argument #3 in \"Check Money\" in %u", id), PM_DEBUG_ERROR);
+ isValid = false;
+ }
+ break;
+ case 4:
+ 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);
+ isValid = false;
+ }
+ break;
+ default:
+ Log(String("Dialog: Too many arguments (%u) for \"Check Money\" in %u", numArgs, id), PM_DEBUG_ERROR);
+ isValid = false;
+ }
+ break;
+ case DC_TRADE:
+ break;
+ case DC_DAYCARE:
+ break;
+ case DC_BATTLE:
+ break;
+ case DC_BADGE:
+ break;
+ case DC_WARP:
+ if (numArgs == 1)
+ {
+ 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;
+ }
+ }
+ else if (numArgs == 2)
+ {
+ if (map)
+ {
+ if (!(arg.Convert(tempU) ? map->GetWarp(tempU) : map->GetWarp(arg)))
+ {
+ Log(String("Dialog: Invalid argument #3 in \"Warp\" in %u", id), PM_DEBUG_ERROR);
+ isValid = false;
+ }
+ }
+ else
+ Log(String("Dialog: Unable to validate argument #2 in \"Warp\" in %u", id), PM_DEBUG_ERROR);
+ }
+ else
+ Log(String("Dialog: Too many arguments (%u) for \"Warp\" in %u", numArgs, id), PM_DEBUG_ERROR);
+ isValid = false;
+ break;
+ case DC_NAME:
+ if (numArgs == 1)
+ {
+ if (arg == "")
+ {
+ Log(String("Dialog: Invalid argument #1 in \"Name\" in %u", id), PM_DEBUG_ERROR);
+ 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:
+ if (numArgs == 1)
+ {
+ if (!Path(pokemod->GetPath() + "sound/" + arg).DoesExist())
+ {
+ Log(String("Dialog: Invalid argument #1 in \"%s\" in %u", DialogCommandStr[curCmd], id), PM_DEBUG_ERROR);
+ 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:
+ break;
+ case DC_WILD_SCOPE:
+ 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;
+ break;
+ case DC_MENU:
+ if (numArgs == 1)
+ {
+ if ((arg != "Call") || (arg != "Goto") || (arg != "0") || (arg != "1"))
+ {
+ Log(String("Dialog: Invalid argument #1 in \"Menu\" in %u", id), PM_DEBUG_ERROR);
+ isValid = false;
+ }
+ }
+ else if (numArgs % 2)
+ {
+ if (arg.Convert(tempU))
+ {
+ if (!pokemod->GetDialog(tempU))
+ {
+ Log(String("Dialog: Invalid argument #%u in \"Menu\" in %u", numArgs, id), PM_DEBUG_ERROR);
+ isValid = false;
+ }
+ }
+ else
+ {
+ Log(String("Dialog: Invalid argument #%u in \"Menu\" in %u", numArgs, id), PM_DEBUG_ERROR);
+ isValid = false;
+ }
+ }
+ else if (arg == "")
+ {
+ Log(String("Dialog: Invalid argument #%u in \"Menu\" in %u", numArgs, id), PM_DEBUG_ERROR);
+ isValid = false;
+ }
+ }
+ }
+ }
+ }
+ }
LogValidateOver("Dialog", id, isValid);
}
@@ -102,5 +639,5 @@ void PokeGen::PokeMod::Dialog::InsertDialogCommand(const String &cmd, const unsi
Log(String("Dialog: Position out-of-range in %u", id), PM_DEBUG_ERROR);
return;
}
- dialog.insert();
+ dialog.insert(pos, cmd);
}