aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorFilippos Karapetis2019-12-27 01:33:02 +0200
committerFilippos Karapetis2019-12-27 01:33:28 +0200
commitf7a5c21d4de443f861544db17b18c958cea2811f (patch)
treefab74f9d0e1008b626f466d5b17c1fbf9fc32b32 /engines
parent26fcce1e4174d528829d42196a27667c0996108d (diff)
downloadscummvm-rg350-f7a5c21d4de443f861544db17b18c958cea2811f.tar.gz
scummvm-rg350-f7a5c21d4de443f861544db17b18c958cea2811f.tar.bz2
scummvm-rg350-f7a5c21d4de443f861544db17b18c958cea2811f.zip
STARTREK: Move isPointInPolygon() inside the Room class
This accesses the room data, so it's better to move it inside the Room class, to reduce direct visibility of the room vertex data
Diffstat (limited to 'engines')
-rw-r--r--engines/startrek/actors.cpp4
-rw-r--r--engines/startrek/awaymission.cpp25
-rw-r--r--engines/startrek/room.cpp22
-rw-r--r--engines/startrek/room.h11
-rw-r--r--engines/startrek/startrek.h9
5 files changed, 37 insertions, 34 deletions
diff --git a/engines/startrek/actors.cpp b/engines/startrek/actors.cpp
index 24434eb995..b8d185e0fb 100644
--- a/engines/startrek/actors.cpp
+++ b/engines/startrek/actors.cpp
@@ -670,7 +670,7 @@ int StarTrekEngine::findObjectAt(int x, int y) {
while (offset != _room->getHotspotEnd()) {
uint16 word = _room->readRdfWord(offset);
if (word & 0x8000) {
- if ((word & actionBit) && isPointInPolygon((int16 *)(_room->_rdfData + offset + 6), x, y)) {
+ if ((word & actionBit) && _room->isPointInPolygon(offset + 6, x, y)) {
int actorIndex = _room->readRdfWord(offset + 6);
_objectHasWalkPosition = true;
_objectWalkPosition.x = _room->readRdfWord(offset + 2);
@@ -681,7 +681,7 @@ int StarTrekEngine::findObjectAt(int x, int y) {
int numVertices = _room->readRdfWord(offset + 8);
offset = offset + 10 + numVertices * 4;
} else {
- if (isPointInPolygon((int16 *)(_room->_rdfData + offset), x, y)) {
+ if (_room->isPointInPolygon(offset, x, y)) {
int actorIndex = _room->readRdfWord(offset);
return actorIndex;
}
diff --git a/engines/startrek/awaymission.cpp b/engines/startrek/awaymission.cpp
index 08016c158b..5db4f42248 100644
--- a/engines/startrek/awaymission.cpp
+++ b/engines/startrek/awaymission.cpp
@@ -679,32 +679,11 @@ void StarTrekEngine::handleAwayMissionAction() {
}
}
-bool StarTrekEngine::isPointInPolygon(int16 *data, int16 x, int16 y) {
- int16 numVertices = data[1];
- int16 *vertData = &data[2];
-
- for (int i = 0; i < numVertices; i++) {
- Common::Point p1(vertData[0], vertData[1]);
- Common::Point p2;
- if (i == numVertices - 1) // Loop to 1st vertex
- p2 = Common::Point(data[2], data[3]);
- else
- p2 = Common::Point(vertData[2], vertData[3]);
-
- if ((p2.x - p1.x) * (y - p1.y) - (p2.y - p1.y) * (x - p1.x) < 0)
- return false;
-
- vertData += 2;
- }
-
- return true;
-}
-
void StarTrekEngine::checkTouchedLoadingZone(int16 x, int16 y) {
int16 offset = _room->getFirstDoorPolygonOffset();
while (offset != _room->getDoorPolygonEndOffset()) {
- if (isPointInPolygon((int16 *)(_room->_rdfData + offset), x, y)) {
+ if (_room->isPointInPolygon(offset, x, y)) {
uint16 var = _room->readRdfWord(offset);
if (_activeDoorWarpHotspot != var) {
_activeDoorWarpHotspot = var;
@@ -722,7 +701,7 @@ void StarTrekEngine::checkTouchedLoadingZone(int16 x, int16 y) {
offset = _room->getFirstWarpPolygonOffset();
while (offset != _room->getWarpPolygonEndOffset()) {
- if (isPointInPolygon((int16 *)(_room->_rdfData + offset), x, y)) {
+ if (_room->isPointInPolygon(offset, x, y)) {
uint16 var = _room->readRdfWord(offset);
if (_activeWarpHotspot != var) {
_activeWarpHotspot = var;
diff --git a/engines/startrek/room.cpp b/engines/startrek/room.cpp
index 9fc0431e81..f3b853acde 100644
--- a/engines/startrek/room.cpp
+++ b/engines/startrek/room.cpp
@@ -756,4 +756,26 @@ void Room::mccoyScan(int direction, TextRef text, bool changeDirection, bool fro
showText(TX_SPEAKER_MCCOY, text, fromRDF);
}
+bool Room::isPointInPolygon(int16 offset, int16 x, int16 y) {
+ int16 *data = (int16 *)(_rdfData + offset);
+ int16 numVertices = data[1];
+ int16 *vertData = &data[2];
+
+ for (int i = 0; i < numVertices; i++) {
+ Common::Point p1(vertData[0], vertData[1]);
+ Common::Point p2;
+ if (i == numVertices - 1) // Loop to 1st vertex
+ p2 = Common::Point(data[2], data[3]);
+ else
+ p2 = Common::Point(vertData[2], vertData[3]);
+
+ if ((p2.x - p1.x) * (y - p1.y) - (p2.y - p1.y) * (x - p1.x) < 0)
+ return false;
+
+ vertData += 2;
+ }
+
+ return true;
+}
+
} // End of namespace StarTrek
diff --git a/engines/startrek/room.h b/engines/startrek/room.h
index 6aeed92c41..be88008c4d 100644
--- a/engines/startrek/room.h
+++ b/engines/startrek/room.h
@@ -142,6 +142,7 @@ public:
* all rooms).
*/
Common::Point getBeamInPosition(int crewmanIndex);
+
/**
* This is analagous to above, but instead of beaming in, they just appear in a spot.
* Used sparingly, ie. in feather's serpent when appearing in cave after Quetzecoatl
@@ -149,6 +150,16 @@ public:
*/
Common::Point getSpawnPosition(int crewmanIndex);
+ /**
+ * Returns true if the given position is contained in a polygon.
+ *
+ * The data passed contains the following words in this order:
+ * * Index of polygon (unused here)
+ * * Number of vertices in polygon
+ * * For each vertex: x and y coordinates.
+ */
+ bool isPointInPolygon(int16 offset, int16 x, int16 y);
+
byte *_rdfData;
private:
diff --git a/engines/startrek/startrek.h b/engines/startrek/startrek.h
index 1e4e330ecb..5967283203 100644
--- a/engines/startrek/startrek.h
+++ b/engines/startrek/startrek.h
@@ -295,15 +295,6 @@ public:
bool checkItemInteractionExists(int action, int activeItem, int passiveItem, int16 arg6);
void handleAwayMissionAction();
- /**
- * Returns true if the given position is contained in a polygon.
- *
- * The data passed contains the following words in this order:
- * * Index of polygon (unused here)
- * * Number of vertices in polygon
- * * For each vertex: x and y coordinates.
- */
- bool isPointInPolygon(int16 *data, int16 x, int16 y);
void checkTouchedLoadingZone(int16 x, int16 y);
/**
* Updates any nonzero away mission timers, and invokes ACTION_TIMER_EXPIRED when any one