aboutsummaryrefslogtreecommitdiff
path: root/engines/startrek/iwfile.cpp
diff options
context:
space:
mode:
authorMatthew Stewart2018-05-14 18:25:47 -0400
committerEugene Sandulenko2018-08-09 08:37:30 +0200
commit2a588200ed4907d56c3927de0acc1fc59d22aa7d (patch)
treed44b540eccc52251ccf0a72bbbecc54729848f72 /engines/startrek/iwfile.cpp
parent1110fee2e462f28d2013530fa23e692aeec7d5dc (diff)
downloadscummvm-rg350-2a588200ed4907d56c3927de0acc1fc59d22aa7d.tar.gz
scummvm-rg350-2a588200ed4907d56c3927de0acc1fc59d22aa7d.tar.bz2
scummvm-rg350-2a588200ed4907d56c3927de0acc1fc59d22aa7d.zip
STARTREK: Pathfinding
Diffstat (limited to 'engines/startrek/iwfile.cpp')
-rw-r--r--engines/startrek/iwfile.cpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/engines/startrek/iwfile.cpp b/engines/startrek/iwfile.cpp
new file mode 100644
index 0000000000..830cb78855
--- /dev/null
+++ b/engines/startrek/iwfile.cpp
@@ -0,0 +1,82 @@
+
+/* 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.
+ *
+ */
+
+#include "startrek/iwfile.h"
+
+namespace StarTrek {
+
+IWFile::IWFile(StarTrekEngine *vm, const Common::String &filename) {
+ debug(6, "IW File: %s", filename.c_str());
+
+ _vm = vm;
+
+ SharedPtr<FileStream> file = _vm->loadFile(filename);
+ _numEntries = file->readUint16();
+
+ assert(_numEntries < MAX_KEY_POSITIONS);
+
+ for (int i = 0; i < MAX_KEY_POSITIONS; i++) {
+ int16 x = file->readUint16();
+ int16 y = file->readUint16();
+ _keyPositions[i] = Common::Point(x, y);
+ }
+
+ for (int i = 0; i < _numEntries; i++) {
+ file->read(_iwEntries[i], _numEntries);
+ }
+}
+
+// FIXME: same issue with sorting as with "compareSpritesByLayer" in graphics.cpp.
+bool iwSorter(const Common::Point &p1, const Common::Point &p2) {
+ return p1.y < p2.y;
+}
+
+/**
+ * Returns the index of the nearest "key position" in the room that an object can walk to
+ * (in a straight line) from a given position.
+ */
+int IWFile::getClosestKeyPosition(int16 x, int16 y) {
+ // This is a sorted list of indices from 0 to _numEntries-1.
+ // The index is stored in Point.x, and the "cost" (distance from position) is stored
+ // in Point.y for sorting purposes.
+ Common::Point sortedIndices[MAX_KEY_POSITIONS];
+
+ for (int i = 0; i < _numEntries; i++) {
+ sortedIndices[i].x = i;
+ sortedIndices[i].y = sqrt(_keyPositions[i].sqrDist(Common::Point(x, y)));
+ }
+
+ sort(sortedIndices, sortedIndices + _numEntries, &iwSorter);
+
+ // Iterate through positions from closest to furthest
+ for (int i = 0; i < _numEntries; i++) {
+ int index = sortedIndices[i].x;
+ Common::Point dest = _keyPositions[index];
+ if (_vm->directPathExists(x, y, dest.x, dest.y))
+ return index;
+ }
+
+ return -1;
+}
+
+}