/* 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 . * */ #ifndef MEDIASTATION_ASSET_HEADER_H #define MEDIASTATION_ASSET_HEADER_H #include "common/str.h" #include "common/rect.h" #include "common/hashmap.h" #include "graphics/palette.h" #include "mediastation/datafile.h" #include "mediastation/mediascript/eventhandler.h" namespace MediaStation { struct MovieChunkReference { uint32 headerChunkId; uint32 audioChunkId; uint32 videoChunkId; }; typedef uint32 ChunkReference; typedef uint32 AssetId; enum AssetType { kAssetTypeScreen = 0x0001, // SCR kAssetTypeStage = 0x0002, // STG kAssetTypePath = 0x0004, // PTH kAssetTypeSound = 0x0005, // SND kAssetTypeTimer = 0x0006, // TMR kAssetTypeImage = 0x0007, // IMG kAssetTypeHotspot = 0x000b, // HSP kAssetTypeSprite = 0x000e, // SPR kAssetTypeLKZazu = 0x000f, kAssetTypeLKConstellations = 0x0010, kAssetTypeImageSet = 0x001d, kAssetTypeCursor = 0x000c, // CSR kAssetTypePrinter = 0x0019, // PRT kAssetTypeMovie = 0x0016, // MOV kAssetTypePalette = 0x0017, kAssetTypeText = 0x001a, // TXT kAssetTypeFont = 0x001b, // FON kAssetTypeCamera = 0x001c, // CAM kAssetTypeCanvas = 0x001e, // CVS // TODO: Discover how the XSND differs from regular sounds. // Only appears in Ariel. kAssetTypeXsnd = 0x001f, kAssetTypeXsndMidi = 0x0020, // TODO: Figure out what this is. Only appears in Ariel. kAssetTypeRecorder = 0x0021, kAssetTypeFunction = 0x0069 // FUN }; enum AssetStartupType { kAssetStartupInactive = 0, kAssetStartupActive = 1 }; enum AssetHeaderSectionType { kAssetHeaderEmptySection = 0x0000, kAssetHeaderSoundEncoding1 = 0x0001, kAssetHeaderSoundEncoding2 = 0x0002, kAssetHeaderEventHandler = 0x0017, kAssetHeaderStageId = 0x0019, kAssetHeaderAssetId = 0x001a, kAssetHeaderChunkReference = 0x001b, kAssetHeaderMovieAnimationChunkReference = 0x06a4, kAssetHeaderMovieAudioChunkReference = 0x06a5, kAssetHeaderAssetReference = 0x077b, kAssetHeaderBoundingBox = 0x001c, kAssetHeaderMouseActiveArea = 0x001d, kAssetHeaderZIndex = 0x001e, kAssetHeaderStartup = 0x001f, kAssetHeaderTransparency = 0x0020, kAssetHeaderHasOwnSubfile = 0x0021, kAssetHeaderCursorResourceId = 0x0022, kAssetHeaderFrameRate = 0x0024, kAssetHeaderLoadType = 0x0032, kAssetHeaderSoundInfo = 0x0033, kAssetHeaderMovieLoadType = 0x0037, kAssetHeaderSpriteChunkCount = 0x03e8, kAssetHeaderPalette = 0x05aa, kAssetHeaderDissolveFactor = 0x05dc, kAssetHeaderGetOffstageEvents = 0x05dd, kAssetHeaderX = 0x05de, kAssetHeaderY = 0x05df, // PATH FIELDS. kAssetHeaderStartPoint = 0x060e, kAssetHeaderEndPoint = 0x060f, kAssetHeaderPathTotalSteps = 0x0610, kAssetHeaderStepRate = 0x0611, kAssetHeaderDuration = 0x0612, // CAMERA FIELDS. kAssetHeaderViewportOrigin = 0x076f, kAssetHeaderLensOpen = 0x0770, // STAGE FIELDS. kAssetHeaderStageUnk1 = 0x0771, kAssetHeaderCylindricalX = 0x0772, kAssetHeaderCylindricalY = 0x0773, kAssetHeaderAssetName = 0x0bb8, // TEXT FIELDS. kAssetHeaderEditable = 0x03eb, kAssetHeaderFontId = 0x0258, kAssetHeaderInitialText = 0x0259, kAssetHeaderTextMaxLength = 0x25a, kAssetHeaderTextJustification = 0x025b, kAssetHeaderTextPosition = 0x25f, kAssetHeaderTextUnk1 = 0x262, kAssetHeaderTextUnk2 = 0x263, kAssetHeaderTextCharacterClass = 0x0266, // SPRITE FIELDS. kAssetHeaderSpriteFrameMapping = 0x03e9 }; enum TextJustification { kTextJustificationLeft = 0x25c, kTextJustificationRight = 0x25d, kTextJustificationCenter = 0x25e }; enum TextPosition { kTextPositionMiddle = 0x25e, kTextPositionTop = 0x260, kTextPositionBotom = 0x261 }; struct CharacterClass { uint firstAsciiCode = 0; uint lastAsciiCode = 0; }; enum SoundEncoding { PCM_S16LE_MONO_22050 = 0x0010, // Uncompressed linear PCM IMA_ADPCM_S16LE_MONO_22050 = 0x0004 // IMA ADPCM encoding, must be decoded }; class AssetHeader { public: AssetHeader(Chunk &chunk); ~AssetHeader(); uint32 _fileNumber = 0; AssetType _type; AssetId _id; ChunkReference _chunkReference = 0; // These two are only used in movies. ChunkReference _audioChunkReference = 0; ChunkReference _animationChunkReference = 0; Common::Rect *_boundingBox = nullptr; Common::Array _mouseActiveArea; int _zIndex = 0; uint32 _assetReference = 0; uint32 _startup = 0; bool _transparency = false; bool _hasOwnSubfile = false; uint32 _cursorResourceId = 0; uint32 _frameRate = 0; uint32 _loadType = 0; uint32 _rate = 0; bool _editable = 0; Graphics::Palette *_palette = nullptr; bool _getOffstageEvents = 0; uint32 _x = 0; // Image only. uint32 _y = 0; // Image only. Common::String *_name = nullptr; uint32 _stageId = 0; SoundEncoding _soundEncoding; uint32 _chunkCount = 0; Common::HashMap _spriteFrameMapping; // PATH FIELDS. uint32 _dissolveFactor = 0; Common::Point *_startPoint = nullptr; Common::Point *_endPoint = nullptr; uint32 _stepRate = 0; uint32 _duration = 0; uint _totalSteps = 0; // EVENT HANDLER FIELDS. Common::HashMap _eventHandlers; Common::Array _timeHandlers; Common::HashMap _keyDownHandlers; Common::Array _inputHandlers; Common::Array _loadCompleteHandlers; // TEXT FIELDS. Common::String *_text = nullptr; uint _maxTextLength = 0; uint _fontAssetId = 0; TextJustification _justification; TextPosition _position; Common::Array _acceptedInput; private: void readSection(AssetHeaderSectionType sectionType, Chunk &chunk); AssetHeaderSectionType getSectionType(Chunk &chunk); }; } // End of namespace MediaStation #endif