mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-21 09:21:08 +00:00
347 lines
7.2 KiB
C++
347 lines
7.2 KiB
C++
/* 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 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.
|
|
*
|
|
*/
|
|
|
|
#ifndef GOB_MULT_H
|
|
#define GOB_MULT_H
|
|
|
|
#include "gob/video.h"
|
|
#include "gob/variables.h"
|
|
|
|
namespace Gob {
|
|
|
|
class Mult {
|
|
public:
|
|
|
|
#include "common/pack-start.h" // START STRUCT PACKING
|
|
|
|
struct Mult_AnimData {
|
|
int8 animation;
|
|
uint8 layer;
|
|
uint8 frame;
|
|
int8 animType;
|
|
int8 order;
|
|
int8 isPaused;
|
|
int8 isStatic;
|
|
int8 maxTick;
|
|
int8 maxFrame;
|
|
uint8 newLayer;
|
|
int8 newAnimation;
|
|
byte intersected;
|
|
uint8 newCycle;
|
|
int8 state;
|
|
int8 nextState;
|
|
int8 newState;
|
|
int8 curLookDir;
|
|
int8 isBusy;
|
|
int8 pathExistence;
|
|
int8 destX;
|
|
int8 destY;
|
|
int8 framesLeft;
|
|
int8 stateType;
|
|
int8 animTypeBak;
|
|
int8 redrawAnimation;
|
|
uint8 redrawLayer;
|
|
uint8 redrawFrame;
|
|
} PACKED_STRUCT;
|
|
|
|
struct Mult_GobState {
|
|
int16 animation; // .
|
|
int16 layer; // |- [0]
|
|
int16 dataCount; // '
|
|
int8 sndItem; // .
|
|
uint8 sndFrame; // |
|
|
int16 freq; // |- [1+]
|
|
int8 repCount; // |
|
|
uint8 speaker; // '
|
|
} PACKED_STRUCT;
|
|
|
|
struct Mult_Object {
|
|
VariableReference *pPosX;
|
|
VariableReference *pPosY;
|
|
Mult_AnimData *pAnimData;
|
|
int16 tick;
|
|
int16 lastLeft;
|
|
int16 lastRight;
|
|
int16 lastTop;
|
|
int16 lastBottom;
|
|
Mult_GobState **goblinStates;
|
|
uint8 goblinX;
|
|
uint8 goblinY;
|
|
uint8 destX;
|
|
uint8 destY;
|
|
int8 gobDestX;
|
|
int8 gobDestY;
|
|
uint8 nearestWayPoint;
|
|
uint8 nearestDest;
|
|
int8 field_22;
|
|
int8 needRedraw;
|
|
int8 field_24;
|
|
int8 field_25;
|
|
int8 field_26;
|
|
int8 field_27;
|
|
int16 newLeft;
|
|
int16 newTop;
|
|
int16 newRight;
|
|
int16 newBottom;
|
|
uint32 videoSlot;
|
|
} PACKED_STRUCT;
|
|
|
|
struct Mult_StaticKey {
|
|
int16 frame;
|
|
int16 layer;
|
|
} PACKED_STRUCT;
|
|
|
|
struct Mult_AnimKey {
|
|
uint16 frame;
|
|
int16 layer;
|
|
int16 posX;
|
|
int16 posY;
|
|
int16 order;
|
|
} PACKED_STRUCT;
|
|
|
|
struct Mult_TextKey {
|
|
int16 frame;
|
|
int16 cmd;
|
|
char unknown[18];
|
|
byte script[6];
|
|
} PACKED_STRUCT;
|
|
|
|
struct Mult_PalKey {
|
|
int16 frame;
|
|
int16 cmd;
|
|
int16 rates[4];
|
|
int16 unknown0;
|
|
int16 unknown1;
|
|
int8 subst[16][4];
|
|
} PACKED_STRUCT;
|
|
|
|
struct Mult_PalFadeKey {
|
|
int16 frame;
|
|
int16 fade;
|
|
int16 palIndex;
|
|
int8 flag;
|
|
} PACKED_STRUCT;
|
|
|
|
struct Mult_SndKey {
|
|
int16 frame;
|
|
int16 cmd;
|
|
int16 freq;
|
|
int16 fadeLength;
|
|
int16 repCount;
|
|
int16 resId;
|
|
int16 soundIndex;
|
|
} PACKED_STRUCT;
|
|
|
|
struct Mult_ImdKey {
|
|
int16 frame;
|
|
int16 imdFile;
|
|
int16 field_4;
|
|
int16 field_6;
|
|
uint16 flags;
|
|
int16 palFrame;
|
|
int16 lastFrame;
|
|
int8 palStart;
|
|
int8 palEnd;
|
|
} PACKED_STRUCT;
|
|
|
|
struct Mult_Data {
|
|
int16 palFadeKeysCount;
|
|
Mult_PalFadeKey *palFadeKeys;
|
|
|
|
int16 palKeysCount;
|
|
Mult_PalKey *palKeys;
|
|
|
|
int16 staticKeysCount;
|
|
Mult_StaticKey *staticKeys;
|
|
int16 staticIndices[10];
|
|
bool staticLoaded[10];
|
|
uint8 staticCount;
|
|
|
|
int16 animKeysCount[4];
|
|
Mult_AnimKey *animKeys[4];
|
|
int16 animIndices[10];
|
|
uint8 animCount;
|
|
|
|
bool animLoaded[10];
|
|
int16 animKeysFrames[4];
|
|
int16 animKeysStartFrames[4];
|
|
int16 animKeysStopFrames[4];
|
|
int16 animKeysIndices[4][4];
|
|
int8 animDirection;
|
|
|
|
int16 textKeysCount;
|
|
Mult_TextKey *textKeys;
|
|
|
|
int16 sndKeysCount;
|
|
Mult_SndKey *sndKeys;
|
|
|
|
int16 sndSlotsCount;
|
|
int16 sndSlot[60];
|
|
int16 frameRate;
|
|
|
|
Video::Color fadePal[5][16];
|
|
int16 animObjs[4][4];
|
|
int16 palAnimIndices[4];
|
|
int16 frameStart;
|
|
|
|
int16 imdKeysIndices[4][4];
|
|
|
|
int16 imdKeysCount[4];
|
|
Mult_ImdKey *imdKeys[4];
|
|
int16 imdIndices[4];
|
|
char *imdFiles;
|
|
char *somepointer10; // ?
|
|
byte *execPtr;
|
|
} PACKED_STRUCT;
|
|
|
|
#include "common/pack-end.h" // END STRUCT PACKING
|
|
|
|
// Globals
|
|
|
|
Mult_Data *_multData;
|
|
|
|
int16 _frame;
|
|
|
|
int16 _objCount;
|
|
Mult_Object *_objects;
|
|
|
|
int16 *_renderData;
|
|
Mult_Object **_renderObjs;
|
|
|
|
int8 *_orderArray;
|
|
|
|
SurfacePtr _animSurf;
|
|
int16 _animLeft;
|
|
int16 _animTop;
|
|
int16 _animWidth;
|
|
int16 _animHeight;
|
|
|
|
void initAll();
|
|
void freeAll();
|
|
void checkFreeMult();
|
|
void freeMult();
|
|
void zeroMultData();
|
|
void playMult(int16 startFrame, int16 endFrame, char checkEscape,
|
|
char handleMouse);
|
|
|
|
void clearObjectVideos();
|
|
|
|
virtual void loadMult(int16 resId) = 0;
|
|
virtual void freeMultKeys() = 0;
|
|
virtual bool hasMultData(uint16 multIndex) = 0;
|
|
virtual void setMultData(uint16 multIndex) = 0;
|
|
virtual void zeroMultData(uint16 multIndex) = 0;
|
|
virtual void multSub(uint16 multIndex) = 0;
|
|
virtual void animate() = 0;
|
|
|
|
Mult(GobEngine *vm);
|
|
virtual ~Mult();
|
|
|
|
protected:
|
|
int16 _index;
|
|
int16 _counter;
|
|
bool _animDataAllocated;
|
|
|
|
Mult_Data *_multDatas[8];
|
|
|
|
bool _doPalSubst;
|
|
|
|
Variables *_animArrayX;
|
|
Variables *_animArrayY;
|
|
Mult_AnimData *_animArrayData;
|
|
|
|
int16 _palKeyIndex;
|
|
Video::Color *_oldPalette;
|
|
Video::Color _palAnimPalette[256];
|
|
int16 _palAnimKey;
|
|
int16 _palAnimRed[4];
|
|
int16 _palAnimGreen[4];
|
|
int16 _palAnimBlue[4];
|
|
|
|
char _palFadingRed;
|
|
char _palFadingGreen;
|
|
char _palFadingBlue;
|
|
|
|
GobEngine *_vm;
|
|
|
|
void drawText(bool &stop, bool &stopNoClear);
|
|
void prepPalAnim(bool &stop);
|
|
void doPalAnim();
|
|
void doFadeAnim(bool &stop);
|
|
void doSoundAnim(bool &stop, int16 frame);
|
|
|
|
virtual void playMultInit() = 0;
|
|
virtual void drawStatics(bool &stop) = 0;
|
|
virtual void drawAnims(bool &stop) = 0;
|
|
virtual void newCycleAnim(Mult_Object &animObj) = 0;
|
|
};
|
|
|
|
class Mult_v1 : public Mult {
|
|
public:
|
|
Mult_v1(GobEngine *vm);
|
|
virtual ~Mult_v1() {}
|
|
|
|
virtual void loadMult(int16 resId);
|
|
virtual void freeMultKeys();
|
|
virtual bool hasMultData(uint16 multIndex);
|
|
virtual void setMultData(uint16 multIndex);
|
|
virtual void zeroMultData(uint16 multIndex);
|
|
virtual void multSub(uint16 multIndex);
|
|
virtual void animate();
|
|
|
|
protected:
|
|
virtual void playMultInit();
|
|
virtual void drawStatics(bool &stop);
|
|
virtual void drawAnims(bool &stop);
|
|
virtual void newCycleAnim(Mult_Object &animObj);
|
|
};
|
|
|
|
class Mult_v2 : public Mult_v1 {
|
|
public:
|
|
Mult_v2(GobEngine *vm);
|
|
virtual ~Mult_v2();
|
|
|
|
virtual void loadMult(int16 resId);
|
|
virtual void freeMultKeys();
|
|
virtual bool hasMultData(uint16 multIndex);
|
|
virtual void setMultData(uint16 multIndex);
|
|
virtual void zeroMultData(uint16 multIndex);
|
|
virtual void multSub(uint16 multIndex);
|
|
virtual void animate();
|
|
|
|
protected:
|
|
virtual void playMultInit();
|
|
virtual void drawStatics(bool &stop);
|
|
virtual void drawAnims(bool &stop);
|
|
virtual void newCycleAnim(Mult_Object &animObj);
|
|
|
|
void loadImds(Common::SeekableReadStream &data);
|
|
void playImd(const char *imdFile, Mult_ImdKey &key, int16 dir, int16 startFrame);
|
|
|
|
void advanceObjects(int16 index);
|
|
void advanceAllObjects();
|
|
};
|
|
|
|
} // End of namespace Gob
|
|
|
|
#endif // GOB_MULT_H
|