scummvm/engines/gob/goblin.h
2014-02-18 02:39:34 +01:00

333 lines
9.5 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_GOBLIN_H
#define GOB_GOBLIN_H
#include "gob/util.h"
#include "gob/mult.h"
#include "gob/variables.h"
#include "gob/sound/sounddesc.h"
namespace Gob {
#define TYPE_USUAL 0
#define TYPE_AMORPHOUS 1
#define TYPE_MOBILE 3
class Goblin {
public:
#include "common/pack-start.h" // START STRUCT PACKING
struct Gob_State {
int16 animation;
int16 layer;
int16 unk0;
int16 unk1;
int16 sndItem; // high/low byte - sound sample index
int16 freq; // high/low byte * 100 - frequency
int16 repCount; // high/low byte - repeat count
int16 sndFrame;
} PACKED_STRUCT;
typedef Gob_State *Gob_PState;
typedef Gob_PState Gob_StateLine[6];
struct Gob_Object {
int16 animation;
int16 state;
int16 stateColumn;
int16 curFrame;
int16 xPos;
int16 yPos;
int16 dirtyLeft;
int16 dirtyTop;
int16 dirtyRight;
int16 dirtyBottom;
int16 left;
int16 top;
int16 right;
int16 bottom;
int16 nextState;
int16 multState;
int16 actionStartState;
int16 curLookDir;
int16 pickable;
int16 relaxTime;
Gob_StateLine *stateMach;
Gob_StateLine *realStateMach;
char doAnim;
int8 order;
char noTick;
char toRedraw;
char type;
char maxTick;
char tick;
char multObjIndex;
char unk14;
char visible;
} PACKED_STRUCT;
struct Gob_Pos {
char x;
char y;
} PACKED_STRUCT;
#include "common/pack-end.h" // END STRUCT PACKING
Gob_Object *_goblins[4];
int16 _currentGoblin;
SoundDesc _soundData[16];
int16 _gobStateLayer;
char _goesAtTarget;
char _readyToAct;
int16 _gobAction; // 0 - move, 3 - do action, 4 - pick
// goblins: 0 - picker, 1 - fighter, 2 - mage
Gob_Pos _gobPositions[3];
int16 _gobDestX;
int16 _gobDestY;
int16 _pressedMapX;
int16 _pressedMapY;
char _pathExistence;
// Pointers to interpreter variables
VariableReference _some0ValPtr;
VariableReference _gobRetVarPtr;
VariableReference _curGobVarPtr;
VariableReference _curGobXPosVarPtr;
VariableReference _curGobYPosVarPtr;
VariableReference _itemInPocketVarPtr;
VariableReference _curGobStateVarPtr;
VariableReference _curGobFrameVarPtr;
VariableReference _curGobMultStateVarPtr;
VariableReference _curGobNextStateVarPtr;
VariableReference _curGobScrXVarPtr;
VariableReference _curGobScrYVarPtr;
VariableReference _curGobLeftVarPtr;
VariableReference _curGobTopVarPtr;
VariableReference _curGobRightVarPtr;
VariableReference _curGobBottomVarPtr;
VariableReference _curGobDoAnimVarPtr;
VariableReference _curGobOrderVarPtr;
VariableReference _curGobNoTickVarPtr;
VariableReference _curGobTypeVarPtr;
VariableReference _curGobMaxTickVarPtr;
VariableReference _curGobTickVarPtr;
VariableReference _curGobActStartStateVarPtr;
VariableReference _curGobLookDirVarPtr;
VariableReference _curGobPickableVarPtr;
VariableReference _curGobRelaxVarPtr;
VariableReference _curGobMaxFrameVarPtr;
VariableReference _destItemStateVarPtr;
VariableReference _destItemFrameVarPtr;
VariableReference _destItemMultStateVarPtr;
VariableReference _destItemNextStateVarPtr;
VariableReference _destItemScrXVarPtr;
VariableReference _destItemScrYVarPtr;
VariableReference _destItemLeftVarPtr;
VariableReference _destItemTopVarPtr;
VariableReference _destItemRightVarPtr;
VariableReference _destItemBottomVarPtr;
VariableReference _destItemDoAnimVarPtr;
VariableReference _destItemOrderVarPtr;
VariableReference _destItemNoTickVarPtr;
VariableReference _destItemTypeVarPtr;
VariableReference _destItemMaxTickVarPtr;
VariableReference _destItemTickVarPtr;
VariableReference _destItemActStartStVarPtr;
VariableReference _destItemLookDirVarPtr;
VariableReference _destItemPickableVarPtr;
VariableReference _destItemRelaxVarPtr;
VariableReference _destItemMaxFrameVarPtr;
int16 _destItemType;
int16 _destItemState;
int16 _itemToObject[20];
Gob_Object *_objects[20];
int16 _objCount;
int16 _gobsCount;
int16 _itemIndInPocket;
int16 _itemIdInPocket;
char _itemByteFlag;
int16 _destItemId;
int16 _destActionItem;
Gob_Object *_actDestItemDesc;
int16 _forceNextState[10];
char _boreCounter;
int16 _positionedGob;
char _noPick;
// Gob2:
int16 _soundSlotsCount;
int16 _soundSlots[60];
bool _gob1Busy;
bool _gob2Busy;
int16 _gob1RelaxTimeVar;
int16 _gob2RelaxTimeVar;
bool _gob1NoTurn;
bool _gob2NoTurn;
// Functions
char rotateState(int16 from, int16 to);
void playSound(SoundDesc &snd, int16 repCount, int16 freq);
void drawObjects();
void animateObjects();
int16 getObjMaxFrame(Gob_Object * obj);
bool objIntersected(Gob_Object * obj1, Gob_Object * obj2);
void setMultStates(Gob_Object * gobDesc);
int16 nextLayer(Gob_Object * gobDesc);
void showBoredom(int16 gobIndex);
void switchGoblin(int16 index);
void zeroObjects();
void freeAllObjects();
void loadObjects(const char *source);
void initVarPointers();
void saveGobDataToVars(int16 xPos, int16 yPos, int16 someVal);
void loadGobDataFromVars();
void pickItem(int16 indexToPocket, int16 idToPocket);
void placeItem(int16 indexInPocket, int16 idInPocket);
void swapItems(int16 indexToPick, int16 idToPick);
void treatItemPick(int16 itemId);
int16 treatItem(int16 action);
int16 doMove(Gob_Object *gobDesc, int16 cont, int16 action);
void setState(int16 index, int16 state);
void updateLayer1(Mult::Mult_AnimData *animData);
void updateLayer2(Mult::Mult_AnimData *animData);
void move(int16 destX, int16 destY, int16 objIndex);
void animate(Mult::Mult_Object *obj);
virtual void handleGoblins() = 0;
virtual void placeObject(Gob_Object * objDesc, char animated,
int16 index, int16 x, int16 y, int16 state) = 0;
virtual void freeObjects() = 0;
virtual void initiateMove(Mult::Mult_Object *obj) = 0;
virtual void moveAdvance(Mult::Mult_Object *obj, Gob_Object *gobDesc,
int16 nextAct, int16 framesCount) = 0;
Goblin(GobEngine *vm);
virtual ~Goblin();
protected:
Util::List *_objList;
int16 _rotStates[4][4];
GobEngine *_vm;
int16 peekGoblin(Gob_Object *curGob);
void initList();
void sortByOrder(Util::List *list);
void adjustDest(int16 posX, int16 posY);
void adjustTarget();
void targetDummyItem(Gob_Object *gobDesc);
void targetItem();
void moveFindItem(int16 posX, int16 posY);
void moveCheckSelect(int16 framesCount, Gob_Object * gobDesc,
int16 *pGobIndex, int16 *nextAct);
void moveInitStep(int16 framesCount, int16 action, int16 cont,
Gob_Object *gobDesc, int16 *pGobIndex, int16 *pNextAct);
void moveTreatRopeStairs(Gob_Object *gobDesc);
void playSounds(Mult::Mult_Object *obj);
virtual bool isMovement(int8 state) = 0;
virtual void advMovement(Mult::Mult_Object *obj, int8 state) = 0;
virtual void movePathFind(Mult::Mult_Object *obj,
Gob_Object *gobDesc, int16 nextAct) = 0;
};
class Goblin_v1 : public Goblin {
public:
virtual void handleGoblins() {}
virtual void placeObject(Gob_Object * objDesc, char animated,
int16 index, int16 x, int16 y, int16 state);
virtual void freeObjects();
virtual void initiateMove(Mult::Mult_Object *obj);
virtual void moveAdvance(Mult::Mult_Object *obj, Gob_Object *gobDesc,
int16 nextAct, int16 framesCount);
Goblin_v1(GobEngine *vm);
virtual ~Goblin_v1() {}
protected:
virtual bool isMovement(int8 state) { return false; }
virtual void advMovement(Mult::Mult_Object *obj, int8 state) {}
virtual void movePathFind(Mult::Mult_Object *obj,
Gob_Object *gobDesc, int16 nextAct);
};
class Goblin_v2 : public Goblin_v1 {
public:
virtual void handleGoblins();
virtual void placeObject(Gob_Object * objDesc, char animated,
int16 index, int16 x, int16 y, int16 state);
virtual void freeObjects();
virtual void initiateMove(Mult::Mult_Object *obj);
virtual void moveAdvance(Mult::Mult_Object *obj, Gob_Object *gobDesc,
int16 nextAct, int16 framesCount);
Goblin_v2(GobEngine *vm);
virtual ~Goblin_v2() {}
protected:
virtual bool isMovement(int8 state);
virtual void advMovement(Mult::Mult_Object *obj, int8 state);
virtual void movePathFind(Mult::Mult_Object *obj,
Gob_Object *gobDesc, int16 nextAct);
};
class Goblin_v3 : public Goblin_v2 {
public:
virtual void placeObject(Gob_Object * objDesc, char animated,
int16 index, int16 x, int16 y, int16 state);
Goblin_v3(GobEngine *vm);
virtual ~Goblin_v3() {}
protected:
virtual bool isMovement(int8 state);
virtual void advMovement(Mult::Mult_Object *obj, int8 state);
};
class Goblin_v4 : public Goblin_v3 {
public:
virtual void movePathFind(Mult::Mult_Object *obj,
Gob_Object *gobDesc, int16 nextAct);
virtual void moveAdvance(Mult::Mult_Object *obj, Gob_Object *gobDesc,
int16 nextAct, int16 framesCount);
Goblin_v4(GobEngine *vm);
virtual ~Goblin_v4() {}
private:
int16 turnState(int16 state, uint16 dir);
};
} // End of namespace Gob
#endif // GOB_GOBLIN_H