2014-09-21 17:09:55 +02:00
|
|
|
/* ResidualVM - A 3D game interpreter
|
|
|
|
*
|
|
|
|
* ResidualVM is the legal property of its developers, whose names
|
|
|
|
* are too numerous to list here. Please refer to the AUTHORS
|
|
|
|
* file distributed with this source distribution.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "engines/stark/console.h"
|
|
|
|
#include "engines/stark/archive.h"
|
2014-12-27 11:04:43 +01:00
|
|
|
#include "engines/stark/resources/resource.h"
|
2014-12-28 14:23:54 +01:00
|
|
|
#include "engines/stark/resources/level.h"
|
|
|
|
#include "engines/stark/resources/location.h"
|
|
|
|
#include "engines/stark/resources/root.h"
|
2014-12-28 11:50:12 +01:00
|
|
|
#include "engines/stark/archiveloader.h"
|
2014-09-21 17:09:55 +02:00
|
|
|
|
|
|
|
#include "common/file.h"
|
|
|
|
|
|
|
|
namespace Stark {
|
|
|
|
|
|
|
|
Console::Console(StarkEngine *vm) : GUI::Debugger(), _vm(vm) {
|
|
|
|
registerCmd("dumpArchive", WRAP_METHOD(Console, Cmd_DumpArchive));
|
2014-12-28 11:50:12 +01:00
|
|
|
registerCmd("dumpResources", WRAP_METHOD(Console, Cmd_DumpResources));
|
|
|
|
registerCmd("listLocations", WRAP_METHOD(Console, Cmd_ListLocations));
|
2014-09-21 17:09:55 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
Console::~Console() {
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Console::Cmd_DumpArchive(int argc, const char **argv) {
|
|
|
|
if (argc != 2) {
|
|
|
|
debugPrintf("Extract all the files from a game archive.\n");
|
|
|
|
debugPrintf("The destination folder, named 'dump', must exist.\n");
|
|
|
|
debugPrintf("Usage :\n");
|
2014-10-05 19:25:00 +02:00
|
|
|
debugPrintf("dumpArchive [archive name]\n");
|
2014-09-21 17:09:55 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
XARCArchive xarc;
|
|
|
|
if (!xarc.open(argv[1])) {
|
|
|
|
debugPrintf("Can't open archive with name '%s'\n", argv[1]);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
Common::ArchiveMemberList members;
|
|
|
|
xarc.listMembers(members);
|
|
|
|
|
|
|
|
for (Common::ArchiveMemberList::const_iterator it = members.begin(); it != members.end(); it++) {
|
|
|
|
Common::String fileName = Common::String::format("dump/%s", it->get()->getName().c_str());
|
|
|
|
|
|
|
|
// Open the output file
|
|
|
|
Common::DumpFile outFile;
|
|
|
|
if (!outFile.open(fileName)) {
|
2014-09-28 08:51:44 +02:00
|
|
|
debugPrintf("Unable to open file '%s' for writing\n", fileName.c_str());
|
2014-09-21 17:09:55 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Copy the archive content to the output file using a temporary buffer
|
|
|
|
Common::SeekableReadStream *inStream = it->get()->createReadStream();
|
|
|
|
uint8 *buf = new uint8[inStream->size()];
|
|
|
|
|
|
|
|
inStream->read(buf, inStream->size());
|
|
|
|
outFile.write(buf, inStream->size());
|
|
|
|
|
|
|
|
delete[] buf;
|
|
|
|
delete inStream;
|
|
|
|
outFile.close();
|
|
|
|
|
2014-09-28 08:51:44 +02:00
|
|
|
debugPrintf("Extracted '%s'\n", it->get()->getName().c_str());
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-12-28 11:50:12 +01:00
|
|
|
bool Console::Cmd_DumpResources(int argc, const char **argv) {
|
2014-09-28 08:51:44 +02:00
|
|
|
if (argc != 2) {
|
|
|
|
debugPrintf("Print the scripts from an archive.\n");
|
|
|
|
debugPrintf("Usage :\n");
|
2014-10-05 19:25:00 +02:00
|
|
|
debugPrintf("dumpScript [archive name]\n");
|
2014-09-28 08:51:44 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-12-28 11:50:12 +01:00
|
|
|
ArchiveLoader *archiveLoader = new ArchiveLoader();
|
|
|
|
archiveLoader->load(argv[1]);
|
|
|
|
|
2014-12-28 14:23:54 +01:00
|
|
|
Resource *resource = archiveLoader->useRoot<Resource>(argv[1]);
|
2014-12-27 11:04:43 +01:00
|
|
|
if (resource == nullptr) {
|
2014-09-28 08:51:44 +02:00
|
|
|
debugPrintf("Can't open archive with name '%s'\n", argv[1]);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-12-27 11:04:43 +01:00
|
|
|
resource->print();
|
2014-12-28 11:50:12 +01:00
|
|
|
|
|
|
|
delete archiveLoader;
|
2014-10-05 19:25:00 +02:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-12-28 11:50:12 +01:00
|
|
|
bool Console::Cmd_ListLocations(int argc, const char **argv) {
|
|
|
|
ArchiveLoader *archiveLoader = new ArchiveLoader();
|
2014-10-05 19:25:00 +02:00
|
|
|
|
2014-12-28 11:50:12 +01:00
|
|
|
archiveLoader->load("x.xarc");
|
2014-12-28 14:23:54 +01:00
|
|
|
Root *root = archiveLoader->useRoot<Root>("x.xarc");
|
2014-10-05 19:25:00 +02:00
|
|
|
|
2014-12-28 12:48:50 +01:00
|
|
|
// Find all the levels
|
2014-12-28 14:23:54 +01:00
|
|
|
Common::Array<Level *> levels = root->listChildren<Level>();
|
2014-10-05 19:25:00 +02:00
|
|
|
|
2014-12-28 12:48:50 +01:00
|
|
|
// Loop over the levels
|
|
|
|
for (uint i = 0; i < levels.size(); i++) {
|
2014-12-28 14:23:54 +01:00
|
|
|
Level *level = levels[i];
|
2014-10-05 19:25:00 +02:00
|
|
|
|
2014-12-28 14:23:54 +01:00
|
|
|
Common::String levelArchive = archiveLoader->buildArchiveName(level);
|
2014-10-05 19:25:00 +02:00
|
|
|
debugPrintf("%s - %s\n", levelArchive.c_str(), level->getName().c_str());
|
|
|
|
|
|
|
|
// Load the detailed level archive
|
2014-12-28 11:50:12 +01:00
|
|
|
archiveLoader->load(levelArchive);
|
2014-12-28 14:23:54 +01:00
|
|
|
level = archiveLoader->useRoot<Level>(levelArchive);
|
2014-10-05 19:25:00 +02:00
|
|
|
|
2014-12-28 14:23:54 +01:00
|
|
|
Common::Array<Location *> locations = level->listChildren<Location>();
|
2014-10-05 19:25:00 +02:00
|
|
|
|
2014-12-28 11:50:12 +01:00
|
|
|
// Loop over the locations
|
2014-12-28 12:48:50 +01:00
|
|
|
for (uint j = 0; j < locations.size(); j++) {
|
2014-12-28 14:23:54 +01:00
|
|
|
Location *location = locations[j];
|
2014-10-05 19:25:00 +02:00
|
|
|
|
2014-12-28 14:23:54 +01:00
|
|
|
Common::String roomArchive = archiveLoader->buildArchiveName(level, location);
|
2014-12-28 11:50:12 +01:00
|
|
|
debugPrintf("%s - %s\n", roomArchive.c_str(), location->getName().c_str());
|
2014-10-05 19:25:00 +02:00
|
|
|
}
|
|
|
|
|
2014-12-28 11:50:12 +01:00
|
|
|
archiveLoader->returnRoot(levelArchive);
|
|
|
|
archiveLoader->unloadUnused();
|
2014-10-05 19:25:00 +02:00
|
|
|
}
|
|
|
|
|
2014-12-28 11:50:12 +01:00
|
|
|
delete archiveLoader;
|
2014-10-05 19:25:00 +02:00
|
|
|
|
2014-09-21 17:09:55 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // End of namespace Stark
|