diff options
Diffstat (limited to 'engines/queen/cutaway.h')
-rw-r--r-- | engines/queen/cutaway.h | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/engines/queen/cutaway.h b/engines/queen/cutaway.h new file mode 100644 index 0000000000..bbf5ec0652 --- /dev/null +++ b/engines/queen/cutaway.h @@ -0,0 +1,265 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2003-2006 The ScummVM project + * + * 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef QUEENCUTAWAY_H +#define QUEENCUTAWAY_H + +#include "common/util.h" +#include "queen/structs.h" + +namespace Queen { + +class QueenEngine; + +class Cutaway { +public: + + //! Public interface to run a cutaway from a file + static void run(const char *filename, char *nextFilename, QueenEngine *vm); + + //! Collection of constants used by QueenCutaway + enum { + PREVIOUS_ROOM = 0, + CURRENT_ROOM = 0, + OBJECT_ROOMFADE = -1, + PERSON_JOE = -1, + OBJECT_JOE = 0, + MAX_PERSON_COUNT = 6, + CUTAWAY_BANK = 8, + MAX_BANK_NAME_COUNT = 5, + MAX_FILENAME_LENGTH = 12, + MAX_FILENAME_SIZE = (MAX_FILENAME_LENGTH + 1), + MAX_PERSON_FACE_COUNT = 13, + MAX_STRING_LENGTH = 255, + MAX_STRING_SIZE = (MAX_STRING_LENGTH + 1), + LEFT = 1, + RIGHT = 2, + FRONT = 3, + BACK = 4 + }; + + //! Different kinds of cutaway objects + enum ObjectType { + OBJECT_TYPE_ANIMATION = 0, + OBJECT_TYPE_PERSON = 1, + OBJECT_TYPE_NO_ANIMATION = 2, + OBJECT_TYPE_TEXT_SPEAK = 3, + OBJECT_TYPE_TEXT_DISPLAY_AND_SPEAK = 4, + OBJECT_TYPE_TEXT_DISPLAY = 5 + }; + +private: + //! Data for a cutaway object + struct CutawayObject { + int16 objectNumber; // 0 = JOE, -1 = MESSAGE + int16 moveToX; + int16 moveToY; + int16 bank; // 0 = PBOB, 13 = Joe Bank, else BANK NAMEstr() + int16 animList; + int16 execute; // 1 Yes, 0 No + int16 limitBobX1; + int16 limitBobY1; + int16 limitBobX2; + int16 limitBobY2; + int16 specialMove; + int16 animType; // 0 - Packet, 1 - Amal, 2 - Unpack + int16 fromObject; + int16 bobStartX; + int16 bobStartY; + int16 room; + int16 scale; + // Variables derived from the variables above + int song; + + //! People to turn on + int person[MAX_PERSON_COUNT]; + + //! Number of elements used in _person array + int personCount; + }; + + struct CutawayAnim { + int16 object; + int16 unpackFrame; // Frame to unpack + int16 speed; + int16 bank; + int16 mx; + int16 my; + int16 cx; + int16 cy; + int16 scale; + int16 currentFrame; // Index to Current Frame + int16 originalFrame; // Index to Original Object Frame + int16 song; + bool flip; // set this if unpackFrame is negative + }; + + struct ObjectDataBackup { + int index; + int16 name; + int16 image; + }; + + struct PersonFace { + int16 index; + int16 image; + }; + + QueenEngine *_vm; + + //! Raw .cut file data (without 20 byte header) + byte *_fileData; + + //! COMPANEL + int16 _comPanel; + + //! Game state data inside of _fileDat + byte *_gameStatePtr; + + //! Actual cutaway data inside of _fileData + byte *_objectData; + + //! Pointer to next sentence string in _fileData + uint16 _nextSentenceOff; + + //! ??? + bool _roomFade; + + //! Number of cutaway objects at _cutawayData + int16 _cutawayObjectCount; + + //! This cutaway is followed by another + bool _anotherCutaway; + + //! Room before cutaway + int _initialRoom; + + //! Temporary room for cutaway + int _temporaryRoom; + + //! Room to stay in + int _finalRoom; + + //! Bank names + char _bankNames[MAX_BANK_NAME_COUNT][MAX_FILENAME_SIZE]; + + //! Filename without ".cut" + char _basename[MAX_FILENAME_SIZE]; + + //! Name of .dog file + char _talkFile[MAX_FILENAME_SIZE]; + + //! Person to talk to + int16 _talkTo; + + //! Used by changeRooms + ObjectDataBackup _personData[MAX_PERSON_COUNT]; + + //! Number of elements used in _personData array + int _personDataCount; + + //! Used by handlePersonRecord() + PersonFace _personFace[MAX_PERSON_FACE_COUNT]; + + //! Number of entries in _personFace array + int _personFaceCount; + + //! Play this song when leaving cutaway + int16 _lastSong; + + //! Song played before running comic.cut + int16 _songBeforeComic; + + int16 _currentImage; + + Cutaway(const char *filename, QueenEngine *vm); + ~Cutaway(); + + //! Run this cutaway object + void run(char *nextFilename); + + //! Load cutaway data from file + void load(const char *filename); + + //! Used by load to read string data + void loadStrings(uint16 offset); + + //! Get persons + const byte *turnOnPeople(const byte *ptr, CutawayObject &object); + + //! Limit the BOB + void limitBob(CutawayObject &object); + + //! This cutaway object occurs in another room + void changeRooms(CutawayObject &object); + + //! Get the object type for this CutawayObject + ObjectType getObjectType(CutawayObject &object); + + //! Perform actions for an animation + const byte *handleAnimation(const byte *ptr, CutawayObject &object); + + //! Perform actions for a person record + void handlePersonRecord(int index, CutawayObject &object, const char *sentence); + + //! Perform text actions + void handleText(int index, ObjectType type, CutawayObject &object, const char *sentence); + + //! Restore Logic::_objectData from _personData + void restorePersonData(); + + //! Stop the cutaway + void stop(); + + //! Update game state after cutaway + void updateGameState(); + + //! Prepare for talk after cutaway + void talk(char *nextFilename); + + //! Get CutawayAnim data from ptr and return new ptr + const byte *getCutawayAnim(const byte *ptr, int header, CutawayAnim &anim); + + //! Special animation + int makeComplexAnimation(int16 currentImage, CutawayAnim *objAnim, int frameCount); + + //! Read a CutawayObject from ptr and return new ptr + static const byte *getCutawayObject(const byte *ptr, CutawayObject &object); + + //! Dump a CutawayObject with debug() + void dumpCutawayObject(int index, CutawayObject &object); + + //! Used by handleText() + int countSpaces(ObjectType type, const char *segment); + + //! Scale Joe + int scale(CutawayObject &object); + + //! Dump CutawayAnum data with debug() + static void dumpCutawayAnim(CutawayAnim &anim); + + bool inRange(int16 x, int16 l, int16 h) const { return (x <= h && x >= l); } +}; + +} // End of namespace Queen + +#endif |