aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/hopkins/lines.cpp302
-rw-r--r--engines/hopkins/lines.h2
-rw-r--r--engines/hopkins/objects.cpp13
-rw-r--r--engines/hopkins/objects.h1
4 files changed, 308 insertions, 10 deletions
diff --git a/engines/hopkins/lines.cpp b/engines/hopkins/lines.cpp
index 55ad7761b6..99ef337d6c 100644
--- a/engines/hopkins/lines.cpp
+++ b/engines/hopkins/lines.cpp
@@ -3572,4 +3572,306 @@ LABEL_85:
return -1;
}
+int LinesManager::PLAN_TEST(int a1, int a2, int a3, int a4, int a5, int a6) {
+ int v6;
+ int v7;
+ int v8;
+ int v9;
+ int v10;
+ int v11;
+ int v12;
+ int v13;
+ int v14;
+ byte *v15;
+ int v16;
+ int v17;
+ int v18;
+ int v19;
+ byte *v20;
+ int v21;
+ int v22;
+ int v23;
+ byte *v25;
+ byte *v26;
+ int v27;
+ int v28;
+ int v29;
+ int v30;
+ int v31;
+ int v32;
+ int v33 = 0;
+ int v34 = 0;
+ int v35;
+ int v36;
+ int v37;
+ int v38;
+ int v39;
+ int v40;
+ int v41;
+ int v42;
+ int v43;
+ int v44;
+ int v45;
+ int v46;
+ int v47;
+ int v48;
+ int v49;
+ int v50;
+ int v51;
+ int v52;
+ int v53;
+
+ v41 = a3;
+ v40 = TEST_LIGNE(a1, a2 - 2, &v42, &v50, &v46);
+ v39 = TEST_LIGNE(a1, a2 + 2, &v43, &v51, &v47);
+ v38 = TEST_LIGNE(a1 - 2, a2, &v44, &v52, &v48);
+ v6 = TEST_LIGNE(a1 + 2, a2, &v45, &v53, &v49);
+ v37 = v6;
+ if (v40 == -1 && v39 == -1 && v38 == -1 && v6 == -1)
+ return -1;
+ if (a4 == -1 || a5 == -1) {
+ v8 = 0;
+ if (v40 != -1)
+ v8 = 1;
+ if (v8)
+ goto LABEL_60;
+ if (v39 != -1)
+ v8 = 2;
+ if (v8)
+ goto LABEL_60;
+ if (v38 != -1)
+ v8 = 3;
+ if (v8)
+ goto LABEL_60;
+ if (v6 != -1)
+ v8 = 4;
+ goto LABEL_59;
+ }
+ v28 = 100;
+ v7 = 100;
+ v35 = 100;
+ v27 = 100;
+ v8 = 0;
+ v9 = a4 - a5;
+ if (a4 - a5 < 0)
+ v9 = -v9;
+ v36 = v9;
+ if (v40 != -1) {
+ v10 = v50 - a5;
+ if (v50 - a5 < 0)
+ v10 = -v10;
+ v28 = v10;
+ }
+ if (v39 != -1) {
+ v11 = v51 - a5;
+ if (v11 < 0)
+ v11 = -v11;
+ v7 = v11;
+ }
+ if (v38 != -1) {
+ v12 = v52 - a5;
+ if (v12 < 0)
+ v12 = -v12;
+ v35 = v12;
+ }
+ if (v37 != -1) {
+ v13 = v53 - a5;
+ if (v13 < 0)
+ v13 = -v13;
+ v27 = v13;
+ }
+ if (v28 < v36 && v28 <= v7 && v28 <= v35 && v28 <= v27)
+ v8 = 1;
+ if (v8)
+ goto LABEL_60;
+ if (v36 > v7 && v28 >= v7 && v35 >= v7 && v27 >= v7)
+ v8 = 2;
+ if (v8)
+ goto LABEL_60;
+ if (v35 < v36 && v35 <= v28 && v35 <= v7 && v35 <= v27)
+ v8 = 3;
+ if (v8)
+ goto LABEL_60;
+ if (v27 >= v36 || v27 > v28 || v27 > v7 || v27 > v35) {
+LABEL_59:
+ if (v8)
+ goto LABEL_60;
+ return -1;
+ }
+ v8 = 4;
+LABEL_60:
+ if (v8 == 1) {
+ v34 = v40;
+ v33 = v42;
+ NV_LIGNEDEP = v50;
+ NV_LIGNEOFS = v46;
+ }
+ if (v8 == 2) {
+ v34 = v39;
+ v33 = v43;
+ NV_LIGNEDEP = v51;
+ NV_LIGNEOFS = v47;
+ }
+ if (v8 == 3) {
+ v34 = v38;
+ v33 = v44;
+ NV_LIGNEDEP = v52;
+ NV_LIGNEOFS = v48;
+ }
+ if (v8 == 4) {
+ v34 = v37;
+ v33 = v45;
+ NV_LIGNEDEP = v53;
+ NV_LIGNEOFS = v49;
+ }
+ if (v33 == 1) {
+ v14 = 0;
+ if (Ligne[v34].field0 > 0) {
+ v32 = v34;
+ v25 = _vm->_globals.essai0;
+ do {
+ v15 = Ligne[v32].fieldC;
+ v16 = READ_LE_UINT16(v15 + 4 * v14);
+ v29 = READ_LE_UINT16(v15 + 4 * v14 + 2);
+ if (!a6) {
+ v17 = v41;
+ _vm->_globals.super_parcours[v17] = v16;
+ _vm->_globals.super_parcours[v17 + 1] = v29;
+ _vm->_globals.super_parcours[v17 + 2] = Ligne[v32].field6;
+ _vm->_globals.super_parcours[v17 + 3] = 0;
+ }
+ if (a6 == 1) {
+ v18 = v41;
+ WRITE_LE_UINT16(v25 + 2 * v18, v16);
+ WRITE_LE_UINT16(v25 + 2 * v18 + 2, v29);
+ WRITE_LE_UINT16(v25 + 2 * v18 + 4, Ligne[v32].field6);
+ WRITE_LE_UINT16(v25 + 2 * v18 + 6, 0);
+ }
+ v41 += 4;
+ ++v14;
+ } while (Ligne[v32].field0 > v14);
+ }
+ }
+ if (v33 == 2) {
+ v19 = Ligne[v34].field0 - 1;
+ if (v19 > -1) {
+ v31 = 16 * v34;
+ v26 = _vm->_globals.essai0;
+ do {
+ v20 = Ligne[v31].fieldC;
+ v21 = READ_LE_UINT16(v20 + 4 * v19);
+ v30 = READ_LE_UINT16(v20 + 4 * v19 + 2);
+ if (a6) {
+ v23 = v41;
+ WRITE_LE_UINT16(v26 + 2 * v23, v21);
+ WRITE_LE_UINT16(v26 + 2 * v23 + 2, v30);
+ WRITE_LE_UINT16(v26 + 2 * v23 + 4, Ligne[v31].field8);
+ WRITE_LE_UINT16(v26 + 2 * v23 + 6, 0);
+ } else {
+ v22 = v41;
+ _vm->_globals.super_parcours[v22] = v21;
+ _vm->_globals.super_parcours[v22 + 1] = v30;
+ _vm->_globals.super_parcours[v22 + 2] = Ligne[v31].field8;
+ _vm->_globals.super_parcours[v22 + 3] = 0;
+ }
+ v41 += 4;
+ --v19;
+ } while (v19 > -1);
+ }
+ }
+ NV_POSI = v41;
+ return 1;
+}
+
+int LinesManager::TEST_LIGNE(int a1, int a2, int *a3, int *a4, int *a5) {
+ int i;
+ int v6;
+ byte *v7;
+ int v8;
+ int v9;
+ int v10;
+ int v11;
+ byte *v12;
+ int v13;
+ int v14;
+ int v15;
+ int v16;
+ byte *v17;
+ int v18;
+ int v19;
+ int v20;
+ int v21;
+ int result;
+ int v23;
+ int v24 = 0;
+ int v25;
+ int v26;
+ int v27;
+ int v28;
+
+ v26 = 0;
+ v25 = _vm->_objectsManager.DERLIGNE + 1;
+ for (i = (int)(_vm->_objectsManager.DERLIGNE + 1); i < _vm->_linesManager.TOTAL_LIGNES + 1; i = v25) {
+ v6 = i;
+ v7 = Ligne[i].fieldC;
+ v8 = Ligne[v6].field0;
+ v23 = READ_LE_UINT16(v7 + 4 * v8 - 4);
+ v9 = READ_LE_UINT16(v7 + 4 * v8 - 2);
+ if (*v7 == a1 && a2 == READ_LE_UINT16(v7 + 2)) {
+ v24 = v25;
+ v26 = 1;
+ *a3 = 1;
+ }
+ if (v23 == a1 && a2 == v9) {
+ v24 = v25;
+ v26 = 1;
+ *a3 = 2;
+ }
+ if (v26 == 1)
+ goto LABEL_12;
+ ++v25;
+ }
+ if (v26 != 1)
+ goto LABEL_33;
+LABEL_12:
+ if (*a3 == 1) {
+ v10 = v24;
+ v11 = Ligne[v10].field0;
+ v12 = Ligne[v10].fieldC;
+ v13 = READ_LE_UINT16(v12 + 4 * v11 - 4);
+ v14 = READ_LE_UINT16(v12 + 4 * v11 - 2);
+ v15 = Ligne[v10].field6;
+ if (v15 == 5 || v15 == 1)
+ v14 += 2;
+ v16 = 16 * v24;
+ if (Ligne[v16].field6 == 3 || Ligne[v16].field8 == 7)
+ v13 += 2;
+ if (!colision2_ligne(v13, v14, &v28, &v27, 0, _vm->_objectsManager.DERLIGNE))
+ error("error");
+ *a4 = v27;
+ *a5 = v28;
+ }
+ if (v26 == 1 && *a3 == 2) {
+ v17 = Ligne[v25].fieldC;
+ v18 = *v17;
+ v19 = READ_LE_UINT16(v17 + 2);
+ v20 = Ligne[v24].field6;
+ if (v20 == 5 || v20 == 1)
+ v19 -= 2;
+ v21 = 16 * v24;
+ if (Ligne[v21].field6 == 3 || Ligne[v21].field8 == 7)
+ v18 -= 2;
+ if (!colision2_ligne(v18, v19, &v28, &v27, 0, _vm->_objectsManager.DERLIGNE))
+ error("erreure");
+ *a4 = v27;
+ *a5 = v28;
+ }
+LABEL_33:
+ if (v26)
+ result = v24;
+ else
+ result = -1;
+ return result;
+}
+
} // End of namespace Hopkins
diff --git a/engines/hopkins/lines.h b/engines/hopkins/lines.h
index 4baee6cb77..54a222698d 100644
--- a/engines/hopkins/lines.h
+++ b/engines/hopkins/lines.h
@@ -89,6 +89,8 @@ public:
int PARC_PERS(int a1, int a2, int a3, int a4, int a5, int a6, int a7);
int VERIF_SMOOTH(int a1, int a2, int a3, int a4);
int SMOOTH_MOVE(int a1, int a2, int a3, int a4, int a5, int a6);
+ int PLAN_TEST(int a1, int a2, int a3, int a4, int a5, int a6);
+ int TEST_LIGNE(int a1, int a2, int *a3, int *a4, int *a5);
};
} // End of namespace Hopkins
diff --git a/engines/hopkins/objects.cpp b/engines/hopkins/objects.cpp
index 0a846f5302..2c0a8d10a6 100644
--- a/engines/hopkins/objects.cpp
+++ b/engines/hopkins/objects.cpp
@@ -3068,8 +3068,8 @@ LABEL_90:
v35 = v34;
}
for (j = v69 + 1; j < v73; ++j) {
- if (PLAN_TEST(
- _vm->_linesManager.Ligne[j].fieldC,
+ if (_vm->_linesManager.PLAN_TEST(
+ READ_LE_UINT16(_vm->_linesManager.Ligne[j].fieldC),
READ_LE_UINT16(_vm->_linesManager.Ligne[j].fieldC + 2),
v67,
j,
@@ -3115,8 +3115,8 @@ LABEL_88:
}
for (l = v69 - 1; l > v73; --l) {
v48 = l;
- if (PLAN_TEST(
- _vm->_linesManager.Ligne[l].fieldC + 4 * _vm->_linesManager.Ligne[v48].field0 - 4,
+ if (_vm->_linesManager.PLAN_TEST(
+ READ_LE_UINT16(_vm->_linesManager.Ligne[l].fieldC + 4 * _vm->_linesManager.Ligne[v48].field0 - 4),
READ_LE_UINT16(_vm->_linesManager.Ligne[l].fieldC + 4 * _vm->_linesManager.Ligne[v48].field0 - 2),
v67,
l,
@@ -6984,11 +6984,6 @@ int ObjectsManager::CALC_PROPRE(int idx) {
return v1;
}
-int ObjectsManager::PLAN_TEST(byte *a1, int a2, int a3, int a4, int a5, int a6) {
- warning("TODO: PLAN_TEST");
- return 0;
-}
-
int ObjectsManager::colision(int a1, int a2) {
if (_vm->_globals.SegmentEnCours <= 0)
return -1;
diff --git a/engines/hopkins/objects.h b/engines/hopkins/objects.h
index ad87291520..56e78c5bd0 100644
--- a/engines/hopkins/objects.h
+++ b/engines/hopkins/objects.h
@@ -240,7 +240,6 @@ public:
void VERBE_OFF(int idx, int a2);
void VERBE_ON(int idx, int a2);
int CALC_PROPRE(int idx);
- int PLAN_TEST(byte *a1, int a2, int a3, int a4, int a5, int a6);
int colision(int a1, int a2);
void ACTION(const byte *spriteData, const Common::String &a2, int a3, int a4, int a5, int a6);