void Map_v2::loadMapObjects(const char *avjFile) { uint8 wayPointsCount; uint16 var; int16 id; int16 mapWidth, mapHeight; int16 tmp; byte *variables; uint32 tmpPos; uint32 passPos; var = _vm->_game->_script->readVarIndex(); variables = _vm->_inter->_variables->getAddressOff8(var); id = _vm->_game->_script->readInt16(); if (((uint16) id) >= 65520) { switch ((uint16) id) { case 65530: for (int i = 0; i < _mapWidth * _mapHeight; i++) _passMap[i] -= READ_VARO_UINT8(var + i); break; case 65531: for (int i = 0; i < _mapWidth * _mapHeight; i++) _passMap[i] += READ_VARO_UINT8(var + i); break; case 65532: for (int i = 0; i < _mapWidth * _mapHeight; i++) WRITE_VARO_UINT8(var + i, 0x00); break; case 65533: { int index = READ_VARO_UINT16(var); // _vm->_mult->_objects[index].field_6E = 0; // _vm->_mult->_objects[index].field_6A = variables; warning("Map_v2::loadMapObjects(): ID == 65533 (%d)", index); break; } case 65534: _tilesWidth = READ_VARO_UINT8(var); _tilesHeight = READ_VARO_UINT8(var + 1); _mapWidth = READ_VARO_UINT8(var + 2); _mapHeight = READ_VARO_UINT8(var + 3); _mapUnknownBool = READ_VARO_UINT8(var + 4) ? true : false; if (_mapUnknownBool) warning("Map_v2::loadMapObjects(): _mapUnknownBool == true"); break; case 65535: _passMap = (int8 *)_vm->_inter->_variables->getAddressOff8(var); break; default: warning("Map_v2::loadMapObjects(): ID == %d", (uint16) id); break; } return; } Resource *resource = _vm->_game->_resources->getResource(id); if (!resource) return; Common::SeekableReadStream &mapData = *resource->stream(); _mapVersion = mapData.readByte(); if (_mapVersion == 4) { _screenWidth = 640; _screenHeight = 400; } else if (_mapVersion == 3) { _passWidth = 65; _screenWidth = 640; _screenHeight = 200; } else { _passWidth = 40; _screenWidth = 320; _screenHeight = 200; } _wayPointCount = mapData.readByte(); _tilesWidth = mapData.readSint16LE(); _tilesHeight = mapData.readSint16LE(); _bigTiles = !(_tilesHeight & 0xFF00); _tilesHeight &= 0xFF; if (_mapVersion == 4) { _screenWidth = mapData.readSint16LE(); _screenHeight = mapData.readSint16LE(); } _mapWidth = _screenWidth / _tilesWidth; _mapHeight = _screenHeight / _tilesHeight; passPos = mapData.pos(); mapData.skip(_mapWidth * _mapHeight); if (resource->getData()[0] == 1) wayPointsCount = _wayPointCount = 40; else wayPointsCount = _wayPointCount == 0 ? 1 : _wayPointCount; delete[] _wayPoints; _wayPoints = new WayPoint[wayPointsCount]; for (int i = 0; i < _wayPointCount; i++) { _wayPoints[i].x = mapData.readSByte(); _wayPoints[i].y = mapData.readSByte(); _wayPoints[i].notWalkable = mapData.readSByte(); } if (_mapVersion == 4) { _mapWidth = VAR(17); _passWidth = _mapWidth; } // In the original asm, this writes byte-wise into the variables-array tmpPos = mapData.pos(); mapData.seek(passPos); if ((variables != 0) && (variables != _vm->_inter->_variables->getAddressOff8(0))) { _passMap = (int8 *)variables; mapHeight = _screenHeight / _tilesHeight; mapWidth = _screenWidth / _tilesWidth; for (int i = 0; i < mapHeight; i++) { for (int j = 0; j < mapWidth; j++) setPass(j, i, mapData.readSByte()); _vm->_inter->_variables->getAddressOff8(var + i * _passWidth); } } mapData.seek(tmpPos); tmp = mapData.readSint16LE(); mapData.skip(tmp * 14); tmp = mapData.readSint16LE(); mapData.skip(tmp * 14 + 28); tmp = mapData.readSint16LE(); mapData.skip(tmp * 14); _vm->_goblin->_gobsCount = tmp; for (int i = 0; i < _vm->_goblin->_gobsCount; i++) loadGoblinStates(mapData, i); _vm->_goblin->_soundSlotsCount = _vm->_game->_script->readInt16(); for (int i = 0; i < _vm->_goblin->_soundSlotsCount; i++) _vm->_goblin->_soundSlots[i] = _vm->_inter->loadSound(1); delete resource; }
bool Inter_v6::o6_assign(OpFuncParams ¶ms) { uint16 size, destType; int16 dest = _vm->_game->_script->readVarIndex(&size, &destType); if (size != 0) { int16 src; _vm->_game->_script->push(); src = _vm->_game->_script->readVarIndex(&size, 0); memcpy(_vm->_inter->_variables->getAddressOff8(dest), _vm->_inter->_variables->getAddressOff8(src), size * 4); _vm->_game->_script->pop(); _vm->_game->_script->evalExpr(&src); return false; } byte loopCount; if (_vm->_game->_script->peekByte() == 98) { _vm->_game->_script->skip(1); loopCount = _vm->_game->_script->readByte(); for (int i = 0; i < loopCount; i++) { uint8 c = _vm->_game->_script->readByte(); uint16 n = _vm->_game->_script->readUint16(); memset(_vm->_inter->_variables->getAddressOff8(dest), c, n); dest += n; } return false; } else if (_vm->_game->_script->peekByte() == 99) { _vm->_game->_script->skip(1); loopCount = _vm->_game->_script->readByte(); } else loopCount = 1; for (int i = 0; i < loopCount; i++) { int16 result; int16 srcType = _vm->_game->_script->evalExpr(&result); switch (destType) { case TYPE_VAR_INT8: case TYPE_ARRAY_INT8: WRITE_VARO_UINT8(dest + i, _vm->_game->_script->getResultInt()); break; case TYPE_VAR_INT16: case TYPE_ARRAY_INT16: WRITE_VARO_UINT16(dest + i * 2, _vm->_game->_script->getResultInt()); break; case TYPE_VAR_INT32: case TYPE_ARRAY_INT32: WRITE_VAR_OFFSET(dest + i * 4, _vm->_game->_script->getResultInt()); break; case TYPE_VAR_INT32_AS_INT16: WRITE_VARO_UINT16(dest + i * 4, _vm->_game->_script->getResultInt()); break; case TYPE_VAR_STR: case TYPE_ARRAY_STR: if (srcType == TYPE_IMM_INT16) WRITE_VARO_UINT8(dest, result); else WRITE_VARO_STR(dest, _vm->_game->_script->getResultStr()); break; } } return false; }