aboutsummaryrefslogtreecommitdiff
path: root/gob/inter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gob/inter.cpp')
-rw-r--r--gob/inter.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/gob/inter.cpp b/gob/inter.cpp
index b8a6274cd9..541b14b919 100644
--- a/gob/inter.cpp
+++ b/gob/inter.cpp
@@ -30,6 +30,7 @@
#include "gob/mult.h"
#include "gob/goblin.h"
#include "gob/cdrom.h"
+#include "gob/map.h"
namespace Gob {
@@ -297,4 +298,145 @@ void Inter::renewTimeInVars(void) {
WRITE_VAR(11, t->tm_sec);
}
+void Inter::manipulateMap(int16 xPos, int16 yPos, int16 item) {
+ for (int16 y = 0; y < Map::kMapHeight; y++) {
+ for (int16 x = 0; x < Map::kMapWidth; x++) {
+ if ((_vm->_map->_itemsMap[y][x] & 0xff) == item) {
+ _vm->_map->_itemsMap[y][x] &= 0xff00;
+ } else if (((_vm->_map->_itemsMap[y][x] & 0xff00) >> 8)
+ == item) {
+ _vm->_map->_itemsMap[y][x] &= 0xff;
+ }
+ }
+ }
+
+ if (xPos < Map::kMapWidth - 1) {
+ if (yPos > 0) {
+ if ((_vm->_map->_itemsMap[yPos][xPos] & 0xff00) != 0 ||
+ (_vm->_map->_itemsMap[yPos - 1][xPos] & 0xff00) !=
+ 0
+ || (_vm->_map->_itemsMap[yPos][xPos +
+ 1] & 0xff00) != 0
+ || (_vm->_map->_itemsMap[yPos - 1][xPos +
+ 1] & 0xff00) != 0) {
+
+ _vm->_map->_itemsMap[yPos][xPos] =
+ (_vm->_map->_itemsMap[yPos][xPos] & 0xff00)
+ + item;
+
+ _vm->_map->_itemsMap[yPos - 1][xPos] =
+ (_vm->_map->_itemsMap[yPos -
+ 1][xPos] & 0xff00) + item;
+
+ _vm->_map->_itemsMap[yPos][xPos + 1] =
+ (_vm->_map->_itemsMap[yPos][xPos +
+ 1] & 0xff00) + item;
+
+ _vm->_map->_itemsMap[yPos - 1][xPos + 1] =
+ (_vm->_map->_itemsMap[yPos - 1][xPos +
+ 1] & 0xff00) + item;
+ } else {
+ _vm->_map->_itemsMap[yPos][xPos] =
+ (_vm->_map->_itemsMap[yPos][xPos] & 0xff) +
+ (item << 8);
+
+ _vm->_map->_itemsMap[yPos - 1][xPos] =
+ (_vm->_map->_itemsMap[yPos -
+ 1][xPos] & 0xff) + (item << 8);
+
+ _vm->_map->_itemsMap[yPos][xPos + 1] =
+ (_vm->_map->_itemsMap[yPos][xPos +
+ 1] & 0xff) + (item << 8);
+
+ _vm->_map->_itemsMap[yPos - 1][xPos + 1] =
+ (_vm->_map->_itemsMap[yPos - 1][xPos +
+ 1] & 0xff) + (item << 8);
+ }
+ } else {
+ if ((_vm->_map->_itemsMap[yPos][xPos] & 0xff00) != 0 ||
+ (_vm->_map->_itemsMap[yPos][xPos + 1] & 0xff00) !=
+ 0) {
+ _vm->_map->_itemsMap[yPos][xPos] =
+ (_vm->_map->_itemsMap[yPos][xPos] & 0xff00)
+ + item;
+
+ _vm->_map->_itemsMap[yPos][xPos + 1] =
+ (_vm->_map->_itemsMap[yPos][xPos +
+ 1] & 0xff00) + item;
+ } else {
+ _vm->_map->_itemsMap[yPos][xPos] =
+ (_vm->_map->_itemsMap[yPos][xPos] & 0xff) +
+ (item << 8);
+
+ _vm->_map->_itemsMap[yPos][xPos + 1] =
+ (_vm->_map->_itemsMap[yPos][xPos +
+ 1] & 0xff) + (item << 8);
+ }
+ }
+ } else {
+ if (yPos > 0) {
+ if ((_vm->_map->_itemsMap[yPos][xPos] & 0xff00) != 0 ||
+ (_vm->_map->_itemsMap[yPos - 1][xPos] & 0xff00) !=
+ 0) {
+ _vm->_map->_itemsMap[yPos][xPos] =
+ (_vm->_map->_itemsMap[yPos][xPos] & 0xff00)
+ + item;
+
+ _vm->_map->_itemsMap[yPos - 1][xPos] =
+ (_vm->_map->_itemsMap[yPos -
+ 1][xPos] & 0xff00) + item;
+ } else {
+ _vm->_map->_itemsMap[yPos][xPos] =
+ (_vm->_map->_itemsMap[yPos][xPos] & 0xff) +
+ (item << 8);
+
+ _vm->_map->_itemsMap[yPos - 1][xPos] =
+ (_vm->_map->_itemsMap[yPos -
+ 1][xPos] & 0xff) + (item << 8);
+ }
+ } else {
+ if ((_vm->_map->_itemsMap[yPos][xPos] & 0xff00) != 0) {
+ _vm->_map->_itemsMap[yPos][xPos] =
+ (_vm->_map->_itemsMap[yPos][xPos] & 0xff00)
+ + item;
+ } else {
+ _vm->_map->_itemsMap[yPos][xPos] =
+ (_vm->_map->_itemsMap[yPos][xPos] & 0xff) +
+ (item << 8);
+ }
+ }
+ }
+
+ if (item < 0 || item >= 20)
+ return;
+
+ if (xPos > 1 && _vm->_map->_passMap[yPos][xPos - 2] == 1) {
+ _vm->_map->_itemPoses[item].x = xPos - 2;
+ _vm->_map->_itemPoses[item].y = yPos;
+ _vm->_map->_itemPoses[item].orient = 4;
+ return;
+ }
+
+ if (xPos < Map::kMapWidth - 2 && _vm->_map->_passMap[yPos][xPos + 2] == 1) {
+ _vm->_map->_itemPoses[item].x = xPos + 2;
+ _vm->_map->_itemPoses[item].y = yPos;
+ _vm->_map->_itemPoses[item].orient = 0;
+ return;
+ }
+
+ if (xPos < Map::kMapWidth - 1 && _vm->_map->_passMap[yPos][xPos + 1] == 1) {
+ _vm->_map->_itemPoses[item].x = xPos + 1;
+ _vm->_map->_itemPoses[item].y = yPos;
+ _vm->_map->_itemPoses[item].orient = 0;
+ return;
+ }
+
+ if (xPos > 0 && _vm->_map->_passMap[yPos][xPos - 1] == 1) {
+ _vm->_map->_itemPoses[item].x = xPos - 1;
+ _vm->_map->_itemPoses[item].y = yPos;
+ _vm->_map->_itemPoses[item].orient = 4;
+ return;
+ }
+}
+
} // End of namespace Gob