aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/goblin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/gob/goblin.cpp')
-rw-r--r--engines/gob/goblin.cpp289
1 files changed, 183 insertions, 106 deletions
diff --git a/engines/gob/goblin.cpp b/engines/gob/goblin.cpp
index 629a31bd05..05bfe6fc5a 100644
--- a/engines/gob/goblin.cpp
+++ b/engines/gob/goblin.cpp
@@ -34,10 +34,13 @@
#include "gob/dataio.h"
#include "gob/cdrom.h"
#include "gob/music.h"
+#include "gob/mult.h"
namespace Gob {
Goblin::Goblin(GobEngine *vm) : _vm(vm) {
+ int i;
+
_goesAtTarget = 0;
_readyToAct = 0;
_gobAction = 0;
@@ -68,7 +71,7 @@ Goblin::Goblin(GobEngine *vm) : _vm(vm) {
_noPick = 0;
_objList = 0;
- int i;
+
for (i = 0; i < 4; i++)
_goblins[i] = 0;
_currentGoblin = 0;
@@ -144,6 +147,19 @@ Goblin::Goblin(GobEngine *vm) : _vm(vm) {
}
_objCount = 0;
_gobsCount = 0;
+
+ _soundSlotsCount = 0;
+ for (i = 0; i < 60; i++)
+ _soundSlots[i] = -1;
+
+ warning("GOB2 Stub! _word_2F9C0, _word_2F9BE, _word_2F9BC, _word_2F9BA, _dword_2F9B6, _dword_2F9B2");
+ _word_2F9C0 = 0;
+ _word_2F9BE = 0;
+ _word_2F9BC = 0;
+ _word_2F9BA = 0;
+ _dword_2F9B6 = 0;
+ _dword_2F9B2 = 0;
+ _dword_2F2A4 = 0;
}
char Goblin::rotateState(int16 from, int16 to) {
@@ -494,52 +510,6 @@ void Goblin::animateObjects(void) {
}
}
-void Goblin::placeObject(Gob_Object *objDesc, char animated) {
- int16 layer;
-
- if (objDesc->stateMach[objDesc->state][0] != 0) {
- objDesc->animation =
- objDesc->stateMach[objDesc->state][0]->animation;
-
- objDesc->noTick = 0;
- objDesc->toRedraw = 1;
- objDesc->doAnim = animated;
-
- objDesc->maxTick = 1;
- objDesc->tick = 1;
- objDesc->curFrame = 0;
- objDesc->type = 0;
- objDesc->actionStartState = 0;
- objDesc->nextState = -1;
- objDesc->multState = -1;
- objDesc->stateColumn = 0;
- objDesc->curLookDir = 0;
- objDesc->visible = 1;
- objDesc->pickable = 0;
- objDesc->unk14 = 0;
-
- objDesc->relaxTime = _vm->_util->getRandom(30);
-
- layer = objDesc->stateMach[objDesc->state][0]->layer;
- _vm->_scenery->updateAnim(layer, 0, objDesc->animation, 0,
- objDesc->xPos, objDesc->yPos, 0);
-
- objDesc->order = _vm->_scenery->_toRedrawBottom / 24 + 3;
-
- objDesc->left = objDesc->xPos;
- objDesc->right = objDesc->xPos;
- objDesc->dirtyLeft = objDesc->xPos;
- objDesc->dirtyRight = objDesc->xPos;
-
- objDesc->top = objDesc->yPos;
- objDesc->bottom = objDesc->yPos;
- objDesc->dirtyTop = objDesc->yPos;
- objDesc->dirtyBottom = objDesc->yPos;
-
- _vm->_util->listInsertBack(_objList, objDesc);
- }
-}
-
int16 Goblin::getObjMaxFrame(Gob_Object * objDesc) {
int16 layer;
@@ -1816,63 +1786,6 @@ int16 Goblin::doMove(Gob_Object *gobDesc, int16 cont, int16 action) {
return gobIndex;
}
-void Goblin::freeObjects(void) {
- int16 i;
- int16 state;
- int16 col;
-
- for (i = 0; i < 16; i++) {
- if (_soundData[i] == 0)
- continue;
-
- _vm->_snd->freeSoundDesc(_soundData[i]);
- _soundData[i] = 0;
- }
-
- for (i = 0; i < 4; i++) {
- if (_goblins[i] == 0)
- continue;
-
- _goblins[i]->stateMach = _goblins[i]->realStateMach;
-
- for (state = 0; state < 40; state++) {
- for (col = 0; col < 6; col++) {
- delete _goblins[i]->stateMach[state][col];
- _goblins[i]->stateMach[state][col] = 0;
- }
- }
-
- if (i == 3) {
- for (state = 40; state < 70; state++) {
- delete _goblins[3]->stateMach[state][0];
- _goblins[3]->stateMach[state][0] = 0;
- }
- }
-
- delete[] _goblins[i]->stateMach;
- delete _goblins[i];
- _goblins[i] = 0;
- }
-
- for (i = 0; i < 20; i++) {
- if (_objects[i] == 0)
- continue;
-
- _objects[i]->stateMach = _objects[i]->realStateMach;
-
- for (state = 0; state < 40; state++) {
- for (col = 0; col < 6; col++) {
- delete _objects[i]->stateMach[state][col];
- _objects[i]->stateMach[state][col] = 0;
- }
- }
-
- delete[] _objects[i]->stateMach;
- delete _objects[i];
- _objects[i] = 0;
- }
-}
-
void Goblin::zeroObjects(void) {
int16 i;
@@ -1906,10 +1819,10 @@ void Goblin::loadObjects(char *source) {
_vm->_map->loadMapObjects(source);
for (i = 0; i < _gobsCount; i++)
- placeObject(_goblins[i], 0);
+ placeObject(_goblins[i], 0, 0, 0, 0, 0);
for (i = 0; i < _objCount; i++) {
- placeObject(_objects[i], 1);
+ placeObject(_objects[i], 1, 0, 0, 0, 0);
}
initVarPointers();
@@ -2378,4 +2291,168 @@ int16 Goblin::treatItem(int16 action) {
}
}
+void Goblin::sub_19BD3(void) {
+ Mult::Mult_Object *obj0;
+ Mult::Mult_Object *obj1;
+ Mult::Mult_AnimData *anim0;
+ Mult::Mult_AnimData *anim1;
+ int16 varVal;
+ int16 var_2;
+ int16 var_4;
+ int16 var_6;
+ int16 var_8;
+ int16 var_A;
+ int16 var_C;
+ int16 di;
+ int16 si;
+
+ obj0 = &(_vm->_mult->_objects[0]);
+ obj1 = &(_vm->_mult->_objects[1]);
+ anim0 = obj0->pAnimData;
+ anim1 = obj1->pAnimData;
+
+ si = anim0->state;
+ di = anim1->state;
+
+ if (anim0->someFlag == 0) {
+ if ((_word_2F9BC == 0) && (anim0->isStatic == 0)) {
+ if ((VAR(_dword_2F9B6) == 0) && (si == 28)) {
+ si = _vm->_util->getRandom(3) + 24;
+ warning("GOB2 Stub! sub_195C7(0, si);");
+ WRITE_VAR(_dword_2F9B6, 100);
+ } else
+ WRITE_VAR(_dword_2F9B6, VAR(_dword_2F9B6) - 1);
+ }
+ if ((si == 8) || (si == 9) || (si == 29))
+ anim0->field_10 = 6;
+ }
+ if (anim1->someFlag == 0) {
+ if((_word_2F9BA == 0) && (anim1->isStatic == 0)) {
+ if ((VAR(_dword_2F9B2) == 0) && (di == 28)) {
+ di = _vm->_util->getRandom(3) + 24;
+ warning("GOB2 Stub! sub_195C7(1, di);");
+ WRITE_VAR(_dword_2F9B2, 100);
+ } else
+ WRITE_VAR(_dword_2F9B2, VAR(_dword_2F9B2) - 1);
+ }
+ if ((di == 8) || (di == 9) || (di == 29))
+ anim1->field_10 = 6;
+ }
+
+ if ((anim0->someFlag == 1) && (anim0->isStatic == 0) &&
+ ((anim0->state == 28) || (anim0->state == 29)))
+ anim0->field_10 = 0;
+ if ((anim1->someFlag == 1) && (anim1->isStatic == 0) &&
+ ((anim1->state == 28) || (anim1->state == 29)))
+ anim1->field_10 = 0;
+
+ if (VAR(18) != ((uint32) -1)) {
+ if (anim0->layer == 44)
+ anim0->field_10 = 4;
+ else if(anim0->layer == 45)
+ anim0->field_10 = 0;
+ if (anim0->someFlag == 0)
+ anim0->field_10 = 6;
+ }
+ if (VAR(19) != ((uint32) -1)) {
+ if (anim1->layer == 48)
+ anim1->field_10 = 4;
+ else if(anim1->layer == 49)
+ anim1->field_10 = 0;
+ if (anim1->someFlag == 0)
+ anim1->field_10 = 6;
+ }
+
+ if ((anim0->layer == 45) && (anim0->field_10 == 4) && (anim0->field_12 == 5) &&
+ (VAR(18) == ((uint32) -1)) && (_word_2F9C0 == 0)) {
+ warning("GOB2 Stub! sub_195C7(0, 19);");
+ }
+ if ((anim0->layer == 44) && (anim0->field_10 == 0) && (anim0->field_12 == 5) &&
+ (VAR(18) == ((uint32) -1)) && (_word_2F9C0 == 0)) {
+ warning("GOB2 Stub! sub_195C7(0, 16);");
+ }
+ if ((anim1->layer == 49) && (anim1->field_10 == 4) && (anim1->field_12 == 5) &&
+ (VAR(19) == ((uint32) -1)) && (_word_2F9BE == 0)) {
+ warning("GOB2 Stub! sub_195C7(1, 19);");
+ }
+ if ((anim1->layer == 48) && (anim1->field_10 == 0) && (anim1->field_12 == 5) &&
+ (VAR(19) == ((uint32) -1)) && (_word_2F9BE == 0)) {
+ warning("GOB2 Stub! sub_195C7(1, 16);");
+ }
+
+ var_2 = obj0->goblinX;
+ var_4 = obj1->goblinX;
+ var_6 = obj0->goblinY;
+ var_8 = obj1->goblinY;
+ di = anim0->field_13;
+ si = anim0->field_14;
+ var_A = anim1->field_13;
+ var_C = anim1->field_14;
+
+ varVal = _vm->_util->readVariableByte(_dword_2F2A4 + var_6 * 40 + var_2);
+ if ((varVal > 17) && (varVal < 21))
+ warning("GOB2 Stub! sub_195C7(anim0);");
+ varVal = _vm->_util->readVariableByte(_dword_2F2A4 + var_8 * 40 + var_4);
+ if ((varVal > 17) && (varVal < 21))
+ warning("GOB2 Stub! sub_19B45(anim1);");
+
+ if ((di < 0) || (di > 39) || (si < 0) || (si > 39))
+ return;
+
+ if (var_6 > si) {
+ if (_vm->_util->readVariableByte(_dword_2F2A4 + si * 40 + di) > 17) {
+ do {
+ si--;
+ } while (_vm->_util->readVariableByte(_dword_2F2A4 + si * 40 + di) > 17);
+ si++;
+ if (_vm->_util->readVariableByte(_dword_2F2A4 + si * 40 + di - 1) == 0) {
+ if (_vm->_util->readVariableByte(_dword_2F2A4 + si * 40 + di + 1) != 0)
+ di++;
+ } else
+ di--;
+ warning("GOB2 Stub! sub_197A6(di (=%d), si (=%d), 0);", si, di);
+ }
+ } else {
+ if (_vm->_util->readVariableByte(_dword_2F2A4 + si * 40 + di) > 17) {
+ do {
+ si++;
+ } while (_vm->_util->readVariableByte(_dword_2F2A4 + si * 40 + di) > 17);
+ si--;
+ if (_vm->_util->readVariableByte(_dword_2F2A4 + si * 40 + di - 1) == 0) {
+ if (_vm->_util->readVariableByte(_dword_2F2A4 + si * 40 + di + 1) != 0)
+ di++;
+ } else
+ di--;
+ warning("GOB2 Stub! sub_197A6(di (=%d), si (=%d), 0);", si, di);
+ }
+ }
+ if (var_8 > var_C) {
+ if (_vm->_util->readVariableByte(_dword_2F2A4 + var_C * 40 + var_A) > 17) {
+ do {
+ var_C--;
+ } while (_vm->_util->readVariableByte(_dword_2F2A4 + var_C * 40 + var_A) > 17);
+ var_C++;
+ if (_vm->_util->readVariableByte(_dword_2F2A4 + var_C * 40 + var_A) == 0) {
+ if (_vm->_util->readVariableByte(_dword_2F2A4 + var_C * 40 + var_A) != 0)
+ var_A++;
+ } else
+ var_A--;
+ warning("GOB2 Stub! sub_197A6(var_A (=%d), var_C (=%d), 1);", var_A, var_C);
+ }
+ } else {
+ if (_vm->_util->readVariableByte(_dword_2F2A4 + var_C * 40 + var_A) > 17) {
+ do {
+ var_C++;
+ } while (_vm->_util->readVariableByte(_dword_2F2A4 + var_C * 40 + var_A) > 17);
+ var_C--;
+ if (_vm->_util->readVariableByte(_dword_2F2A4 + var_C * 40 + var_A) == 0) {
+ if (_vm->_util->readVariableByte(_dword_2F2A4 + var_C * 40 + var_A) != 0)
+ var_A++;
+ } else
+ var_A--;
+ warning("GOB2 Stub! sub_197A6(var_A (=%d), var_C (=%d), 1);", var_A, var_C);
+ }
+ }
+}
+
} // End of namespace Gob