aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2017-09-24 12:18:15 -0400
committerGitHub2017-09-24 12:18:15 -0400
commit47f6c2e9b9687150da6d5d1498fce90523706c28 (patch)
tree2b9c3b5424ce427098cfd770ef09784d482b2b24
parent3333432b4dc35b65d27423ab7860fae068b13d5e (diff)
parent1ecb27e6cc32eba24079e9b28aea414319c6cbcf (diff)
downloadscummvm-rg350-47f6c2e9b9687150da6d5d1498fce90523706c28.tar.gz
scummvm-rg350-47f6c2e9b9687150da6d5d1498fce90523706c28.tar.bz2
scummvm-rg350-47f6c2e9b9687150da6d5d1498fce90523706c28.zip
Merge pull request #1010 from dreammaster/debugger_params
GUI: Support double quoted debugger parameters
-rw-r--r--engines/titanic/core/game_object.cpp21
-rw-r--r--engines/titanic/core/project_item.cpp26
-rw-r--r--engines/titanic/core/project_item.h9
-rw-r--r--engines/titanic/debugger.cpp18
-rw-r--r--gui/console.cpp4
-rw-r--r--gui/debugger.cpp63
-rw-r--r--gui/debugger.h6
7 files changed, 110 insertions, 37 deletions
diff --git a/engines/titanic/core/game_object.cpp b/engines/titanic/core/game_object.cpp
index 4534d09724..d52fa27669 100644
--- a/engines/titanic/core/game_object.cpp
+++ b/engines/titanic/core/game_object.cpp
@@ -1206,28 +1206,11 @@ void CGameObject::loadSurface() {
}
bool CGameObject::changeView(const CString &viewName) {
- return changeView(viewName, "");
+ return getRoot()->changeView(viewName, "");
}
bool CGameObject::changeView(const CString &viewName, const CString &clipName) {
- CViewItem *newView = parseView(viewName);
- CGameManager *gameManager = getGameManager();
- CViewItem *oldView = gameManager->getView();
-
- if (!oldView || !newView)
- return false;
-
- CMovieClip *clip = nullptr;
- if (!clipName.empty()) {
- clip = oldView->findNode()->findRoom()->findClip(clipName);
- } else {
- CLinkItem *link = oldView->findLink(newView);
- if (link)
- clip = link->getClip();
- }
-
- gameManager->_gameState.changeView(newView, clip);
- return true;
+ return getRoot()->changeView(viewName, clipName);
}
void CGameObject::dragMove(const Point &pt) {
diff --git a/engines/titanic/core/project_item.cpp b/engines/titanic/core/project_item.cpp
index 16fe0e6ec1..b2bd5cd92b 100644
--- a/engines/titanic/core/project_item.cpp
+++ b/engines/titanic/core/project_item.cpp
@@ -631,4 +631,30 @@ CViewItem *CProjectItem::parseView(const CString &viewString) {
return view;
}
+bool CProjectItem::changeView(const CString &viewName) {
+ return changeView(viewName, "");
+}
+
+bool CProjectItem::changeView(const CString &viewName, const CString &clipName) {
+ CViewItem *newView = parseView(viewName);
+ CGameManager *gameManager = getGameManager();
+ CViewItem *oldView = gameManager->getView();
+
+ if (!oldView || !newView)
+ return false;
+
+ CMovieClip *clip = nullptr;
+ if (!clipName.empty()) {
+ clip = oldView->findNode()->findRoom()->findClip(clipName);
+ } else {
+ CLinkItem *link = oldView->findLink(newView);
+ if (link)
+ clip = link->getClip();
+ }
+
+ gameManager->_gameState.changeView(newView, clip);
+ return true;
+}
+
+
} // End of namespace Titanic
diff --git a/engines/titanic/core/project_item.h b/engines/titanic/core/project_item.h
index 4a87e64e2e..c9fd6f97cb 100644
--- a/engines/titanic/core/project_item.h
+++ b/engines/titanic/core/project_item.h
@@ -242,6 +242,15 @@ public:
*/
CViewItem *parseView(const CString &viewString);
+ /**
+ * Change the view
+ */
+ bool changeView(const CString &viewName, const CString &clipName);
+
+ /**
+ * Change the view
+ */
+ bool changeView(const CString &viewName);
};
} // End of namespace Titanic
diff --git a/engines/titanic/debugger.cpp b/engines/titanic/debugger.cpp
index 5119f23c94..7438a0053b 100644
--- a/engines/titanic/debugger.cpp
+++ b/engines/titanic/debugger.cpp
@@ -168,9 +168,18 @@ bool Debugger::cmdRoom(int argc, const char **argv) {
} else if (argc >= 2) {
CRoomItem *roomItem = findRoom(argv[1]);
- if (!roomItem)
- debugPrintf("Could not find room - %s\n", argv[1]);
- else if (argc == 2)
+ if (!roomItem && argc == 2) {
+ // Presume it's a full view specified
+ CProjectItem *project = g_vm->_window->_project;
+ CViewItem *view = project->parseView(argv[1]);
+
+ if (view) {
+ project->changeView(argv[1]);
+ return false;
+ } else {
+ debugPrintf("Could not find view - %s\n", argv[1]);
+ }
+ } else if (argc == 2)
listRoom(roomItem);
else {
CNodeItem *nodeItem = findNode(roomItem, argv[2]);
@@ -322,9 +331,6 @@ bool Debugger::cmdMovie(int argc, const char **argv) {
bool Debugger::cmdSound(int argc, const char **argv) {
if (argc == 2) {
Common::String name = argv[1];
- const char *ch = strchr(argv[1], '!');
- if (ch)
- name.setChar('#', ch - argv[1]);
if (!name.contains("#"))
name = "z#" + name;
diff --git a/gui/console.cpp b/gui/console.cpp
index 27b38ac78b..f99197c32d 100644
--- a/gui/console.cpp
+++ b/gui/console.cpp
@@ -480,9 +480,7 @@ void ConsoleDialog::handleKeyDown(Common::KeyState state) {
}
void ConsoleDialog::defaultKeyDownHandler(Common::KeyState &state) {
- if (state.ascii == '~' || state.ascii == '#') {
- slideUpAndClose();
- } else if (state.hasFlags(Common::KBD_CTRL)) {
+ if (state.hasFlags(Common::KBD_CTRL)) {
specialKeys(state.keycode);
} else if ((state.ascii >= 32 && state.ascii <= 127) || (state.ascii >= 160 && state.ascii <= 255)) {
for (int i = _promptEndPos - 1; i >= _currentPos; i--)
diff --git a/gui/debugger.cpp b/gui/debugger.cpp
index a570d86b70..1de322ae93 100644
--- a/gui/debugger.cpp
+++ b/gui/debugger.cpp
@@ -289,17 +289,11 @@ bool Debugger::handleCommand(int argc, const char **argv, bool &result) {
bool Debugger::parseCommand(const char *inputOrig) {
int num_params = 0;
const char *param[256];
- char *input = strdup(inputOrig); // One of the rare occasions using strdup is OK (although avoiding strtok might be more elegant here).
// Parse out any params
- char *tok = strtok(input, " ");
- if (tok) {
- do {
- param[num_params++] = tok;
- } while ((tok = strtok(NULL, " ")) != NULL);
- } else {
- param[num_params++] = input;
- }
+ // One of the rare occasions using strdup is OK, since splitCommands needs to modify it
+ char *input = strdup(inputOrig);
+ splitCommand(input, num_params, &param[0]);
// Handle commands first
bool result;
@@ -399,6 +393,57 @@ bool Debugger::parseCommand(const char *inputOrig) {
return true;
}
+void Debugger::splitCommand(char *input, int &argc, const char **argv) {
+ byte c;
+ enum states { DULL, IN_WORD, IN_STRING } state = DULL;
+ const char *paramStart = nullptr;
+
+ argc = 0;
+ for (char *p = input; *p; ++p) {
+ c = (byte)*p;
+
+ switch (state) {
+ case DULL:
+ // not in a word, not in a double quoted string
+ if (isspace(c))
+ break;
+
+ // not a space -- if it's a double quote we go to IN_STRING, else to IN_WORD
+ if (c == '"') {
+ state = IN_STRING;
+ paramStart = p + 1; // word starts at *next* char, not this one
+ } else {
+ state = IN_WORD;
+ paramStart = p; // word starts here
+ }
+ break;
+
+ case IN_STRING:
+ // we're in a double quoted string, so keep going until we hit a close "
+ if (c == '"') {
+ // Add entire quoted string to parameter list
+ *p = '\0';
+ argv[argc++] = paramStart;
+ state = DULL; // back to "not in word, not in string" state
+ }
+ break;
+
+ case IN_WORD:
+ // we're in a word, so keep going until we get to a space
+ if (isspace(c)) {
+ *p = '\0';
+ argv[argc++] = paramStart;
+ state = DULL; // back to "not in word, not in string" state
+ }
+ break;
+ }
+ }
+
+ if (state != DULL)
+ // Add in final parameter
+ argv[argc++] = paramStart;
+}
+
// returns true if something has been completed
// completion has to be delete[]-ed then
bool Debugger::tabComplete(const char *input, Common::String &completion) const {
diff --git a/gui/debugger.h b/gui/debugger.h
index bc9306c1de..b12bd2761e 100644
--- a/gui/debugger.h
+++ b/gui/debugger.h
@@ -204,6 +204,12 @@ protected:
private:
void enter();
+ /**
+ * Splits up the input into individual parameters
+ * @remarks Adapted from code provided by torek on StackOverflow
+ */
+ void splitCommand(char *input, int &argc, const char **argv);
+
bool parseCommand(const char *input);
bool tabComplete(const char *input, Common::String &completion) const;