From c48989abdc1d284ea47c13a46536dcbb9c19ca71 Mon Sep 17 00:00:00 2001 From: Vladimir Serbinenko Date: Fri, 18 Nov 2022 21:13:16 +0100 Subject: [PATCH] NEVERHOOD: Enable Japanese version. It was choking on missing "Making of". I tested by going through first couple of puzzles and main menu. Menu is fully translated but the puzzles are textless so far. --- engines/neverhood/blbarchive.cpp | 14 ++++++++++---- engines/neverhood/blbarchive.h | 2 +- engines/neverhood/detection.cpp | 4 ++-- engines/neverhood/neverhood.cpp | 3 ++- engines/neverhood/resourceman.cpp | 5 +++-- engines/neverhood/resourceman.h | 2 +- 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp index 29c963d4e28..1f9aaf88fe2 100644 --- a/engines/neverhood/blbarchive.cpp +++ b/engines/neverhood/blbarchive.cpp @@ -54,14 +54,17 @@ BlbArchive::~BlbArchive() { delete[] _extData; } -void BlbArchive::open(const Common::String &filename) { +bool BlbArchive::open(const Common::String &filename, bool isOptional) { BlbHeader header; uint16 *extDataOffsets; _entries.clear(); - if (!_fd.open(filename)) - error("BlbArchive::open() Could not open %s", filename.c_str()); + if (!_fd.open(filename)) { + if (!isOptional) + error("BlbArchive::open() Could not open %s", filename.c_str()); + return false; + } header.id1 = _fd.readUint32LE(); header.id2 = _fd.readUint16LE(); @@ -69,8 +72,10 @@ void BlbArchive::open(const Common::String &filename) { header.fileSize = _fd.readUint32LE(); header.fileCount = _fd.readUint32LE(); - if (header.id1 != 0x2004940 || header.id2 != 7 || header.fileSize != _fd.size()) + if (header.id1 != 0x2004940 || header.id2 != 7 || header.fileSize != _fd.size()) { error("BlbArchive::open() %s seems to be corrupt", filename.c_str()); + return false; + } debug(4, "%s: fileCount = %d", filename.c_str(), header.fileCount); @@ -111,6 +116,7 @@ void BlbArchive::open(const Common::String &filename) { delete[] extDataOffsets; + return true; } void BlbArchive::load(uint index, byte *buffer, uint32 size) { diff --git a/engines/neverhood/blbarchive.h b/engines/neverhood/blbarchive.h index d9033435ae2..575d9d1fba1 100644 --- a/engines/neverhood/blbarchive.h +++ b/engines/neverhood/blbarchive.h @@ -54,7 +54,7 @@ class BlbArchive { public: BlbArchive(); ~BlbArchive(); - void open(const Common::String &filename); + bool open(const Common::String &filename, bool isOptional); void load(uint index, byte *buffer, uint32 size); void load(BlbArchiveEntry *entry, byte *buffer, uint32 size); byte *getEntryExtData(uint index); diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp index 8c85308832c..fa6d9c76f90 100644 --- a/engines/neverhood/detection.cpp +++ b/engines/neverhood/detection.cpp @@ -117,11 +117,11 @@ static const ADGameDescription gameDescriptions[] = { // Bugreport #11074 { "neverhood", - _s("Missing game code"), // Reason for being unsupported + "", AD_ENTRY1s("hd.blb", "c791725bbbc23c0f8bf78eece4555565", 4308928), Common::JA_JPN, Common::kPlatformWindows, - ADGF_DROPPLATFORM | ADGF_UNSUPPORTED, + ADGF_DROPPLATFORM, GUIO1(GUIO_NONE) }, diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 498ee4d143e..eb89bf80e96 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -94,7 +94,8 @@ Common::Error NeverhoodEngine::run() { _res->addArchive("c.blb"); _res->addArchive("hd.blb"); _res->addArchive("i.blb"); - _res->addArchive("m.blb"); + // Japanese version is missing "making of". + _res->addArchive("m.blb", getLanguage() == Common::Language::JA_JPN); _res->addArchive("s.blb"); _res->addArchive("t.blb"); } diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp index cb90f539d41..76f6dc6507d 100644 --- a/engines/neverhood/resourceman.cpp +++ b/engines/neverhood/resourceman.cpp @@ -36,9 +36,10 @@ ResourceMan::ResourceMan() { ResourceMan::~ResourceMan() { } -void ResourceMan::addArchive(const Common::String &filename) { +void ResourceMan::addArchive(const Common::String &filename, bool isOptional) { BlbArchive *archive = new BlbArchive(); - archive->open(filename); + if (!archive->open(filename, isOptional)) + return; _archives.push_back(archive); debug(3, "ResourceMan::addArchive(%s) %d files", filename.c_str(), archive->getCount()); for (uint archiveEntryIndex = 0; archiveEntryIndex < archive->getCount(); archiveEntryIndex++) { diff --git a/engines/neverhood/resourceman.h b/engines/neverhood/resourceman.h index c39a99c1518..339e02aa1c8 100644 --- a/engines/neverhood/resourceman.h +++ b/engines/neverhood/resourceman.h @@ -70,7 +70,7 @@ class ResourceMan { public: ResourceMan(); ~ResourceMan(); - void addArchive(const Common::String &filename); + void addArchive(const Common::String &filename, bool isOptional = false); ResourceFileEntry *findEntrySimple(uint32 fileHash); ResourceFileEntry *findEntry(uint32 fileHash, ResourceFileEntry **firstEntry = NULL); Common::SeekableReadStream *createStream(uint32 fileHash);