aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/map_v2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/gob/map_v2.cpp')
-rw-r--r--engines/gob/map_v2.cpp121
1 files changed, 79 insertions, 42 deletions
diff --git a/engines/gob/map_v2.cpp b/engines/gob/map_v2.cpp
index d8ef031cc9..6558cd27d9 100644
--- a/engines/gob/map_v2.cpp
+++ b/engines/gob/map_v2.cpp
@@ -33,6 +33,7 @@
#include "gob/game.h"
#include "gob/parse.h"
#include "gob/mult.h"
+#include "gob/scenery.h"
namespace Gob {
@@ -43,11 +44,11 @@ void Map_v2::loadMapObjects(char *avjFile) {
int i;
int j;
int k;
+ uint8 wayPointsCount;
int16 var;
int16 id;
- int16 numChunks;
- int16 chunkLength;
- int16 offVar;
+ int16 mapHeight;
+ int16 mapWidth;
int16 offData;
int16 tmp;
int16 numData;
@@ -61,17 +62,13 @@ void Map_v2::loadMapObjects(char *avjFile) {
char statesMask[102];
Goblin::Gob2_State *statesPtr;
- uint8 var_9;
- uint8 byte_2F2AA;
- byte *off_2F2AB;
-
var = _vm->_parse->parseVarIndex();
variables = _vm->_global->_inter_variables + var;
id = _vm->_inter->load16();
if (id == -1) {
- _vm->_goblin->_dword_2F2A4 = _vm->_global->_inter_variables + var;
+ _passMap = (int8 *)(_vm->_global->_inter_variables + var);
return;
}
@@ -79,51 +76,53 @@ void Map_v2::loadMapObjects(char *avjFile) {
dataPtr = extData;
if (*dataPtr++ == 3) {
- _vm->_mult->_word_2F22A = 640;
- _vm->_mult->_word_2CC84 = 65;
+ _vm->_map->_screenWidth = 640;
+ _vm->_map->_passWidth = 65;
} else {
- _vm->_mult->_word_2F22A = 320;
- _vm->_mult->_word_2CC84 = 40;
+ _vm->_map->_screenWidth = 320;
+ _vm->_map->_passWidth = 40;
}
- byte_2F2AA = *dataPtr++;
- _vm->_mult->_word_2F2B1 = READ_LE_UINT16(dataPtr);
+ _wayPointsCount = *dataPtr++;
+ _vm->_map->_tilesWidth = READ_LE_UINT16(dataPtr);
dataPtr += 2;
- _vm->_mult->_word_2F2AF = READ_LE_UINT16(dataPtr);
+ _vm->_map->_tilesHeight = READ_LE_UINT16(dataPtr);
dataPtr += 2;
- _vm->_mult->_word_2CC86 = _vm->_mult->_word_2F2AF & 0xFF00 ? 0 : 1;
- _vm->_mult->_word_2F2AF &= 0xFF;
+ _vm->_map->_bigTiles = !(_vm->_map->_tilesHeight & 0xFF00);
+ _vm->_map->_tilesHeight &= 0xFF;
- dataPtrBak = dataPtr;
- dataPtr += (_vm->_mult->_word_2F22A / _vm->_mult->_word_2F2B1) * (200 / _vm->_mult->_word_2F2AF);
+ _mapWidth = _vm->_map->_screenWidth / _vm->_map->_tilesWidth;
+ _mapHeight = 200 / _vm->_map->_tilesHeight;
- if (*extData == 1) {
- byte_2F2AA = 40;
- var_9 = 40;
- } else {
- if (byte_2F2AA == 0) {
- var_9 = 1;
- } else {
- var_9 = byte_2F2AA;
- }
+ dataPtrBak = dataPtr;
+ dataPtr += _mapWidth * _mapHeight;
+
+ if (*extData == 1)
+ wayPointsCount = _wayPointsCount = 40;
+ else
+ wayPointsCount = _wayPointsCount == 0 ? 1 : _wayPointsCount;
+
+ _wayPoints = new Point[wayPointsCount];
+ for (i = 0; i < wayPointsCount; i++) {
+ _wayPoints[i].x = -1;
+ _wayPoints[i].y = -1;
+ _wayPoints[i].field_2 = -1;
+ }
+ for (i = 0; i < _wayPointsCount; i++) {
+ _wayPoints[i].x = *dataPtr++;
+ _wayPoints[i].y = *dataPtr++;
+ _wayPoints[i].field_2 = *dataPtr++;
}
-
- off_2F2AB = new byte[3 * var_9];
- memset(off_2F2AB, -1, 3 * var_9);
- memcpy(off_2F2AB, dataPtr, 3 * byte_2F2AA);
- dataPtr += 3 * byte_2F2AA;
// In the original asm, this writes byte-wise into the variables-array
if (variables != _vm->_global->_inter_variables) {
- _vm->_goblin->_dword_2F2A4 = variables;
- numChunks = 200 / _vm->_mult->_word_2F2AF;
- chunkLength = _vm->_mult->_word_2F22A / _vm->_mult->_word_2F2B1;
- for (i = 0; i < numChunks; i++) {
- offVar = _vm->_mult->_word_2CC84 * i;
- offData = (chunkLength * i);
- for (j = 0; j < chunkLength; j++) {
- _vm->_util->writeVariableByte(_vm->_goblin->_dword_2F2A4 + offVar + j,
- *(dataPtrBak + offData + j));
+ _passMap = (int8 *) variables;
+ mapHeight = 200 / _vm->_map->_tilesHeight;
+ mapWidth = _vm->_map->_screenWidth / _vm->_map->_tilesWidth;
+ for (i = 0; i < mapHeight; i++) {
+ offData = (mapWidth * i);
+ for (j = 0; j < mapWidth; j++) {
+ setPass(j, i, *(dataPtrBak + offData + j), _vm->_map->_passWidth);
}
}
}
@@ -189,4 +188,42 @@ void Map_v2::loadMapObjects(char *avjFile) {
_vm->_goblin->_soundSlots[i] = _vm->_inter->loadSound(1);
}
+void Map_v2::findNearestToGob(int16 index) {
+ Mult::Mult_Object *obj = &_vm->_mult->_objects[index];
+ int16 wayPoint = findNearestWayPoint(obj->goblinX, obj->goblinY);
+
+ if (wayPoint != -1)
+ obj->nearestWayPoint = wayPoint;
+}
+
+void Map_v2::findNearestToDest(int16 index) {
+ Mult::Mult_Object *obj = &_vm->_mult->_objects[index];
+ int16 wayPoint = findNearestWayPoint(obj->destX, obj->destY);
+
+ if (wayPoint != -1)
+ obj->nearestDest = wayPoint;
+}
+
+void Map_v2::optimizePoints(int16 index, int16 x, int16 y) {
+ Mult::Mult_Object *obj;
+ int i;
+
+ int16 var_2;
+
+ obj = &_vm->_mult->_objects[index];
+
+ if (obj->nearestWayPoint < obj->nearestDest) {
+ var_2 = obj->nearestWayPoint;
+ for (i = obj->nearestWayPoint; i <= obj->nearestDest; i++) {
+ if (checkDirectPath(index, x, y, _wayPoints[i].x, _wayPoints[i].y) == 1)
+ obj->nearestWayPoint = i;
+ }
+ } else {
+ for (i = obj->nearestWayPoint; i >= obj->nearestDest && _wayPoints[i].field_2 != 1; i--) {
+ if (checkDirectPath(index, x, y, _wayPoints[i].x, _wayPoints[i].y) == 1)
+ obj->nearestWayPoint = i;
+ }
+ }
+}
+
} // End of namespace Gob