aboutsummaryrefslogtreecommitdiff
path: root/engines/neverhood/neverhood.cpp
diff options
context:
space:
mode:
authorjohndoe1232011-10-21 09:13:49 +0000
committerWillem Jan Palenstijn2013-05-08 20:39:43 +0200
commit9cf2c83e5e5a35816ab153bf8443dac691829ea8 (patch)
treeaaae7f06e6d26055b7cca20d5ef359cc2084101b /engines/neverhood/neverhood.cpp
parent023c36f2b6f1906c28d246a1b861e2287d85d851 (diff)
downloadscummvm-rg350-9cf2c83e5e5a35816ab153bf8443dac691829ea8.tar.gz
scummvm-rg350-9cf2c83e5e5a35816ab153bf8443dac691829ea8.tar.bz2
scummvm-rg350-9cf2c83e5e5a35816ab153bf8443dac691829ea8.zip
NEVERHOOD: Major renaming:
- Give better names to animation callback functions/vars - Give better names to animation functions (previously known as subXXXX - not completed yet) - Add dumpAllResources (which is a lie, since it only dumps animations for now) - More renaming to come
Diffstat (limited to 'engines/neverhood/neverhood.cpp')
-rw-r--r--engines/neverhood/neverhood.cpp138
1 files changed, 81 insertions, 57 deletions
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index d94d3db128..f1f4bab9cd 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -92,63 +92,8 @@ Common::Error NeverhoodEngine::run() {
}
#if 0
- BlbArchive *blb = new BlbArchive();
- blb->open("m.blb");
- delete blb;
-#endif
-
-#if 0
- ResourceFileEntry *r = _res->findEntry(0x50A80517);
-#endif
-
-#if 0
- int resourceHandle = _res->useResource(0x0CA04202);
- debug("resourceHandle = %d", resourceHandle);
- byte *data = _res->loadResource(resourceHandle);
- bool rle;
- NDimensions dimensions;
- NUnknown unknown;
- byte *palette, *pixels;
- parseBitmapResource(data, &rle, &dimensions, &unknown, &palette, &pixels);
- debug("%d, %d", dimensions.width, dimensions.height);
- byte *rawpixels = new byte[dimensions.width * dimensions.height];
- memset(rawpixels, 0, dimensions.width * dimensions.height);
- debug("rle = %d", rle);
- unpackSpriteRle(pixels, dimensions.width, dimensions.height, rawpixels, dimensions.width, false, false);
- Common::DumpFile d;
- d.open("dump.0");
- d.write(rawpixels, dimensions.width * dimensions.height);
- d.close();
- delete[] rawpixels;
- _res->unloadResource(resourceHandle);
- _res->unuseResource(resourceHandle);
-#endif
-
-#if 0
- { // Create a new scope
- SpriteResource r(this);
- BaseSurface *surf = new BaseSurface(this, 0, 640, 480);
- r.load(0x0CA04202);
- debug("r: width = %d; height = %d", r.getDimensions().width, r.getDimensions().height);
- surf->drawSpriteResource(r);
- delete surf;
- }
-#endif
-
-#if 0
- { // Create a new scope
- AnimResource r(this);
- r.load(0x000540B0);
- }
-#endif
-
-#if 0
- { // Create a new scope
- DataResource dataResource(this);
- //dataResource.load(0x01801002);
- //dataResource.load(0x84500132);
- dataResource.load(0x81120132);
- }
+ // TODO: This should probably be implemented as debug command later
+ dumpAllResources();
#endif
#if 1
@@ -220,5 +165,84 @@ NPoint NeverhoodEngine::getMousePos() {
pt.y = _mouseY;
return pt;
}
+
+void writeTga(const char *filename, byte *pixels, byte *palette, int16 width, int16 height) {
+ byte identsize = 0;
+ byte colourmaptype = 1;
+ byte imagetype = 1;
+ uint16 colourmapstart = 0;
+ uint16 colourmaplength = 256;
+ byte colourmapbits = 24;
+ uint16 xstart = 0;
+ uint16 ystart = 0;
+ byte bits = 8;
+ byte descriptor = 0x20;
+ Common::DumpFile tga;
+ tga.open(filename);
+ tga.writeByte(identsize);
+ tga.writeByte(colourmaptype);
+ tga.writeByte(imagetype);
+ tga.writeUint16LE(colourmapstart);
+ tga.writeUint16LE(colourmaplength);
+ tga.writeByte(colourmapbits);
+ tga.writeUint16LE(xstart);
+ tga.writeUint16LE(ystart);
+ tga.writeUint16LE(width);
+ tga.writeUint16LE(height);
+ tga.writeByte(bits);
+ tga.writeByte(descriptor);
+ tga.write(palette, 768);
+ tga.write(pixels, width * height);
+ tga.close();
+}
+
+void NeverhoodEngine::dumpAllResources() {
+
+ PaletteResource paletteResource(this);
+ byte *vgaPalette = new byte[768];
+ paletteResource.load(0x4086520E);
+ byte *srcpalette = paletteResource.palette();
+ for (int i = 0; i < 256; i++) {
+ vgaPalette[i * 3 + 2] = srcpalette[i * 4 + 0];
+ vgaPalette[i * 3 + 1] = srcpalette[i * 4 + 1];
+ vgaPalette[i * 3 + 0] = srcpalette[i * 4 + 2];
+ }
+
+#if 0
+ for (int i = 0; i < 768; i++)
+ vgaPalette[i] <<= 2;
+#endif
+
+ uint entriesCount = _res->getEntryCount();
+ debug("%d entries", entriesCount);
+
+ for (uint i = 0; i < entriesCount; i++) {
+ const ResourceFileEntry &entry = _res->getEntry(i);
+ int type = _res->getResourceTypeByHash(entry.fileHash);
+ debug("hash: %08X; type: %d", entry.fileHash, type);
+ if (type == 4) {
+ AnimResource anim(this);
+ anim.load(entry.fileHash);
+ for (uint frameIndex = 0; frameIndex < anim.getFrameCount(); frameIndex++) {
+ const AnimFrameInfo &frameInfo = anim.getFrameInfo(frameIndex);
+ int16 width = (frameInfo.rect.width + 3) & 0xFFFC;
+ byte *pixels = new byte[width * frameInfo.rect.height];
+ memset(pixels, 0, width * frameInfo.rect.height);
+ anim.draw(frameIndex, pixels, width, false, false);
+ Common::String filename =
+ frameInfo.frameHash != 0
+ ? Common::String::format("%08X_%03d_%08X.tga", entry.fileHash, frameIndex, frameInfo.frameHash)
+ : Common::String::format("%08X_%03d.tga", entry.fileHash, frameIndex);
+ writeTga(filename.c_str(), pixels, vgaPalette, width, frameInfo.rect.height);
+ delete[] pixels;
+ }
+ static int n = 0;
+ //if (n++ == 25) break;
+ }
+ }
+
+ delete[] vgaPalette;
+
+}
} // End of namespace Neverhood