- 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:
Sven Hesse 2006-08-12 09:16:08 +00:00
parent de9ba3adee
commit 1c4715b71f
17 changed files with 314 additions and 73 deletions

View file

@ -478,7 +478,7 @@ void Draw_v2::spriteOperation(int16 operation) {
int16 y;
Video::SurfaceDesc *sourceSurf;
Video::SurfaceDesc *destSurf;
bool deltaveto;
bool deltaVeto;
int16 left;
int16 ratio;
int16 spriteLeft;
@ -494,10 +494,10 @@ void Draw_v2::spriteOperation(int16 operation) {
// '---
if (operation & 0x10) {
deltaveto = true;
deltaVeto = true;
operation &= 0x0F;
} else
deltaveto = false;
deltaVeto = false;
if (_sourceSurface >= 100)
_sourceSurface -= 80;
@ -505,7 +505,7 @@ void Draw_v2::spriteOperation(int16 operation) {
if (_destSurface >= 100)
_destSurface -= 80;
if ((_renderFlags & RENDERFLAG_USEDELTAS) && !deltaveto) {
if ((_renderFlags & RENDERFLAG_USEDELTAS) && !deltaVeto) {
if ((_sourceSurface == 21) && (operation != DRAW_LOADSPRITE)) {
_spriteLeft += _backDeltaX;
_spriteTop += _backDeltaY;
@ -864,7 +864,7 @@ void Draw_v2::spriteOperation(int16 operation) {
_destSpriteX += len * strlen(_textToPrint);
}
if ((_renderFlags & RENDERFLAG_USEDELTAS) && !deltaveto) {
if ((_renderFlags & RENDERFLAG_USEDELTAS) && !deltaVeto) {
if (_sourceSurface == 21) {
_spriteLeft -= _backDeltaX;
_spriteTop -= _backDeltaY;

View file

@ -344,7 +344,8 @@ void Game::freeSoundSlot(int16 slot) {
return;
if (_soundADL[slot]) {
_vm->_music->stopPlay();
if (_vm->_music->getIndex() == slot)
_vm->_music->stopPlay();
if (_soundFromExt[slot] == 1) {
delete[] ((char *) _soundSamples[slot]);
_soundFromExt[slot] = 0;
@ -866,8 +867,10 @@ char *Game::loadLocTexts(void) {
warning("Your game version doesn't support the requested language, using the first one available");
for (i = 0; i < 10; i++) {
handle = openLocTextFile(locTextFile, i);
if (handle >= 0)
if (handle >= 0) {
_vm->_global->_language = i;
break;
}
}
}

View file

@ -115,6 +115,7 @@ void Game_v2::playTot(int16 skipPlay) {
loadTotFile(_curTotFile);
if (_totFileData == 0) {
_vm->_draw->blitCursor();
_vm->_inter->_terminate = 2;
break;
}
@ -258,6 +259,13 @@ void Game_v2::playTot(int16 skipPlay) {
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);

View file

@ -193,6 +193,11 @@ void GobEngine::shutdown() {
_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() {
_snd = new Snd(this);
_global = new Global(this);

View file

@ -55,6 +55,7 @@ class Music;
#define VAR(var) VAR_OFFSET((var) << 2)
#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(var, val) WRITE_VAR_OFFSET((var) << 2, (val))
@ -120,6 +121,8 @@ public:
Util *_util;
Inter *_inter;
Music *_music;
void writeVarDebug(uint32 offs, uint32 v);
};
} // End of namespace Gob

View file

@ -1890,10 +1890,10 @@ void Goblin::sub_19BD3(void) {
var_A = anim1->field_13;
var_C = anim1->field_14;
pass = _vm->_map->getPass(gob1X, gob1Y, 40);
pass = _vm->_map->getPass(gob1X, gob1Y);
if ((pass > 17) && (pass < 21))
warning("GOB2 Stub! sub_19AB7(anim0);");
pass = _vm->_map->getPass(gob2X, gob2Y, 40);
pass = _vm->_map->getPass(gob2X, gob2Y);
if ((pass > 17) && (pass < 21))
warning("GOB2 Stub! sub_19B45(anim1);");
@ -1901,57 +1901,57 @@ void Goblin::sub_19BD3(void) {
return;
if (gob1Y > si) {
if (_vm->_map->getPass(di, si, 40) > 17) {
if (_vm->_map->getPass(di, si) > 17) {
do {
si--;
} while (_vm->_map->getPass(di, si, 40) > 17);
} while (_vm->_map->getPass(di, si) > 17);
si++;
if (_vm->_map->getPass(di - 1, si, 40) == 0) {
if (_vm->_map->getPass(di + 1, si, 40) != 0)
if (_vm->_map->getPass(di - 1, si) == 0) {
if (_vm->_map->getPass(di + 1, si) != 0)
di++;
} else
di--;
warning("GOB2 Stub! sub_197A6(di (=%d), si (=%d), 0);", si, di);
sub_197A6(di, si, 0);
}
} else {
if (_vm->_map->getPass(di, si, 40) > 17) {
if (_vm->_map->getPass(di, si) > 17) {
do {
si++;
} while (_vm->_map->getPass(di, si, 40) > 17);
} while (_vm->_map->getPass(di, si) > 17);
si--;
if (_vm->_map->getPass(di - 1, si, 40) == 0) {
if (_vm->_map->getPass(di + 1, si, 40) != 0)
if (_vm->_map->getPass(di - 1, si) == 0) {
if (_vm->_map->getPass(di + 1, si) != 0)
di++;
} else
di--;
warning("GOB2 Stub! sub_197A6(di (=%d), si (=%d), 0);", si, di);
sub_197A6(di, si, 0);
}
}
if (gob2Y > var_C) {
if (_vm->_map->getPass(var_A, var_C, 40) > 17) {
if (_vm->_map->getPass(var_A, var_C) > 17) {
do {
var_C--;
} while (_vm->_map->getPass(var_A, var_C, 40) > 17);
} while (_vm->_map->getPass(var_A, var_C) > 17);
var_C++;
if (_vm->_map->getPass(var_A - 1, var_C, 40) == 0) {
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) != 0)
var_A++;
} else
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 {
if (_vm->_map->getPass(var_A, var_C, 40) > 17) {
if (_vm->_map->getPass(var_A, var_C) > 17) {
do {
var_C++;
} while (_vm->_map->getPass(var_A, var_C, 40) > 17);
} while (_vm->_map->getPass(var_A, var_C) > 17);
var_C--;
if (_vm->_map->getPass(var_A - 1, var_C, 40) == 0) {
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) != 0)
var_A++;
} else
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--;
}
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

View file

@ -220,6 +220,7 @@ public:
void sub_19BD3(void);
void sub_195C7(int16 index, int16 state);
void sub_11984(Mult::Mult_Object *obj);
void sub_197A6(int16 destX, int16 destY, int16 objIndex);
virtual void placeObject(Gob_Object * objDesc, char animated,
int16 index, int16 x, int16 y, int16 state) = 0;

View file

@ -205,6 +205,7 @@ memBlocks = word ptr -2*/
_vm->_global->_inter_variables = new char[varsCount * 4];
memset(_vm->_global->_inter_variables, 0, varsCount * 4);
WRITE_VAR(58, 1);
strcpy(_vm->_game->_curTotFile, buffer);

View file

@ -314,6 +314,7 @@ protected:
void o2_totSub(void);
void o2_switchTotSub(void);
void o2_stub0x54(void);
void o2_stub0x55(void);
void o2_stub0x80(void);
void o2_stub0x82(void);
void o2_stub0x85(void);

View file

@ -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) {
byte cmd;
bool boolRes = evalBoolResult() != 0;
if (boolRes != 0) {
if (counter == cmdCount
&& retFlag == 2)

View file

@ -231,7 +231,7 @@ void Inter_v2::setupOpcodes(void) {
OPCODE(o2_writeGoblinPos),
/* 54 */
OPCODE(o2_stub0x54),
OPCODE(o2_drawStub),
OPCODE(o2_stub0x55),
OPCODE(o2_placeGoblin),
{NULL, ""},
/* 58 */
@ -718,6 +718,97 @@ void Inter_v2::o2_stub0x54(void) {
_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) {
int16 start;
int16 videoMode;
@ -1276,7 +1367,7 @@ bool Inter_v2::o2_playSound(char &cmdCount, int16 &counter, int16 &retFlag) {
}
// loc_E2F3
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->startPlay();
} else {
@ -1635,6 +1726,8 @@ void Inter_v2::o2_initMult(void) {
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].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 =
(Mult::Mult_AnimData *) (_vm->_global->_inter_variables + animDataVar +
i * 4 * _vm->_global->_inter_animDataSize);

View file

@ -117,11 +117,9 @@ void Map_v2::loadMapObjects(char *avjFile) {
_passMap = (int8 *) variables;
mapHeight = 200 / _tilesHeight;
mapWidth = _screenWidth / _tilesWidth;
for (i = 0; i < mapHeight; i++) {
for (j = 0; j < mapWidth; j++) {
for (i = 0; i < mapHeight; i++)
for (j = 0; j < mapWidth; j++)
setPass(j, i, mapData.readSByte());
}
}
}
mapData.seek(dataPos1);

View file

@ -84,11 +84,7 @@ public:
int16 lastRight;
int16 lastTop;
int16 lastBottom;
int8 someFlag; // New in GOB2
int16 somethingLeft; // New in GOB2
int16 somethingTop; // New in GOB2
int16 somethingRight; // New in GOB2
int16 somethingBottom; // New in GOB2
Mult::Mult_GobState **goblinStates; // New in GOB2
int8 goblinX; // New in GOB2
int8 goblinY; // New in GOB2
int8 destX; // New in GOB2
@ -97,7 +93,16 @@ public:
int8 gobDestY; // New in GOB2
int8 nearestWayPoint; // 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 {

View file

@ -327,9 +327,9 @@ void Mult_v2::multSub(uint16 multindex) {
}
_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();
}
expr = _vm->_parse->parseValExpr();
_multData2->animKeysFrames[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);
if ((_vm->_global->_videoMode == 0x14) &&
if ((_vm->_global->_videoMode == 0x13) && _vm->_video->_extraMode &&
((_vm->_draw->_backSurface->width * _vm->_draw->_backSurface->height) / 2
+ (_vm->_anim->_areaWidth * _vm->_anim->_areaHeight) / 4) < 64000) {
_vm->_anim->_animSurf = new Video::SurfaceDesc;

View file

@ -76,6 +76,7 @@ const unsigned char Music::_volRegNums[] = {
Music::Music(GobEngine *vm) : _vm(vm) {
int i;
_index = -1;
_data = 0;
_playPos = 0;
_dataSize = 0;
@ -365,6 +366,9 @@ void Music::pollMusic(void) {
_pollNotes[channel] = note;
setKey(channel, note, true, false);
break;
case 0x60:
warning("GOB2 Stub! ADL command 0x60");
break;
// Last note off
case 0x80:
note = _pollNotes[channel];
@ -452,6 +456,7 @@ void Music::playTrack(const char *trackname) {
bool Music::loadMusic(const char *filename) {
Common::File song;
unloadMusic();
song.open(filename);
if (!song.isOpen())
return false;
@ -469,12 +474,13 @@ bool Music::loadMusic(const char *filename) {
return true;
}
void Music::loadFromMemory(byte *data) {
void Music::loadFromMemory(byte *data, int index) {
unloadMusic();
_repCount = 0;
_dataSize = (uint32) -1;
_data = data;
_index = index;
reset();
setVoices();
@ -483,6 +489,7 @@ void Music::loadFromMemory(byte *data) {
void Music::unloadMusic(void) {
_playing = false;
_index = -1;
if (_data && _needFree)
delete[] _data;

View file

@ -45,12 +45,13 @@ public:
bool playing() { return _playing; }
bool getRepeating(void) { return _repCount != 0; }
void setRepeating (int32 repCount) { _repCount = repCount; }
int getIndex(void) { return _index; }
virtual void startPlay(void);
virtual void stopPlay(void) { _mutex.lock(); _playing = false; _mutex.unlock(); }
virtual void playTrack(const char *trackname);
virtual void playBgMusic(void);
virtual bool loadMusic(const char *filename);
virtual void loadFromMemory(byte *data);
virtual void loadFromMemory(byte *data, int index=-1);
virtual void unloadMusic(void);
// AudioStream API
@ -68,6 +69,7 @@ protected:
static const unsigned char _operators[];
static const unsigned char _volRegNums [];
FM_OPL *_opl;
int _index;
byte *_data;
byte *_playPos;
uint32 _dataSize;

View file

@ -148,24 +148,24 @@ int16 Parse_v2::parseValExpr(unsigned stopToken) {
offset = arrDesc[dim] * offset + temp2;
}
if (operation == 16)
*valPtr = *(_vm->_global->_inter_variables + temp + offset);
*valPtr = *(int8 *)(_vm->_global->_inter_variables + temp + offset);
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)
*valPtr = *(uint16*)(_vm->_global->_inter_variables + temp * 2 + offset * 2);
*valPtr = *(uint16 *)(_vm->_global->_inter_variables + temp * 2 + offset * 2);
else if (operation == 28) {
_vm->_global->_inter_execPtr++;
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;
case 17:
*valPtr = *(uint16*)(_vm->_global->_inter_variables + _vm->_inter->load16() * 2);
*valPtr = *(uint16 *)(_vm->_global->_inter_variables + _vm->_inter->load16() * 2);
break;
case 18:
*valPtr = *(_vm->_global->_inter_variables + _vm->_inter->load16());
*valPtr = *(int8 *)(_vm->_global->_inter_variables + _vm->_inter->load16());
break;
case 19:
@ -183,14 +183,14 @@ int16 Parse_v2::parseValExpr(unsigned stopToken) {
case 23:
case 24:
*valPtr = VAR(_vm->_inter->load16());
*valPtr = *(uint16 *)(_vm->_global->_inter_variables + _vm->_inter->load16() * 4);
break;
case 25:
temp = _vm->_inter->load16() * 4;
_vm->_global->_inter_execPtr++;
temp += parseValExpr(12);
*valPtr = *(_vm->_global->_inter_variables + temp);
*valPtr = *(uint8 *)(_vm->_global->_inter_variables + temp);
break;
case 29:
@ -257,7 +257,7 @@ int16 Parse_v2::parseValExpr(unsigned stopToken) {
operPtr[-1] = operPtr[0];
valPtr[-1] = valPtr[0];
if (stkPos > 1 && operPtr[-2] == 1) {
valPtr[-2] = 20;
operPtr[-2] = 20;
valPtr[-2] = -valPtr[-1];
stkPos--;
@ -265,26 +265,25 @@ int16 Parse_v2::parseValExpr(unsigned stopToken) {
valPtr--;
}
if (stkPos > 2 && operPtr[-2] > 4
&& operPtr[-2] < 9) {
if (stkPos > 2 && operPtr[-2] > 4 && operPtr[-2] < 9) {
stkPos -= 2;
operPtr -= 2;
valPtr -= 2;
switch (operPtr[0]) {
case 5:
operPtr[-1] *= operPtr[1];
valPtr[-1] *= valPtr[1];
break;
case 6:
operPtr[-1] /= operPtr[1];
valPtr[-1] /= valPtr[1];
break;
case 7:
operPtr[-1] %= operPtr[1];
valPtr[-1] %= valPtr[1];
break;
case 8:
operPtr[-1] &= operPtr[1];
valPtr[-1] &= valPtr[1];
break;
}
}
@ -352,7 +351,7 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) {
int32 prevVal;
int32 curVal;
int32 *valPtr;
char *operPtr;
byte *operPtr;
byte *arrDescPtr;
char var_C;
byte operation;
@ -368,7 +367,7 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) {
memset(operStack, 0, 20);
stkPos = -1;
operPtr = (char *)(operStack - 1);
operPtr = operStack - 1;
valPtr = values - 1;
while (1) {
@ -376,7 +375,7 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) {
operPtr++;
valPtr++;
operation = *_vm->_global->_inter_execPtr++;
if (operation >= 19 && operation <= 29) {
if (operation >= 16 && operation <= 29) {
switch (operation) {
case 16:
case 26:
@ -396,30 +395,30 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) {
offset = offset * arrDescPtr[dim] + temp2;
}
if (operation == 16)
*valPtr = *(_vm->_global->_inter_variables + temp + offset);
*valPtr = *(int8 *)(_vm->_global->_inter_variables + temp + offset);
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)
*valPtr = *(uint16*)(_vm->_global->_inter_variables + temp * 2 + offset * 2);
*valPtr = *(int16 *)(_vm->_global->_inter_variables + temp * 2 + offset * 2);
else if (operation == 28) {
*valPtr = encodePtr(_vm->_global->_inter_variables + temp * 4 + offset * _vm->_global->_inter_animDataSize * 4, kInterVar);
if (*_vm->_global->_inter_execPtr == 13) {
_vm->_global->_inter_execPtr++;
temp2 = parseValExpr(12);
*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;
case 17:
*operPtr = 20;
*valPtr = *(uint16*)(_vm->_global->_inter_variables + _vm->_inter->load16() * 2);
*valPtr = *(int16 *)(_vm->_global->_inter_variables + _vm->_inter->load16() * 2);
break;
case 18:
*operPtr = 20;
*valPtr = *(_vm->_global->_inter_variables + _vm->_inter->load16());
*valPtr = *(int8 *)(_vm->_global->_inter_variables + _vm->_inter->load16());
break;
case 19:
@ -445,11 +444,15 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) {
break;
case 23:
case 24:
*operPtr = 20;
*valPtr = VAR(_vm->_inter->load16());
break;
case 24:
*operPtr = 20;
*valPtr = *(int16 *)(_vm->_global->_inter_variables + _vm->_inter->load16() * 4);
break;
case 25:
*operPtr = 22;
temp = _vm->_inter->load16() * 4;
@ -458,7 +461,7 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) {
_vm->_global->_inter_execPtr++;
temp += parseValExpr(12);
*operPtr = 20;
*valPtr = (uint8)*(_vm->_global->_inter_variables + temp);
*valPtr = *(uint8 *)(_vm->_global->_inter_variables + temp);
}
break;
@ -560,7 +563,7 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) {
break;
}
continue;
} // op>= 19 && op <= 29
} // op >= 16 && op <= 29
if (operation == stopToken || operation == 30 || operation == 31 || operation == 10) {
while (stkPos >= 2) {