ScummVM API documentation
data.h
1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 #ifndef MTROPOLIS_DATA_H
23 #define MTROPOLIS_DATA_H
24 
25 #include "common/array.h"
26 #include "common/data-io.h"
27 #include "common/endian.h"
28 #include "common/error.h"
29 #include "common/hashmap.h"
30 #include "common/hash-str.h"
31 #include "common/ptr.h"
32 #include "common/stream.h"
33 #include "common/rect.h"
34 #include "common/xpfloat.h"
35 
36 #include "mtropolis/core.h"
37 
38 // This contains defs related to parsing of mTropolis stored data into structured data objects.
39 // This is separated from asset construction for a number of reasons, mainly that data parsing has
40 // several quirky parses, and there are a lot of fields where, due to platform-specific byte
41 // swaps, we know the size of the value but don't know what it means.
42 
43 namespace MTropolis {
44 
45 class PlugIn;
46 
47 namespace Data {
48 
49 enum DataFormat {
50  kDataFormatUnknown,
51 
52  kDataFormatMacintosh,
53  kDataFormatWindows,
54 };
55 
56 } // End of namespace Data
57 
58 } // End of namespace MTropolis
59 
60 namespace Common {
61 
62 template<>
63 struct DataFormatTraits<MTropolis::Data::DataFormat> {
64  static inline bool isLittleEndian(MTropolis::Data::DataFormat dataFormat) {
65  return dataFormat != MTropolis::Data::kDataFormatMacintosh;
66  }
67 };
68 
69 template<>
70 struct DataIO<MTropolis::Data::DataFormat, Common::XPFloat> {
71  static const uint kMaxSize = 10;
72 
73  static inline uint computeSize(MTropolis::Data::DataFormat dataFormat) {
74  if (dataFormat == MTropolis::Data::kDataFormatMacintosh)
75  return 10;
76  else if (dataFormat == MTropolis::Data::kDataFormatWindows)
77  return 8;
78  else
79  return 0;
80  }
81 
82  static inline void encode(MTropolis::Data::DataFormat dataFormat, byte *data, const Common::XPFloat &value) {
83  if (dataFormat == MTropolis::Data::kDataFormatMacintosh) {
84  DataIO<MTropolis::Data::DataFormat, uint16>::encode(dataFormat, data + 0, value.signAndExponent);
85  DataIO<MTropolis::Data::DataFormat, uint64>::encode(dataFormat, data + 2, value.mantissa);
86  } else if (dataFormat == MTropolis::Data::kDataFormatWindows) {
87  uint64 doubleBits = 0;
88  bool overflowed = false;
89  value.toDoubleBitsSafe(doubleBits, overflowed);
90  DataIO<MTropolis::Data::DataFormat, uint64>::encode(dataFormat, data, doubleBits);
91  }
92  }
93 
94  static inline void decode(MTropolis::Data::DataFormat dataFormat, const byte *data, Common::XPFloat &value) {
95  if (dataFormat == MTropolis::Data::kDataFormatMacintosh) {
96  DataIO<MTropolis::Data::DataFormat, uint16>::decode(dataFormat, data + 0, value.signAndExponent);
97  DataIO<MTropolis::Data::DataFormat, uint64>::decode(dataFormat, data + 2, value.mantissa);
98  } else if (dataFormat == MTropolis::Data::kDataFormatWindows) {
99  uint64 doubleBits = 0;
100  DataIO<MTropolis::Data::DataFormat, uint64>::decode(dataFormat, data, doubleBits);
101  value = value.fromDoubleBits(doubleBits);
102  }
103  }
104 };
105 
106 } // End of namespace Common
107 
108 
109 namespace MTropolis {
110 
111 class PlugIn;
112 
113 namespace Data {
114 
115 struct PlugInModifier;
116 struct PlugInModifierData;
117 
118 // Project format and data format are 2 separate things.
119 //
120 // A cross-platform project can be booted in either Mac or Win mode and contains
121 // separate scene streams for Mac and Win. Which one is loaded depends on what the
122 // game platform is loaded as.
123 //
124 // The following table describes the behavior:
125 //
126 // Project type | ProjectFormat | Catalog and asset data format | Scene data format |
127 // ------------------------------------------------------------------------------------------|
128 // Mac | Macintosh | Macintosh | Macintosh |
129 // Win | Windows | Windows | Windows |
130 // Cross-Platform as Mac | Neutral | Windows | Macintosh |
131 // Cross-Platform as Win | Neutral | Windows | Windows |
132 
133 enum ProjectFormat {
134  kProjectFormatUnknown,
135 
136  kProjectFormatMacintosh,
137  kProjectFormatWindows,
138  kProjectFormatNeutral,
139 };
140 
141 enum DataReadErrorCode {
142  kDataReadErrorNone = 0,
143 
144  kDataReadErrorUnsupportedRevision,
145  kDataReadErrorReadFailed,
146  kDataReadErrorUnrecognized,
147  kDataReadErrorPlugInNotFound,
148 };
149 
150 enum ModifierFlags {
151  kModifierFlagLast = 0x2,
152 };
153 
154 enum TextAlignmentCode {
155  kTextAlignmentCodeLeft = 0,
156  kTextAlignmentCodeCenter = 1,
157  kTextAlignmentCodeRight = 0xffff,
158 };
159 
160 
161 namespace DataObjectTypes {
162 
163 enum DataObjectType : uint {
164  kUnknown = 0,
165 
166  kProjectLabelMap = 0x22,
167  kProjectCatalog = 0x3e8,
168  kStreamHeader = 0x3e9,
169  kProjectHeader = 0x3ea,
170  kPresentationSettings = 0x3ec,
171 
172  kAssetCatalog = 0xd,
173  kGlobalObjectInfo = 0x17,
174  kUnknown19 = 0x19,
175  kUnknown2B = 0x2b,
176 
177  kProjectStructuralDef = 0x2,
178  kSectionStructuralDef = 0x3,
179  kSubsectionStructuralDef = 0x21,
180 
181  kGraphicElement = 0x8,
182  kMovieElement = 0x5,
183  kMToonElement = 0x6,
184  kImageElement = 0x7,
185  kSoundElement = 0xa,
186  kTextLabelElement = 0x15,
187 
188  kAVIMovieElement = 0x25,
189  kAliasModifier = 0x27,
190  kChangeSceneModifier = 0x136,
191  kReturnModifier = 0x140,
192  kSoundEffectModifier = 0x1a4,
193  kSimpleMotionModifier = 0x1fe,
194  kDragMotionModifier = 0x208,
195  kPathMotionModifierV1 = 0x21c,
196  kPathMotionModifierV2 = 0x21b,
197  kVectorMotionModifier = 0x226,
198  kSceneTransitionModifier = 0x26c,
199  kElementTransitionModifier = 0x276,
200  kSharedSceneModifier = 0x29a,
201  kIfMessengerModifier = 0x2bc,
202  kBehaviorModifier = 0x2c6,
203  kMessengerModifier = 0x2da,
204  kSetModifier = 0x2df,
205  kTimerMessengerModifier = 0x2e4,
206  kCollisionDetectionMessengerModifier = 0x2ee,
207  kBoundaryDetectionMessengerModifier = 0x2f8,
208  kKeyboardMessengerModifier = 0x302,
209  kTextStyleModifier = 0x32a,
210  kGraphicModifier = 0x334,
211  kImageEffectModifier = 0x384,
212  kMiniscriptModifier = 0x3c0,
213  kCursorModifierV1 = 0x3ca,
214  kGradientModifier = 0x4b0, // NYI
215  kColorTableModifier = 0x4c4,
216  kSoundFadeModifier = 0x4ce,
217  kSaveAndRestoreModifier = 0x4d8,
218 
219  kCompoundVariableModifier = 0x2c7,
220  kBooleanVariableModifier = 0x321,
221  kIntegerVariableModifier = 0x322,
222  kIntegerRangeVariableModifier = 0x324,
223  kVectorVariableModifier = 0x327,
224  kPointVariableModifier = 0x326,
225  kFloatingPointVariableModifier = 0x328,
226  kStringVariableModifier = 0x329,
227  kObjectReferenceVariableModifierV1 = 0x33e,
228  kDebris = 0xfffffffe, // Deleted modifier in alias list
229  kPlugInModifier = 0xffffffff,
230 
231  kMovieAsset = 0x10,
232  kAudioAsset = 0x11,
233  kColorTableAsset = 0x1e,
234  kImageAsset = 0xe,
235  kMToonAsset = 0xf,
236  kTextAsset = 0x1f,
237  kAVIMovieAsset = 0x24,
238 
239  kAssetDataChunk = 0xffff,
240 };
241 
242 bool isValidSceneRootElement(DataObjectType type);
243 bool isVisualElement(DataObjectType type);
244 bool isNonVisualElement(DataObjectType type);
245 bool isStructural(DataObjectType type);
246 bool isElement(DataObjectType type);
247 bool isModifier(DataObjectType type);
248 bool isAsset(DataObjectType type);
249 
250 } // End of namespace DataObjectTypes
251 
252 namespace StructuralFlags {
253  enum StructuralFlags {
254  kHasModifiers = 0x1,
255  kHasChildren = 0x4,
256  kNoMoreSiblings = 0x8,
257  };
258 } // End of namespace StructuralFlags
259 
260 
261 class DataReader {
262 public:
263  DataReader(int64 globalPosition, Common::SeekableReadStream &stream, DataFormat dataFormat);
264 
265  bool readU8(uint8 &value);
266  bool readU16(uint16 &value);
267  bool readU32(uint32 &value);
268  bool readU64(uint64 &value);
269  bool readS8(int8 &value);
270  bool readS16(int16 &value);
271  bool readS32(int32 &value);
272  bool readS64(int64 &value);
273  bool readF32(float &value);
274  bool readF64(double &value);
275  bool readPlatformFloat(Common::XPFloat &value);
276 
277  template<class... T>
278  bool readMultiple(T &...values);
279 
280  bool read(void *dest, size_t size);
281 
282  // Reads a terminated string where "length" is the number of characters including a null terminator
283  bool readTerminatedStr(Common::String &value, size_t length);
284 
285  bool readNonTerminatedStr(Common::String &value, size_t length);
286 
287  template<size_t TSize>
288  bool readChars(char (&arr)[TSize]);
289 
290  template<size_t TSize>
291  bool readBytes(uint8 (&arr)[TSize]);
292 
293  bool seek(int64 pos);
294  bool skip(size_t count);
295 
296  int64 tell() const;
297  inline int64 tellGlobal() const { return _globalPosition + tell(); }
298 
299  DataFormat getDataFormat() const;
300 
301  void setPermitDamagedStrings(bool permit);
302 
303 private:
304  bool checkErrorAndReset();
305 
307  DataFormat _dataFormat;
308  int64 _globalPosition;
309 
310  bool _permitDamagedStrings;
311 };
312 
313 template<class... T>
314 bool DataReader::readMultiple(T &...values) {
315  byte buffer[Common::DataMultipleIO<DataFormat, T...>::kMaxSize];
316  const uint actualSize = Common::DataMultipleIO<DataFormat, T...>::computeSize(_dataFormat);
317 
318  if (!read(buffer, actualSize))
319  return false;
320 
321  Common::DataMultipleIO<DataFormat, T...>::decode(_dataFormat, buffer, values...);
322  return true;
323 }
324 
325 struct Rect {
326  Rect();
327 
328  bool load(DataReader &reader);
329 
330  bool toScummVMRect(Common::Rect &outRect) const;
331  bool toScummVMRectUnchecked(Common::Rect &outRect) const;
332 
333  int16 top;
334  int16 left;
335  int16 bottom;
336  int16 right;
337 };
338 
339 struct Point {
340  Point();
341 
342  bool load(DataReader &reader);
343  bool toScummVMPoint(Common::Point &outPoint) const;
344 
345  int16 x;
346  int16 y;
347 };
348 
349 struct Event {
350  Event();
351 
352  bool load(DataReader &reader);
353 
354  uint32 eventID;
355  uint32 eventInfo;
356 };
357 
358 struct ColorRGB16 {
359  ColorRGB16();
360 
361  bool load(DataReader &reader);
362 
363  uint16 red;
364  uint16 green;
365  uint16 blue;
366 };
367 
368 struct IntRange {
369  IntRange();
370 
371  bool load(DataReader &reader);
372 
373  int32 min;
374  int32 max;
375 };
376 
378  bool load(DataReader &reader);
379 
380  Common::XPFloat angleRadians;
381  Common::XPFloat magnitude;
382 };
383 
384 struct XPFloatPOD {
385  uint16 signAndExponent;
386  uint64 mantissa;
387 
388  bool load(DataReader &reader);
389  Common::XPFloat toXPFloat() const;
390 };
391 
392 struct Label {
393  bool load(DataReader &reader);
394 
395  uint32 superGroupID;
396  uint32 labelID;
397 };
398 
399 // mTropolis uses two separate type-tagged value formats.
400 //
401 // InternalTypeTaggedValue is used by internal modifiers for messenger payloads and set modifiers
402 // and seems to match Miniscript ops too.
403 // InternalTypeTaggedValue is always 46 bytes in size and stores string data elsewhere in the containing structure.
404 //
405 // PlugInTypeTaggedValue is used by plug-ins and is fully self-contained.
406 //
407 // If you change something here, remember to update DynamicValue::load
409  enum TypeCode {
410  kNull = 0x00,
411  kInteger = 0x01,
412  kString = 0x0d, // String data is stored externally from the value
413  kPoint = 0x10,
414  kIntegerRange = 0x11,
415  kFloat = 0x15,
416  kBool = 0x1a,
417  kIncomingData = 0x1b,
418  kVariableReference = 0x1c,
419  kLabel = 0x1d,
420  };
421 
423  uint32 unknown;
424  uint32 guid;
425  };
426 
427  union ValueUnion {
428  ValueUnion();
429 
430  uint8 asBool;
431  XPFloatPOD asFloat;
432  int32 asInteger;
433  IntRange asIntegerRange;
434  VariableReference asVariableReference;
435  Label asLabel;
436  Point asPoint;
437 
438  template<class T>
439  void constructField(T ValueUnion::*fieldPtr);
440  };
441 
444 
445  uint16 type;
446  ValueUnion value;
447 
448  bool load(DataReader &reader);
449 };
450 
452  enum TypeCode {
453  kNull = 0x00,
454  kInteger = 0x01,
455  kPoint = 0xa,
456  kIntegerRange = 0xb,
457  kFloat = 0xf,
458  kBoolean = 0x14,
459  kEvent = 0x17,
460  kLabel = 0x64,
461  kString = 0x66,
462  kIncomingData = 0x6e,
463  kVariableReference = 0x73, // Has extra data
464  };
465 
466  union ValueUnion {
467  ValueUnion();
468  ~ValueUnion();
469 
470  int32 asInt;
471  Point asPoint;
472  IntRange asIntRange;
473  XPFloatPOD asFloat;
474  uint16 asBoolean;
475  Event asEvent;
476  Label asLabel;
477  uint32 asVarRefGUID;
478  Common::String asString;
479 
480  template<class T>
481  void constructField(T ValueUnion::*fieldPtr);
482 
483  template<class T>
484  void destructField(T ValueUnion::*fieldPtr);
485  };
486 
489 
490  uint16 type;
491  ValueUnion value;
492 
493  Common::Array<uint8> extraData;
494 
495  bool load(DataReader &reader);
496 };
497 
499 
500 public:
501  DataObject();
502  virtual ~DataObject();
503  DataReadErrorCode load(DataObjectTypes::DataObjectType type, uint16 revision, DataReader &reader);
504 
505  uint16 getRevision() const;
506  DataObjectTypes::DataObjectType getType() const;
507 
508 protected:
509  virtual DataReadErrorCode load(DataReader &reader) = 0;
510 
511  DataObjectTypes::DataObjectType _type;
512  uint16 _revision;
513 };
514 
515 struct ProjectHeader : public DataObject {
516  ProjectHeader();
517 
518  uint32 persistFlags;
519  uint32 sizeIncludingTag;
520  uint16 unknown1;
521  uint32 catalogFilePosition;
522 
523 protected:
524  DataReadErrorCode load(DataReader &reader) override;
525 };
526 
527 struct ProjectLabelMap : public DataObject {
528  ProjectLabelMap();
529  ~ProjectLabelMap();
530 
531  struct LabelTree {
532  LabelTree();
533  ~LabelTree();
534 
535  enum : uint {
536  kExpandedInEditor = 0x80000000,
537  };
538 
539  uint32 nameLength;
540  uint32 isGroup;
541  uint32 id;
542  uint32 unknown1;
543  uint32 flags;
544 
545  Common::String name;
546 
547  uint32 numChildren;
548  LabelTree *children;
549  };
550 
551  struct SuperGroup {
552  SuperGroup();
553  ~SuperGroup();
554 
555  uint32 nameLength;
556  uint32 id;
557  uint32 unknown2;
558  Common::String name;
559 
560  uint32 numChildren;
561  LabelTree *tree;
562  };
563 
564  uint32 persistFlags;
565  uint32 unknown1; // Always 0x16
566  uint32 numSuperGroups;
567  uint32 nextAvailableID;
568 
569  SuperGroup *superGroups;
570 
571 private:
572  static DataReadErrorCode loadSuperGroup(SuperGroup &sg, DataReader &reader);
573  static DataReadErrorCode loadLabelTree(LabelTree &lt, DataReader &reader);
574 
575  DataReadErrorCode load(DataReader &reader) override;
576 };
577 
580 
581  uint32 persistFlags;
582  uint32 sizeIncludingTag;
583  uint8 unknown1[2];
584  Point dimensions;
585  uint16 bitsPerPixel;
586  uint16 unknown4;
587 
588 protected:
589  DataReadErrorCode load(DataReader &reader) override;
590 };
591 
592 struct AssetCatalog : public DataObject {
593  enum {
594  kFlag1Deleted = 1,
595  kFlag1LimitOnePerSegment = 2,
596  };
597 
600 
601  uint32 assetType;
602  uint32 flags2;
603  };
604 
605  struct AssetInfo {
606  AssetInfo();
607 
608  uint32 flags1;
609  uint16 nameLength;
610  uint16 alwaysZero;
611  uint32 streamID;
612  uint32 filePosition; // Contains a static value in Obsidian
613 
614  AssetInfoRev4Fields rev4Fields;
615 
616  Common::String name;
617  };
618 
619  AssetCatalog();
620 
621  uint32 persistFlags;
622  uint32 totalNameSizePlus22;
623  uint8 unknown1[4];
624  uint32 numAssets;
625  bool haveRev4Fields;
626 
628 
629 protected:
630  DataReadErrorCode load(DataReader &reader) override;
631 };
632 
633 struct Unknown19 : public DataObject {
634  Unknown19();
635 
636  uint32 persistFlags;
637  uint32 sizeIncludingTag;
638  uint8 unknown1[2];
639 
640 protected:
641  DataReadErrorCode load(DataReader &reader) override;
642 };
643 
644 struct Unknown2B : public DataObject {
645  Unknown2B();
646 
647  uint32 persistFlags;
648  uint32 sizeIncludingTag;
649 
650 protected:
651  DataReadErrorCode load(DataReader &reader) override;
652 };
653 
654 struct StructuralDef : public DataObject {
655  StructuralDef();
656 
657  uint32 structuralFlags;
658 };
659 
662 
663  uint32 unknown1; // Seems to always be 0x16 or 0x9
664  uint32 sizeIncludingTag;
665  uint32 guid;
666  uint32 otherFlags;
667  uint16 lengthOfName;
668 
669  Common::String name;
670 
671 protected:
672  DataReadErrorCode load(DataReader &reader) override;
673 };
674 
677 
678  uint32 sizeIncludingTag;
679  uint32 guid;
680  uint16 lengthOfName;
681  uint32 otherFlags;
682  uint16 unknown4;
683  uint16 sectionID;
684  uint32 segmentID;
685 
686  Common::String name;
687 
688 protected:
689  DataReadErrorCode load(DataReader &reader) override;
690 };
691 
694 
695  uint32 structuralFlags;
696  uint32 sizeIncludingTag;
697  uint32 guid;
698  uint16 lengthOfName;
699  uint32 otherFlags;
700  uint16 sectionID;
701 
702  Common::String name;
703 
704 protected:
705  DataReadErrorCode load(DataReader &reader) override;
706 };
707 
708 namespace ElementFlags {
709 
710 enum ElementFlags {
711  kNotDirectToScreen = 0x00001000,
712  kHidden = 0x00008000,
713  kPaused = 0x00010000,
714  kExpandedInEditor = 0x00800000,
715  kCacheBitmap = 0x02000000,
716  kSelectedInEditor = 0x10000000,
717 };
718 
719 } // End of namespace ElementFlags
720 
721 namespace AnimationFlags {
722 
723 enum AnimationFlags {
724  kAlternate = 0x10000000,
725  kLoop = 0x08000000,
726  kPlayEveryFrame = 0x02000000,
727 };
728 
729 } // End of namespace AnimationFlags
730 
731 namespace SceneTransitionTypes {
732 
733 enum SceneTransitionType {
734  kNone = 0,
735  kPatternDissolve = 0x0406,
736  kRandomDissolve = 0x0410, // No steps
737  kFade = 0x041a,
738  kSlide = 0x03e8, // Directional
739  kPush = 0x03f2, // Directional
740  kZoom = 0x03fc,
741  kWipe = 0x0424, // Directional
742 };
743 
744 } // End of namespace SceneTransitionTypes
745 
746 namespace SceneTransitionDirections {
747 
748 enum SceneTransitionDirection {
749  kUp = 0x384,
750  kDown = 0x385,
751  kLeft = 0x386,
752  kRight = 0x387,
753 };
754 
755 } // End of namespace SceneTransitionDirections
756 
757 struct GraphicElement : public StructuralDef {
758  GraphicElement();
759 
760  // Possible element flags: NotDirectToScreen, CacheBitmap, Hidden
761  uint32 sizeIncludingTag;
762  uint32 guid;
763  uint16 lengthOfName;
764  uint32 elementFlags;
765  uint16 layer;
766  uint16 sectionID;
767  Rect rect1;
768  Rect rect2;
769  uint32 streamLocator; // 1-based index, sometimes observed with 0x10000000 flag set, not sure of the meaning
770  uint8 unknown11[4];
771 
772  Common::String name;
773 
774 protected:
775  DataReadErrorCode load(DataReader &reader) override;
776 };
777 
778 struct ImageElement : public StructuralDef {
779  ImageElement();
780 
781  // Possible element flags: NotDirectToScreen, CacheBitmap, Hidden
782  uint32 sizeIncludingTag;
783  uint32 guid;
784  uint16 lengthOfName;
785  uint32 elementFlags;
786  uint16 layer;
787  uint16 sectionID;
788  Rect rect1;
789  Rect rect2;
790  uint32 imageAssetID;
791  uint32 streamLocator;
792  uint8 unknown7[4];
793 
794  Common::String name;
795 
796 protected:
797  DataReadErrorCode load(DataReader &reader) override;
798 };
799 
802 
803  // Possible element flags: NotDirectToScreen, CacheBitmap, Hidden
804  uint32 sizeIncludingTag;
805  uint32 guid;
806  uint16 lengthOfName;
807  uint32 elementFlags;
808  uint16 layer;
809  uint16 sectionID;
810  Rect rect1;
811  Rect rect2;
812  uint32 assetID;
813 
814  struct MacPart {
815  uint8 unknown2[30];
816  };
817 
818  struct WinPart {
819  uint8 unknown3[2];
820  uint8 unknown4[8];
821  };
822 
823  union PlatformPart {
824  MacPart mac;
825  WinPart win;
826  };
827 
828  bool haveMacPart;
829  bool haveWinPart;
830  PlatformPart platform;
831 
832  Common::String name;
833 
834 protected:
835  DataReadErrorCode load(DataReader &reader) override;
836 };
837 
838 struct SoundElement : public StructuralDef {
839  enum SoundFlags : uint {
840  kPaused = 0x40000000,
841  kLoop = 0x80000000,
842  };
843 
844  SoundElement();
845 
846  // Possible element flags: Loop, Paused
847  uint32 sizeIncludingTag;
848  uint32 guid;
849  uint16 lengthOfName;
850  uint32 elementFlags;
851  uint32 soundFlags;
852  uint16 unknown2;
853  uint8 unknown3[2];
854  uint16 rightVolume;
855  uint16 leftVolume;
856  int16 balance;
857  uint32 assetID;
858  uint8 unknown5[8];
859 
860  Common::String name;
861 
862 protected:
863  DataReadErrorCode load(DataReader &reader) override;
864 };
865 
866 struct MovieElement : public StructuralDef {
867  explicit MovieElement(bool avi);
868 
869  // Possible flags: NotDirectToScreen, CacheBitmap, Hidden, Loop, Loop + Alternate, Paused
870  uint32 sizeIncludingTag;
871  uint32 guid;
872  uint16 lengthOfName;
873  uint32 elementFlags;
874  uint16 layer;
875  uint8 unknown3[44];
876  uint16 sectionID;
877  uint8 unknown5[2];
878  Rect rect1;
879  Rect rect2;
880  uint32 assetID;
881  uint32 unknown7;
882  uint16 volume;
883  uint32 animationFlags;
884  uint8 unknown10[4];
885  uint8 unknown11[4];
886  uint32 streamLocator;
887  uint8 unknown13[4];
888 
889  Common::String name;
890 
891  bool isAVI;
892 
893 protected:
894  DataReadErrorCode load(DataReader &reader) override;
895 };
896 
897 struct MToonElement : public StructuralDef {
898  MToonElement();
899 
900  // Possible flags: NotDirectToScreen, CacheBitmap, Hidden, Loop, Paused, PlayEveryFrame (inverted as "Maintain Rate")
901  uint32 sizeIncludingTag;
902  uint32 guid;
903  uint16 lengthOfName;
904  uint32 elementFlags;
905  uint16 layer;
906  uint32 animationFlags;
907  uint8 unknown4[4];
908  uint16 sectionID;
909  Rect rect1;
910  Rect rect2;
911  uint32 assetID;
912  uint32 rateTimes100000;
913  uint32 streamLocator;
914  uint32 unknown6;
915 
916  Common::String name;
917 
918 protected:
919  DataReadErrorCode load(DataReader &reader) override;
920 };
921 
922 struct GlobalObjectInfo : public DataObject {
924 
925  uint32 persistFlags;
926  uint32 sizeIncludingTag;
927  uint16 numGlobalModifiers;
928  uint8 unknown1[4];
929 
930 protected:
931  DataReadErrorCode load(DataReader &reader) override;
932 };
933 
934 class ProjectCatalog : public DataObject {
935 public:
936  struct StreamDesc {
937  StreamDesc();
938 
939  char streamType[25];
940  uint16 segmentIndexPlusOne;
941  uint32 winSize;
942  uint32 winPos;
943  uint32 macSize;
944  uint32 macPos;
945  };
946 
947  struct SegmentDesc {
948  SegmentDesc();
949 
950  uint32 segmentID;
951  Common::String label;
952  Common::String exportedPath;
953  };
954 
955  ProjectCatalog();
956 
957  uint32 persistFlags;
958  uint32 sizeOfStreamAndSegmentDescs;
959  uint16 unknown1;
960  uint16 unknown2;
961  uint32 unknown3;
962 
965 
966 protected:
967  DataReadErrorCode load(DataReader &reader) override;
968 };
969 
970 struct StreamHeader : public DataObject {
971  StreamHeader();
972 
973  uint32 marker;
974  uint32 sizeIncludingTag;
975  char name[17];
976  uint8 projectID[2];
977  uint8 unknown1[4]; // Seems to be consistent across builds
978  uint16 unknown2; // 0
979 
980 protected:
981  DataReadErrorCode load(DataReader &reader) override;
982 };
983 
984 struct BehaviorModifier : public DataObject {
985  enum BehaviorFlags {
986  kBehaviorFlagSwitchable = 1,
987  };
988 
990 
991  uint32 modifierFlags;
992  uint32 sizeIncludingTag;
993  uint8 unknown2[2];
994  uint32 guid;
995  uint32 unknown4;
996  uint16 unknown5;
997  uint32 unknown6;
998  uint32 unknown8; // revision 2 only.
999  Point editorLayoutPosition;
1000  uint16 lengthOfName;
1001  uint16 numChildren;
1002  uint32 behaviorFlags;
1003  Event enableWhen;
1004  Event disableWhen;
1005  uint8 unknown7[2];
1006 
1007  Common::String name;
1008 
1009 protected:
1010  DataReadErrorCode load(DataReader &reader) override;
1011 };
1012 
1014  struct LocalRef {
1015  LocalRef();
1016 
1017  uint32 guid;
1018  uint8 lengthOfName;
1019  uint8 unknown2;
1020 
1021  Common::String name;
1022  };
1023 
1024  struct Attribute {
1025  Attribute();
1026 
1027  uint8 lengthOfName;
1028  uint8 unknown3;
1029 
1030  Common::String name;
1031  };
1032 
1034 
1035  uint32 unknown1;
1036  uint32 sizeOfInstructions;
1037  uint32 numOfInstructions;
1038  uint32 numLocalRefs;
1039  uint32 numAttributes;
1040 
1041  Common::Array<uint8> bytecode;
1042  Common::Array<LocalRef> localRefs;
1043  Common::Array<Attribute> attributes;
1044 
1045  DataFormat dataFormat;
1046 
1047  bool load(DataReader &reader);
1048 };
1049 
1050 // Header used for most modifiers, but not all
1053 
1054  uint32 modifierFlags;
1055  uint32 sizeIncludingTag;
1056  uint32 guid;
1057  uint8 unknown3[6];
1058  uint32 unknown4;
1059  uint32 unknown5; // V2 header only
1060  Point editorLayoutPosition;
1061  uint16 lengthOfName;
1062 
1063  Common::String name;
1064 
1065  bool load(DataReader &reader, bool isV2);
1066 };
1067 
1070 
1071  TypicalModifierHeader modHeader;
1072  Event enableWhen;
1073  uint8 unknown6[11];
1074  uint8 unknown7;
1075 
1076  MiniscriptProgram program;
1077 
1078 protected:
1079  DataReadErrorCode load(DataReader &reader) override;
1080 };
1081 
1084 
1085  TypicalModifierHeader modHeader;
1086  Event applyWhen;
1087  uint32 unknown1;
1088  uint8 unknown2[4];
1089  uint32 assetID;
1090 
1091 protected:
1092  DataReadErrorCode load(DataReader &reader) override;
1093 };
1094 
1097 
1098  TypicalModifierHeader modHeader;
1099  uint8 unknown1[4];
1100  Event enableWhen;
1101  Event disableWhen;
1102  uint16 fadeToVolume;
1103  uint8 codedDuration[4];
1104  uint8 unknown2[18];
1105 
1106 protected:
1107  DataReadErrorCode load(DataReader &reader) override;
1108 };
1109 
1112 
1113  TypicalModifierHeader modHeader;
1114  uint8 unknown1[4];
1115  Event saveWhen;
1116  Event restoreWhen;
1117  InternalTypeTaggedValue saveOrRestoreValue;
1118 
1119  uint8 unknown5[8];
1120 
1121  uint8 lengthOfFilePath;
1122  uint8 lengthOfFileName;
1123  uint8 lengthOfVariableName;
1124  uint8 lengthOfVariableString;
1125 
1126  Common::String varName;
1127  Common::String varString;
1128  Common::String filePath;
1129  Common::String fileName;
1130 
1131 protected:
1132  DataReadErrorCode load(DataReader &reader) override;
1133 };
1134 
1135 enum MessageFlags : uint {
1136  kMessageFlagNoRelay = 0x20000000,
1137  kMessageFlagNoCascade = 0x40000000,
1138  kMessageFlagNoImmediate = 0x80000000,
1139 };
1140 
1141 
1144 
1145  TypicalModifierHeader modHeader;
1146 
1147  uint32 messageFlags;
1148  Event send;
1149  Event when;
1150  uint16 unknown14;
1151  uint32 destination;
1152  uint8 unknown11[10];
1154  uint8 withSourceLength;
1155  uint8 withStringLength;
1156 
1157  Common::String withSource;
1158  Common::String withString;
1159 
1160 protected:
1161  DataReadErrorCode load(DataReader &reader) override;
1162 };
1163 
1164 struct SetModifier : public DataObject {
1165  SetModifier();
1166 
1167  TypicalModifierHeader modHeader;
1168 
1169  uint8 unknown1[4];
1170  Event executeWhen;
1171  InternalTypeTaggedValue source;
1172  InternalTypeTaggedValue target;
1173  uint8 unknown3;
1174  uint8 sourceNameLength;
1175  uint8 targetNameLength;
1176  uint8 sourceStringLength;
1177  uint8 targetStringLength;
1178  uint8 unknown4;
1179 
1180  Common::String sourceName;
1181  Common::String targetName;
1182  Common::String sourceString;
1183  Common::String targetString;
1184 
1185 protected:
1186  DataReadErrorCode load(DataReader &reader) override;
1187 };
1188 
1189 struct AliasModifier : public DataObject {
1190  AliasModifier();
1191 
1192  uint32 modifierFlags;
1193  uint32 sizeIncludingTag;
1194  uint16 aliasIndexPlusOne;
1195  uint32 unknown1;
1196  uint32 unknown2;
1197  uint32 unknown3;
1198  uint32 lengthOfName;
1199  uint32 guid;
1200  Point editorLayoutPosition;
1201 
1202  Common::String name;
1203 
1204  bool haveGUID;
1205 
1206 protected:
1207  DataReadErrorCode load(DataReader &reader) override;
1208 };
1209 
1211  enum ChangeSceneFlags : uint {
1212  kChangeSceneFlagNextScene = 0x80000000,
1213  kChangeSceneFlagPrevScene = 0x40000000,
1214  kChangeSceneFlagSpecificScene = 0x20000000,
1215  kChangeSceneFlagAddToReturnList = 0x10000000,
1216  kChangeSceneFlagAddToDestList = 0x08000000,
1217  kChangeSceneFlagWrapAround = 0x04000000,
1218  };
1219 
1221 
1222  TypicalModifierHeader modHeader;
1223  uint32 changeSceneFlags;
1224  Event executeWhen;
1225  uint32 targetSectionGUID;
1226  uint32 targetSubsectionGUID;
1227  uint32 targetSceneGUID;
1228 
1229 protected:
1230  DataReadErrorCode load(DataReader &reader) override;
1231 };
1232 
1235 
1236  static const uint32 kSpecialAssetIDSystemBeep = 0xffffffffu;
1237 
1238  TypicalModifierHeader modHeader;
1239  uint8 unknown1[4];
1240  Event executeWhen;
1241  Event terminateWhen;
1242  uint32 unknown2;
1243  uint8 unknown3[4];
1244  uint32 assetID;
1245  uint8 unknown5[4];
1246 
1247 protected:
1248  DataReadErrorCode load(DataReader &reader) override;
1249 };
1250 
1254 
1255  uint32 messageFlags;
1256  Event send;
1257  uint16 unknown11;
1258  uint32 destination;
1259  uint8 unknown13[10];
1261  uint8 withSourceLength;
1262  uint8 withStringLength;
1263 
1264  Common::String withSource;
1265  Common::String withString;
1266 
1267  bool load(DataReader &reader);
1268  };
1269 
1270  struct PointDef {
1271  PointDef();
1272 
1273  enum FrameFlags {
1274  kFrameFlagPlaySequentially = 1,
1275  };
1276 
1277  Point point;
1278  uint32 frame;
1279  uint32 frameFlags;
1280 
1281  PointDefMessageSpec messageSpec;
1282 
1283  bool load(DataReader &reader, bool haveMessageSpec);
1284  };
1285 
1286  enum Flags {
1287  kFlagReverse = 0x00100000,
1288  kFlagLoop = 0x10000000,
1289  kFlagAlternate = 0x02000000,
1290  kFlagStartAtBeginning = 0x08000000,
1291  };
1292 
1293  explicit PathMotionModifier(uint version);
1294 
1295  TypicalModifierHeader modHeader;
1296  uint32 flags;
1297 
1298  Event executeWhen;
1299  Event terminateWhen;
1300 
1301  uint8 unknown2[2];
1302  uint16 numPoints;
1303  uint8 unknown3[4];
1304  uint32 frameDurationTimes10Million;
1305  uint8 unknown5[4];
1306  uint32 unknown6;
1307 
1308  bool havePointDefMessageSpecs;
1309 
1310  Common::Array<PointDef> points;
1311 
1312 protected:
1313  DataReadErrorCode load(DataReader &reader) override;
1314 };
1315 
1318 
1319  TypicalModifierHeader modHeader;
1320 
1321  Event executeWhen;
1322  Event terminateWhen;
1323  uint16 motionType;
1324  uint16 directionFlags;
1325  uint16 steps;
1326  uint32 delayMSecTimes4800;
1327  uint8 unknown1[4];
1328 
1329 protected:
1330  DataReadErrorCode load(DataReader &reader) override;
1331 };
1332 
1335 
1336  TypicalModifierHeader modHeader;
1337 
1338  Event enableWhen;
1339  Event disableWhen;
1340 
1341  struct WinPart {
1342  uint8 unknown2;
1343  uint8 constrainHorizontal;
1344  uint8 constrainVertical;
1345  uint8 constrainToParent;
1346  };
1347 
1348  struct MacPart {
1349  uint8 flags;
1350  uint8 unknown3;
1351 
1352  enum Flags {
1353  kConstrainToParent = 0x10,
1354  kConstrainVertical = 0x20,
1355  kConstrainHorizontal = 0x40,
1356  };
1357  };
1358 
1360  WinPart win;
1361  MacPart mac;
1362  };
1363 
1364  PlatformPart platform;
1365 
1366  bool haveMacPart;
1367  bool haveWinPart;
1368  Rect constraintMargin;
1369  uint16 unknown1;
1370 
1371 protected:
1372  DataReadErrorCode load(DataReader &reader) override;
1373 };
1374 
1377 
1378  TypicalModifierHeader modHeader;
1379 
1380  Event enableWhen;
1381  Event disableWhen;
1383  uint16 unknown1;
1384  uint8 vecSourceLength;
1385  uint8 vecStringLength;
1386 
1387  Common::String vecSource;
1388  Common::String vecString;
1389 
1390 protected:
1391  DataReadErrorCode load(DataReader &reader) override;
1392 };
1393 
1396 
1397  TypicalModifierHeader modHeader;
1398 
1399  Event enableWhen;
1400  Event disableWhen;
1401  uint16 transitionType;
1402  uint16 direction;
1403  uint16 unknown3;
1404  uint16 steps;
1405  uint32 duration;
1406  uint8 unknown5[2];
1407 
1408 protected:
1409  DataReadErrorCode load(DataReader &reader) override;
1410 };
1411 
1414 
1415  enum TransitionType {
1416  kTransitionTypeRectangularIris = 0x03e8,
1417  kTransitionTypeOvalIris = 0x03f2,
1418  kTransitionTypeZoom = 0x044c,
1419  kTransitionTypeFade = 0x2328,
1420  };
1421 
1422  enum RevealType {
1423  kRevealTypeReveal = 0,
1424  kRevealTypeConceal = 1,
1425  };
1426 
1427  TypicalModifierHeader modHeader;
1428 
1429  Event enableWhen;
1430  Event disableWhen;
1431  uint16 revealType;
1432  uint16 transitionType;
1433  uint16 unknown3;
1434  uint16 unknown4;
1435  uint16 steps;
1436  uint16 rate;
1437 
1438 protected:
1439  DataReadErrorCode load(DataReader &reader) override;
1440 };
1441 
1444 
1445  TypicalModifierHeader modHeader;
1446 
1447  uint8 unknown1[4];
1448  Event executeWhen;
1449  uint32 sectionGUID;
1450  uint32 subsectionGUID;
1451  uint32 sceneGUID;
1452 
1453 protected:
1454  DataReadErrorCode load(DataReader &reader) override;
1455 };
1456 
1459 
1460  TypicalModifierHeader modHeader;
1461 
1462  uint32 messageFlags;
1463  Event send;
1464  Event when;
1465  uint16 unknown6;
1466  uint32 destination;
1467  uint8 unknown7[10];
1469  uint8 unknown9[10];
1470  uint8 withSourceLength;
1471  uint8 withStringLength;
1472  MiniscriptProgram program;
1473 
1474  Common::String withSource;
1475  Common::String withString;
1476 
1477 protected:
1478  DataReadErrorCode load(DataReader &reader) override;
1479 };
1480 
1483 
1484  TypicalModifierHeader modHeader;
1485 
1486  enum TimerFlags {
1487  kTimerFlagLooping = 0x10000000,
1488  };
1489 
1490  uint32 messageAndTimerFlags;
1491  Event executeWhen;
1492  Event send;
1493  Event terminateWhen;
1494  uint16 unknown2;
1495  uint32 destination;
1496  uint8 unknown4[10];
1498  uint8 unknown5;
1499  uint8 minutes;
1500  uint8 seconds;
1501  uint8 hundredthsOfSeconds;
1502  uint32 unknown6;
1503  uint32 unknown7;
1504  uint8 unknown8[10];
1505  uint8 withSourceLength;
1506  uint8 withStringLength;
1507 
1508  Common::String withSource;
1509  Common::String withString;
1510 
1511 protected:
1512  DataReadErrorCode load(DataReader &reader) override;
1513 };
1514 
1517 
1518  enum Flags {
1519  kDetectTopEdge = 0x1000,
1520  kDetectBottomEdge = 0x0800,
1521  kDetectLeftEdge = 0x0400,
1522  kDetectRightEdge = 0x0200,
1523  kDetectExiting = 0x0100, // Off = once exited
1524  kWhileDetected = 0x0080, // Off = on first detected
1525  };
1526 
1527  TypicalModifierHeader modHeader;
1528  uint16 messageFlagsHigh;
1529  Event enableWhen;
1530  Event disableWhen;
1531  Event send;
1532  uint16 unknown2;
1533  uint32 destination;
1534  uint8 unknown3[10];
1536  uint8 withSourceLength;
1537  uint8 withStringLength;
1538 
1539  Common::String withSource;
1540  Common::String withString;
1541 
1542 protected:
1543  DataReadErrorCode load(DataReader &reader) override;
1544 };
1545 
1548 
1549  enum ModifierFlags {
1550  kDetectLayerInFront = 0x10000000,
1551  kDetectLayerBehind = 0x08000000,
1552  kSendToCollidingElement = 0x02000000,
1553  kSendToOnlyFirstCollidingElement = 0x00200000,
1554 
1555  kDetectionModeMask = 0x01c00000,
1556  kDetectionModeFirstContact = 0x01400000,
1557  kDetectionModeWhileInContact = 0x01000000,
1558  kDetectionModeExiting = 0x00800000,
1559 
1560  kNoCollideWithParent = 0x00100000,
1561  };
1562 
1563  TypicalModifierHeader modHeader;
1564  uint32 messageAndModifierFlags;
1565  Event enableWhen;
1566  Event disableWhen;
1567  Event send;
1568  uint16 unknown2;
1569  uint32 destination;
1570  uint8 unknown3[10];
1572  uint8 withSourceLength;
1573  uint8 withStringLength;
1574 
1575  Common::String withSource;
1576  Common::String withString;
1577 
1578 protected:
1579  DataReadErrorCode load(DataReader &reader) override;
1580 };
1581 
1583  enum KeyStateFlags {
1584  kOnDown = 0x10000000,
1585  kOnUp = 0x4000000,
1586  kOnRepeat = 0x8000000,
1587 
1588  kKeyStateMask = (kOnDown | kOnUp | kOnRepeat),
1589  };
1590 
1591  enum KeyModifiers {
1592  kControl = 0x1000,
1593  kCommand = 0x0100,
1594  kOption = 0x0800,
1595  };
1596 
1597  enum KeyCodes {
1598  kAny = 0x00,
1599  kHome = 0x01,
1600  kEnter = 0x03,
1601  kEnd = 0x04,
1602  kHelp = 0x05,
1603  kBackspace = 0x08,
1604  kTab = 0x09,
1605  kPageUp = 0x0b,
1606  kPageDown = 0x0c,
1607  kReturn = 0x0d,
1608  kEscape = 0x1b,
1609  kArrowLeft = 0x1c,
1610  kArrowRight = 0x1d,
1611  kArrowUp = 0x1e,
1612  kArrowDown = 0x1f,
1613  kDelete = 0x7f,
1614  };
1615 
1617 
1618  TypicalModifierHeader modHeader;
1619  uint32 messageFlagsAndKeyStates;
1620  uint16 unknown2;
1621  uint16 keyModifiers;
1622  uint8 keycode;
1623  uint8 unknown4[7];
1624  Event message;
1625  uint16 unknown7;
1626  uint32 destination;
1627  uint8 unknown9[10];
1629  uint8 withSourceLength;
1630  uint8 withStringLength;
1631 
1632  Common::String withSource;
1633  Common::String withString;
1634 
1635 protected:
1636  DataReadErrorCode load(DataReader &reader) override;
1637 };
1638 
1641 
1642  TypicalModifierHeader modHeader;
1643 
1644  uint8 unknown1[4];
1645  uint16 macFontID;
1646  uint8 flags;
1647  uint8 unknown2;
1648  uint16 size;
1649  ColorRGB16 textColor; // Appears to not actually be used
1650  ColorRGB16 backgroundColor; // Appears to not actually be used
1651  uint16 alignment;
1652  uint16 unknown3;
1653  Event applyWhen;
1654  Event removeWhen;
1655  uint16 lengthOfFontFamilyName;
1656 
1657  Common::String fontFamilyName;
1658 
1659 protected:
1660  DataReadErrorCode load(DataReader &reader) override;
1661 };
1662 
1663 struct GraphicModifier : public DataObject {
1664  GraphicModifier();
1665 
1666  TypicalModifierHeader modHeader;
1667 
1668  uint16 unknown1;
1669  Event applyWhen;
1670  Event removeWhen;
1671  uint8 unknown2[2];
1672  uint16 inkMode;
1673  uint16 shape;
1674 
1675  struct MacPart {
1676  uint8 unknown4_1[6];
1677  uint8 unknown4_2[26];
1678  };
1679 
1680  struct WinPart {
1681  uint8 unknown5_1[4];
1682  uint8 unknown5_2[22];
1683  };
1684 
1686  MacPart mac;
1687  WinPart win;
1688  };
1689 
1690  bool haveMacPart;
1691  bool haveWinPart;
1692  PlatformPart platform;
1693 
1694  ColorRGB16 foreColor;
1695  ColorRGB16 backColor;
1696  uint16 borderSize;
1697  ColorRGB16 borderColor;
1698  uint16 shadowSize;
1699  ColorRGB16 shadowColor;
1700 
1701  uint16 numPolygonPoints;
1702  uint8 unknown6[8];
1703 
1704  Common::Array<Point> polyPoints;
1705 
1706 protected:
1707  DataReadErrorCode load(DataReader &reader) override;
1708 };
1709 
1712 
1713  enum Types {
1714  kTypeInvert = 1,
1715  kTypeSelectedBevels = 2,
1716  kTypeDeselectedBevels = 3,
1717  kTypeToneDown = 4,
1718  kTypeToneUp = 5,
1719  };
1720 
1721  TypicalModifierHeader modHeader;
1722 
1723  uint32 flags;
1724  uint16 type;
1725  Event applyWhen;
1726  Event removeWhen;
1727  uint16 bevelWidth;
1728  uint16 toneAmount;
1729  uint8 unknown2[2];
1730 
1731 protected:
1732  DataReadErrorCode load(DataReader &reader) override;
1733 };
1734 
1735 struct ReturnModifier : public DataObject {
1736  ReturnModifier();
1737 
1738  TypicalModifierHeader modHeader;
1739 
1740  Event executeWhen;
1741  uint16 unknown1;
1742 
1743 protected:
1744  DataReadErrorCode load(DataReader &reader) override;
1745 };
1746 
1747 struct CursorModifierV1 : public DataObject {
1748  CursorModifierV1();
1749 
1750  struct MacOnlyPart {
1751  MacOnlyPart();
1752 
1753  Event applyWhen;
1754  uint32 unknown1;
1755  uint16 unknown2;
1756  uint32 cursorIndex;
1757  };
1758 
1759  TypicalModifierHeader modHeader;
1760 
1761  bool hasMacOnlyPart;
1762  MacOnlyPart macOnlyPart;
1763 
1764 protected:
1765  DataReadErrorCode load(DataReader &reader) override;
1766 };
1767 
1770 
1771  // This doesn't follow the usual modifier header layout
1772  uint32 modifierFlags;
1773  uint32 sizeIncludingTag;
1774  uint8 unknown1[2]; // Extra field
1775  uint32 guid;
1776  uint8 unknown4[6];
1777  uint32 unknown5;
1778  Point editorLayoutPosition;
1779  uint16 lengthOfName;
1780  uint16 numChildren;
1781  uint8 unknown7[4];
1782 
1783  Common::String name;
1784 
1785 protected:
1786  DataReadErrorCode load(DataReader &reader) override;
1787 };
1788 
1791 
1792  TypicalModifierHeader modHeader;
1793  uint8 value;
1794  uint8 unknown5;
1795 
1796 protected:
1797  DataReadErrorCode load(DataReader &reader) override;
1798 };
1799 
1802 
1803  TypicalModifierHeader modHeader;
1804  uint8 unknown1[4];
1805  int32 value;
1806 
1807 protected:
1808  DataReadErrorCode load(DataReader &reader) override;
1809 };
1810 
1813 
1814  TypicalModifierHeader modHeader;
1815  uint8 unknown1[4];
1816  IntRange range;
1817 
1818 protected:
1819  DataReadErrorCode load(DataReader &reader) override;
1820 };
1821 
1824 
1825  TypicalModifierHeader modHeader;
1826  uint8 unknown1[4];
1827  XPFloatVector vector;
1828 
1829 protected:
1830  DataReadErrorCode load(DataReader &reader) override;
1831 };
1832 
1835 
1836  TypicalModifierHeader modHeader;
1837 
1838  uint8 unknown5[4];
1839  Point value;
1840 
1841 protected:
1842  DataReadErrorCode load(DataReader &reader) override;
1843 };
1844 
1847 
1848  TypicalModifierHeader modHeader;
1849  uint8 unknown1[4];
1850  Common::XPFloat value;
1851 
1852 protected:
1853  DataReadErrorCode load(DataReader &reader) override;
1854 };
1855 
1858 
1859  TypicalModifierHeader modHeader;
1860  uint32 lengthOfString;
1861  uint8 unknown1[4];
1862  Common::String value;
1863 
1864 protected:
1865  DataReadErrorCode load(DataReader &reader) override;
1866 };
1867 
1870 
1871  TypicalModifierHeader modHeader;
1872  uint32 unknown1;
1873  Event setToSourcesParentWhen;
1874 
1875 protected:
1876  DataReadErrorCode load(DataReader &reader) override;
1877 };
1878 
1880  virtual ~PlugInModifierData();
1881  virtual DataReadErrorCode load(PlugIn &plugIn, const PlugInModifier &prefix, DataReader &reader) = 0;
1882 };
1883 
1884 struct PlugInModifier : public DataObject {
1885  PlugInModifier();
1886 
1887  uint32 modifierFlags;
1888  uint32 codedSize; // Total size on Mac but (size + (name length * 255)) on Windows for some reason
1889  char modifierName[17];
1890  uint32 guid;
1891  uint8 unknown2[6];
1892  uint16 plugInRevision;
1893  uint32 unknown4;
1894  Point editorLayoutPosition;
1895  uint16 lengthOfName;
1896 
1897  Common::String name;
1898 
1899  uint32 subObjectSize;
1900 
1902 
1903 protected:
1904  DataReadErrorCode load(DataReader &reader) override;
1905 };
1906 
1907 struct Debris : public DataObject {
1908  Debris();
1909 
1910  uint32 persistFlags;
1911  uint32 sizeIncludingTag;
1912 
1913 protected:
1914  DataReadErrorCode load(DataReader &reader) override;
1915 };
1916 
1917 struct ColorTableAsset : public DataObject {
1918  ColorTableAsset();
1919 
1920  uint32 persistFlags;
1921  uint32 sizeIncludingTag;
1922  uint8 unknown1[4];
1923  uint32 assetID;
1924  uint32 unknown2; // Usually zero-fill but sometimes contains 0xb
1925 
1926  ColorRGB16 colors[256];
1927 
1928 protected:
1929  DataReadErrorCode load(DataReader &reader) override;
1930 };
1931 
1932 struct MovieAsset : public DataObject {
1933  struct MacPart {
1934  uint8 unknown5_1[66];
1935  uint8 unknown6[12];
1936  uint8 unknown8[4];
1937  };
1938 
1939  struct WinPart {
1940  uint8 unknown3_1[32];
1941  uint8 unknown4[12];
1942  uint8 unknown7[12];
1943  };
1944 
1946  MacPart mac;
1947  WinPart win;
1948  };
1949 
1950  MovieAsset();
1951 
1952  uint32 persistFlags;
1953  uint32 assetAndDataCombinedSize;
1954  uint8 unknown1[4];
1955  uint32 assetID;
1956  uint8 unknown1_1[4];
1957  uint16 extFileNameLength;
1958 
1959  uint32 movieDataPos;
1960  uint32 moovAtomPos;
1961  uint32 movieDataSize;
1962 
1963  bool haveMacPart;
1964  bool haveWinPart;
1965  PlatformPart platform;
1966 
1967  Common::String extFileName;
1968 
1969 protected:
1970  DataReadErrorCode load(DataReader &reader) override;
1971 };
1972 
1973 struct AVIMovieAsset : public DataObject {
1974  AVIMovieAsset();
1975 
1976  uint8 unknown1[12];
1977  uint32 assetID;
1978  uint8 unknown2[4];
1979  uint16 extFileNameLength;
1980  uint8 unknown3[60];
1981 
1982  Common::String extFileName;
1983 
1984 protected:
1985  DataReadErrorCode load(DataReader &reader) override;
1986 };
1987 
1988 struct AudioAsset : public DataObject {
1989  struct MacPart {
1990  uint8 unknown4[4];
1991  uint8 unknown5[5];
1992  uint8 unknown6[3];
1993  uint8 unknown8[20];
1994  };
1995 
1996  struct WinPart {
1997  uint8 unknown9[3];
1998  uint8 unknown10[3];
1999  uint8 unknown11[18];
2000  uint8 unknown12_1[2];
2001  };
2002 
2004  MacPart mac;
2005  WinPart win;
2006  };
2007 
2008  struct CuePoint {
2009  uint8 unknown13[2];
2010  uint32 unknown14;
2011  uint32 position;
2012  uint32 cuePointID;
2013  };
2014 
2015  AudioAsset();
2016 
2017  uint32 persistFlags;
2018  uint32 assetAndDataCombinedSize;
2019  uint8 unknown2[4];
2020  uint32 assetID;
2021  uint8 unknown3[20];
2022  uint16 sampleRate1;
2023  uint8 bitsPerSample;
2024  uint8 encoding1;
2025  uint8 channels;
2026  uint8 codedDuration[4];
2027  uint16 sampleRate2;
2028  uint32 cuePointDataSize;
2029  uint16 numCuePoints;
2030  uint8 unknown14[4];
2031  uint32 filePosition;
2032  uint32 size;
2033 
2034  Common::Array<CuePoint> cuePoints;
2035 
2036  bool haveMacPart;
2037  bool haveWinPart;
2038  bool isBigEndian;
2039  PlatformPart platform;
2040 
2041 protected:
2042  DataReadErrorCode load(DataReader &reader) override;
2043 };
2044 
2045 struct ImageAsset : public DataObject {
2046  struct MacPart {
2047  uint8 unknown7[44];
2048  };
2049 
2050  struct WinPart {
2051  uint8 unknown8[10];
2052  };
2053 
2055  WinPart win;
2056  MacPart mac;
2057  };
2058 
2059  ImageAsset();
2060 
2061  uint32 persistFlags;
2062  uint32 unknown1;
2063  uint8 unknown2[4];
2064  uint32 assetID;
2065  uint32 unknown3;
2066 
2067  Rect rect1;
2068  uint32 hdpiFixed;
2069  uint32 vdpiFixed;
2070  uint16 bitsPerPixel;
2071  uint8 unknown4[2];
2072  uint8 unknown5[4];
2073  uint8 unknown6[8];
2074  Rect rect2;
2075  uint32 filePosition;
2076  uint32 size;
2077 
2078  bool haveMacPart;
2079  bool haveWinPart;
2080  PlatformPart platform;
2081 
2082 protected:
2083  DataReadErrorCode load(DataReader &reader) override;
2084 };
2085 
2086 struct MToonAsset : public DataObject {
2087  struct MacPart {
2088  uint8 unknown10[88];
2089  };
2090 
2091  struct WinPart {
2092  uint8 unknown11[54];
2093  };
2094 
2096  MacPart mac;
2097  WinPart win;
2098  };
2099 
2100  struct FrameDef {
2101  struct MacPart {
2102  uint8 unknown17[4];
2103  };
2104 
2105  struct WinPart {
2106  uint8 unknown18[2];
2107  };
2108 
2110  MacPart mac;
2111  WinPart win;
2112  };
2113 
2114  FrameDef();
2115 
2116  uint8 unknown12[4];
2117  Rect rect1;
2118  uint32 dataOffset;
2119  uint8 unknown13[2];
2120  uint32 compressedSize;
2121  uint8 unknown14;
2122  uint8 keyframeFlag;
2123  uint8 platformBit;
2124  uint8 unknown15;
2125  Rect rect2;
2126  uint32 hdpiFixed;
2127  uint32 vdpiFixed;
2128  uint16 bitsPerPixel;
2129  uint32 unknown16;
2130  uint16 decompressedBytesPerRow;
2131  uint32 decompressedSize;
2132 
2133  PlatformUnion platform;
2134  };
2135 
2136  struct FrameRangeDef {
2137  FrameRangeDef();
2138 
2139  uint32 startFrame;
2140  uint32 endFrame;
2141  uint8 lengthOfName;
2142  uint8 unknown14;
2143 
2144  Common::String name; // Null terminated
2145  };
2146 
2147  enum {
2148  kEncodingFlag_TemporalCompression = 0x80,
2149  kEncodingFlag_HasRanges = 0x20000000,
2150  kEncodingFlag_Trimming = 0x08,
2151  };
2152 
2154  FrameRangePart();
2155 
2156  uint32 tag;
2157  uint32 sizeIncludingTag;
2158 
2159  uint32 numFrameRanges;
2160  Common::Array<FrameRangeDef> frameRanges;
2161  };
2162 
2163  MToonAsset();
2164 
2165  uint32 marker;
2166  uint8 unknown1[8];
2167  uint32 assetID;
2168 
2169  bool haveMacPart;
2170  bool haveWinPart;
2171  PlatformUnion platform;
2172 
2173  uint32 frameDataPosition;
2174  uint32 sizeOfFrameData;
2175 
2176  // mToon data
2177  uint32 mtoonHeader[2];
2178  uint16 version;
2179  uint8 unknown2[4];
2180  uint32 encodingFlags;
2181  Rect rect;
2182 
2183  uint16 numFrames;
2184  uint8 unknown3[14];
2185  uint16 bitsPerPixel;
2186  uint32 codecID;
2187  uint8 unknown4_1[8];
2188  uint32 codecDataSize;
2189  Point registrationPoint;
2190 
2191  Common::Array<FrameDef> frames;
2192 
2193  // Codec data appears to be a 16-byte header followed by a QuickTime sample description
2194  // Note that the sample description is partly useless because frames can have different sizes
2195  // and the sample desc is only for the last frame!
2196  //
2197  // The 16-byte header is:
2198  // uint32be size of codec data
2199  // char[4] codec ID
2200  // byte[8] unknown (all 0?)
2201  Common::Array<uint8> codecData;
2202 
2203  FrameRangePart frameRangesPart;
2204 
2205 protected:
2206  DataReadErrorCode load(DataReader &reader) override;
2207 };
2208 
2209 struct TextAsset : public DataObject {
2211  uint8 unknown9[2];
2212  uint16 spanStart;
2213  uint8 unknown10[4];
2214  uint16 fontID;
2215  uint8 fontFlags;
2216  uint8 unknown11[1];
2217  uint16 size;
2218  uint8 unknown12[6];
2219  };
2220 
2221  struct MacPart {
2222  uint8 unknown3[44];
2223  };
2224 
2225  struct WinPart {
2226  uint8 unknown4[10];
2227  };
2228 
2230  MacPart mac;
2231  WinPart win;
2232  };
2233 
2234  TextAsset();
2235 
2236  uint32 persistFlags;
2237  uint32 sizeIncludingTag;
2238  uint32 unknown1;
2239  uint32 assetID;
2240  uint32 unknown2;
2241  Rect bitmapRect;
2242  uint32 hdpi;
2243  uint32 vdpi;
2244  uint16 unknown5;
2245  uint8 pitchBigEndian[2];
2246  uint32 unknown6;
2247 
2248  uint32 bitmapSize;
2249  uint8 unknown7[20];
2250  uint32 textSize;
2251  uint8 unknown8[8];
2252  uint16 alignment;
2253  uint16 isBitmap;
2254 
2255  bool haveMacPart;
2256  bool haveWinPart;
2257  PlatformPart platform;
2258 
2259  Common::String text;
2260  Common::Array<uint8> bitmapData;
2261 
2262  bool isBottomUp;
2263 
2264  Common::Array<MacFormattingSpan> macFormattingSpans;
2265 
2266 protected:
2267  DataReadErrorCode load(DataReader &reader) override;
2268 };
2269 
2270 struct AssetDataChunk : public DataObject {
2271  AssetDataChunk();
2272 
2273  uint32 unknown1;
2274  uint32 sizeIncludingTag;
2275  int64 filePosition;
2276 
2277 protected:
2278  DataReadErrorCode load(DataReader &reader) override;
2279 };
2280 
2282  virtual Common::SharedPtr<Data::PlugInModifierData> createModifierData() const = 0;
2283  virtual PlugIn &getPlugIn() const = 0;
2284 };
2285 
2287 public:
2288  const IPlugInModifierDataFactory *findLoader(const char *modifierName) const;
2289  void registerLoader(const char *modifierName, const IPlugInModifierDataFactory *loader);
2290 
2291 private:
2293 };
2294 
2295 DataReadErrorCode loadDataObject(const PlugInModifierRegistry &registry, DataReader &reader, Common::SharedPtr<DataObject> &outObject);
2296 
2297 template<size_t TSize>
2298 inline bool DataReader::readBytes(uint8(&arr)[TSize]) {
2299  return this->read(arr, TSize);
2300 }
2301 
2302 template<size_t TSize>
2303 inline bool DataReader::readChars(char (&arr)[TSize]) {
2304  return this->read(arr, TSize);
2305 }
2306 
2307 } // End of namespace Data
2308 
2309 } // End of namespace MTropolis
2310 
2311 #endif /* MTROPOLIS_DATA_H */
Definition: data.h:1735
Definition: str.h:59
Definition: data.h:1164
Definition: data.h:970
Definition: data.h:592
Definition: data.h:644
Definition: data-io.h:167
Definition: data.h:800
Definition: data.h:1189
Definition: data.h:2086
Definition: data.h:515
Definition: data.h:1973
Definition: data.h:527
Definition: data.h:1917
Definition: data.h:1747
Definition: rect.h:144
Definition: data.h:339
Definition: data.h:1095
Definition: data.h:1013
Definition: stream.h:745
Definition: runtime.h:1198
Definition: data.h:897
Definition: noncopyable.h:39
Definition: data.h:377
Definition: data.h:984
Definition: data-io.h:37
Definition: hashmap.h:85
Definition: data.h:392
Definition: data.h:1142
Definition: data.h:866
Definition: algorithm.h:29
Definition: xpfloat.h:32
Definition: rect.h:45
Definition: data.h:1932
Definition: data.h:757
Definition: data.h:922
Definition: data.h:349
Definition: data.h:325
Definition: data.h:358
Definition: data.h:1639
Definition: actions.h:25
Definition: data.h:2045
Definition: data-io.h:121
Definition: data.h:778
Definition: data.h:498
Definition: data.h:838
Definition: data.h:934
Definition: ptr.h:159
Definition: data.h:384
Definition: data.h:1663
Definition: data.h:2270
Definition: data.h:1884
Definition: data.h:2209
Definition: data.h:368
Definition: data.h:261
Definition: data.h:633
Definition: data.h:1907
Definition: data.h:1988
Definition: data.h:654
Definition: core.h:33