/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * 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 3 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, see . * */ //============================================================================= // // This unit provides functions for reading compiled room file (CRM) // into the RoomStruct structure, as well as extracting separate components, // such as room scripts. // //============================================================================= #ifndef AGS_SHARED_GAME_ROOM_FILE_H #define AGS_SHARED_GAME_ROOM_FILE_H #include "common/std/memory.h" #include "common/std/vector.h" #include "ags/shared/core/platform.h" #include "ags/shared/game/room_version.h" #include "ags/shared/util/error.h" #include "ags/shared/util/stream.h" #include "ags/shared/util/string.h" namespace AGS3 { struct SpriteInfo; namespace AGS { namespace Shared { class RoomStruct; enum RoomFileErrorType { kRoomFileErr_NoError, kRoomFileErr_FileOpenFailed, kRoomFileErr_FormatNotSupported, kRoomFileErr_BlockListFailed, kRoomFileErr_UnknownBlockType, kRoomFileErr_OldBlockNotSupported, kRoomFileErr_BlockDataOverlapping, kRoomFileErr_IncompatibleEngine, kRoomFileErr_ScriptLoadFailed, kRoomFileErr_InconsistentData, kRoomFileErr_PropertiesBlockFormat, kRoomFileErr_InvalidPropertyValues, kRoomFileErr_BlockNotFound }; enum RoomFileBlock { kRoomFblk_None = 0, // Main room data kRoomFblk_Main = 1, // Room script text source (was present in older room formats) kRoomFblk_Script = 2, // Old versions of compiled script (no longer supported) kRoomFblk_CompScript = 3, kRoomFblk_CompScript2 = 4, // Names of the room objects kRoomFblk_ObjectNames = 5, // Secondary room backgrounds kRoomFblk_AnimBg = 6, // Contemporary compiled script kRoomFblk_CompScript3 = 7, // Custom properties kRoomFblk_Properties = 8, // Script names of the room objects kRoomFblk_ObjectScNames = 9, // End of room data tag kRoomFile_EOF = 0xFF }; String GetRoomFileErrorText(RoomFileErrorType err); String GetRoomBlockName(RoomFileBlock id); typedef TypedCodeError RoomFileError; typedef ErrorHandle HRoomFileError; #ifdef AGS_PLATFORM_SCUMMVM typedef std::shared_ptr UStream; #else typedef std::unique_ptr UStream; #endif // RoomDataSource defines a successfully opened room file struct RoomDataSource { // Name of the asset file String Filename; // Room file format version RoomFileVersion DataVersion; // A ponter to the opened stream UStream InputStream; RoomDataSource(); }; // Opens room data for reading from an arbitrary file HRoomFileError OpenRoomFile(const String &filename, RoomDataSource &src); // Opens room data for reading from asset of a given name HRoomFileError OpenRoomFileFromAsset(const String &filename, RoomDataSource &src); // Reads room data HRoomFileError ReadRoomData(RoomStruct *room, Stream *in, RoomFileVersion data_ver); // Applies necessary updates, conversions and fixups to the loaded data // making it compatible with current engine HRoomFileError UpdateRoomData(RoomStruct *room, RoomFileVersion data_ver, bool game_is_hires, const std::vector &sprinfos); // Extracts text script from the room file, if it's available. // Historically, text sources were kept inside packed room files before AGS 3.*. HRoomFileError ExtractScriptText(String &script, Stream *in, RoomFileVersion data_ver); // Writes all room data to the stream HRoomFileError WriteRoomData(const RoomStruct *room, Stream *out, RoomFileVersion data_ver); // Reads room data header using stream assigned to RoomDataSource; // tests and saves its format index if successful HRoomFileError ReadRoomHeader(RoomDataSource &src); typedef void(*PfnWriteRoomBlock)(const RoomStruct *room, Stream *out); // Writes room block with a new-style string id void WriteRoomBlock(const RoomStruct *room, const String &ext_id, PfnWriteRoomBlock writer, Stream *out); // Writes room block with a old-style numeric id void WriteRoomBlock(const RoomStruct *room, RoomFileBlock block, PfnWriteRoomBlock writer, Stream *out); } // namespace Shared } // namespace AGS } // namespace AGS3 #endif