aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorPaul Gilbert2007-06-22 12:26:10 +0000
committerPaul Gilbert2007-06-22 12:26:10 +0000
commitb923618844aa4a57770e11d12b9cebae268e9ceb (patch)
tree457fdc99f6877641dc0bd2a6b3ab9696731e01cf /engines
parentcabcfdcae11e9b6cc361a27f82215db9060873d0 (diff)
downloadscummvm-rg350-b923618844aa4a57770e11d12b9cebae268e9ceb.tar.gz
scummvm-rg350-b923618844aa4a57770e11d12b9cebae268e9ceb.tar.bz2
scummvm-rg350-b923618844aa4a57770e11d12b9cebae268e9ceb.zip
Added extra information to some methods, and a new method to show an animation sequence
svn-id: r27603
Diffstat (limited to 'engines')
-rw-r--r--engines/lure/debugger.cpp156
-rw-r--r--engines/lure/debugger.h1
2 files changed, 138 insertions, 19 deletions
diff --git a/engines/lure/debugger.cpp b/engines/lure/debugger.cpp
index 953e5643b7..5d1198c360 100644
--- a/engines/lure/debugger.cpp
+++ b/engines/lure/debugger.cpp
@@ -25,7 +25,10 @@
#include "common/stdafx.h"
#include "common/config-manager.h"
+#include "common/endian.h"
+#include "lure/luredefs.h"
#include "lure/debugger.h"
+#include "lure/decode.h"
#include "lure/res.h"
#include "lure/res_struct.h"
#include "lure/room.h"
@@ -44,6 +47,7 @@ Debugger::Debugger(): GUI::Debugger() {
DCmd_Register("hotspots", WRAP_METHOD(Debugger, cmd_hotspots));
DCmd_Register("hotspot", WRAP_METHOD(Debugger, cmd_hotspot));
DCmd_Register("room", WRAP_METHOD(Debugger, cmd_room));
+ DCmd_Register("showanim", WRAP_METHOD(Debugger, cmd_showAnim));
}
static int strToInt(const char *s) {
@@ -115,9 +119,13 @@ bool Debugger::cmd_listRooms(int argc, const char **argv) {
DebugPrintf("Available rooms are:\n");
for (RoomDataList::iterator i = rooms.begin(); i != rooms.end(); ++i) {
RoomData *room = *i;
- strings.getString(room->roomNumber, buffer);
- // DEBUG: Explictly note the second drawbridge room as "Alt" for now
- if (ctr == 42) { strcat(buffer, " (alt)"); }
+ // Explictly note the second drawbridge room as "Alt"
+ if (room->roomNumber == 49) {
+ strings.getString(47, buffer);
+ strcat(buffer, " (alt)");
+ } else {
+ strings.getString(room->roomNumber, buffer);
+ }
DebugPrintf("#%d - %s", room->roomNumber, buffer);
@@ -134,17 +142,6 @@ bool Debugger::cmd_listRooms(int argc, const char **argv) {
DebugPrintf("\n");
DebugPrintf("Current room: %d\n", Room::getReference().roomNumber());
- Resources &res = Resources::getReference();
- HotspotDataList &list = res.hotspotData();
- for (HotspotDataList::iterator i = list.begin(); i != list.end(); ++i)
- {
- HotspotData *data = *i;
- strings.getString(data->nameId, buffer);
-
- DebugPrintf("%xh - %s\n", data->hotspotId, buffer);
- }
- DebugPrintf("\n");
-
return true;
}
@@ -340,13 +337,13 @@ bool Debugger::cmd_hotspot(int argc, const char **argv) {
} else if (strcmp(argv[2], "activate") == 0) {
// Activate the hotspot
res.activateHotspot(hs->hotspotId);
- hs->flags &= !HOTSPOTFLAG_20;
+ hs->flags &= !HOTSPOTFLAG_MENU_EXCLUSION;
DebugPrintf("Activated\n");
} else if (strcmp(argv[2], "deactivate") == 0) {
// Activate the hotspot
res.deactivateHotspot(hs->hotspotId);
- hs->flags |= HOTSPOTFLAG_20;
+ hs->flags |= HOTSPOTFLAG_MENU_EXCLUSION;
DebugPrintf("Deactivated\n");
} else {
@@ -377,6 +374,8 @@ bool Debugger::cmd_hotspot(int argc, const char **argv) {
return true;
}
+const char *directionList[5] = {"UP", "DOWN", "LEFT", "RIGHT", "NONE"};
+
bool Debugger::cmd_room(int argc, const char **argv) {
Resources &res = Resources::getReference();
StringData &strings = StringData::getReference();
@@ -407,8 +406,7 @@ bool Debugger::cmd_room(int argc, const char **argv) {
RoomExitHotspotList &exits = room->exitHotspots;
if (exits.empty())
DebugPrintf(" none\n");
- else
- {
+ else {
RoomExitHotspotList::iterator i;
for (i = exits.begin(); i != exits.end(); ++i) {
RoomExitHotspotData *rec = *i;
@@ -420,7 +418,127 @@ bool Debugger::cmd_room(int argc, const char **argv) {
DebugPrintf("\n");
}
- DebugPrintf("\n");
+ DebugPrintf("Room exits:");
+ if (room->exits.empty())
+ DebugPrintf(" none\n");
+ else {
+ RoomExitList::iterator i2;
+ for (i2 = room->exits.begin(); i2 != room->exits.end(); ++i2) {
+ RoomExitData *rec2 = *i2;
+
+ DebugPrintf("\nExit - (%d,%d)-(%d,%d) Dest=%d,(%d,%d) Dir=%s Sequence=%xh",
+ rec2->xs, rec2->ys, rec2->xe, rec2->ye, rec2->roomNumber,
+ rec2->x, rec2->y, directionList[rec2->direction], rec2->sequenceOffset);
+ }
+
+ DebugPrintf("\n");
+ }
+
+ return true;
+}
+
+bool Debugger::cmd_showAnim(int argc, const char **argv) {
+ Resources &res = Resources::getReference();
+ if (argc < 2) {
+ DebugPrintf("showAnim animId [[frame_width frame_height] | list]\n");
+ return true;
+ }
+
+ // Get the animation Id
+ int animId = strToInt(argv[1]);
+ HotspotAnimData *data = res.getAnimation(animId);
+ if (data == NULL) {
+ DebugPrintf("No such animation Id exists\n");
+ return true;
+ }
+
+ // Figure out the total size of the animation - this will be used for guestimating
+ // frame sizes, or validating that a specified frame size is correct
+ MemoryBlock *src = Disk::getReference().getEntry(data->animId);
+
+ int numFrames = READ_LE_UINT16(src->data());
+ uint16 *headerEntry = (uint16 *) (src->data() + 2);
+ assert((numFrames >= 1) && (numFrames < 100));
+
+ // Calculate total needed size for output and create memory block to hold it
+ uint32 totalSize = 0;
+ for (uint16 ctr = 0; ctr < numFrames; ++ctr, ++headerEntry) {
+ totalSize += (READ_LE_UINT16(headerEntry) + 31) / 32;
+ }
+ totalSize = (totalSize + 0x81) << 4;
+ MemoryBlock *dest = Memory::allocate(totalSize);
+
+ uint32 srcStart = (numFrames + 1) * sizeof(uint16) + 6;
+ uint32 destSize = AnimationDecoder::decode_data(src, dest, srcStart) - 0x40;
+
+ // Figure out the frame size
+ int frameSize;
+
+ if ((data->flags & PIXELFLAG_HAS_TABLE) != 0) {
+ // Table based animation, so get frame size from frame 1 offset
+ frameSize = READ_LE_UINT16(src->data());
+ } else {
+ // Get frame size from dividing uncompressed size by number of frames
+ frameSize = destSize / numFrames;
+ }
+
+ // Free up the data
+ delete src;
+ delete dest;
+
+ int width, height;
+
+ if (argc == 4) {
+ // Width and height specified
+ width = strToInt(argv[2]);
+ height = strToInt(argv[3]);
+
+ if ((width * height) != (frameSize * 2)) {
+ DebugPrintf("Warning: Total size = %d, Frame size (%d,%d) * %d frames = %d bytes\n",
+ destSize, width, height, numFrames, width * height * numFrames / 2);
+ }
+ } else {
+ // Guestimate a frame size
+ frameSize = destSize / numFrames;
+
+ // Figure out the approximate starting point of a width 3/4 the frame size
+ width = frameSize * 3 / 4;
+
+ bool descFlag = (argc == 3);
+ if (descFlag) DebugPrintf("Target size = %d\n", frameSize * 2);
+
+ while ((width > 0) && (descFlag || (((frameSize * 2) % width) != 0))) {
+ if (((frameSize * 2) % width) == 0)
+ DebugPrintf("Frame size (%d,%d) found\n", width, frameSize * 2 / width);
+ --width;
+ }
+
+ if (argc == 3) {
+ DebugPrintf("Done\n");
+ return true;
+ } else if (width == 0) {
+ DebugPrintf("Total size = %d, # frames = %d, frame Size = %d - No valid frame dimensions\n",
+ destSize, numFrames, frameSize);
+ return true;
+ }
+
+ height = (frameSize * 2) / width;
+ DebugPrintf("# frames = %d, guestimated frame size = (%d,%d)\n",
+ numFrames, width, height);
+ }
+
+ // Bottle object is used as a handy hotspot holder that doesn't have any
+ // tick proc behaviour that we need to worry about
+ Hotspot *hotspot = res.activateHotspot(BOTTLE_HOTSPOT_ID);
+ hotspot->setLayer(0xfe);
+ hotspot->setSize(width, height);
+
+ Hotspot *player = res.activateHotspot(PLAYER_ID);
+ hotspot->setColourOffset(player->resource()->colourOffset);
+
+ hotspot->setAnimation(animId);
+
+ DebugPrintf("Done\n");
return true;
}
diff --git a/engines/lure/debugger.h b/engines/lure/debugger.h
index 55a381cca0..5c36bda13e 100644
--- a/engines/lure/debugger.h
+++ b/engines/lure/debugger.h
@@ -47,6 +47,7 @@ protected:
bool cmd_hotspots(int argc, const char **argv);
bool cmd_hotspot(int argc, const char **argv);
bool cmd_room(int argc, const char **argv);
+ bool cmd_showAnim(int argc, const char **argv);
};
} // End of namespace Lure