- Some more goblins-handling functions
- Fixed some mistakes I made in the Parse_v2 functions. Now the goblins (finally) move. Also, the correct music is played in the first screen. - Found the hook for the menu - On freeing a sound slot, only stop the playing music if it's in the slot to free svn-id: r23700
This commit is contained in:
parent
de9ba3adee
commit
1c4715b71f
17 changed files with 314 additions and 73 deletions
|
@ -478,7 +478,7 @@ void Draw_v2::spriteOperation(int16 operation) {
|
||||||
int16 y;
|
int16 y;
|
||||||
Video::SurfaceDesc *sourceSurf;
|
Video::SurfaceDesc *sourceSurf;
|
||||||
Video::SurfaceDesc *destSurf;
|
Video::SurfaceDesc *destSurf;
|
||||||
bool deltaveto;
|
bool deltaVeto;
|
||||||
int16 left;
|
int16 left;
|
||||||
int16 ratio;
|
int16 ratio;
|
||||||
int16 spriteLeft;
|
int16 spriteLeft;
|
||||||
|
@ -494,10 +494,10 @@ void Draw_v2::spriteOperation(int16 operation) {
|
||||||
// '---
|
// '---
|
||||||
|
|
||||||
if (operation & 0x10) {
|
if (operation & 0x10) {
|
||||||
deltaveto = true;
|
deltaVeto = true;
|
||||||
operation &= 0x0F;
|
operation &= 0x0F;
|
||||||
} else
|
} else
|
||||||
deltaveto = false;
|
deltaVeto = false;
|
||||||
|
|
||||||
if (_sourceSurface >= 100)
|
if (_sourceSurface >= 100)
|
||||||
_sourceSurface -= 80;
|
_sourceSurface -= 80;
|
||||||
|
@ -505,7 +505,7 @@ void Draw_v2::spriteOperation(int16 operation) {
|
||||||
if (_destSurface >= 100)
|
if (_destSurface >= 100)
|
||||||
_destSurface -= 80;
|
_destSurface -= 80;
|
||||||
|
|
||||||
if ((_renderFlags & RENDERFLAG_USEDELTAS) && !deltaveto) {
|
if ((_renderFlags & RENDERFLAG_USEDELTAS) && !deltaVeto) {
|
||||||
if ((_sourceSurface == 21) && (operation != DRAW_LOADSPRITE)) {
|
if ((_sourceSurface == 21) && (operation != DRAW_LOADSPRITE)) {
|
||||||
_spriteLeft += _backDeltaX;
|
_spriteLeft += _backDeltaX;
|
||||||
_spriteTop += _backDeltaY;
|
_spriteTop += _backDeltaY;
|
||||||
|
@ -864,7 +864,7 @@ void Draw_v2::spriteOperation(int16 operation) {
|
||||||
_destSpriteX += len * strlen(_textToPrint);
|
_destSpriteX += len * strlen(_textToPrint);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((_renderFlags & RENDERFLAG_USEDELTAS) && !deltaveto) {
|
if ((_renderFlags & RENDERFLAG_USEDELTAS) && !deltaVeto) {
|
||||||
if (_sourceSurface == 21) {
|
if (_sourceSurface == 21) {
|
||||||
_spriteLeft -= _backDeltaX;
|
_spriteLeft -= _backDeltaX;
|
||||||
_spriteTop -= _backDeltaY;
|
_spriteTop -= _backDeltaY;
|
||||||
|
|
|
@ -344,6 +344,7 @@ void Game::freeSoundSlot(int16 slot) {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (_soundADL[slot]) {
|
if (_soundADL[slot]) {
|
||||||
|
if (_vm->_music->getIndex() == slot)
|
||||||
_vm->_music->stopPlay();
|
_vm->_music->stopPlay();
|
||||||
if (_soundFromExt[slot] == 1) {
|
if (_soundFromExt[slot] == 1) {
|
||||||
delete[] ((char *) _soundSamples[slot]);
|
delete[] ((char *) _soundSamples[slot]);
|
||||||
|
@ -866,8 +867,10 @@ char *Game::loadLocTexts(void) {
|
||||||
warning("Your game version doesn't support the requested language, using the first one available");
|
warning("Your game version doesn't support the requested language, using the first one available");
|
||||||
for (i = 0; i < 10; i++) {
|
for (i = 0; i < 10; i++) {
|
||||||
handle = openLocTextFile(locTextFile, i);
|
handle = openLocTextFile(locTextFile, i);
|
||||||
if (handle >= 0)
|
if (handle >= 0) {
|
||||||
_vm->_global->_language = i;
|
_vm->_global->_language = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -115,6 +115,7 @@ void Game_v2::playTot(int16 skipPlay) {
|
||||||
loadTotFile(_curTotFile);
|
loadTotFile(_curTotFile);
|
||||||
if (_totFileData == 0) {
|
if (_totFileData == 0) {
|
||||||
_vm->_draw->blitCursor();
|
_vm->_draw->blitCursor();
|
||||||
|
_vm->_inter->_terminate = 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -258,6 +259,13 @@ void Game_v2::playTot(int16 skipPlay) {
|
||||||
|
|
||||||
strcpy(_curTotFile, _totToLoad);
|
strcpy(_curTotFile, _totToLoad);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
_vm->_scenery->_pCaptureCounter = oldCaptureCounter;
|
||||||
|
_vm->_global->_inter_execPtr = (char *)_totFileData;
|
||||||
|
_vm->_global->_inter_execPtr += READ_LE_UINT16(_totFileData + (skipPlay << 1) + 0x66);
|
||||||
|
_vm->_inter->callSub(2);
|
||||||
|
if (_vm->_inter->_terminate != 0)
|
||||||
|
_vm->_inter->_terminate = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(_curTotFile, savedTotName);
|
strcpy(_curTotFile, savedTotName);
|
||||||
|
|
|
@ -193,6 +193,11 @@ void GobEngine::shutdown() {
|
||||||
_quitRequested = true;
|
_quitRequested = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GobEngine::writeVarDebug(uint32 offs, uint32 v) {
|
||||||
|
warning("Setting var %d(%d) to %d", offs, offs >> 2, v);
|
||||||
|
(*(uint32 *)(_global->_inter_variables + (offs))) = v;
|
||||||
|
}
|
||||||
|
|
||||||
int GobEngine::init() {
|
int GobEngine::init() {
|
||||||
_snd = new Snd(this);
|
_snd = new Snd(this);
|
||||||
_global = new Global(this);
|
_global = new Global(this);
|
||||||
|
|
|
@ -55,6 +55,7 @@ class Music;
|
||||||
#define VAR(var) VAR_OFFSET((var) << 2)
|
#define VAR(var) VAR_OFFSET((var) << 2)
|
||||||
#define VAR_ADDRESS(var) (&VAR(var))
|
#define VAR_ADDRESS(var) (&VAR(var))
|
||||||
|
|
||||||
|
//#define WRITE_VAR_OFFSET(offs, val) _vm->writeVarDebug(offs, val)
|
||||||
#define WRITE_VAR_OFFSET(offs, val) (VAR_OFFSET(offs) = (val))
|
#define WRITE_VAR_OFFSET(offs, val) (VAR_OFFSET(offs) = (val))
|
||||||
#define WRITE_VAR(var, val) WRITE_VAR_OFFSET((var) << 2, (val))
|
#define WRITE_VAR(var, val) WRITE_VAR_OFFSET((var) << 2, (val))
|
||||||
|
|
||||||
|
@ -120,6 +121,8 @@ public:
|
||||||
Util *_util;
|
Util *_util;
|
||||||
Inter *_inter;
|
Inter *_inter;
|
||||||
Music *_music;
|
Music *_music;
|
||||||
|
|
||||||
|
void writeVarDebug(uint32 offs, uint32 v);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // End of namespace Gob
|
} // End of namespace Gob
|
||||||
|
|
|
@ -1890,10 +1890,10 @@ void Goblin::sub_19BD3(void) {
|
||||||
var_A = anim1->field_13;
|
var_A = anim1->field_13;
|
||||||
var_C = anim1->field_14;
|
var_C = anim1->field_14;
|
||||||
|
|
||||||
pass = _vm->_map->getPass(gob1X, gob1Y, 40);
|
pass = _vm->_map->getPass(gob1X, gob1Y);
|
||||||
if ((pass > 17) && (pass < 21))
|
if ((pass > 17) && (pass < 21))
|
||||||
warning("GOB2 Stub! sub_19AB7(anim0);");
|
warning("GOB2 Stub! sub_19AB7(anim0);");
|
||||||
pass = _vm->_map->getPass(gob2X, gob2Y, 40);
|
pass = _vm->_map->getPass(gob2X, gob2Y);
|
||||||
if ((pass > 17) && (pass < 21))
|
if ((pass > 17) && (pass < 21))
|
||||||
warning("GOB2 Stub! sub_19B45(anim1);");
|
warning("GOB2 Stub! sub_19B45(anim1);");
|
||||||
|
|
||||||
|
@ -1901,57 +1901,57 @@ void Goblin::sub_19BD3(void) {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (gob1Y > si) {
|
if (gob1Y > si) {
|
||||||
if (_vm->_map->getPass(di, si, 40) > 17) {
|
if (_vm->_map->getPass(di, si) > 17) {
|
||||||
do {
|
do {
|
||||||
si--;
|
si--;
|
||||||
} while (_vm->_map->getPass(di, si, 40) > 17);
|
} while (_vm->_map->getPass(di, si) > 17);
|
||||||
si++;
|
si++;
|
||||||
if (_vm->_map->getPass(di - 1, si, 40) == 0) {
|
if (_vm->_map->getPass(di - 1, si) == 0) {
|
||||||
if (_vm->_map->getPass(di + 1, si, 40) != 0)
|
if (_vm->_map->getPass(di + 1, si) != 0)
|
||||||
di++;
|
di++;
|
||||||
} else
|
} else
|
||||||
di--;
|
di--;
|
||||||
warning("GOB2 Stub! sub_197A6(di (=%d), si (=%d), 0);", si, di);
|
sub_197A6(di, si, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (_vm->_map->getPass(di, si, 40) > 17) {
|
if (_vm->_map->getPass(di, si) > 17) {
|
||||||
do {
|
do {
|
||||||
si++;
|
si++;
|
||||||
} while (_vm->_map->getPass(di, si, 40) > 17);
|
} while (_vm->_map->getPass(di, si) > 17);
|
||||||
si--;
|
si--;
|
||||||
if (_vm->_map->getPass(di - 1, si, 40) == 0) {
|
if (_vm->_map->getPass(di - 1, si) == 0) {
|
||||||
if (_vm->_map->getPass(di + 1, si, 40) != 0)
|
if (_vm->_map->getPass(di + 1, si) != 0)
|
||||||
di++;
|
di++;
|
||||||
} else
|
} else
|
||||||
di--;
|
di--;
|
||||||
warning("GOB2 Stub! sub_197A6(di (=%d), si (=%d), 0);", si, di);
|
sub_197A6(di, si, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (gob2Y > var_C) {
|
if (gob2Y > var_C) {
|
||||||
if (_vm->_map->getPass(var_A, var_C, 40) > 17) {
|
if (_vm->_map->getPass(var_A, var_C) > 17) {
|
||||||
do {
|
do {
|
||||||
var_C--;
|
var_C--;
|
||||||
} while (_vm->_map->getPass(var_A, var_C, 40) > 17);
|
} while (_vm->_map->getPass(var_A, var_C) > 17);
|
||||||
var_C++;
|
var_C++;
|
||||||
if (_vm->_map->getPass(var_A - 1, var_C, 40) == 0) {
|
if (_vm->_map->getPass(var_A - 1, var_C) == 0) {
|
||||||
if (_vm->_map->getPass(var_A + 1, var_C, 40) != 0)
|
if (_vm->_map->getPass(var_A + 1, var_C) != 0)
|
||||||
var_A++;
|
var_A++;
|
||||||
} else
|
} else
|
||||||
var_A--;
|
var_A--;
|
||||||
warning("GOB2 Stub! sub_197A6(var_A (=%d), var_C (=%d), 1);", var_A, var_C);
|
sub_197A6(var_A, var_C, 1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (_vm->_map->getPass(var_A, var_C, 40) > 17) {
|
if (_vm->_map->getPass(var_A, var_C) > 17) {
|
||||||
do {
|
do {
|
||||||
var_C++;
|
var_C++;
|
||||||
} while (_vm->_map->getPass(var_A, var_C, 40) > 17);
|
} while (_vm->_map->getPass(var_A, var_C) > 17);
|
||||||
var_C--;
|
var_C--;
|
||||||
if (_vm->_map->getPass(var_A - 1, var_C, 40) == 0) {
|
if (_vm->_map->getPass(var_A - 1, var_C) == 0) {
|
||||||
if (_vm->_map->getPass(var_A + 1, var_C, 40) != 0)
|
if (_vm->_map->getPass(var_A + 1, var_C) != 0)
|
||||||
var_A++;
|
var_A++;
|
||||||
} else
|
} else
|
||||||
var_A--;
|
var_A--;
|
||||||
warning("GOB2 Stub! sub_197A6(var_A (=%d), var_C (=%d), 1);", var_A, var_C);
|
sub_197A6(var_A, var_C, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2049,4 +2049,114 @@ void Goblin::sub_11984(Mult::Mult_Object *obj) {
|
||||||
animData->frame--;
|
animData->frame--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Goblin::sub_197A6(int16 destX, int16 destY, int16 objIndex) {
|
||||||
|
Mult::Mult_Object *obj;
|
||||||
|
Mult::Mult_AnimData *animData;
|
||||||
|
int16 mouseX;
|
||||||
|
int16 mouseY;
|
||||||
|
int16 gobDestX;
|
||||||
|
int16 gobDestY;
|
||||||
|
int16 mapWidth;
|
||||||
|
int16 mapHeight;
|
||||||
|
int16 di;
|
||||||
|
int16 si;
|
||||||
|
int16 var_1E;
|
||||||
|
int16 var_20;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
obj = &_vm->_mult->_objects[objIndex];
|
||||||
|
animData = obj->pAnimData;
|
||||||
|
|
||||||
|
obj->gobDestX = destX;
|
||||||
|
obj->gobDestY = destY;
|
||||||
|
animData->field_13 = destX;
|
||||||
|
animData->field_14 = destY;
|
||||||
|
|
||||||
|
if ((animData->isBusy != 0) && (destX != -1) && (destY != -1)) {
|
||||||
|
if ((destX == -1) && (destY == -1)) {
|
||||||
|
mouseX = _vm->_global->_inter_mouseX;
|
||||||
|
mouseY = _vm->_global->_inter_mouseY;
|
||||||
|
if (_vm->_map->_bigTiles)
|
||||||
|
mouseY += ((_vm->_global->_inter_mouseX / _vm->_map->_tilesHeight) + 1) / 2;
|
||||||
|
obj->gobDestX = mouseX / _vm->_map->_tilesWidth;
|
||||||
|
obj->gobDestY = mouseY / _vm->_map->_tilesHeight;
|
||||||
|
gobDestX = obj->gobDestX;
|
||||||
|
gobDestY = obj->gobDestY;
|
||||||
|
if (_vm->_map->getPass(obj->gobDestX, obj->gobDestY) == 0) {
|
||||||
|
mapWidth = _vm->_map->_screenWidth / _vm->_map->_tilesWidth;
|
||||||
|
mapHeight = 200 / _vm->_map->_tilesHeight;
|
||||||
|
var_20 = 0;
|
||||||
|
di = -1;
|
||||||
|
si = -1;
|
||||||
|
|
||||||
|
for (i = 1; i <= gobDestX; i++)
|
||||||
|
if (_vm->_map->getPass(gobDestX - i, gobDestY) != 0)
|
||||||
|
break;
|
||||||
|
if (i <= gobDestX)
|
||||||
|
di = ((i - 1) * _vm->_map->_tilesWidth) + (mouseX % _vm->_map->_tilesWidth) + 1;
|
||||||
|
var_1E = i;
|
||||||
|
|
||||||
|
for (i = 1; (gobDestX + i) < mapWidth; i++)
|
||||||
|
if (_vm->_map->getPass(gobDestX + i, gobDestY) != 0)
|
||||||
|
break;
|
||||||
|
if ((gobDestX + i) < mapWidth)
|
||||||
|
si = (i * _vm->_map->_tilesWidth) - (mouseX % _vm->_map->_tilesWidth);
|
||||||
|
|
||||||
|
if ((si != -1) && ((di == -1) || (di > si))) {
|
||||||
|
di = si;
|
||||||
|
var_20 = 1;
|
||||||
|
var_1E = i;
|
||||||
|
}
|
||||||
|
si = -1;
|
||||||
|
|
||||||
|
for (i = 1; (gobDestY + i) < mapHeight; i++)
|
||||||
|
if (_vm->_map->getPass(gobDestX, gobDestY + i) != 0)
|
||||||
|
break;
|
||||||
|
if ((gobDestY + i) < mapHeight)
|
||||||
|
si = (i * _vm->_map->_tilesHeight) - (mouseY % _vm->_map->_tilesHeight);
|
||||||
|
|
||||||
|
if ((si != -1) && ((di == -1) || (di > si))) {
|
||||||
|
di = si;
|
||||||
|
var_20 = 2;
|
||||||
|
var_1E = i;
|
||||||
|
}
|
||||||
|
si = -1;
|
||||||
|
|
||||||
|
for (i = 1; i <= gobDestY; i++)
|
||||||
|
if (_vm->_map->getPass(gobDestX, gobDestY - i) != 0)
|
||||||
|
break;
|
||||||
|
if (i <= gobDestY)
|
||||||
|
si = ((i - 1) * _vm->_map->_tilesHeight) + (mouseY % _vm->_map->_tilesHeight) + 1;
|
||||||
|
|
||||||
|
if ((si != -1) && ((di == -1) || (di > si))) {
|
||||||
|
var_20 = 3;
|
||||||
|
var_1E = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (var_20 == 0)
|
||||||
|
gobDestX -= var_1E;
|
||||||
|
else if (var_20 == 1)
|
||||||
|
gobDestX += var_1E;
|
||||||
|
else if (var_20 == 2)
|
||||||
|
gobDestY += var_1E;
|
||||||
|
else if (var_20 == 3)
|
||||||
|
gobDestY -= var_1E;
|
||||||
|
}
|
||||||
|
obj->gobDestX = gobDestX;
|
||||||
|
obj->gobDestY = gobDestY;
|
||||||
|
animData->field_13 = gobDestX;
|
||||||
|
animData->field_14 = gobDestY;
|
||||||
|
if (animData->field_13 == -1) {
|
||||||
|
animData->field_13 = obj->goblinX;
|
||||||
|
obj->gobDestX = obj->goblinX;
|
||||||
|
}
|
||||||
|
if (animData->field_14 == -1) {
|
||||||
|
animData->field_14 = obj->goblinY;
|
||||||
|
obj->gobDestY = obj->goblinY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
initiateMove(obj);
|
||||||
|
}
|
||||||
|
|
||||||
} // End of namespace Gob
|
} // End of namespace Gob
|
||||||
|
|
|
@ -220,6 +220,7 @@ public:
|
||||||
void sub_19BD3(void);
|
void sub_19BD3(void);
|
||||||
void sub_195C7(int16 index, int16 state);
|
void sub_195C7(int16 index, int16 state);
|
||||||
void sub_11984(Mult::Mult_Object *obj);
|
void sub_11984(Mult::Mult_Object *obj);
|
||||||
|
void sub_197A6(int16 destX, int16 destY, int16 objIndex);
|
||||||
|
|
||||||
virtual void placeObject(Gob_Object * objDesc, char animated,
|
virtual void placeObject(Gob_Object * objDesc, char animated,
|
||||||
int16 index, int16 x, int16 y, int16 state) = 0;
|
int16 index, int16 x, int16 y, int16 state) = 0;
|
||||||
|
|
|
@ -205,6 +205,7 @@ memBlocks = word ptr -2*/
|
||||||
|
|
||||||
_vm->_global->_inter_variables = new char[varsCount * 4];
|
_vm->_global->_inter_variables = new char[varsCount * 4];
|
||||||
memset(_vm->_global->_inter_variables, 0, varsCount * 4);
|
memset(_vm->_global->_inter_variables, 0, varsCount * 4);
|
||||||
|
WRITE_VAR(58, 1);
|
||||||
|
|
||||||
strcpy(_vm->_game->_curTotFile, buffer);
|
strcpy(_vm->_game->_curTotFile, buffer);
|
||||||
|
|
||||||
|
|
|
@ -314,6 +314,7 @@ protected:
|
||||||
void o2_totSub(void);
|
void o2_totSub(void);
|
||||||
void o2_switchTotSub(void);
|
void o2_switchTotSub(void);
|
||||||
void o2_stub0x54(void);
|
void o2_stub0x54(void);
|
||||||
|
void o2_stub0x55(void);
|
||||||
void o2_stub0x80(void);
|
void o2_stub0x80(void);
|
||||||
void o2_stub0x82(void);
|
void o2_stub0x82(void);
|
||||||
void o2_stub0x85(void);
|
void o2_stub0x85(void);
|
||||||
|
|
|
@ -1806,6 +1806,7 @@ bool Inter_v1::o1_call(char &cmdCount, int16 &counter, int16 &retFlag) {
|
||||||
bool Inter_v1::o1_callBool(char &cmdCount, int16 &counter, int16 &retFlag) {
|
bool Inter_v1::o1_callBool(char &cmdCount, int16 &counter, int16 &retFlag) {
|
||||||
byte cmd;
|
byte cmd;
|
||||||
bool boolRes = evalBoolResult() != 0;
|
bool boolRes = evalBoolResult() != 0;
|
||||||
|
|
||||||
if (boolRes != 0) {
|
if (boolRes != 0) {
|
||||||
if (counter == cmdCount
|
if (counter == cmdCount
|
||||||
&& retFlag == 2)
|
&& retFlag == 2)
|
||||||
|
|
|
@ -231,7 +231,7 @@ void Inter_v2::setupOpcodes(void) {
|
||||||
OPCODE(o2_writeGoblinPos),
|
OPCODE(o2_writeGoblinPos),
|
||||||
/* 54 */
|
/* 54 */
|
||||||
OPCODE(o2_stub0x54),
|
OPCODE(o2_stub0x54),
|
||||||
OPCODE(o2_drawStub),
|
OPCODE(o2_stub0x55),
|
||||||
OPCODE(o2_placeGoblin),
|
OPCODE(o2_placeGoblin),
|
||||||
{NULL, ""},
|
{NULL, ""},
|
||||||
/* 58 */
|
/* 58 */
|
||||||
|
@ -718,6 +718,97 @@ void Inter_v2::o2_stub0x54(void) {
|
||||||
_vm->_mult->_objects[index].pAnimData->pathExistence = 4;
|
_vm->_mult->_objects[index].pAnimData->pathExistence = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Inter_v2::o2_stub0x55(void) {
|
||||||
|
int16 index;
|
||||||
|
int16 state;
|
||||||
|
int16 f16;
|
||||||
|
int16 layer;
|
||||||
|
int16 animation;
|
||||||
|
int16 deltaX;
|
||||||
|
int16 deltaY;
|
||||||
|
int16 deltaHeight;
|
||||||
|
int16 deltaWidth;
|
||||||
|
Mult::Mult_Object *obj;
|
||||||
|
Mult::Mult_AnimData *objAnim;
|
||||||
|
|
||||||
|
index = _vm->_parse->parseValExpr();
|
||||||
|
state = _vm->_parse->parseValExpr();
|
||||||
|
f16 = _vm->_parse->parseValExpr();
|
||||||
|
|
||||||
|
obj = &_vm->_mult->_objects[index];
|
||||||
|
objAnim = obj->pAnimData;
|
||||||
|
|
||||||
|
objAnim->field_16 = f16;
|
||||||
|
switch (f16) {
|
||||||
|
case 0:
|
||||||
|
if (obj->goblinStates[state] != 0) {
|
||||||
|
objAnim->frame = 0;
|
||||||
|
layer = obj->goblinStates[state][0].layer;
|
||||||
|
animation = obj->goblinStates[state][0].animation;
|
||||||
|
objAnim->state = state;
|
||||||
|
objAnim->layer = layer;
|
||||||
|
objAnim->animation = animation;
|
||||||
|
*obj->pPosX = _vm->_scenery->_animations[animation].layers[layer].posX;
|
||||||
|
*obj->pPosY = _vm->_scenery->_animations[animation].layers[layer].posY;
|
||||||
|
objAnim->isPaused = 0;
|
||||||
|
objAnim->isStatic = 0;
|
||||||
|
objAnim->newCycle = _vm->_scenery->_animations[animation].layers[layer].framesCount;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
case 4:
|
||||||
|
case 6:
|
||||||
|
if (obj->goblinStates[state] != 0) {
|
||||||
|
layer = obj->goblinStates[objAnim->state][0].layer;
|
||||||
|
animation = obj->goblinStates[objAnim->state][0].animation;
|
||||||
|
_vm->_scenery->updateAnim(layer, 0, animation, 0, *obj->pPosX, *obj->pPosY, 0);
|
||||||
|
deltaHeight = _vm->_scenery->_animBottom - _vm->_scenery->_animTop;
|
||||||
|
deltaWidth = _vm->_scenery->_animRight - _vm->_scenery->_animLeft;
|
||||||
|
deltaX = _vm->_scenery->_animations[objAnim->animation].layers[objAnim->layer].animDeltaX;
|
||||||
|
deltaY = _vm->_scenery->_animations[objAnim->animation].layers[objAnim->layer].animDeltaY;
|
||||||
|
layer = obj->goblinStates[state][0].layer;
|
||||||
|
animation = obj->goblinStates[state][0].animation;
|
||||||
|
objAnim->state = state;
|
||||||
|
objAnim->layer = layer;
|
||||||
|
objAnim->animation = animation;
|
||||||
|
objAnim->frame = 0;
|
||||||
|
objAnim->isPaused = 0;
|
||||||
|
objAnim->isStatic = 0;
|
||||||
|
objAnim->newCycle = _vm->_scenery->_animations[animation].layers[layer].framesCount;
|
||||||
|
_vm->_scenery->updateAnim(layer, 0, animation, 0, *obj->pPosX, *obj->pPosY, 0);
|
||||||
|
deltaHeight -= _vm->_scenery->_animBottom - _vm->_scenery->_animTop;
|
||||||
|
deltaWidth -= _vm->_scenery->_animRight - _vm->_scenery->_animLeft;
|
||||||
|
*obj->pPosX += deltaWidth + deltaX;
|
||||||
|
*obj->pPosY += deltaHeight + deltaY;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 11:
|
||||||
|
if (obj->goblinStates[state] != 0) {
|
||||||
|
layer = obj->goblinStates[state][0].layer;
|
||||||
|
animation = obj->goblinStates[state][0].animation;
|
||||||
|
objAnim->state = state;
|
||||||
|
objAnim->layer = layer;
|
||||||
|
objAnim->animation = animation;
|
||||||
|
objAnim->frame = 0;
|
||||||
|
objAnim->isPaused = 0;
|
||||||
|
objAnim->isStatic = 0;
|
||||||
|
objAnim->newCycle = _vm->_scenery->_animations[animation].layers[layer].framesCount;
|
||||||
|
_vm->_scenery->updateAnim(layer, 0, animation, 0, *obj->pPosX, *obj->pPosY, 0);
|
||||||
|
if (_vm->_map->_bigTiles)
|
||||||
|
*obj->pPosY = ((obj->goblinY + 1) * _vm->_map->_tilesHeight) -
|
||||||
|
(_vm->_scenery->_animBottom - _vm->_scenery->_animTop) -
|
||||||
|
((obj->goblinY + 1) / 2);
|
||||||
|
else
|
||||||
|
*obj->pPosY = ((obj->goblinY + 1) * _vm->_map->_tilesHeight) -
|
||||||
|
(_vm->_scenery->_animBottom - _vm->_scenery->_animTop);
|
||||||
|
*obj->pPosX = obj->goblinX * _vm->_map->_tilesWidth;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Inter_v2::o2_stub0x80(void) {
|
void Inter_v2::o2_stub0x80(void) {
|
||||||
int16 start;
|
int16 start;
|
||||||
int16 videoMode;
|
int16 videoMode;
|
||||||
|
@ -1276,7 +1367,7 @@ bool Inter_v2::o2_playSound(char &cmdCount, int16 &counter, int16 &retFlag) {
|
||||||
}
|
}
|
||||||
// loc_E2F3
|
// loc_E2F3
|
||||||
if (_vm->_game->_soundTypes[index] & 8) {
|
if (_vm->_game->_soundTypes[index] & 8) {
|
||||||
_vm->_music->loadFromMemory((byte *) _vm->_game->_soundSamples[index]);
|
_vm->_music->loadFromMemory((byte *) _vm->_game->_soundSamples[index], index);
|
||||||
_vm->_music->setRepeating(repCount - 1);
|
_vm->_music->setRepeating(repCount - 1);
|
||||||
_vm->_music->startPlay();
|
_vm->_music->startPlay();
|
||||||
} else {
|
} else {
|
||||||
|
@ -1635,6 +1726,8 @@ void Inter_v2::o2_initMult(void) {
|
||||||
for (i = 0; i < _vm->_mult->_objCount; i++) {
|
for (i = 0; i < _vm->_mult->_objCount; i++) {
|
||||||
_vm->_mult->_objects[i].pPosX = (int32 *)(_vm->_global->_inter_variables + i * 4 + (posXVar / 4) * 4);
|
_vm->_mult->_objects[i].pPosX = (int32 *)(_vm->_global->_inter_variables + i * 4 + (posXVar / 4) * 4);
|
||||||
_vm->_mult->_objects[i].pPosY = (int32 *)(_vm->_global->_inter_variables + i * 4 + (posYVar / 4) * 4);
|
_vm->_mult->_objects[i].pPosY = (int32 *)(_vm->_global->_inter_variables + i * 4 + (posYVar / 4) * 4);
|
||||||
|
if ((i == 0) || (i == 1))
|
||||||
|
warning("=> Goblin %d: %d (%d) (%d)", i, animDataVar + i * 4 * _vm->_global->_inter_animDataSize, (animDataVar + i * 4 * _vm->_global->_inter_animDataSize) / 4, _vm->_global->_inter_animDataSize);
|
||||||
_vm->_mult->_objects[i].pAnimData =
|
_vm->_mult->_objects[i].pAnimData =
|
||||||
(Mult::Mult_AnimData *) (_vm->_global->_inter_variables + animDataVar +
|
(Mult::Mult_AnimData *) (_vm->_global->_inter_variables + animDataVar +
|
||||||
i * 4 * _vm->_global->_inter_animDataSize);
|
i * 4 * _vm->_global->_inter_animDataSize);
|
||||||
|
|
|
@ -117,12 +117,10 @@ void Map_v2::loadMapObjects(char *avjFile) {
|
||||||
_passMap = (int8 *) variables;
|
_passMap = (int8 *) variables;
|
||||||
mapHeight = 200 / _tilesHeight;
|
mapHeight = 200 / _tilesHeight;
|
||||||
mapWidth = _screenWidth / _tilesWidth;
|
mapWidth = _screenWidth / _tilesWidth;
|
||||||
for (i = 0; i < mapHeight; i++) {
|
for (i = 0; i < mapHeight; i++)
|
||||||
for (j = 0; j < mapWidth; j++) {
|
for (j = 0; j < mapWidth; j++)
|
||||||
setPass(j, i, mapData.readSByte());
|
setPass(j, i, mapData.readSByte());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
mapData.seek(dataPos1);
|
mapData.seek(dataPos1);
|
||||||
|
|
||||||
tmp = mapData.readSint16LE();
|
tmp = mapData.readSint16LE();
|
||||||
|
|
|
@ -84,11 +84,7 @@ public:
|
||||||
int16 lastRight;
|
int16 lastRight;
|
||||||
int16 lastTop;
|
int16 lastTop;
|
||||||
int16 lastBottom;
|
int16 lastBottom;
|
||||||
int8 someFlag; // New in GOB2
|
Mult::Mult_GobState **goblinStates; // New in GOB2
|
||||||
int16 somethingLeft; // New in GOB2
|
|
||||||
int16 somethingTop; // New in GOB2
|
|
||||||
int16 somethingRight; // New in GOB2
|
|
||||||
int16 somethingBottom; // New in GOB2
|
|
||||||
int8 goblinX; // New in GOB2
|
int8 goblinX; // New in GOB2
|
||||||
int8 goblinY; // New in GOB2
|
int8 goblinY; // New in GOB2
|
||||||
int8 destX; // New in GOB2
|
int8 destX; // New in GOB2
|
||||||
|
@ -97,7 +93,16 @@ public:
|
||||||
int8 gobDestY; // New in GOB2
|
int8 gobDestY; // New in GOB2
|
||||||
int8 nearestWayPoint; // New in GOB2
|
int8 nearestWayPoint; // New in GOB2
|
||||||
int8 nearestDest; // New in GOB2
|
int8 nearestDest; // New in GOB2
|
||||||
Mult::Mult_GobState **goblinStates; // New in GOB2
|
int8 field_22; // New in GOB2
|
||||||
|
int8 someFlag; // New in GOB2
|
||||||
|
int8 field_24; // New in GOB2
|
||||||
|
int8 field_25; // New in GOB2
|
||||||
|
int8 field_26; // New in GOB2
|
||||||
|
int8 field_27; // New in GOB2
|
||||||
|
int16 somethingLeft; // New in GOB2
|
||||||
|
int16 somethingTop; // New in GOB2
|
||||||
|
int16 somethingRight; // New in GOB2
|
||||||
|
int16 somethingBottom; // New in GOB2
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Mult_StaticKey {
|
struct Mult_StaticKey {
|
||||||
|
|
|
@ -327,9 +327,9 @@ void Mult_v2::multSub(uint16 multindex) {
|
||||||
}
|
}
|
||||||
|
|
||||||
_multData2->field_124[index][0] = flags;
|
_multData2->field_124[index][0] = flags;
|
||||||
for (i = 1; i < 4; i++) {
|
for (i = 1; i < 4; i++)
|
||||||
_multData2->field_124[index][i] = _vm->_parse->parseValExpr();
|
_multData2->field_124[index][i] = _vm->_parse->parseValExpr();
|
||||||
}
|
|
||||||
expr = _vm->_parse->parseValExpr();
|
expr = _vm->_parse->parseValExpr();
|
||||||
_multData2->animKeysFrames[index] = expr;
|
_multData2->animKeysFrames[index] = expr;
|
||||||
_multData2->animKeysStartFrames[index] = expr;
|
_multData2->animKeysStartFrames[index] = expr;
|
||||||
|
@ -473,7 +473,7 @@ void Mult_v2::playMult(int16 startFrame, int16 endFrame, char checkEscape,
|
||||||
|
|
||||||
_vm->_draw->adjustCoords(0, &_vm->_anim->_areaWidth, &_vm->_anim->_areaHeight);
|
_vm->_draw->adjustCoords(0, &_vm->_anim->_areaWidth, &_vm->_anim->_areaHeight);
|
||||||
|
|
||||||
if ((_vm->_global->_videoMode == 0x14) &&
|
if ((_vm->_global->_videoMode == 0x13) && _vm->_video->_extraMode &&
|
||||||
((_vm->_draw->_backSurface->width * _vm->_draw->_backSurface->height) / 2
|
((_vm->_draw->_backSurface->width * _vm->_draw->_backSurface->height) / 2
|
||||||
+ (_vm->_anim->_areaWidth * _vm->_anim->_areaHeight) / 4) < 64000) {
|
+ (_vm->_anim->_areaWidth * _vm->_anim->_areaHeight) / 4) < 64000) {
|
||||||
_vm->_anim->_animSurf = new Video::SurfaceDesc;
|
_vm->_anim->_animSurf = new Video::SurfaceDesc;
|
||||||
|
|
|
@ -76,6 +76,7 @@ const unsigned char Music::_volRegNums[] = {
|
||||||
Music::Music(GobEngine *vm) : _vm(vm) {
|
Music::Music(GobEngine *vm) : _vm(vm) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
_index = -1;
|
||||||
_data = 0;
|
_data = 0;
|
||||||
_playPos = 0;
|
_playPos = 0;
|
||||||
_dataSize = 0;
|
_dataSize = 0;
|
||||||
|
@ -365,6 +366,9 @@ void Music::pollMusic(void) {
|
||||||
_pollNotes[channel] = note;
|
_pollNotes[channel] = note;
|
||||||
setKey(channel, note, true, false);
|
setKey(channel, note, true, false);
|
||||||
break;
|
break;
|
||||||
|
case 0x60:
|
||||||
|
warning("GOB2 Stub! ADL command 0x60");
|
||||||
|
break;
|
||||||
// Last note off
|
// Last note off
|
||||||
case 0x80:
|
case 0x80:
|
||||||
note = _pollNotes[channel];
|
note = _pollNotes[channel];
|
||||||
|
@ -452,6 +456,7 @@ void Music::playTrack(const char *trackname) {
|
||||||
bool Music::loadMusic(const char *filename) {
|
bool Music::loadMusic(const char *filename) {
|
||||||
Common::File song;
|
Common::File song;
|
||||||
|
|
||||||
|
unloadMusic();
|
||||||
song.open(filename);
|
song.open(filename);
|
||||||
if (!song.isOpen())
|
if (!song.isOpen())
|
||||||
return false;
|
return false;
|
||||||
|
@ -469,12 +474,13 @@ bool Music::loadMusic(const char *filename) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Music::loadFromMemory(byte *data) {
|
void Music::loadFromMemory(byte *data, int index) {
|
||||||
unloadMusic();
|
unloadMusic();
|
||||||
_repCount = 0;
|
_repCount = 0;
|
||||||
|
|
||||||
_dataSize = (uint32) -1;
|
_dataSize = (uint32) -1;
|
||||||
_data = data;
|
_data = data;
|
||||||
|
_index = index;
|
||||||
|
|
||||||
reset();
|
reset();
|
||||||
setVoices();
|
setVoices();
|
||||||
|
@ -483,6 +489,7 @@ void Music::loadFromMemory(byte *data) {
|
||||||
|
|
||||||
void Music::unloadMusic(void) {
|
void Music::unloadMusic(void) {
|
||||||
_playing = false;
|
_playing = false;
|
||||||
|
_index = -1;
|
||||||
|
|
||||||
if (_data && _needFree)
|
if (_data && _needFree)
|
||||||
delete[] _data;
|
delete[] _data;
|
||||||
|
|
|
@ -45,12 +45,13 @@ public:
|
||||||
bool playing() { return _playing; }
|
bool playing() { return _playing; }
|
||||||
bool getRepeating(void) { return _repCount != 0; }
|
bool getRepeating(void) { return _repCount != 0; }
|
||||||
void setRepeating (int32 repCount) { _repCount = repCount; }
|
void setRepeating (int32 repCount) { _repCount = repCount; }
|
||||||
|
int getIndex(void) { return _index; }
|
||||||
virtual void startPlay(void);
|
virtual void startPlay(void);
|
||||||
virtual void stopPlay(void) { _mutex.lock(); _playing = false; _mutex.unlock(); }
|
virtual void stopPlay(void) { _mutex.lock(); _playing = false; _mutex.unlock(); }
|
||||||
virtual void playTrack(const char *trackname);
|
virtual void playTrack(const char *trackname);
|
||||||
virtual void playBgMusic(void);
|
virtual void playBgMusic(void);
|
||||||
virtual bool loadMusic(const char *filename);
|
virtual bool loadMusic(const char *filename);
|
||||||
virtual void loadFromMemory(byte *data);
|
virtual void loadFromMemory(byte *data, int index=-1);
|
||||||
virtual void unloadMusic(void);
|
virtual void unloadMusic(void);
|
||||||
|
|
||||||
// AudioStream API
|
// AudioStream API
|
||||||
|
@ -68,6 +69,7 @@ protected:
|
||||||
static const unsigned char _operators[];
|
static const unsigned char _operators[];
|
||||||
static const unsigned char _volRegNums [];
|
static const unsigned char _volRegNums [];
|
||||||
FM_OPL *_opl;
|
FM_OPL *_opl;
|
||||||
|
int _index;
|
||||||
byte *_data;
|
byte *_data;
|
||||||
byte *_playPos;
|
byte *_playPos;
|
||||||
uint32 _dataSize;
|
uint32 _dataSize;
|
||||||
|
|
|
@ -148,24 +148,24 @@ int16 Parse_v2::parseValExpr(unsigned stopToken) {
|
||||||
offset = arrDesc[dim] * offset + temp2;
|
offset = arrDesc[dim] * offset + temp2;
|
||||||
}
|
}
|
||||||
if (operation == 16)
|
if (operation == 16)
|
||||||
*valPtr = *(_vm->_global->_inter_variables + temp + offset);
|
*valPtr = *(int8 *)(_vm->_global->_inter_variables + temp + offset);
|
||||||
else if (operation == 26)
|
else if (operation == 26)
|
||||||
*valPtr = *(uint16*)(_vm->_global->_inter_variables + temp * 4 + offset * 4);
|
*valPtr = *(uint16 *)(_vm->_global->_inter_variables + temp * 4 + offset * 4);
|
||||||
else if (operation == 27)
|
else if (operation == 27)
|
||||||
*valPtr = *(uint16*)(_vm->_global->_inter_variables + temp * 2 + offset * 2);
|
*valPtr = *(uint16 *)(_vm->_global->_inter_variables + temp * 2 + offset * 2);
|
||||||
else if (operation == 28) {
|
else if (operation == 28) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp2 = parseValExpr(12);
|
temp2 = parseValExpr(12);
|
||||||
*valPtr = (uint8)*(_vm->_global->_inter_variables + temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
|
*valPtr = *(uint8 *)(_vm->_global->_inter_variables + temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 17:
|
case 17:
|
||||||
*valPtr = *(uint16*)(_vm->_global->_inter_variables + _vm->_inter->load16() * 2);
|
*valPtr = *(uint16 *)(_vm->_global->_inter_variables + _vm->_inter->load16() * 2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 18:
|
case 18:
|
||||||
*valPtr = *(_vm->_global->_inter_variables + _vm->_inter->load16());
|
*valPtr = *(int8 *)(_vm->_global->_inter_variables + _vm->_inter->load16());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 19:
|
case 19:
|
||||||
|
@ -183,14 +183,14 @@ int16 Parse_v2::parseValExpr(unsigned stopToken) {
|
||||||
|
|
||||||
case 23:
|
case 23:
|
||||||
case 24:
|
case 24:
|
||||||
*valPtr = VAR(_vm->_inter->load16());
|
*valPtr = *(uint16 *)(_vm->_global->_inter_variables + _vm->_inter->load16() * 4);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 25:
|
case 25:
|
||||||
temp = _vm->_inter->load16() * 4;
|
temp = _vm->_inter->load16() * 4;
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp += parseValExpr(12);
|
temp += parseValExpr(12);
|
||||||
*valPtr = *(_vm->_global->_inter_variables + temp);
|
*valPtr = *(uint8 *)(_vm->_global->_inter_variables + temp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 29:
|
case 29:
|
||||||
|
@ -257,7 +257,7 @@ int16 Parse_v2::parseValExpr(unsigned stopToken) {
|
||||||
operPtr[-1] = operPtr[0];
|
operPtr[-1] = operPtr[0];
|
||||||
valPtr[-1] = valPtr[0];
|
valPtr[-1] = valPtr[0];
|
||||||
if (stkPos > 1 && operPtr[-2] == 1) {
|
if (stkPos > 1 && operPtr[-2] == 1) {
|
||||||
valPtr[-2] = 20;
|
operPtr[-2] = 20;
|
||||||
valPtr[-2] = -valPtr[-1];
|
valPtr[-2] = -valPtr[-1];
|
||||||
|
|
||||||
stkPos--;
|
stkPos--;
|
||||||
|
@ -265,26 +265,25 @@ int16 Parse_v2::parseValExpr(unsigned stopToken) {
|
||||||
valPtr--;
|
valPtr--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stkPos > 2 && operPtr[-2] > 4
|
if (stkPos > 2 && operPtr[-2] > 4 && operPtr[-2] < 9) {
|
||||||
&& operPtr[-2] < 9) {
|
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
switch (operPtr[0]) {
|
switch (operPtr[0]) {
|
||||||
case 5:
|
case 5:
|
||||||
operPtr[-1] *= operPtr[1];
|
valPtr[-1] *= valPtr[1];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 6:
|
case 6:
|
||||||
operPtr[-1] /= operPtr[1];
|
valPtr[-1] /= valPtr[1];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 7:
|
case 7:
|
||||||
operPtr[-1] %= operPtr[1];
|
valPtr[-1] %= valPtr[1];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8:
|
case 8:
|
||||||
operPtr[-1] &= operPtr[1];
|
valPtr[-1] &= valPtr[1];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -352,7 +351,7 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) {
|
||||||
int32 prevVal;
|
int32 prevVal;
|
||||||
int32 curVal;
|
int32 curVal;
|
||||||
int32 *valPtr;
|
int32 *valPtr;
|
||||||
char *operPtr;
|
byte *operPtr;
|
||||||
byte *arrDescPtr;
|
byte *arrDescPtr;
|
||||||
char var_C;
|
char var_C;
|
||||||
byte operation;
|
byte operation;
|
||||||
|
@ -368,7 +367,7 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) {
|
||||||
memset(operStack, 0, 20);
|
memset(operStack, 0, 20);
|
||||||
|
|
||||||
stkPos = -1;
|
stkPos = -1;
|
||||||
operPtr = (char *)(operStack - 1);
|
operPtr = operStack - 1;
|
||||||
valPtr = values - 1;
|
valPtr = values - 1;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -376,7 +375,7 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) {
|
||||||
operPtr++;
|
operPtr++;
|
||||||
valPtr++;
|
valPtr++;
|
||||||
operation = *_vm->_global->_inter_execPtr++;
|
operation = *_vm->_global->_inter_execPtr++;
|
||||||
if (operation >= 19 && operation <= 29) {
|
if (operation >= 16 && operation <= 29) {
|
||||||
switch (operation) {
|
switch (operation) {
|
||||||
case 16:
|
case 16:
|
||||||
case 26:
|
case 26:
|
||||||
|
@ -396,30 +395,30 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) {
|
||||||
offset = offset * arrDescPtr[dim] + temp2;
|
offset = offset * arrDescPtr[dim] + temp2;
|
||||||
}
|
}
|
||||||
if (operation == 16)
|
if (operation == 16)
|
||||||
*valPtr = *(_vm->_global->_inter_variables + temp + offset);
|
*valPtr = *(int8 *)(_vm->_global->_inter_variables + temp + offset);
|
||||||
else if (operation == 26)
|
else if (operation == 26)
|
||||||
*valPtr = *(uint32*)(_vm->_global->_inter_variables + temp * 4 + offset * 4);
|
*valPtr = *(uint32 *)(_vm->_global->_inter_variables + temp * 4 + offset * 4);
|
||||||
else if (operation == 27)
|
else if (operation == 27)
|
||||||
*valPtr = *(uint16*)(_vm->_global->_inter_variables + temp * 2 + offset * 2);
|
*valPtr = *(int16 *)(_vm->_global->_inter_variables + temp * 2 + offset * 2);
|
||||||
else if (operation == 28) {
|
else if (operation == 28) {
|
||||||
*valPtr = encodePtr(_vm->_global->_inter_variables + temp * 4 + offset * _vm->_global->_inter_animDataSize * 4, kInterVar);
|
*valPtr = encodePtr(_vm->_global->_inter_variables + temp * 4 + offset * _vm->_global->_inter_animDataSize * 4, kInterVar);
|
||||||
if (*_vm->_global->_inter_execPtr == 13) {
|
if (*_vm->_global->_inter_execPtr == 13) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp2 = parseValExpr(12);
|
temp2 = parseValExpr(12);
|
||||||
*operPtr = 20;
|
*operPtr = 20;
|
||||||
*valPtr = (uint8)*(_vm->_global->_inter_variables + temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
|
*valPtr = *(uint8 *)(_vm->_global->_inter_variables + temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 17:
|
case 17:
|
||||||
*operPtr = 20;
|
*operPtr = 20;
|
||||||
*valPtr = *(uint16*)(_vm->_global->_inter_variables + _vm->_inter->load16() * 2);
|
*valPtr = *(int16 *)(_vm->_global->_inter_variables + _vm->_inter->load16() * 2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 18:
|
case 18:
|
||||||
*operPtr = 20;
|
*operPtr = 20;
|
||||||
*valPtr = *(_vm->_global->_inter_variables + _vm->_inter->load16());
|
*valPtr = *(int8 *)(_vm->_global->_inter_variables + _vm->_inter->load16());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 19:
|
case 19:
|
||||||
|
@ -445,11 +444,15 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 23:
|
case 23:
|
||||||
case 24:
|
|
||||||
*operPtr = 20;
|
*operPtr = 20;
|
||||||
*valPtr = VAR(_vm->_inter->load16());
|
*valPtr = VAR(_vm->_inter->load16());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 24:
|
||||||
|
*operPtr = 20;
|
||||||
|
*valPtr = *(int16 *)(_vm->_global->_inter_variables + _vm->_inter->load16() * 4);
|
||||||
|
break;
|
||||||
|
|
||||||
case 25:
|
case 25:
|
||||||
*operPtr = 22;
|
*operPtr = 22;
|
||||||
temp = _vm->_inter->load16() * 4;
|
temp = _vm->_inter->load16() * 4;
|
||||||
|
@ -458,7 +461,7 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp += parseValExpr(12);
|
temp += parseValExpr(12);
|
||||||
*operPtr = 20;
|
*operPtr = 20;
|
||||||
*valPtr = (uint8)*(_vm->_global->_inter_variables + temp);
|
*valPtr = *(uint8 *)(_vm->_global->_inter_variables + temp);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -560,7 +563,7 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
} // op>= 19 && op <= 29
|
} // op >= 16 && op <= 29
|
||||||
|
|
||||||
if (operation == stopToken || operation == 30 || operation == 31 || operation == 10) {
|
if (operation == stopToken || operation == 30 || operation == 31 || operation == 10) {
|
||||||
while (stkPos >= 2) {
|
while (stkPos >= 2) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue