[Scummvm-git-logs] scummvm master -> 9ee1312bd28755b04374f7fe232e1cc1ff31d571
whiterandrek
noreply at scummvm.org
Sun Feb 6 22:10:58 UTC 2022
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
9ee1312bd2 PETKA: fix pathfinding
Commit: 9ee1312bd28755b04374f7fe232e1cc1ff31d571
https://github.com/scummvm/scummvm/commit/9ee1312bd28755b04374f7fe232e1cc1ff31d571
Author: Andrei Prykhodko (whiterandrek at gmail.com)
Date: 2022-02-07T00:10:54+02:00
Commit Message:
PETKA: fix pathfinding
bugs #12066 and #12067
Changed paths:
engines/petka/walk.cpp
engines/petka/walk.h
diff --git a/engines/petka/walk.cpp b/engines/petka/walk.cpp
index 6af2d94c43f..f8af88f0c73 100644
--- a/engines/petka/walk.cpp
+++ b/engines/petka/walk.cpp
@@ -73,16 +73,16 @@ Walk::Walk(int id) { // CHECKED
currX = 0.0;
currY = 0.0;
_bkg3Count = 0;
- _bkg2Count = 0;
+ _edgesCount = 0;
field_134 = 0;
- _bkg1Count = 0;
+ _verticesCount = 0;
_bkg3_1 = nullptr;
_bkg3_2 = nullptr;
- _bkg2 = nullptr;
+ _edges = nullptr;
_bkg3_3 = nullptr;
_bkg3_4 = nullptr;
_bkg3_5 = nullptr;
- _bkg1 = nullptr;
+ _vertices = nullptr;
field_190 = 0;
resId = 0;
}
@@ -155,8 +155,8 @@ void Walk::init(Point start, Point end) {
if (field_134 > 1) {
do {
int v23 = sub_423A30(_bkg3_4[(v21 - 4) / 4], _bkg3_4[v21 / 4]);
- _bkg3_3[v22].x = (_bkg1[_bkg2[v23].x].x + _bkg1[_bkg2[v23].y].x) / 2;
- _bkg3_3[v22].y = (_bkg1[_bkg2[v23].x].y + _bkg1[_bkg2[v23].y].y) / 2;
+ _bkg3_3[v22].x = (_vertices[_edges[v23].x].x + _vertices[_edges[v23].y].x) / 2;
+ _bkg3_3[v22].y = (_vertices[_edges[v23].x].y + _vertices[_edges[v23].y].y) / 2;
if (v22 > 1 && !sub_424160(&_bkg3_3[v22 - 2], &_bkg3_3[v22])) {
v20--;
@@ -191,9 +191,9 @@ void Walk::init(Point start, Point end) {
}
void Walk::clearBackground() { // CHECKED
- delete[] _bkg1;
- _bkg1 = nullptr;
- _bkg1Count = 0;
+ delete[] _vertices;
+ _vertices = nullptr;
+ _verticesCount = 0;
if (_bkg3_1) {
@@ -210,9 +210,9 @@ void Walk::clearBackground() { // CHECKED
_bkg3Count = 0;
}
- delete[] _bkg2;
- _bkg2 = nullptr;
- _bkg2Count = 0;
+ delete[] _edges;
+ _edges = nullptr;
+ _edgesCount = 0;
delete[] _bkg3_3;
_bkg3_3 = nullptr;
@@ -234,20 +234,20 @@ void Walk::setBackground(Common::String name) { // CHECKED
if (!stream)
return;
- _bkg1Count = stream->readUint32LE();
- _bkg1 = new Point[_bkg1Count];
+ _verticesCount = stream->readUint32LE();
+ _vertices = new Point[_verticesCount];
- for (int i = 0; i < _bkg1Count; ++i) {
- _bkg1[i].x = stream->readUint32LE();
- _bkg1[i].y = stream->readUint32LE();
+ for (int i = 0; i < _verticesCount; ++i) {
+ _vertices[i].x = stream->readUint32LE();
+ _vertices[i].y = stream->readUint32LE();
}
- _bkg2Count = stream->readUint32LE();
- _bkg2 = new Point[_bkg2Count];
+ _edgesCount = stream->readUint32LE();
+ _edges = new Point[_edgesCount];
- for (int i = 0; i < _bkg2Count; ++i) {
- _bkg2[i].x = stream->readUint32LE();
- _bkg2[i].y = stream->readUint32LE();
+ for (int i = 0; i < _edgesCount; ++i) {
+ _edges[i].x = stream->readUint32LE();
+ _edges[i].y = stream->readUint32LE();
}
_bkg3Count = stream->readUint32LE();
@@ -289,13 +289,13 @@ int Walk::getSpriteId() { // CHECKED
}
int Walk::commonPoint(int idx1, int idx2) { // CHECKED
- if (_bkg2[idx1].x == _bkg2[idx2].x || _bkg2[idx1].x == _bkg2[idx2].y)
- return _bkg2[idx1].x;
+ if (_edges[idx1].x == _edges[idx2].x || _edges[idx1].x == _edges[idx2].y)
+ return _edges[idx1].x;
- if (_bkg2[idx1].y != _bkg2[idx2].x && _bkg2[idx1].y != _bkg2[idx2].y)
- return 0;
+ if (_edges[idx1].y == _edges[idx2].x || _edges[idx1].y == _edges[idx2].y)
+ return _edges[idx1].y;
- return _bkg2[idx1].y;
+ return 0;
}
int Walk::readWayFile(const Common::String &name, int **p1, int **p2) { // CHECKED
@@ -472,14 +472,16 @@ Common::Point Walk::sub_4234B0() { // CHECKED
return p;
}
-bool Walk::sub_423570(int i1, int i2) { // CHECKED
- if (i1 == i2)
- return false;
-
- if (_bkg2[i1].x == _bkg2[i2].x || _bkg2[i1].x == _bkg2[i2].y)
- return true;
-
- return !(_bkg2[i1].y != _bkg2[i2].x && _bkg2[i1].y != _bkg2[i2].y);
+bool Walk::areEdgesAdjacent(int first_index, int second_index) { // CHECKED
+ if (first_index != second_index) {
+ if (_edges[first_index].x == _edges[second_index].x ||
+ _edges[first_index].x == _edges[second_index].y ||
+ _edges[first_index].y == _edges[second_index].x ||
+ _edges[first_index].y == _edges[second_index].y) {
+ return true;
+ }
+ }
+ return false;
}
int Walk::sub_423600(Point p) {
@@ -489,7 +491,7 @@ int Walk::sub_423600(Point p) {
v4[0] = _bkg3_2[j][0];
for (int k = 0; k < _bkg3_1[j]; ++k) {
- if (sub_423570(v4[0], _bkg3_2[j][k])) {
+ if (areEdgesAdjacent(v4[0], _bkg3_2[j][k])) {
v4[1] = _bkg3_2[j][k];
break;
}
@@ -497,7 +499,7 @@ int Walk::sub_423600(Point p) {
for (int k = 2; k < _bkg3_1[j]; ++k) {
for (int l = 0; l < _bkg3_1[j]; ++l) {
- if (sub_423570(v4[k - 1], _bkg3_2[j][l]) && v4[k - 2] != _bkg3_2[j][l]) {
+ if (areEdgesAdjacent(v4[k - 1], _bkg3_2[j][l]) && v4[k - 2] != _bkg3_2[j][l]) {
v4[k] = _bkg3_2[j][l];
break;
}
@@ -507,8 +509,8 @@ int Walk::sub_423600(Point p) {
int v11 = commonPoint(v4[_bkg3_1[j] - 1], v4[0]);
int v31 = commonPoint(v4[0], v4[1]);
- double v12 = angle(p, _bkg1[v11], _bkg1[v31]);
- if (p == _bkg1[v11] || p == _bkg1[v31]) {
+ double v12 = angle(p, _vertices[v11], _vertices[v31]);
+ if (p == _vertices[v11] || p == _vertices[v31]) {
delete[] v4;
return i;
}
@@ -519,8 +521,8 @@ int Walk::sub_423600(Point p) {
int v16 = commonPoint(v4[k - 1], v4[k]);
int v32 = commonPoint(v4[k], v4[k + 1]);
- v12 += angle(p, _bkg1[v16], _bkg1[v32]);
- if (p == _bkg1[v16] || p == _bkg1[v32]) {
+ v12 += angle(p, _vertices[v16], _vertices[v32]);
+ if (p == _vertices[v16] || p == _vertices[v32]) {
delete[] v4;
return i;
}
@@ -531,10 +533,10 @@ int Walk::sub_423600(Point p) {
delete[] v4;
- double v23 = angle(p, _bkg1[v19], _bkg2[v20]);
+ double v23 = angle(p, _vertices[v19], _vertices[v20]);
v12 += v23;
- if (p == _bkg1[v19] || p == _bkg1[v20])
+ if (p == _vertices[v19] || p == _vertices[v20])
return i;
if (v12 < 0.0)
@@ -691,12 +693,12 @@ bool Walk::sub_424160(Point *p1, Point *p2) { // CHECKED
Point p;
int v = 1;
- if (_bkg1Count <= 1)
- return sub_423E00(_bkg1[v - 1], _bkg1[0], *p1, *p2, p) != 0;
+ if (_verticesCount <= 1)
+ return sub_423E00(_vertices[v - 1], _vertices[0], *p1, *p2, p) != 0;
- while (!sub_423E00(_bkg1[v - 1], _bkg1[v], *p1, *p2, p)) {
- if (++v >= _bkg1Count)
- return sub_423E00(_bkg1[v - 1], _bkg1[0], *p1, *p2, p) != 0;
+ while (!sub_423E00(_vertices[v - 1], _vertices[v], *p1, *p2, p)) {
+ if (++v >= _verticesCount)
+ return sub_423E00(_vertices[v - 1], _vertices[0], *p1, *p2, p) != 0;
}
return true;
}
@@ -734,13 +736,13 @@ int Walk::sub_424320(Point *p1, Point *p2) { // CHECKED
Point p;
int i;
- for (i = 1; i < _bkg1Count; ++i) {
- if (sub_423E00(_bkg1[i - 1], _bkg1[i], *p1, *p2, p) && *p1 != p && *p2 != p) {
+ for (i = 1; i < _verticesCount; ++i) {
+ if (sub_423E00(_vertices[i - 1], _vertices[i], *p1, *p2, p) && *p1 != p && *p2 != p) {
ret++;
}
}
- if (sub_423E00(_bkg1[i - 1], _bkg1[0], *p1, *p2, p) && *p1 != p && *p2 != p) {
+ if (sub_423E00(_vertices[i - 1], _vertices[0], *p1, *p2, p) && *p1 != p && *p2 != p) {
ret++;
}
@@ -748,13 +750,13 @@ int Walk::sub_424320(Point *p1, Point *p2) { // CHECKED
}
int Walk::moveInside(Point *p) { // CHECKED
- DBLPoint dp = sub_424610(_bkg1[_bkg2->x], _bkg1[_bkg2->y].x, _bkg1[_bkg2->y].y, *p);
+ DBLPoint dp = sub_424610(_vertices[_edges->x], _vertices[_edges->y].x, _vertices[_edges->y].y, *p);
int index = 0;
double min = (dp.y - p->y) * (dp.y - p->y) + (dp.x - p->x) * (dp.x - p->x);
- for (int i = 1; i < _bkg1Count; ++i) {
- DBLPoint dp1 = sub_424610(_bkg1[_bkg2[i].x], _bkg1[_bkg2[i].y].x, _bkg1[_bkg2[i].y].y, *p);
+ for (int i = 1; i < _verticesCount; ++i) {
+ DBLPoint dp1 = sub_424610(_vertices[_edges[i].x], _vertices[_edges[i].y].x, _vertices[_edges[i].y].y, *p);
double curr = (dp1.y - p->y) * (dp1.y - p->y) + (dp1.x - p->x) * (dp1.x - p->x);
if (curr < min) {
dp = dp1;
@@ -768,7 +770,7 @@ int Walk::moveInside(Point *p) { // CHECKED
p->y = dp.y;
- for (int i = 0; i < _bkg1Count; ++i) {
+ for (int i = 0; i < _verticesCount; ++i) {
for (int j = 0; j < _bkg3_1[i]; ++j) {
if (_bkg3_2[i][j] == index)
return i;
diff --git a/engines/petka/walk.h b/engines/petka/walk.h
index addfc9172d9..eee6dd1ef1b 100644
--- a/engines/petka/walk.h
+++ b/engines/petka/walk.h
@@ -71,7 +71,7 @@ public:
int sub_422EA0(Point p1, Point p2);
int sub_423350();
Common::Point sub_4234B0();
- bool sub_423570(int, int);
+ bool areEdgesAdjacent(int, int);
int sub_423600(Point p);
int sub_423970(int, int);
@@ -137,13 +137,13 @@ public:
double field_198;
int destX;
int destY;
- int _bkg1Count;
- Point *_bkg1;
- int _bkg2Count;
+ int _verticesCount;
+ Point *_vertices;
+ int _edgesCount;
int _bkg3Count;
int *_bkg3_1;
int **_bkg3_2;
- Point *_bkg2;
+ Point *_edges;
char field_1C4;
char field_1C5;
char field_1C6;
More information about the Scummvm-git-logs
mailing list