diff options
author | Sven Hesse | 2007-08-13 14:04:50 +0000 |
---|---|---|
committer | Sven Hesse | 2007-08-13 14:04:50 +0000 |
commit | 5bacb6edeef0dac09b5e5b2ac41a6a332f78cee7 (patch) | |
tree | c0c0bf36cd4175da5ce3bc3058ce0e21a97491f5 /engines/gob/map_v4.cpp | |
parent | 32164654a6a4c9ddbb70c65371c1e762056511e6 (diff) | |
download | scummvm-rg350-5bacb6edeef0dac09b5e5b2ac41a6a332f78cee7.tar.gz scummvm-rg350-5bacb6edeef0dac09b5e5b2ac41a6a332f78cee7.tar.bz2 scummvm-rg350-5bacb6edeef0dac09b5e5b2ac41a6a332f78cee7.zip |
Woodruff is now controllable
svn-id: r28591
Diffstat (limited to 'engines/gob/map_v4.cpp')
-rw-r--r-- | engines/gob/map_v4.cpp | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/engines/gob/map_v4.cpp b/engines/gob/map_v4.cpp new file mode 100644 index 0000000000..fb398ecbaf --- /dev/null +++ b/engines/gob/map_v4.cpp @@ -0,0 +1,158 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * 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$ + * + */ + +#include "common/stdafx.h" +#include "common/stream.h" + +#include "gob/gob.h" +#include "gob/map.h" +#include "gob/global.h" +#include "gob/goblin.h" +#include "gob/inter.h" +#include "gob/game.h" +#include "gob/parse.h" +#include "gob/mult.h" + +namespace Gob { + +Map_v4::Map_v4(GobEngine *vm) : Map_v2(vm) { +} + +Map_v4::~Map_v4() { +} + +void Map_v4::loadMapObjects(const char *avjFile) { + uint8 wayPointsCount; + int16 var; + int16 id; + int16 mapWidth, mapHeight; + int16 tmp; + byte *variables; + byte *extData; + uint32 tmpPos; + uint32 passPos; + + var = _vm->_parse->parseVarIndex(); + variables = _vm->_global->_inter_variables + var; + + id = _vm->_inter->load16(); + + if (((uint16) id) >= 65520) { + warning("Woodruff Stub: loadMapObjects ID >= 65520"); + return; + } else if (id == -1) { + _passMap = (int8 *)(_vm->_global->_inter_variables + var); + return; + } + + extData = _vm->_game->loadExtData(id, 0, 0); + Common::MemoryReadStream mapData(extData, 4294967295U); + + _widthByte = mapData.readByte(); + if (_widthByte == 4) { + _screenWidth = 640; + _screenHeight = 400; + } else if (_widthByte == 3) { + _screenWidth = 640; + _screenHeight = 200; + } else { + _screenWidth = 320; + _screenHeight = 200; + } + + _wayPointsCount = mapData.readByte(); + _tilesWidth = mapData.readSint16LE(); + _tilesHeight = mapData.readSint16LE(); + + _bigTiles = !(_tilesHeight & 0xFF00); + _tilesHeight &= 0xFF; + + if (_widthByte == 4) { + _screenWidth = mapData.readSint16LE(); + _screenHeight = mapData.readSint16LE(); + } + + _mapWidth = _screenWidth / _tilesWidth; + _mapHeight = _screenHeight / _tilesHeight; + + passPos = mapData.pos(); + mapData.skip(_mapWidth * _mapHeight); + + if (*extData == 1) + wayPointsCount = _wayPointsCount = 40; + else + wayPointsCount = _wayPointsCount == 0 ? 1 : _wayPointsCount; + + delete[] _wayPoints; + _wayPoints = new Point[wayPointsCount]; + for (int i = 0; i < _wayPointsCount; i++) { + _wayPoints[i].x = mapData.readSByte(); + _wayPoints[i].y = mapData.readSByte(); + _wayPoints[i].notWalkable = mapData.readSByte(); + } + + if (_widthByte == 4) + _mapWidth = (int16) READ_VARO_UINT16(68); + + _passWidth = _mapWidth; + + // In the original asm, this writes byte-wise into the variables-array + tmpPos = mapData.pos(); + mapData.seek(passPos); + if (variables != _vm->_global->_inter_variables) { + byte *sizes; + + _passMap = (int8 *) variables; + mapHeight = _screenHeight / _tilesHeight; + mapWidth = _screenWidth / _tilesWidth; + sizes = _vm->_global->_inter_variablesSizes + + (((byte *) _passMap) - _vm->_global->_inter_variables); + for (int i = 0; i < mapHeight; i++) { + for (int j = 0; j < mapWidth; j++) + setPass(j, i, mapData.readSByte()); + memset(sizes + i * _passWidth, 0, mapWidth); + } + } + 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->_inter->load16(); + for (int i = 0; i < _vm->_goblin->_soundSlotsCount; i++) + _vm->_goblin->_soundSlots[i] = _vm->_inter->loadSound(1); + + delete[] extData; +} + +} // End of namespace Gob |