diff options
Diffstat (limited to 'engines/gob/goblin.h')
-rw-r--r-- | engines/gob/goblin.h | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/engines/gob/goblin.h b/engines/gob/goblin.h new file mode 100644 index 0000000000..858bf247ae --- /dev/null +++ b/engines/gob/goblin.h @@ -0,0 +1,231 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2004 Ivan Dubrov + * Copyright (C) 2004-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 GOB_GOBLIN_H +#define GOB_GOBLIN_H + +#include "gob/util.h" +#include "gob/sound.h" + +namespace Gob { + +#define TYPE_USUAL 0 +#define TYPE_AMORPHOUS 1 +#define TYPE_MOBILE 3 + +class Goblin { +public: +#pragma START_PACK_STRUCTS + struct Gob_State { + int16 animation;// +0h + int16 layer; // +2h + int16 unk0; // +4h + int16 unk1; // +6h + int16 sndItem; // +8h, high/low byte - sound sample index + int16 freq; // +Ah, high/low byte * 100 - frequency + int16 repCount; // +Ch high/low byte - repeat count + int16 sndFrame; // +Eh + } GCC_PACK; + + typedef Gob_State *Gob_PState; + + typedef Gob_PState Gob_StateLine[6]; + + struct Gob_Object { + int16 animation; // +0h + int16 state; // +2h + int16 stateColumn; // +4h + int16 curFrame; // +6h + int16 xPos; // +8h + int16 yPos; // +Ah + int16 dirtyLeft; // +Ch + int16 dirtyTop; // +Eh + int16 dirtyRight; // +10h + int16 dirtyBottom; // +12h + int16 left; // +14h + int16 top; // +16h + int16 right; // +18h + int16 bottom; // +1ah + int16 nextState; // +1ch + int16 multState; // +1eh + int16 actionStartState; // +20h + int16 curLookDir; // +22h + int16 pickable; // +24h + int16 relaxTime; // +26h + Gob_StateLine *stateMach; // +28h + Gob_StateLine *realStateMach; // +2ch + char doAnim; // +30h + char order; // +31h + char noTick; // +32h + char toRedraw; // +33h + char type; // +34h + char maxTick; // +35h + char tick; // +36h + char multObjIndex; // +37h, from which play mult animations + char unk14; // +38h + char visible; // +39h + } GCC_PACK; + + struct Gob_Pos { + char x; + char y; + } GCC_PACK; +#pragma END_PACK_STRUCTS + + Util::List *_objList; + Gob_Object *_goblins[4]; + int16 _currentGoblin; + Snd::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 + int32 *_some0ValPtr; + + int32 *_gobRetVarPtr; + int32 *_curGobVarPtr; + int32 *_curGobXPosVarPtr; + int32 *_curGobYPosVarPtr; + int32 *_itemInPocketVarPtr; + + int32 *_curGobStateVarPtr; + int32 *_curGobFrameVarPtr; + int32 *_curGobMultStateVarPtr; + int32 *_curGobNextStateVarPtr; + int32 *_curGobScrXVarPtr; + int32 *_curGobScrYVarPtr; + int32 *_curGobLeftVarPtr; + int32 *_curGobTopVarPtr; + int32 *_curGobRightVarPtr; + int32 *_curGobBottomVarPtr; + int32 *_curGobDoAnimVarPtr; + int32 *_curGobOrderVarPtr; + int32 *_curGobNoTickVarPtr; + int32 *_curGobTypeVarPtr; + int32 *_curGobMaxTickVarPtr; + int32 *_curGobTickVarPtr; + int32 *_curGobActStartStateVarPtr; + int32 *_curGobLookDirVarPtr; + int32 *_curGobPickableVarPtr; + int32 *_curGobRelaxVarPtr; + int32 *_curGobMaxFrameVarPtr; + + int32 *_destItemStateVarPtr; + int32 *_destItemFrameVarPtr; + int32 *_destItemMultStateVarPtr; + int32 *_destItemNextStateVarPtr; + int32 *_destItemScrXVarPtr; + int32 *_destItemScrYVarPtr; + int32 *_destItemLeftVarPtr; + int32 *_destItemTopVarPtr; + int32 *_destItemRightVarPtr; + int32 *_destItemBottomVarPtr; + int32 *_destItemDoAnimVarPtr; + int32 *_destItemOrderVarPtr; + int32 *_destItemNoTickVarPtr; + int32 *_destItemTypeVarPtr; + int32 *_destItemMaxTickVarPtr; + int32 *_destItemTickVarPtr; + int32 *_destItemActStartStVarPtr; + int32 *_destItemLookDirVarPtr; + int32 *_destItemPickableVarPtr; + int32 *_destItemRelaxVarPtr; + int32 *_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; + + // Functions + char rotateState(int16 from, int16 to); + void playSound(Snd::SoundDesc * snd, int16 repCount, int16 freq); + void drawObjects(void); + void animateObjects(void); + void placeObject(Gob_Object * objDesc, char animated); + int16 getObjMaxFrame(Gob_Object * obj); + int16 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 freeObjects(void); + void zeroObjects(void); + void freeAllObjects(void); + void loadObjects(char *source); + void initVarPointers(void); + void saveGobDataToVars(int16 xPos, int16 yPos, int16 someVal); + void loadGobDataFromVars(void); + 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); + + Goblin(GobEngine *vm); + +protected: + int16 _rotStates[4][4]; + GobEngine *_vm; + + int16 peekGoblin(Gob_Object *curGob); + void initList(void); + void sortByOrder(Util::List *list); + void adjustDest(int16 posX, int16 posY); + void adjustTarget(void); + void targetDummyItem(Gob_Object *gobDesc); + void targetItem(void); + void initiateMove(void); + 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 movePathFind(Gob_Object *gobDesc, int16 nextAct); + void moveAdvance(Gob_Object *gobDesc, int16 nextAct, int16 framesCount); +}; + +} // End of namespace Gob + +#endif /* __GOBLIN_H */ |