aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/console.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/console.cpp')
-rw-r--r--engines/sci/console.cpp166
1 files changed, 113 insertions, 53 deletions
diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp
index d4b909a4a0..70d7b85a36 100644
--- a/engines/sci/console.cpp
+++ b/engines/sci/console.cpp
@@ -29,51 +29,11 @@
#include "sci/console.h"
#include "sci/resource.h"
#include "sci/vocabulary.h"
+#include "sci/engine/state.h"
namespace Sci {
extern EngineState *g_EngineState;
-extern bool g_redirect_sciprintf_to_gui;
-
-class ConsoleFunc : public Common::Functor2<int, const char **, bool> {
-public:
- ConsoleFunc(const ConCommand &func, const char *param) : _func(func), _param(param) {}
-
- bool isValid() const { return _func != 0; }
- bool operator()(int argc, const char **argv) const {
-#if 1
- // FIXME: Evil hack: recreate the original input string
- Common::String tmp = argv[0];
- for (int i = 1; i < argc; ++i) {
- tmp += ' ';
- tmp += argv[i];
- }
- g_redirect_sciprintf_to_gui = true;
- con_parse(g_EngineState, tmp.c_str());
- sciprintf("\n");
- g_redirect_sciprintf_to_gui = false;
-
- return true;
-#else
- Common::Array<cmd_param_t> cmdParams;
- for (int i = 1; i < argc; ++i) {
- cmd_param_t tmp;
- tmp.str = argv[i];
- // TODO: Convert argc/argv suitable, using _param
- cmdParams.push_back(tmp);
- }
- assert(g_EngineState);
- return !(*_func)(g_EngineState, cmdParams);
-#endif
- }
-private:
- EngineState *_s;
- const ConCommand _func;
- const char *_param;
-};
-
-
-
Console::Console(SciEngine *vm) : GUI::Debugger() {
_vm = vm;
@@ -91,7 +51,23 @@ Console::Console(SciEngine *vm) : GUI::Debugger() {
DCmd_Register("size", WRAP_METHOD(Console, cmdResourceSize));
DCmd_Register("restypes", WRAP_METHOD(Console, cmdResourceTypes));
DCmd_Register("sci0_palette", WRAP_METHOD(Console, cmdSci0Palette));
+ DCmd_Register("hexgrep", WRAP_METHOD(Console, cmdHexgrep));
+ DCmd_Register("list", WRAP_METHOD(Console, cmdList));
DCmd_Register("exit", WRAP_METHOD(Console, cmdExit));
+
+ // These were in sci.cpp
+ /*
+ con_hook_int(&(gfx_options.buffer_pics_nr), "buffer_pics_nr",
+ "Number of pics to buffer in LRU storage\n");
+ con_hook_int(&(gfx_options.pic0_dither_mode), "pic0_dither_mode",
+ "Mode to use for pic0 dithering\n");
+ con_hook_int(&(gfx_options.pic0_dither_pattern), "pic0_dither_pattern",
+ "Pattern to use for pic0 dithering\n");
+ con_hook_int(&(gfx_options.pic0_unscaled), "pic0_unscaled",
+ "Whether pic0 should be drawn unscaled\n");
+ con_hook_int(&(gfx_options.dirty_frames), "dirty_frames",
+ "Dirty frames management\n");
+ */
}
Console::~Console() {
@@ -108,11 +84,6 @@ static ResourceType parseResourceType(const char *resid) {
return res;
}
-void Console::con_hook_command(ConCommand command, const char *name, const char *param, const char *description) {
- DCmd_Register(name, new ConsoleFunc(command, param));
-}
-
-
bool Console::cmdGetVersion(int argc, const char **argv) {
int ver = _vm->getVersion();
@@ -236,13 +207,7 @@ bool Console::cmdKernelWords(int argc, const char **argv) {
bool Console::cmdHexDump(int argc, const char **argv) {
if (argc != 3) {
DebugPrintf("Usage: %s <resource type> <resource number>\n", argv[0]);
- DebugPrintf("The %d valid resource types are:\n", kResourceTypeInvalid);
- // There are 20 resource types supported by SCI1.1
- for (int i = 0; i < kResourceTypeInvalid; i++) {
- DebugPrintf("%s", getResourceTypeName((ResourceType) i));
- DebugPrintf((i < kResourceTypeInvalid - 1) ? ", " : "\n");
- }
-
+ cmdResourceTypes(argc, argv);
return true;
}
@@ -348,6 +313,101 @@ bool Console::cmdSci0Palette(int argc, const char **argv) {
return false;
}
+bool Console::cmdHexgrep(int argc, const char **argv) {
+ if (argc < 4) {
+ DebugPrintf("Searches some resources for a particular sequence of bytes, represented as hexadecimal numbers.\n");
+ DebugPrintf("Usage: %s <resource type> <resource number> <search string>\n", argv[0]);
+ DebugPrintf("<resource number> can be a specific resource number, or \"all\" for all of the resources of the specified type\n", argv[0]);
+ DebugPrintf("EXAMPLES:\n hexgrep script all e8 03 c8 00\n hexgrep pic 042 fe");
+ cmdResourceTypes(argc, argv);
+ return true;
+ }
+
+ ResourceType restype = parseResourceType(argv[1]);
+ int resNumber = 0, resMax = 0;
+ char seekString[500];
+ Resource *script = NULL;
+
+ if (restype == kResourceTypeInvalid) {
+ DebugPrintf("Resource type '%s' is not valid\n", argv[1]);
+ return true;
+ }
+
+ if (!scumm_stricmp(argv[2], "all")) {
+ resNumber = 0;
+ resMax = 999;
+ } else {
+ resNumber = resMax = atoi(argv[2]);
+ }
+
+ strcpy(seekString, argv[3]);
+
+ // Construct the seek string
+ for (int i = 4; i < argc; i++) {
+ strcat(seekString, argv[i]);
+ }
+
+ for (; resNumber <= resMax; resNumber++) {
+ if ((script = _vm->getResMgr()->findResource(restype, resNumber, 0))) {
+ unsigned int seeker = 0, seekerold = 0;
+ uint32 comppos = 0;
+ int output_script_name = 0;
+
+ while (seeker < script->size) {
+ if (script->data[seeker] == seekString[comppos]) {
+ if (comppos == 0)
+ seekerold = seeker;
+
+ comppos++;
+
+ if (comppos == strlen(seekString)) {
+ comppos = 0;
+ seeker = seekerold + 1;
+
+ if (!output_script_name) {
+ DebugPrintf("\nIn %s.%03d:\n", getResourceTypeName((ResourceType)restype), resNumber);
+ output_script_name = 1;
+ }
+ DebugPrintf(" 0x%04x\n", seekerold);
+ }
+ } else
+ comppos = 0;
+
+ seeker++;
+ }
+ }
+ }
+
+ return true;
+}
+
+bool Console::cmdList(int argc, const char **argv) {
+ if (argc != 2) {
+ DebugPrintf("Lists all of the resources of a given type\n");
+ cmdResourceTypes(argc, argv);
+ return true;
+ }
+
+
+ ResourceType res = parseResourceType(argv[1]);
+ if (res == kResourceTypeInvalid)
+ DebugPrintf("Unknown resource type: '%s'\n", argv[1]);
+ else {
+ int j = 0;
+ for (int i = 0; i < sci_max_resource_nr[_vm->getResMgr()->_sciVersion]; i++) {
+ if (_vm->getResMgr()->testResource(res, i)) {
+ DebugPrintf("%s.%03d | ", getResourceTypeName((ResourceType)res), i);
+ if (j % 5 == 0)
+ DebugPrintf("\n");
+ j++;
+ }
+ }
+ DebugPrintf("\n");
+ }
+
+ return true;
+}
+
bool Console::cmdExit(int argc, const char **argv) {
if (argc != 2) {
DebugPrintf("exit game - exit gracefully\n");