diff options
Diffstat (limited to 'engines/hopkins/lines.cpp')
-rw-r--r-- | engines/hopkins/lines.cpp | 3927 |
1 files changed, 3927 insertions, 0 deletions
diff --git a/engines/hopkins/lines.cpp b/engines/hopkins/lines.cpp new file mode 100644 index 0000000000..2ba89962d7 --- /dev/null +++ b/engines/hopkins/lines.cpp @@ -0,0 +1,3927 @@ +/* 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 "common/system.h" +#include "common/textconsole.h" +#include "hopkins/lines.h" +#include "hopkins/graphics.h" +#include "hopkins/hopkins.h" + +namespace Hopkins { + +LinesManager::LinesManager() { + for (int i = 0; i < 400; ++i) { + Common::fill((byte *)&LigneZone[i], (byte *)&LigneZone[i] + sizeof(LigneZoneItem), 0); + Common::fill((byte *)&Ligne[i], (byte *)&Ligne[i] + sizeof(LigneItem), 0); + } + for (int i = 0; i < 4000; ++i) { + Common::fill((byte *)&SMOOTH[i], (byte *)&SMOOTH[i] + sizeof(SmoothItem), 0); + } + + next_ligne = 0; + TOTAL_LIGNES = 0; + NV_LIGNEDEP = 0; + NV_LIGNEOFS = 0; + NV_POSI = 0; + NVPX = 0; + NVPY = 0; + SMOOTH_SENS = 0; + SMOOTH_X = SMOOTH_Y = 0; +} + +void LinesManager::setParent(HopkinsEngine *vm) { + _vm = vm; +} + +void LinesManager::CLEAR_ZONE() { + for (int idx = 0; idx < 400; ++idx) + RETIRE_LIGNE_ZONE(idx); + + next_ligne = 0; +} + +// Object Zone +int LinesManager::ZONE_OBJET(int a1, int a2) { + int v2; + + v2 = 0; + if ((uint)(a2 - 120) <= 0x21u) + v2 = OPTI_ZONE(a1, 1, 0); + if ((uint)(a2 - 154) <= 0x25u) + v2 = OPTI_ZONE(a1, 7, 0); + if ((uint)(a2 - 192) <= 0x25u) + v2 = OPTI_ZONE(a1, 13, 0); + if ((uint)(a2 - 230) <= 0x25u) + v2 = OPTI_ZONE(a1, 19, 0); + if ((uint)(a2 - 268) <= 0x25u) + v2 = OPTI_ZONE(a1, 25, 1); + if ((uint)(a2 - 268) <= 0x14u && a1 >= _vm->_graphicsManager.ofscroll + 424 && a1 <= _vm->_graphicsManager.ofscroll + 478) + v2 = 30; + if ((uint)(a2 - 290) <= 0x10u && a1 >= _vm->_graphicsManager.ofscroll + 424 && a1 <= _vm->_graphicsManager.ofscroll + 478) + v2 = 31; + if (a1 < _vm->_graphicsManager.ofscroll + 152 || a1 > _vm->_graphicsManager.ofscroll + 484) + v2 = 32; + if ((uint)(a2 - 114) > 0xC0u) + v2 = 32; + return v2; +} + +int LinesManager::OPTI_ZONE(int a1, int a2, int a3) { + int v3; + signed int v4; + + v3 = a2; + v4 = 0; + if (a1 >= _vm->_graphicsManager.ofscroll + 158 && a1 <= _vm->_graphicsManager.ofscroll + 208) + v4 = 1; + if (!v4) { + if (a1 >= _vm->_graphicsManager.ofscroll + 208 && a1 <= _vm->_graphicsManager.ofscroll + 266) { + v3 = a2 + 1; + v4 = 1; + } + if (!v4) { + if (a1 >= _vm->_graphicsManager.ofscroll + 266 && a1 <= _vm->_graphicsManager.ofscroll + 320) { + v3 += 2; + v4 = 1; + } + if (!v4) { + if (a1 >= _vm->_graphicsManager.ofscroll + 320 && a1 <= _vm->_graphicsManager.ofscroll + 370) { + v3 += 3; + v4 = 1; + } + if (!v4) { + if (a1 >= _vm->_graphicsManager.ofscroll + 370 && a1 <= _vm->_graphicsManager.ofscroll + 424) { + v3 += 4; + v4 = 1; + } + if (!v4) { + if (!a3 && a1 >= _vm->_graphicsManager.ofscroll + 424 && a1 <= _vm->_graphicsManager.ofscroll + 478) { + v3 += 5; + v4 = 1; + } + if (!v4) + v3 = 0; + } + } + } + } + } + return v3; +} + +// Remove Line Zone +void LinesManager::RETIRE_LIGNE_ZONE(int idx) { + if (idx > 400) + error("Attempting to add a line obstacle > MAX_LIGNE."); + if (_vm->_linesManager.LigneZone[idx].zoneData != (int16 *)g_PTRNUL) + _vm->_globals.dos_free2((byte *)_vm->_linesManager.LigneZone[idx].zoneData); + + _vm->_linesManager.LigneZone[idx].zoneData = (int16 *)g_PTRNUL; +} + +// Add Line Zone +void LinesManager::AJOUTE_LIGNE_ZONE(int idx, int a2, int a3, int a4, int a5, int a6) { + int v8; + int v9; + int16 *zoneData; + int16 *dataP; + int v11; + int v13; + int v14; + int v16; + int v17; + int v18; + int v19; + int v20; + int v21; + int v22; + int v23; + + if (a2 != a3 || a3 != a4 || a3 != a5) { + if (idx > 400) + error("Attempting to add a line obstacle > MAX_LIGNE."); + + if (LigneZone[idx].zoneData != (int16 *)g_PTRNUL) + LigneZone[idx].zoneData = (int16 *)_vm->_globals.dos_free2((byte *)LigneZone[idx].zoneData); + v8 = a2 - a4; + if (a2 - a4 < 0) + v8 = -v8; + v19 = v8; + v9 = a3 - a5; + if (a3 - a5 < 0) + v9 = -v9; + v18 = v9; + if (v19 <= v9) + v20 = v9 + 1; + else + v20 = v19 + 1; + + zoneData = (int16 *)_vm->_globals.dos_malloc2(2 * sizeof(int16) * v20 + (4 * sizeof(int16))); + v11 = idx; + LigneZone[v11].zoneData = zoneData; + if (zoneData == (int16 *)g_PTRNUL) + error("AJOUTE LIGNE ZONE"); + + dataP = zoneData; + v23 = 1000 * v19 / v20; + v22 = 1000 * v18 / v20; + if (a4 < a2) + v23 = -v23; + if (a5 < a3) + v22 = -v22; + v13 = 1000 * a2; + v16 = 1000 * a3; + v17 = 1000 * a2 / 1000; + v21 = 1000 * a3 / 1000; + v14 = 0; + if (v20 > 0) { + do { + *dataP++ = v17; + *dataP++ = v21; + + v13 += v23; + v16 += v22; + v17 = v13 / 1000; + v21 = v16 / 1000; + ++v14; + } while (v20 > v14); + } + *dataP++ = -1; + *dataP++ = -1; + + LigneZone[idx].count = v20; + LigneZone[idx].field2 = a6; + } else { + _vm->_globals.BOBZONE_FLAG[a6] = true; + _vm->_globals.BOBZONE[a6] = a3; + } +} + + +void LinesManager::RESET_OBSTACLE() { + for (int idx =0; idx < 400; ++idx) { + RETIRE_LIGNE(idx); + Ligne[idx].field0 = 0; + Ligne[idx].lineData = (int16 *)g_PTRNUL; + } +} + +// Remove Line +void LinesManager::RETIRE_LIGNE(int idx) { + if (idx > 400) + error("Attempting to add a line obstacle > MAX_LIGNE."); + if (Ligne[idx].lineData != (int16 *)g_PTRNUL) + _vm->_globals.dos_free2((byte *)Ligne[idx].lineData); + Ligne[idx].lineData = (int16 *)g_PTRNUL; +} + +// Add Line +void LinesManager::AJOUTE_LIGNE(int idx, int a2, int a3, int a4, int a5, int a6, int a7) { + int v7; + int v8; + int v9; + byte *v10; + int v11; + int v12; + int v13; + int v24; + int v25; + int v26; + int16 *v27; + int v30; + int v31; + int16 *v32; + int v33; + int v34; + int v35; + int v36; + int v37; + int v38; + int v39; + int v40; + + if (idx > 400) + error("Attempting to add a line obstacle > MAX_LIGNE."); + if (TOTAL_LIGNES < idx) + TOTAL_LIGNES = idx; + + if (Ligne[idx].lineData != (int16 *)g_PTRNUL) + _vm->_globals.dos_free2((byte *)Ligne[idx].lineData); + v7 = a3 - a5; + if (a3 - a5 < 0) + v7 = -v7; + v8 = v7 + 1; + v9 = a4 - a6; + if (a4 - a6 < 0) + v9 = -v9; + v34 = v9 + 1; + v33 = v9 + 1; + if (v8 > (int)(v9 + 1)) + v34 = v8; + + v10 = _vm->_globals.dos_malloc2(4 * v34 + 8); + if (v10 == g_PTRNUL) + error("AJOUTE LIGNE OBSTACLE"); + + Common::fill(v10, v10 + 4 * v34 + 8, 0); + Ligne[idx].lineData = (int16 *)v10; + + v32 = Ligne[idx].lineData; + v36 = 1000 * v8; + v39 = 1000 * v8 / (v34 - 1); + v37 = 1000 * v33 / (v34 - 1); + if (a5 < a3) + v39 = -v39; + if (a6 < a4) + v37 = -v37; + v11 = (int)v39 / 1000; + v12 = (int)v37 / 1000; + v13 = (int)v37 / 1000; + if (!((int)v39 / 1000)) { + if (v12 == -1) { + Ligne[idx].field6 = 1; + Ligne[idx].field8 = 5; + } + if (v12 == 1) { + Ligne[idx].field6 = 5; + Ligne[idx].field8 = 1; + } + } + if (v11 == 1) { + if (v12 == -1) { + Ligne[idx].field6 = 2; + Ligne[idx].field8 = 6; + } + if (!v13) { + Ligne[idx].field6 = 3; + Ligne[idx].field8 = 7; + } + if (v13 == 1) { + Ligne[idx].field6 = 4; + Ligne[idx].field8 = 8; + } + } + if (v11 == -1) { + if (v13 == 1) { + Ligne[idx].field6 = 6; + Ligne[idx].field8 = 2; + } + if (!v13) { + Ligne[idx].field6 = 7; + Ligne[idx].field8 = 3; + } + if (v13 == -1) { + Ligne[idx].field6 = 8; + Ligne[idx].field8 = 4; + } + } + if (v11 == 1 && (unsigned int)(v37 - 251) <= 0x2EC) { + Ligne[idx].field6 = 4; + Ligne[idx].field8 = 8; + } + if (v11 == -1 && (unsigned int)(v37 - 251) <= 0x2EC) { + Ligne[idx].field6 = 6; + Ligne[idx].field8 = 2; + } + if (v11 == 1 && (unsigned int)(v37 + 999) <= 0x2EC) { + Ligne[idx].field6 = 2; + Ligne[idx].field8 = 6; + } + if (v11 == -1 && v37 <= 249 && v37 > 1000) { + Ligne[idx].field6 = 8; + Ligne[idx].field8 = 4; + } + v40 = v36 / v34; + v38 = 1000 * v33 / v34; + if (a5 < a3) + v40 = -v40; + if (a6 < a4) + v38 = -v38; + v24 = 1000 * a3; + v25 = 1000 * a4; + v31 = 1000 * a3 / 1000; + v30 = 1000 * a4 / 1000; + v35 = v34 - 1; + v26 = 0; + if (v35 > 0) { + do { + v32[0] = v31; + v32[1] = v30; + v32 += 2; + + v24 += v40; + v25 += v38; + v31 = v24 / 1000; + v30 = v25 / 1000; + ++v26; + } while (v35 > v26); + } + v32[0] = a5; + v32[1] = a6; + + v27 = v32 + 2; + v27[0] = -1; + v27[1] = -1; + + Ligne[idx].field0 = v35 + 1; + Ligne[idx].field2 = a7; + Ligne[idx].field4 = a2; +} + +// Line Collision 2 +int LinesManager::colision2_ligne(int a1, int a2, int *a3, int *a4, int a5, int a6) { + int v6; + int16 *v7; + int v8; + int v9; + int v10; + int v11; + int v12; + int16 *v13; + int v14; + int result; + int v16; + int v17; + int v18; + int v19; + int v20; + int v21; + int v22; + int v23; + int v24; + + v24 = a5; + v6 = a5; + if (a5 >= a6 + 1) { +LABEL_29: + result = 0; + } else { + v22 = a1 + 4; + v21 = a1 - 4; + v20 = a2 + 4; + v19 = a2 - 4; + while (1) { + v7 = Ligne[v6].lineData; + + if (v7 != (int16 *)g_PTRNUL) { + v23 = 1; + v8 = 2 * Ligne[v6].field0; + v9 = v7[0]; + v16 = v7[1]; + v10 = v7[v8 - 2]; + v18 = v7[v8 - 1]; + if (v7[0] >= v10) + goto LABEL_32; + if (v22 < v9 || v21 > v10) + v23 = 0; + if (v9 >= v10) { +LABEL_32: + if (v21 > v9 || v22 < v10) + v23 = 0; + } + if (v16 >= v18) + goto LABEL_33; + if (v20 < v16 || v19 > v18) + v23 = 0; + if (v16 >= v18) { +LABEL_33: + if (v19 > v16 || v20 < v18) + v23 = 0; + } + if (v23 == 1) { + v11 = 0; + v17 = Ligne[v24].field0; + if (v17 > 0) + break; + } + } +LABEL_28: + ++v24; + v6 = v24; + if (v24 >= a6 + 1) + goto LABEL_29; + } + while (1) { + v12 = v7[0]; + + v13 = v7 + 1; + v14 = v13[0]; + v7 = v13 + 1; + + if (a1 == v12 || a1 + 1 == v12) { + if (a2 == v14 || a2 + 1 == v14) + break; + } + ++v11; + if (v17 <= v11) + goto LABEL_28; + } + *a3 = v11; + *a4 = v24; + result = 1; + } + return result; +} + +int LinesManager::Scolision2_ligne(int a1, int a2, int *a3, int *a4, int a5, int a6) { + int v6; + int16 *v7; + int v8; + int v9; + int v10; + int v11; + int v12; + int16 *v13; + int result; + int v15; + int v16; + int v17; + int v18; + int v19; + int v20; + int v21; + int v22; + int v23; + int v24; + + v24 = a5; + v6 = a5; + if (a5 >= a6 + 1) { +LABEL_47: + result = 0; + } else { + v22 = a1 + 10; + v21 = a1 - 10; + v20 = a2 + 10; + v19 = a2 - 10; + for (;;) { + v7 = Ligne[v6].lineData; + + if (v7 != (int16 *)g_PTRNUL) { + v23 = 1; + v8 = 2 * Ligne[v6].field0; + v9 = v7[0]; + v15 = v7[1]; + v10 = v7[v8 - 2]; + v17 = v7[v8 - 1]; + if (v7[0] >= v10) + goto LABEL_50; + if (v22 < v9 || v21 > v10) + v23 = 0; + if (v9 >= v10) { +LABEL_50: + if (v21 > v9 || v22 < v10) + v23 = 0; + } + if (v15 >= v17) + goto LABEL_51; + if (v20 < v15 || v19 > v17) + v23 = 0; + if (v15 >= v17) { +LABEL_51: + if (v19 > v15 || v20 < v17) + v23 = 0; + } + if (v23 == 1) { + v11 = 0; + v18 = Ligne[v24].field0; + if (v18 > 0) + break; + } + } +LABEL_46: + ++v24; + v6 = v24; + if (v24 >= a6 + 1) + goto LABEL_47; + } + while (1) { + v12 = v7[0]; + v13 = v7 + 1; + v16 = v13[0]; + v7 = v13 + 1; + if (a1 == v12 + || v12 == a1 + 1 + || v12 == a1 + 2 + || v12 == a1 + 3 + || v12 == a1 + 4 + || v12 == a1 + 5 + || v12 == a1 + 6 + || v12 == a1 + 7 + || v12 == a1 + 8 + || v12 == a1 + 9 + || a1 + 10 == v12) { + if (v16 == a2 + || v16 == a2 + 1 + || v16 == a2 + 2 + || v16 == a2 + 3 + || v16 == a2 + 4 + || v16 == a2 + 5 + || v16 == a2 + 6 + || v16 == a2 + 7 + || v16 == a2 + 8 + || v16 == a2 + 9 + || a2 + 10 == v16) + break; + } + ++v11; + if (v18 <= v11) + goto LABEL_46; + } + *a3 = v11; + *a4 = v24; + result = 1; + } + return result; +} + +// Init route +void LinesManager::INIPARCOURS() { + int v0; + int v1; + int v2; + int16 *v3; + int v4; + int v5; + int v6; + int16 *v7; + int v8; + int v9; + int v11; + int v12; + int v13; + int v14; + int v15; + + v15 = Ligne[0].lineData[0]; + v14 = Ligne[0].lineData[1]; + + v0 = 1; + v1 = 0; + do { + v2 = Ligne[v0].field0; + v3 = Ligne[v0].lineData; + + v4 = v3[2 * v2 - 2]; + v5 = v3[2 * v2 - 1]; + if (_vm->_graphicsManager.max_x == v4 || _vm->_graphicsManager.max_y == v5 || _vm->_graphicsManager.min_x == v4 + || _vm->_graphicsManager.min_y == v5) + v1 = 1; + if (v15 == v4 && v14 == v5) + v1 = 1; + if (v0 == 400) { + v6 = v1; + error("ERROR - LAST LINE NOT FOUND"); + v1 = v6; + } + v7 = Ligne[v0 + 1].lineData; + if (v7[0] != v4 && v7[1] != v5) + v1 = 1; + if (!v1) + ++v0; + } while (v1 != 1); + + _vm->_objectsManager.DERLIGNE = v0; + v8 = 1; + v13 = _vm->_globals.Max_Ligne_Long; + v9 = _vm->_objectsManager.DERLIGNE + 1; + do { + v11 = v8; + if (Ligne[v11].field0 < v13) { + if (v8 != v9) { + v12 = v8 - 1; + Ligne[v11].field6 = Ligne[v12].field6; + Ligne[v11].field8 = Ligne[v12].field8; + } + } + ++v8; + } while (v8 != 400); +} + +// Avoid +int LinesManager::CONTOURNE(int a1, int a2, int a3, int a4, int a5, int16 *a6, int a7) { + int v7; + int v8; + int i; + int16 *v10; + int v11; + int v12; + int v13; + int16 *v14; + int v15; + int v16; + int j; + int16 *v18; + int v19; + int v20; + int k; + int16 *v22; + int v23; + int v24; + int v25; + int16 *v26; + int v27; + int v28; + int v29; + int16 *v30; + int v31; + int v32; + int v34; + int v35; + int v36; + int v50; + + v36 = a1; + v7 = a2; + v8 = a3; + if (a1 < a4) { + for (i = a2; Ligne[a1].field0 > i; ++i) { + v10 = Ligne[a1].lineData; + v11 = v10[2 * i]; + v50 = v10[2 * i + 1]; + + v12 = v8; + a6[v12] = v11; + a6[v12 + 1] = v50; + a6[v12 + 2] = Ligne[a1].field6; + v8 += a7; + } + v34 = a1 + 1; + if ((int)(a1 + 1) < a4) { + do { + v13 = 0; + if (Ligne[v34].field0 > 0) { + do { + v14 = Ligne[v34].lineData; + v15 = v14[2 * v13]; + v50 = v14[2 * v13 + 1]; + v16 = v8; + + a6[v16] = v15; + a6[v16 + 1] = v50; + a6[v16 + 2] = Ligne[v34].field6; + v8 += a7; + ++v13; + } while (Ligne[v34].field0 > v13); + } + ++v34; + } while (v34 < a4); + } + v7 = 0; + v36 = a4; + } + if (v36 > a4) { + for (j = v7; j > 0; --j) { + v18 = Ligne[v36].lineData; + v19 = v18[2 * j]; + v50 = v18[2 * j + 1]; + + v20 = v8; + a6[v20] = v19; + a6[v20 + 1] = v50; + a6[v20 + 2] = Ligne[v36].field8; + v8 += a7; + } + v35 = v36 - 1; + if ((int)(v36 - 1) > a4) { + do { + for (k = Ligne[v35].field0 - 1; k > 0; --k) { + v22 = Ligne[v35].lineData; + v23 = v22[2 * k]; + v50 = v22[2 * k + 1]; + + v24 = v8; + a6[v24] = v23; + a6[v24 + 1] = v50; + a6[v24 + 2] = Ligne[v35].field8; + v8 += a7; + } + --v35; + } while (v35 > a4); + } + v7 = Ligne[a4].field0 - 1; + v36 = a4; + } + if (v36 == a4) { + if (a5 >= v7) { + if (a5 > v7) { + v29 = v7; + do { + v30 = Ligne[a4].lineData; + v31 = v30[2 * v29]; + v50 = v30[2 * v29 + 1]; + + v32 = v8; + a6[v32] = v31; + a6[v32 + 1] = v50; + a6[v32 + 2] = Ligne[a4].field6; + v8 += a7; + ++v29; + } while (a5 > v29); + } + } else { + v25 = v7; + do { + v26 = Ligne[a4].lineData; + v27 = v26[2 * v25]; + v50 = v26[2 * v25 + 1]; + + v28 = v8; + a6[v28] = v27; + a6[v28 + 1] = v50; + a6[v28 + 2] = Ligne[a4].field8; + v8 += a7; + --v25; + } while (a5 < v25); + } + } + return v8; +} + +// Avoid 1 +int LinesManager::CONTOURNE1(int a1, int a2, int a3, int a4, int a5, int16 *a6, int a7, int a8, int a9) { + int v9; + int v10; + int i; + int16 *v12; + int v13; + int v14; + int v15; + int v16; + int16 *v17; + int v18; + int v19; + int j; + int16 *v21; + int v22; + int v23; + int v24; + int k; + int16 *v26; + int v27; + int v28; + int v29; + int16 *v30; + int v31; + int v32; + int v33; + int16 *v34; + int v35; + int v36; + int v38; + int v39; + int v40; + int v50; + + v9 = a1; + v10 = a2; + v40 = a3; + if (a4 < a1) { + for (i = a2; Ligne[a1].field0 > i; ++i) { + v12 = Ligne[a1].lineData; + v13 = v12[2 * i]; + v50 = v12[2 * i + 1]; + + v14 = v40; + a6[v14] = v13; + a6[v14 + 1] = v50; + a6[v14 + 2] = Ligne[a1].field6; + v40 += a7; + } + v15 = a1 + 1; + if ((int)(a1 + 1) == a9 + 1) + v15 = a8; + while (a4 != v15) { + v16 = 0; + if (Ligne[v15].field0 > 0) { + do { + v17 = Ligne[v15].lineData; + v18 = v17[2 * v16]; + v50 = v17[2 * v16 + 1]; + + v19 = v40; + a6[v19] = v18; + a6[v19 + 1] = v50; + a6[v19 + 2] = Ligne[v15].field6; + v40 += a7; + ++v16; + } while (Ligne[v15].field0 > v16); + } + ++v15; + if (a9 + 1 == v15) + v15 = a8; + } + v10 = 0; + v9 = a4; + } + if (a4 > v9) { + for (j = v10; j > 0; --j) { + v21 = Ligne[v9].lineData; + v22 = v21[2 * j]; + v50 = v21[2 * j + 1]; + + v23 = v40; + a6[v23] = v22; + a6[v23 + 1] = v50; + a6[v23 + 2] = Ligne[v9].field8; + v40 += a7; + } + v24 = v9 - 1; + if (v24 == a8 - 1) + v24 = a9; + while (a4 != v24) { + for (k = Ligne[v24].field0 - 1; k > 0; --k) { + v26 = Ligne[v24].lineData; + v27 = v26[2 * k]; + v50 = v26[2 * k + 1]; + + v28 = v40; + a6[v28] = v27; + a6[v28 + 1] = v50; + a6[v28 + 2] = Ligne[v24].field8; + v40 += a7; + } + --v24; + if (a8 - 1 == v24) + v24 = a9; + } + v10 = Ligne[a4].field0 - 1; + v9 = a4; + } + if (a4 == v9) { + if (a5 >= v10) { + if (a5 > v10) { + v33 = v10; + v39 = a4; + do { + v34 = Ligne[v39].lineData; + v35 = v34[2 * v33]; + v50 = v34[2 * v33 + 1]; + + v36 = v40; + a6[v36] = v35; + a6[v36 + 1] = v50; + a6[v36 + 2] = Ligne[v39].field6; + v40 += a7; + ++v33; + } while (a5 > v33); + } + } else { + v29 = v10; + v38 = a4; + do { + v30 = Ligne[v38].lineData; + v31 = v30[2 * v29]; + v50 = v30[2 * v29 + 1]; + + v32 = v40; + a6[v32] = v31; + a6[v32 + 1] = v50; + a6[v32 + 2] = Ligne[v38].field8; + v40 += a7; + --v29; + } while (a5 < v29); + } + } + return v40; +} + +int LinesManager::MIRACLE(int a1, int a2, int a3, int a4, int a5) { + int v5; + int v6; + int v7; + int v8; + int v9; + int v10; + int i; + int v12; + int v13; + int j; + int v15; + int v16; + int k; + int v18; + int v19; + int l; + int v21; + int v22; + int v23; + int v24; + int v25; + int v26; + int v27; + int v28; + int v29; + int v30; + int v31; + int v32; + int v33; + int v35 = 0; + int v36 = 0; + int v37; + int v38; + int v39; + int v40; + int v41; + int v42 = 0; + int v43 = 0; + int v44 = 0; + int v45 = 0; + int v46 = 0; + int v47 = 0; + int v48 = 0; + int v49 = 0; + int v50; + int v51; + + v5 = a1; + v6 = a2; + v50 = a3; + v7 = a5; + if (colision2_ligne(a1, a2, &v51, &v50, 0, TOTAL_LIGNES) == 1) { + v8 = Ligne[v50].field4; + if (v8 == 1) + v6 = a2 - 2; + if (v8 == 2) { + v6 -= 2; + v5 = a1 + 2; + } + if (v8 == 3) + v5 += 2; + if (v8 == 4) { + v6 += 2; + v5 += 2; + } + if (v8 == 5) + v6 += 2; + if (v8 == 6) { + v6 += 2; + v5 -= 2; + } + if (v8 == 7) + v5 -= 2; + if (v8 == 8) { + v6 -= 2; + v5 -= 2; + } + } + v41 = v5; + v40 = v6; + v9 = 0; + v10 = v40; + for (i = v40; v40 + 200 > v10; i = v10) { + if (colision2_ligne(v41, i, &v49, &v48, 0, _vm->_objectsManager.DERLIGNE) == 1 && v48 <= _vm->_objectsManager.DERLIGNE) + break; + v49 = 0; + v48 = -1; + ++v9; + ++v10; + } + v37 = v9; + v12 = 0; + v13 = v40; + for (j = v40; v40 - 200 < v13; j = v13) { + if (colision2_ligne(v41, j, &v47, &v46, 0, _vm->_objectsManager.DERLIGNE) == 1 && v46 <= _vm->_objectsManager.DERLIGNE) + break; + v47 = 0; + v46 = -1; + ++v12; + --v13; + } + v39 = v12; + v15 = 0; + v16 = v41; + for (k = v41; v41 + 200 > v16; k = v16) { + if (colision2_ligne(k, v40, &v45, &v44, 0, _vm->_objectsManager.DERLIGNE) == 1 && v44 <= _vm->_objectsManager.DERLIGNE) + break; + v45 = 0; + v44 = -1; + ++v15; + ++v16; + } + v38 = v15; + v18 = 0; + v19 = v41; + for (l = v41; v41 - 200 < v19; l = v19) { + if (colision2_ligne(l, v40, &v43, &v42, 0, _vm->_objectsManager.DERLIGNE) == 1 && v42 <= _vm->_objectsManager.DERLIGNE) + break; + v43 = 0; + v42 = -1; + ++v18; + --v19; + } + if (a4 > v50) { + if (v46 != -1 && v46 <= v50) + v46 = -1; + if (v44 != -1 && v50 >= v44) + v44 = -1; + if (v48 != -1 && v50 >= v48) + v48 = -1; + if (v42 != -1 && v50 >= v42) + v42 = -1; + if (v46 != -1 && a4 < v46) + v46 = -1; + if (v44 != -1 && a4 < v44) + v44 = -1; + if (v48 != -1 && a4 < v48) + v48 = -1; + if (v42 != -1 && a4 < v42) + v42 = -1; + } + if (a4 < v50) { + if (v46 != -1 && v46 >= v50) + v46 = -1; + if (v44 != -1 && v50 <= v44) + v44 = -1; + if (v48 != -1 && v50 <= v48) + v48 = -1; + if (v42 != -1 && v50 <= v42) + v42 = -1; + if (v46 != -1 && a4 > v46) + v46 = -1; + if (v44 != -1 && a4 > v44) + v44 = -1; + if (v48 != -1 && a4 > v48) + v48 = -1; + if (v42 != -1 && a4 > v42) + v42 = -1; + } + if (v46 != -1 || v44 != -1 || v48 != -1 || v42 != -1) { + v21 = 0; + if (a4 > v50) { + if (v48 <= v46 && v44 <= v46 && v42 <= v46 && v46 > v50) + v21 = 1; + if (v48 <= v44 && v46 <= v44 && v42 <= v44 && v50 < v44) + v21 = 3; + if (v46 <= v48 && v44 <= v48 && v42 <= v48 && v50 < v48) + v21 = 5; + if (v48 <= v42 && v44 <= v42 && v46 <= v42 && v50 < v42) + v21 = 7; + } + if (a4 < v50) { + if (v46 == -1) + v46 = 1300; + if (v44 == -1) + v44 = 1300; + if (v48 == -1) + v48 = 1300; + if (v42 == -1) + v42 = 1300; + if (v46 != 1300 && v48 >= v46 && v44 >= v46 && v42 >= v46 && v46 < v50) + v21 = 1; + if (v44 != 1300 && v48 >= v44 && v46 >= v44 && v42 >= v44 && v50 > v44) + v21 = 3; + if (v48 != 1300 && v46 >= v48 && v44 >= v48 && v42 >= v48 && v50 > v48) + v21 = 5; + if (v42 != 1300 && v48 >= v42 && v44 >= v42 && v46 >= v42 && v50 > v42) + v21 = 7; + } + if (v21) { + if (v21 == 1) { + v36 = v46; + v35 = v47; + } + if (v21 == 3) { + v36 = v44; + v35 = v45; + } + if (v21 == 5) { + v36 = v48; + v35 = v49; + } + if (v21 == 7) { + v36 = v42; + v35 = v43; + } + if (v21 == 1) { + v22 = 0; + if (v39 > 0) { + do { + if (colision2_ligne(v41, v40 - v22, &v47, &v46, _vm->_objectsManager.DERLIGNE + 1, TOTAL_LIGNES) == 1 + && _vm->_objectsManager.DERLIGNE < v46) { + v23 = GENIAL(v46, v47, v41, v40 - v22, v41, v40 - v39, v7, &_vm->_globals.super_parcours[0], 4); + if (v23 == -1) + return 0; + v7 = v23; + if (NVPY != -1) + v22 = NVPY - v40; + } + v24 = v7; + _vm->_globals.super_parcours[v24] = v41; + _vm->_globals.super_parcours[v24 + 1] = v40 - v22; + _vm->_globals.super_parcours[v24 + 2] = 1; + _vm->_globals.super_parcours[v24 + 3] = 0; + v7 += 4; + ++v22; + } while (v39 > v22); + } +LABEL_186: + NV_LIGNEDEP = v36; + NV_LIGNEOFS = v35; + NV_POSI = v7; + return 1; + } + if (v21 == 5) { + v25 = 0; + if (v37 > 0) { + do { + if (colision2_ligne(v41, v25 + v40, &v47, &v46, _vm->_objectsManager.DERLIGNE + 1, TOTAL_LIGNES) == 1 + && _vm->_objectsManager.DERLIGNE < v46) { + v26 = GENIAL(v46, v47, v41, v25 + v40, v41, v37 + v40, v7, &_vm->_globals.super_parcours[0], 4); + if (v26 == -1) + return 0; + v7 = v26; + if (NVPY != -1) + v25 = v40 - NVPY; + } + v27 = v7; + _vm->_globals.super_parcours[v27] = v41; + _vm->_globals.super_parcours[v27 + 1] = v25 + v40; + _vm->_globals.super_parcours[v27 + 2] = 5; + _vm->_globals.super_parcours[v27 + 3] = 0; + v7 += 4; + ++v25; + } while (v37 > v25); + } + goto LABEL_186; + } + if (v21 == 7) { + v28 = 0; + if (v18 > 0) { + do { + if (colision2_ligne(v41 - v28, v40, &v47, &v46, _vm->_objectsManager.DERLIGNE + 1, TOTAL_LIGNES) == 1 + && _vm->_objectsManager.DERLIGNE < v46) { + v29 = GENIAL(v46, v47, v41 - v28, v40, v41 - v18, v40, v7, &_vm->_globals.super_parcours[0], 4); + if (v29 == -1) + return 0; + v7 = v29; + if (NVPX != -1) + v28 = v41 - NVPX; + } + v30 = v7; + _vm->_globals.super_parcours[v30] = v41 - v28; + _vm->_globals.super_parcours[v30 + 1] = v40; + _vm->_globals.super_parcours[v30 + 2] = 7; + _vm->_globals.super_parcours[v30 + 3] = 0; + v7 += 4; + ++v28; + } while (v18 > v28); + } + goto LABEL_186; + } + if (v21 == 3) { + v31 = 0; + if (v38 > 0) { + do { + if (colision2_ligne(v31 + v41, v40, &v47, &v46, _vm->_objectsManager.DERLIGNE + 1, TOTAL_LIGNES) == 1 + && _vm->_objectsManager.DERLIGNE < v46) { + v32 = GENIAL(v46, v47, v31 + v41, v40, v38 + v41, v40, v7, &_vm->_globals.super_parcours[0], 4); + if (v32 == -1) + return 0; + v7 = v32; + if (NVPX != -1) + v31 = NVPX - v41; + } + v33 = v7; + _vm->_globals.super_parcours[v33] = v31 + v41; + _vm->_globals.super_parcours[v33 + 1] = v40; + _vm->_globals.super_parcours[v33 + 2] = 3; + _vm->_globals.super_parcours[v33 + 3] = 0; + v7 += 4; + ++v31; + } while (v38 > v31); + } + goto LABEL_186; + } + } + } + return 0; +} + +int LinesManager::GENIAL(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int16 *a8, int a9) { + int v9; + int16 *v10; + int v11; + int16 *v12; + int16 *v13; + int v14; + int v15; + int16 *v16; + int v17; + int v18; + int v19; + int v20; + int v21; + int v22; + int v23; + int v24; + int v25; + int v26; + int v27; + int16 *v28; + int v29; + int v30; + int v31; + int v32; + int v33; + int v34; + int v35 = 0; + int v36 = 0; + int v37; + int v38; + int v40; + int v41; + int v42 = 0; + int v43 = 0; + int v44 = 0; + int v45 = 0; + int v46 = 0; + int v47 = 0; + int v48 = 0; + int v49 = 0; + int v50; + int16 *v51; + int v52; + int v53; + int v54; + int v55; + int v56; + int v57; + int v58; + int v59; + int v60; + int v61; + int v62; + int v63; + int v64; + int v65; + int v66 = 0; + int v67; + int v68 = 0; + int v69; + int v70 = 0; + int v71; + int v72 = 0; + int v73; + int v74; + int v75; + int v76; + int v77 = 0; + int v78 = 0; + int v79 = 0; + int v80; + int v81; + int v82; + int v83; + int v84; + int v85; + int v86; + int v87; + int v88; + int v89; + int i; + int v91; + int v92; + int v93; + int v94; + int v95; + int v96; + int v97; + int v98; + int v99; + int v100; + int v101; + + v99 = a7; + v80 = -1; + ++_vm->_globals.STOP_BUG; + if (_vm->_globals.STOP_BUG > 10) { + v9 = a7; +LABEL_112: + a8[v9] = -1; + a8[v9 + 1] = -1; + a8[v9 + 2] = -1; + return -1; + } + v10 = Ligne[a1].lineData; + v98 = v10[0]; + v97 = v10[1]; + v92 = a1; + + while (1) { + v86 = v92 - 1; + v11 = 2 * Ligne[v92 - 1].field0; + + v12 = Ligne[v92 - 1].lineData; + if (v12 == (int16 *)g_PTRNUL) + break; + while (v12[v11 - 2] != v98 || v97 != v12[v11 - 1]) { + --v86; + if (_vm->_objectsManager.DERLIGNE - 1 != v86) { + v11 = 2 * Ligne[v86].field0; + v12 = Ligne[v86].lineData; + if (v12 != (int16 *)g_PTRNUL) + continue; + } + goto LABEL_11; + } + + v92 = v86; + v98 = v12[0]; + v97 = v12[1]; + } +LABEL_11: + v13 = Ligne[a1].lineData; + v14 = 2 * Ligne[a1].field0; + v95 = v13[v14 - 2]; + v93 = v13[v14 - 1]; + v91 = a1; + + for (;;) { + v87 = v91 + 1; + v15 = 2 * Ligne[v91 + 1].field0; + v16 = Ligne[v91 + 1].lineData; + if (v16 == (int16 *)g_PTRNUL) + break; + while (1) { + v65 = v15; + v17 = v16[v15 - 2]; + if (v16[0] == v95) { + if (v93 == v16[1]) + break; + } + ++v87; + if (v87 != TOTAL_LIGNES + 1) { + v15 = 2 * Ligne[v87].field0; + v16 = Ligne[v87].lineData; + if (v16 != (int16 *)g_PTRNUL) + continue; + } + goto LABEL_17; + } + v91 = v87; + v95 = v17; + v93 = v16[v65 - 1]; + } +LABEL_17: + v18 = a3 - a5; + if (a3 - a5 < 0) + v18 = -v18; + v58 = v18 + 1; + v19 = a4 - a6; + if (a4 - a6 < 0) + v19 = -v19; + v85 = v19 + 1; + v20 = v19 + 1; + if (v58 > v20) + v85 = v18 + 1; + v84 = 1000 * v58 / v85; + v83 = 1000 * v20 / v85; + v21 = 1000 * a3; + v22 = 1000 * a4; + v82 = v21 / 1000; + v81 = v22 / 1000; + if (a5 < a3) + v84 = -v84; + if (a6 < a4) + v83 = -v83; + if (v85 > 800) + v85 = 800; + + Common::fill(&_vm->_globals.BufLig[0], &_vm->_globals.BufLig[1000], 0); + v23 = 0; + v88 = 0; + if (v85 + 1 > 0) { + v51 = _vm->_globals.BufLig; + do { + v24 = v23; + v51[v24] = v82; + v51[v24 + 1] = v81; + v21 += v84; + v22 += v83; + v82 = v21 / 1000; + v81 = v22 / 1000; + v23 += 2; + ++v88; + } while (v88 < v85 + 1); + } + v25 = v23 - 2; + v26 = 0; + v89 = v85 + 1; + if ((int)(v85 + 1) > 0) { + do { + v96 = _vm->_globals.BufLig[v25]; + v94 = _vm->_globals.BufLig[v25 + 1]; + if (colision2_ligne(v96, v94, &v101, &v100, v92, v91) == 1 && _vm->_objectsManager.DERLIGNE < v100) { + v80 = v100; + v77 = v101; + v78 = v96; + v79 = v94; + v26 = 1; + } + if (v26 == 1) + break; + v25 -= 2; + --v89; + } while (v89 > 0); + } + for (i = v92; i < v91 + 1; ++i) { + v27 = 2 * Ligne[i].field0; + v28 = Ligne[i].lineData; + if (v28 == (int16 *)g_PTRNUL) + error("error in genial routine"); + v29 = v28[0]; + v30 = v28[1]; + v59 = v28[1]; + v31 = v27; + v32 = v28[v27 - 2]; + v33 = v28[v31 - 1]; + if (i == v92) { + v72 = v33; + if (v30 <= v33) + v72 = v30; + v70 = v33; + if (v59 >= v33) + v70 = v59; + v68 = v32; + if (v29 <= v32) + v68 = v29; + v66 = v32; + if (v29 >= v32) + v66 = v29; + } else { + if (v59 < v33 && v59 < v72) + v72 = v59; + if (v33 < v59 && v33 < v72) + v72 = v33; + if (v59 > v33 && v59 > v70) + v70 = v59; + if (v33 > v59 && v33 > v70) + v70 = v33; + if (v29 < v32 && v68 > v29) + v68 = v29; + if (v32 < v29 && v68 > v32) + v68 = v32; + if (v29 > v32 && v66 < v29) + v66 = v29; + if (v32 > v29 && v66 < v32) + v66 = v32; + } + } + v69 = v68 - 2; + v73 = v72 - 2; + v67 = v66 + 2; + v71 = v70 + 2; + if (a5 >= v69 && a5 <= v67 && a6 >= v73 && a6 <= v71) { + v34 = a6; + v76 = -1; + do { + --v34; + v60 = colision2_ligne(a5, v34, &v101, &v100, v92, v91); + if (v60 == 1) + v76 = v100; + if (!v34 || v73 > v34) + v60 = 1; + } while (v60 != 1); + v35 = a6; + v75 = -1; + do { + ++v35; + v61 = colision2_ligne(a5, v35, &v101, &v100, v92, v91); + if (v61 == 1) + v75 = v100; + if (_vm->_globals.Max_Perso_Y <= v35 || v71 <= v35) + v61 = 1; + } while (v61 != 1); + v36 = a5; + v74 = -1; + do { + ++v36; + v62 = colision2_ligne(v36, a6, &v101, &v100, v92, v91); + if (v62 == 1) + v74 = v100; + if (_vm->_graphicsManager.max_x <= v36 || v67 <= v36) + v62 = 1; + } while (v62 != 1); + v37 = a5; + v38 = -1; + do { + --v37; + v63 = colision2_ligne(v37, a6, &v101, &v100, v92, v91); + if (v63 == 1) + v38 = v100; + if (v37 <= 0 || v69 >= v37) + v63 = 1; + } while (v63 != 1); + if (v74 != -1 && v38 != -1 && v76 != -1 && v75 != -1) { + v9 = a7; + goto LABEL_112; + } + } + if (v78 < a3 - 1 || v78 > a3 + 1 || v79 < a4 - 1 || v79 > a4 + 1) { + NVPX = v78; + NVPY = v79; + if (a1 < v80) { + v40 = v80 - a1; + if (v80 - a1 < 0) + v40 = -v40; + v41 = v40; + v42 = a1; + v43 = 0; + v52 = v92 - 1; + do { + if (v52 == v42) + v42 = v91; + ++v43; + --v42; + if (v52 == v42) + v42 = v91; + } while (v80 != v42); + if (v41 == v43) { + v44 = Ligne[a1].field0 / 2; + v54 = Ligne[a1].field0 / 2; + if (v44 < 0) + v54 = -v44; + if (a2 > v54) { + v55 = Ligne[a1].field0 / 2; + if (v44 < 0) + v55 = -v44; + if (a2 >= v55) + v99 = CONTOURNE(a1, a2, a7, v80, v77, a8, a9); + } else { + v99 = CONTOURNE1(a1, a2, a7, v80, v77, a8, a9, v92, v91); + } + } + if (v41 < v43) + v99 = CONTOURNE(a1, a2, v99, v80, v77, a8, a9); + if (v43 < v41) + v99 = CONTOURNE1(a1, a2, v99, v80, v77, a8, a9, v92, v91); + } + if (a1 > v80) { + v45 = a1 - v80; + if (a1 - v80 < 0) + v45 = -v45; + v46 = v45; + v47 = a1; + v48 = 0; + v53 = v91 + 1; + do { + if (v53 == v47) + v47 = v92; + ++v48; + ++v47; + if (v53 == v47) + v47 = v92; + } while (v80 != v47); + if (v46 == v48) { + v49 = Ligne[a1].field0 / 2; + v56 = Ligne[a1].field0 / 2; + if (v49 < 0) + v56 = -v49; + if (a2 > v56) { + v57 = Ligne[a1].field0 / 2; + if (v49 < 0) + v57 = -v49; + if (a2 >= v57) + v99 = CONTOURNE1(a1, a2, v99, v80, v77, a8, a9, v92, v91); + } else { + v99 = CONTOURNE(a1, a2, v99, v80, v77, a8, a9); + } + } + if (v46 < v48) + v99 = CONTOURNE(a1, a2, v99, v80, v77, a8, a9); + if (v48 < v46) + v99 = CONTOURNE1(a1, a2, v99, v80, v77, a8, a9, v92, v91); + } + if (a1 == v80) + v99 = CONTOURNE(a1, a2, v99, a1, v77, a8, a9); + do { + v64 = colision2_ligne(NVPX, NVPY, &v101, &v100, _vm->_objectsManager.DERLIGNE + 1, TOTAL_LIGNES); + if (v64 == 1) { + v50 = v100; + if (Ligne[v50].field4 == 1) + --NVPY; + if (Ligne[v50].field4 == 2) { + --NVPY; + ++NVPX; + } + if (Ligne[v50].field4 == 3) + ++NVPX; + if (Ligne[v50].field4 == 4) { + ++NVPY; + ++NVPX; + } + if (Ligne[v50].field4 == 5) + ++NVPY; + if (Ligne[v50].field4 == 6) { + ++NVPY; + --NVPX; + } + if (Ligne[v50].field4 == 7) + --NVPX; + if (Ligne[v50].field4 == 8) { + --NVPY; + --NVPX; + } + } + } while (v64); + } else { + NVPX = -1; + NVPY = -1; + } + return v99; +} + +// Avoid 2 +int16 *LinesManager::PARCOURS2(int a1, int a2, int destX, int destY) { + int v4; + int v5; + int v6; + int v7; + int v8; + int v9; + int v10; + int v11; + int v12; + int v14; + int v15; + int v16; + int v17; + int v18; + int v19; + int v20; + int v21; + int v22; + int v23; + int v24; + int v25; + int v26; + int v27; + int v28; + int v29; + int v31; + int v32; + int v33; + int v34; + 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; + int v54; + int v55; + int v56; + int v57; + int v58; + int v59; + int v60; + int v61; + int v62; + int v63; + int v64; + int v65; + int v66; + int v67; + int v68; + int i; + int16 *v70; + int v71; + int v72; + int j; + int16 *v74; + int v75; + int v76; + int v77; + int v78; + int v79; + int v80; + int16 *v81; + int v82; + int v83; + int16 *v84; + int v85; + int v86; + int v87; + int v88; + int v89; + int v90; + int16 *v91; + int v92; + int v93; + int v94; + int16 *v95; + int v96; + int v97; + int v98; + int v99; + int v100; + int v101; + int v102; + int v103; + int v104; + int v105; + int v106; + int v107; + int v108; + int v109; + int v110; + int v111; + int v112; + int v113; + int v114; + int v115; + int v116; + int v117; + int v118 = 0; + int v119 = 0; + int v120; + int v121; + int v122; + int v123; + int v124; + int v125; + int v126[10]; + int v131[10]; + int v136[10]; + int v141[10]; + + v123 = destX; + v122 = destY; + v121 = 0; + v120 = 0; + v115 = 0; + v114 = 0; + v113 = 0; + v111 = 0; + if (destY <= 24) + v122 = 25; + if (!_vm->_globals.NOT_VERIF) { + v4 = a1 - _vm->_globals.old_x1_65; + if (v4 < 0) + v4 = -v4; + if (v4 <= 4) { + v5 = a2 - _vm->_globals.old_y1_66; + if (v5 < 0) + v5 = -v5; + if (v5 <= 4) { + v6 = _vm->_globals.old_x2_67 - destX; + if (v6 < 0) + v6 = -v6; + if (v6 <= 4) { + v7 = _vm->_globals.old_y2_68 - v122; + if (v7 < 0) + v7 = -v7; + if (v7 <= 4) + return (int16 *)g_PTRNUL; + } + } + } + v8 = a1 - destX; + if (v8 < 0) + v8 = -v8; + if (v8 <= 4) { + v9 = a2 - v122; + if (v9 < 0) + v9 = -v9; + if (v9 <= 4) + return (int16 *)g_PTRNUL; + } + if (_vm->_globals.old_z_69 > 0 && _vm->_objectsManager.NUMZONE > 0 && _vm->_globals.old_z_69 == _vm->_objectsManager.NUMZONE) + return (int16 *)g_PTRNUL; + } + _vm->_globals.NOT_VERIF = 0; + _vm->_globals.old_z_69 = _vm->_objectsManager.NUMZONE; + _vm->_globals.old_x1_65 = a1; + _vm->_globals.old_x2_67 = destX; + _vm->_globals.old_y1_66 = a2; + _vm->_globals.old_y2_68 = v122; + _vm->_globals.STOP_BUG = 0; + v112 = 0; + if (destX <= 19) + v123 = 20; + if (v122 <= 19) + v122 = 20; + if (v123 > _vm->_graphicsManager.max_x - 10) + v123 = _vm->_graphicsManager.max_x - 10; + if (v122 > _vm->_globals.Max_Perso_Y) + v122 = _vm->_globals.Max_Perso_Y; + v10 = a1 - v123; + if (v10 < 0) + v10 = -v10; + if (v10 <= 3) { + v11 = a2 - v122; + if (v11 < 0) + v11 = -v11; + if (v11 <= 3) + return (int16 *)g_PTRNUL; + } + + for (v12 = 0; v12 <= 8; ++v12) { + v141[v12] = -1; + v136[v12] = 0; + v131[v12] = 1300; + v126[v12] = 1300; + ++v12; + } + + if (PARC_PERS(a1, a2, v123, v122, -1, -1, 0) != 1) { + v14 = 0; + v15 = v122; + if (_vm->_graphicsManager.max_y > v122) { + v16 = 5; + do { + v101 = v16; + v17 = colision2_ligne(v123, v15, &v136[3], &v141[3], 0, _vm->_objectsManager.DERLIGNE); + v16 = v101; + if (v17 == 1 && v141[v101] <= _vm->_objectsManager.DERLIGNE) + break; + v136[v101] = 0; + v141[v101] = -1; + ++v14; + ++v15; + } while (_vm->_graphicsManager.max_y > v15); + } + v131[3] = v14; + v18 = 0; + v19 = v122; + if (_vm->_graphicsManager.min_y < v122) { + v20 = 1; + do { + v102 = v20; + v21 = colision2_ligne(v123, v19, &v136[1], &v141[1], 0, _vm->_objectsManager.DERLIGNE); + v20 = v102; + if (v21 == 1 && v141[v102] <= _vm->_objectsManager.DERLIGNE) + break; + v136[v102] = 0; + v141[v102] = -1; + if (v131[3] < v18) { + if (v141[3] != -1) + break; + } + ++v18; + --v19; + } while (_vm->_graphicsManager.min_y < v19); + } + v131[1] = v18; + v22 = 0; + v23 = v123; + if (_vm->_graphicsManager.max_x > v123) { + v24 = 3; + do { + v103 = v24; + v25 = colision2_ligne(v23, v122, &v136[2], &v141[2], 0, _vm->_objectsManager.DERLIGNE); + v24 = v103; + if (v25 == 1 && v141[v103] <= _vm->_objectsManager.DERLIGNE) + break; + v136[v103] = 0; + v141[v103] = -1; + ++v22; + if (v131[1] < v22) { + if (v141[1] != -1) + break; + } + if (v131[3] < v22 && v141[3] != -1) + break; + ++v23; + } while (_vm->_graphicsManager.max_x > v23); + } + v131[2] = v22; + v26 = 0; + v27 = v123; + if (_vm->_graphicsManager.min_x < v123) { + v28 = 7; + do { + v104 = v28; + v29 = colision2_ligne(v27, v122, &v136[4], &v141[4], 0, _vm->_objectsManager.DERLIGNE); + v28 = v104; + if (v29 == 1 && v141[v104] <= _vm->_objectsManager.DERLIGNE) + break; + v136[v104] = 0; + v141[v104] = -1; + ++v26; + if (v131[1] < v26) { + if (v141[1] != -1) + break; + } + if (v131[3] < v26 && v141[3] != -1) + break; + if (v131[2] < v26 && v141[2] != -1) + break; + --v27; + } while (_vm->_graphicsManager.min_x < v27); + } + v131[4] = v26; + if (v141[1] < 0 || _vm->_objectsManager.DERLIGNE < v141[1]) + v141[1] = -1; + if (v141[2] < 0 || _vm->_objectsManager.DERLIGNE < v141[2]) + v141[2] = -1; + if (v141[3] < 0 || _vm->_objectsManager.DERLIGNE < v141[3]) + v141[3] = -1; + if (v141[4] < 0 || _vm->_objectsManager.DERLIGNE < v141[4]) + v141[4] = -1; + if (v141[1] < 0) + v131[1] = 1300; + if (v141[2] < 0) + v131[2] = 1300; + if (v141[3] < 0) + v131[3] = 1300; + if (v141[4] < 0) + v131[4] = 1300; + if (v141[1] == -1 && v141[2] == -1 && v141[3] == -1 && v141[4] == -1) + return (int16 *)g_PTRNUL; + v31 = 0; + if (v141[3] != -1 && v131[1] >= v131[3] && v131[2] >= v131[3] && v131[4] >= v131[3]) { + v121 = v141[3]; + v120 = v136[3]; + v31 = 1; + } + if (v141[1] != -1 && !v31 && v131[3] >= v131[1] && v131[2] >= v131[1] && v131[4] >= v131[1]) { + v121 = v141[1]; + v120 = v136[1]; + v31 = 1; + } + if (v141[2] != -1 && !v31 && v131[1] >= v131[2] && v131[3] >= v131[2] && v131[4] >= v131[2]) { + v121 = v141[2]; + v120 = v136[2]; + v31 = 1; + } + if (v141[4] != -1 && !v31 && v131[3] >= v131[4] && v131[2] >= v131[4] && v131[1] >= v131[4]) { + v121 = v141[4]; + v120 = v136[4]; + } + v32 = 0; + do { + v33 = v32; + v141[v33] = -1; + v136[v33] = 0; + v131[v33] = 1300; + v126[v33] = 1300; + ++v32; + } while (v32 <= 8); + + v34 = 0; + v35 = a2; + if (_vm->_graphicsManager.max_y > a2) { + v36 = 5; + do { + v105 = v36; + v37 = colision2_ligne(a1, v35, &v136[3], &v141[3], 0, _vm->_objectsManager.DERLIGNE); + v36 = v105; + if (v37 == 1 && v141[v105] <= _vm->_objectsManager.DERLIGNE) + break; + v136[v105] = 0; + v141[v105] = -1; + ++v34; + ++v35; + } while (_vm->_graphicsManager.max_y > v35); + } + v131[3] = v34 + 1; + v38 = 0; + v39 = a2; + if (_vm->_graphicsManager.min_y < a2) { + v40 = 1; + do { + v106 = v40; + v41 = colision2_ligne(a1, v39, &v136[1], &v141[1], 0, _vm->_objectsManager.DERLIGNE); + v40 = v106; + if (v41 == 1 && v141[v106] <= _vm->_objectsManager.DERLIGNE) + break; + v136[v106] = 0; + v141[v106] = -1; + ++v38; + if (v141[3] != -1) { + if (v38 > 80) + break; + } + --v39; + } while (_vm->_graphicsManager.min_y < v39); + } + v131[1] = v38 + 1; + v42 = 0; + v43 = a1; + if (_vm->_graphicsManager.max_x > a1) { + v44 = 3; + do { + v107 = v44; + v45 = colision2_ligne(v43, a2, &v136[2], &v141[2], 0, _vm->_objectsManager.DERLIGNE); + v44 = v107; + if (v45 == 1 && v141[v107] <= _vm->_objectsManager.DERLIGNE) + break; + v136[v107] = 0; + v141[v107] = -1; + ++v42; + if (v141[3] != -1 || v141[1] != -1) { + if (v42 > 100) + break; + } + ++v43; + } while (_vm->_graphicsManager.max_x > v43); + } + v131[2] = v42 + 1; + v46 = 0; + v47 = a1; + if (_vm->_graphicsManager.min_x < a1) { + v48 = 7; + do { + v108 = v48; + v49 = colision2_ligne(v47, a2, &v136[4], &v141[4], 0, _vm->_objectsManager.DERLIGNE); + v48 = v108; + if (v49 == 1 && v141[v108] <= _vm->_objectsManager.DERLIGNE) + break; + v136[v108] = 0; + v141[v108] = -1; + ++v46; + if (v141[3] != -1 || v141[1] != -1 || v141[2] != -1) { + if (v46 > 100) + break; + } + --v47; + } while (_vm->_graphicsManager.min_x < v47); + } + v131[4] = v46 + 1; + if (v141[1] != -1) { + v50 = v141[1] - v121; + if (v50 < 0) + v50 = -v50; + v126[1] = v50; + } + if (v141[2] != -1) { + v51 = v141[2] - v121; + if (v51 < 0) + v51 = -v51; + v126[2] = v51; + } + if (v141[3] != -1) { + v52 = v141[3] - v121; + if (v52 < 0) + v52 = -v52; + v126[3] = v52; + } + if (v141[4] != -1) { + v53 = v141[4] - v121; + if (v53 < 0) + v53 = -v53; + v126[4] = v53; + } + if (v141[1] == -1 && v141[2] == -1 && v141[3] == -1 && v141[4] == -1) + error("ERREUR POINT PLUS PROCHE Du perso NON TROUVE"); + v54 = 0; + if (v141[1] != -1 && v126[2] >= v126[1] && v126[3] >= v126[1] && v126[4] >= v126[1]) { + v54 = 1; + v115 = v141[1]; + v111 = v131[1]; + v113 = 1; + v114 = v136[1]; + } + if (!v54) { + if (v141[3] != -1 && v126[2] >= v126[3] && v126[1] >= v126[3] && v126[4] >= v126[3]) { + v54 = 1; + v115 = v141[3]; + v111 = v131[3]; + v113 = 5; + v114 = v136[3]; + } + if (!v54) { + if (v141[2] != -1 && v126[1] >= v126[2] && v126[3] >= v126[2] && v126[4] >= v126[2]) { + v54 = 1; + v115 = v141[2]; + v111 = v131[2]; + v113 = 3; + v114 = v136[2]; + } + if (!v54 && v141[4] != -1 && v126[1] >= v126[4] && v126[3] >= v126[4] && v126[2] >= v126[4]) { + v115 = v141[4]; + v111 = v131[4]; + v113 = 7; + v114 = v136[4]; + } + } + } + v55 = PARC_PERS(a1, a2, v123, v122, v115, v121, 0); + if (v55 != 1) { + if (v55 == 2) { +LABEL_201: + v115 = NV_LIGNEDEP; + v114 = NV_LIGNEOFS; + v112 = NV_POSI; + } else { + if (v113 == 1) { + v56 = 0; + if (v111 > 0) { + do { + if ((uint16)colision2_ligne(a1, a2 - v56, &v125, &v124, _vm->_objectsManager.DERLIGNE + 1, TOTAL_LIGNES) == 1 + && _vm->_objectsManager.DERLIGNE < v124) { + v57 = v112; + v58 = GENIAL(v124, v125, a1, a2 - v56, a1, a2 - v111, v112, &_vm->_globals.super_parcours[0], 4); + if (v58 == -1) + goto LABEL_282; + v112 = v58; + if (NVPY != -1) + v56 = a2 - NVPY; + } + v59 = v112; + _vm->_globals.super_parcours[v59] = a1; + _vm->_globals.super_parcours[v59 + 1] = a2 - v56; + _vm->_globals.super_parcours[v59 + 2] = 1; + _vm->_globals.super_parcours[v59 + 3] = 0; + v112 += 4; + ++v56; + } while (v111 > v56); + } + } + if (v113 == 5) { + v60 = 0; + if (v111 > 0) { + do { + if ((uint16)colision2_ligne(a1, v60 + a2, &v125, &v124, _vm->_objectsManager.DERLIGNE + 1, TOTAL_LIGNES) == 1 + && _vm->_objectsManager.DERLIGNE < v124) { + v57 = v112; + v61 = GENIAL(v124, v125, a1, v60 + a2, a1, v111 + a2, v112, &_vm->_globals.super_parcours[0], 4); + if (v61 == -1) + goto LABEL_282; + v112 = v61; + if (NVPY != -1) + v60 = NVPY - a2; + } + v62 = v112; + _vm->_globals.super_parcours[v62] = a1; + _vm->_globals.super_parcours[v62 + 1] = v60 + a2; + _vm->_globals.super_parcours[v62 + 2] = 5; + _vm->_globals.super_parcours[v62 + 3] = 0; + v112 += 4; + ++v60; + } while (v111 > v60); + } + } + if (v113 == 7) { + v63 = 0; + if (v111 > 0) { + do { + if ((uint16)colision2_ligne(a1 - v63, a2, &v125, &v124, _vm->_objectsManager.DERLIGNE + 1, TOTAL_LIGNES) == 1 + && _vm->_objectsManager.DERLIGNE < v124) { + v57 = v112; + v64 = GENIAL(v124, v125, a1 - v63, a2, a1 - v111, a2, v112, &_vm->_globals.super_parcours[0], 4); + if (v64 == -1) + goto LABEL_282; + v112 = v64; + if (NVPX != -1) + v63 = a1 - NVPX; + } + v65 = v112; + _vm->_globals.super_parcours[v65] = a1 - v63; + _vm->_globals.super_parcours[v65 + 1] = a2; + _vm->_globals.super_parcours[v65 + 2] = 7; + _vm->_globals.super_parcours[v65 + 3] = 0; + v112 += 4; + ++v63; + } while (v111 > v63); + } + } + if (v113 == 3) { + v66 = 0; + if (v111 > 0) { + do { + if ((uint16)colision2_ligne(v66 + a1, a2, &v125, &v124, _vm->_objectsManager.DERLIGNE + 1, TOTAL_LIGNES) == 1 + && _vm->_objectsManager.DERLIGNE < v124) { + v57 = v112; + v67 = GENIAL(v124, v125, v66 + a1, a2, v111 + a1, a2, v112, &_vm->_globals.super_parcours[0], 4); + if (v67 == -1) + goto LABEL_282; + v112 = v67; + if (NVPX != -1) + v66 = NVPX - a1; + } + v68 = v112; + _vm->_globals.super_parcours[v68] = v66 + a1; + _vm->_globals.super_parcours[v68 + 1] = a2; + _vm->_globals.super_parcours[v68 + 2] = 3; + _vm->_globals.super_parcours[v68 + 3] = 0; + v112 += 4; + ++v66; + } while (v111 > v66); + } + } + } +LABEL_234: + if (v115 < v121) { + for (i = v114; Ligne[v115].field0 > i; ++i) { + v70 = Ligne[v115].lineData; + v119 = v70[2 * i]; + v118 = v70[2 * i + 1]; + v71 = v112; + _vm->_globals.super_parcours[v71] = v119; + _vm->_globals.super_parcours[v71 + 1] = v118; + _vm->_globals.super_parcours[v71 + 2] = Ligne[v115].field6; + _vm->_globals.super_parcours[v71 + 3] = 0; + v112 += 4; + } + v116 = v115 + 1; + if ((v115 + 1) < v121) { + do { + v72 = 0; + v110 = v116; + for (j = v116; Ligne[j].field0 > v72; j = v116) { + v74 = Ligne[v110].lineData; + v119 = v74[2 * v72]; + v118 = v74[2 * v72 + 1]; + v75 = v112; + _vm->_globals.super_parcours[v75] = v119; + _vm->_globals.super_parcours[v75 + 1] = v118; + _vm->_globals.super_parcours[v75 + 2] = Ligne[v110].field6; + _vm->_globals.super_parcours[v75 + 3] = 0; + v112 += 4; + v76 = Ligne[v110].field0; + if (v76 > 30) { + v77 = v76 / 2; + if (v77 < 0) + v77 = -v77; + if (v72 == v77) { + v78 = PARC_PERS(v119, v118, v123, v122, v110, v121, v112); + if (v78 == 1) + return &_vm->_globals.super_parcours[0]; + if (v78 == 2) + goto LABEL_200; + if (MIRACLE(v119, v118, v110, v121, v112) == 1) + goto LABEL_201; + } + } + ++v72; + v110 = v116; + } + v79 = PARC_PERS(v119, v118, v123, v122, v116, v121, v112); + if (v79 == 1) + return &_vm->_globals.super_parcours[0]; + if (v79 == 2) { +LABEL_200: + v115 = NV_LIGNEDEP; + v114 = NV_LIGNEOFS; + v112 = NV_POSI; + goto LABEL_234; + } + if (MIRACLE(v119, v118, v116, v121, v112) == 1) + goto LABEL_201; + ++v116; + } while (v116 < v121); + } + v114 = 0; + v115 = v121; + } + if (v115 > v121) { + v80 = v114; + if (v114 > 0) { + v98 = v115; + do { + v81 = Ligne[v98].lineData; + v119 = v81[2 * v80]; + v118 = v81[2 * v80 + 1]; + + v82 = v112; + _vm->_globals.super_parcours[v82] = v119; + _vm->_globals.super_parcours[v82 + 1] = v118; + _vm->_globals.super_parcours[v82 + 2] = Ligne[v98].field8; + _vm->_globals.super_parcours[v82 + 3] = 0; + v112 += 4; + --v80; + } while (v80 > 0); + } + v117 = v115 - 1; + if ((v115 - 1) > v121) { + do { + v83 = Ligne[v117].field0 - 1; + if (v83 > -1) { + v109 = v117; + do { + v84 = Ligne[v109].lineData; + v119 = v84[2 * v83]; + v118 = v84[2 * v83 + 1]; + v85 = v112; + _vm->_globals.super_parcours[v85] = v119; + _vm->_globals.super_parcours[v85 + 1] = v118; + _vm->_globals.super_parcours[v85 + 2] = Ligne[v109].field8; + _vm->_globals.super_parcours[v85 + 3] = 0; + v112 += 4; + v86 = Ligne[v109].field0; + if (v86 > 30) { + v87 = v86 / 2; + if (v87 < 0) + v87 = -v87; + if (v83 == v87) { + v88 = PARC_PERS(v119, v118, v123, v122, v117, v121, v112); + if (v88 == 1) + return &_vm->_globals.super_parcours[0]; + if (v88 == 2) + goto LABEL_200; + if (MIRACLE(v119, v118, v117, v121, v112) == 1) + goto LABEL_201; + } + } + --v83; + } while (v83 > -1); + } + v89 = PARC_PERS(v119, v118, v123, v122, v117, v121, v112); + if (v89 == 1) + return &_vm->_globals.super_parcours[0]; + if (v89 == 2) + goto LABEL_200; + if (MIRACLE(v119, v118, v117, v121, v112) == 1) + goto LABEL_201; + --v117; + } while (v117 > v121); + } + v114 = Ligne[v121].field0 - 1; + v115 = v121; + } + if (v115 == v121) { + if (v114 <= v120) { + if (v114 < v120) { + v94 = v114; + v100 = v121; + do { + v95 = Ligne[v100].lineData; + v96 = v95[2 * v94 + 1]; + v97 = v112; + _vm->_globals.super_parcours[v97] = v95[2 * v94]; + _vm->_globals.super_parcours[v97 + 1] = v96; + _vm->_globals.super_parcours[v97 + 2] = Ligne[v100].field6; + _vm->_globals.super_parcours[v97 + 3] = 0; + v112 += 4; + ++v94; + } while (v120 > v94); + } + } else { + v90 = v114; + v99 = v121; + do { + v91 = Ligne[v99].lineData; + v92 = v91[2 * v90 + 1]; + v93 = v112; + _vm->_globals.super_parcours[v93] = v91[2 * v90]; + _vm->_globals.super_parcours[v93 + 1] = v92; + _vm->_globals.super_parcours[v93 + 2] = Ligne[v99].field8; + _vm->_globals.super_parcours[v93 + 3] = 0; + v112 += 4; + --v90; + } while (v120 < v90); + } + } + v57 = v112; + if (PARC_PERS( + _vm->_globals.super_parcours[v112 - 4], + _vm->_globals.super_parcours[v112 - 3], + v123, + v122, + -1, + -1, + v112) != 1) { +LABEL_282: + _vm->_globals.super_parcours[v57] = -1; + _vm->_globals.super_parcours[v57 + 1] = -1; + _vm->_globals.super_parcours[v57 + 2] = -1; + _vm->_globals.super_parcours[v57 + 3] = -1; + } + return &_vm->_globals.super_parcours[0]; + } + } + return &_vm->_globals.super_parcours[0]; +} + +int LinesManager::PARC_PERS(int a1, int a2, int a3, int a4, int a5, int a6, int a7) { + int v7; + int v8; + int v9; + int v10; + int v11; + int v12; + int v13; + int v14; + int v15; + int v16; + int16 *v17; + int v18; + int v19; + int v20; + int v21; + int v22; + int v23; + int v24; + int v25; + int16 *v26; + int v27; + int16 *v28; + int16 *v29; + int v30; + int v31; + int16 *v32; + int v33; + int v34; + int16 *v35; + int v36; + int v37; + int16 *v38; + int v39; + int v40; + int v41; + int16 *v42; + int v43; + int v44; + int v45; + int v46; + int16 *v47; + int v48; + int16 *v49; + int16 *v50; + int v51; + int v52; + int16 *v53; + int v54; + int v55; + int v56; + int16 *v57; + int v58; + int v59; + int16 *v60; + int v61; + int v62; + int v63; + int16 *v64; + int v65; + int v66; + int v67; + int v68; + int16 *v69; + int v70; + int16 *v71; + int16 *v72; + int v73; + int v74; + int v76; + int16 *v77; + int16 *v78; + int v79; + int16 *v80; + int v81; + int16 *v82; + int v83; + int16 *v84; + int v85; + int16 *v86; + int v87; + int16 *v88; + int v89; + int v90; + int v91; + int v92; + int v93; + int v94; + int v95; + int v96; + int v97; + int v98; + int v99; + int v100; + int v101; + int v102; + int v103; + int v104; + int v105; + int v106; + int v107; + int v108; + int v109; + int v110; + int v111; + int v112; + int v113; + int v114; + int v115; + int v116; + int v117; + int v118; + int v119; + int v120; + int v121; + int v122; + int v123; + int v124; + int v125; + int v126 = 0; + int v127; + int v128; + int v129; + int v130; + int v131; + int v132; + int v133; + int v134; + int v135; + int v136; + int v137; + int v138; + int v139; + int v140; + int v141; + int v142; + int v143; + int v144; + int v145; + int colResult = 0; + + v7 = a1; + v90 = a2; + v137 = a7; + v136 = 0; + if (a5 == -1 && a6 == -1) + v136 = 1; + v144 = a5; + if (colision2_ligne(a1, a2, &v145, &v144, 0, TOTAL_LIGNES) == 1) { + v8 = Ligne[v144].field4; + if (v8 == 1) + v90 = a2 - 2; + if (v8 == 2) { + v90 -= 2; + v7 = a1 + 2; + } + if (v8 == 3) + v7 += 2; + if (v8 == 4) { + v90 += 2; + v7 += 2; + } + if (v8 == 5) + v90 += 2; + if (v8 == 6) { + v90 += 2; + v7 -= 2; + } + if (v8 == 7) + v7 -= 2; + if (v8 == 8) { + v90 -= 2; + v7 -= 2; + } + } + v98 = v7; + v97 = v90; + v115 = 0; + v142 = -1; + v140 = -1; + v138 = -1; + + for (;;) { + v111 = v7; + v109 = v90; + if (a3 >= v7 - 2 && a3 <= v7 + 2 && a4 >= v90 - 2 && a4 <= v90 + 2) { +LABEL_149: + v27 = v115; + v28 = _vm->_globals.essai0; + v28[v27] = -1; + v28[v27 + 1] = -1; + v28[v27 + 2] = -1; + +LABEL_150: + if (v115) { + v127 = 0; + v116 = 0; + v29 = _vm->_globals.essai0; + do { + v30 = v137; + _vm->_globals.super_parcours[v30] = v29[v116]; + _vm->_globals.super_parcours[v30 + 1] = v29[v116 + 1]; + _vm->_globals.super_parcours[v30 + 2] = v29[v116 + 2]; + _vm->_globals.super_parcours[v30 + 3] = 0; + v116 += 3; + v137 += 4; + + if (v29[v116] == -1) { + if (v29[v116 + 1] == -1) + v127 = 1; + } + } while (v127 != 1); + } + goto LABEL_248; + } + v9 = v7 - a3; + if (v7 - a3 < 0) + v9 = -v9; + v10 = v9 + 1; + v11 = v90 - a4; + if (v90 - a4 < 0) + v11 = -v11; + v107 = v11 + 1; + if (v10 > (int16)(v11 + 1)) + v107 = v10; + v12 = v107 - 1; + v101 = 1000 * v10 / v12; + v99 = 1000 * (int16)(v11 + 1) / v12; + if (a3 < v7) + v101 = -v101; + if (a4 < v90) + v99 = -v99; + v13 = (int16)v101 / 1000; + v94 = (int16)v99 / 1000; + v91 = -1; + if ((int16)v99 / 1000 == -1 && (unsigned int)v101 <= 0x96) + v91 = 1; + if (v13 == 1) { + if ((unsigned int)(v99 + 1) <= 0x97) + v91 = 3; + if ((unsigned int)v99 <= 0x96) + v91 = 3; + } + if (v94 == 1) { + if ((unsigned int)v101 <= 0x96) + v91 = 5; + if ((unsigned int)(v101 + 150) <= 0x96) + v91 = 5; + } + if (v13 == -1) { + if ((unsigned int)v99 <= 0x96) + v91 = 7; + if ((unsigned int)(v99 + 150) <= 0x96) + v91 = 7; + } + if (v94 == -1 && (unsigned int)(v101 + 150) <= 0x96) + v91 = 1; + if (v91 == -1 && !VERIF_SMOOTH(v7, v109, a3, a4) && SMOOTH_MOVE(v7, v109, a3, a4) != -1) + break; +LABEL_72: + v19 = v111 - a3; + if (v111 - a3 < 0) + v19 = -v19; + v20 = v19 + 1; + v95 = v109 - a4; + if (v95 < 0) + v95 = -(v109 - a4); + v108 = v95 + 1; + if (v20 > (int16)(v95 + 1)) + v108 = v20; + if (v108 <= 10) + goto LABEL_149; + v21 = v108 - 1; + v102 = 1000 * v20 / v21; + v100 = 1000 * (int16)(v95 + 1) / v21; + if (a3 < v111) + v102 = -v102; + if (a4 < v109) + v100 = -v100; + v22 = (int16)v102 / 1000; + v96 = (int16)v100 / 1000; + v106 = 1000 * v111; + v105 = 1000 * v109; + v104 = 1000 * v111 / 1000; + v103 = v105 / 1000; + if (!((int16)v102 / 1000) && v96 == -1) + v91 = 1; + if (v22 == 1) { + if (v96 == -1) + v91 = 2; + if (!v96) + v91 = 3; + if (v96 == 1) + v91 = 4; + } + if (!v22 && v96 == 1) + v91 = 5; + if (v22 != -1) + goto LABEL_103; + if (v96 == 1) + v91 = 6; + if (!v96) + v91 = 7; + if (v96 == -1) { + v91 = 8; +LABEL_103: + if (v96 == -1) { + if ((unsigned int)v102 <= 0x1FE) + v91 = 1; + if ((unsigned int)(v102 - 510) <= 0x1EA) + v91 = 2; + } + } + if (v22 == 1) { + if ((unsigned int)(v100 + 1) <= 0x1FF) + v91 = 2; + if ((unsigned int)(v100 + 510) <= 0x1FE) + v91 = 3; + if ((unsigned int)v100 <= 0x1FE) + v91 = 3; + if ((unsigned int)(v100 - 510) <= 0x1EA) + v91 = 4; + } + if (v96 == 1) { + if ((unsigned int)(v102 - 510) <= 0x1EA) + v91 = 4; + if ((unsigned int)v102 <= 0x1FE) + v91 = 5; + if (v102 >= -1 && v102 <= -510) + v91 = 6; + if ((unsigned int)(v102 + 510) <= 0x1FE) + v91 = 5; + } + if (v22 == -1) { + if ((unsigned int)(v100 - 510) <= 0x1EA) + v91 = 6; + if ((unsigned int)v100 <= 0x1FE) + v91 = 7; + if ((unsigned int)(v100 + 1000) <= 0x1EA) + v91 = 8; + if ((unsigned int)(v100 + 510) <= 0x1FE) + v91 = 7; + } + if (v96 == -1) { + if ((unsigned int)(v102 + 1000) <= 0x1EA) + v91 = 8; + if ((unsigned int)(v102 + 510) <= 0x1FE) + v91 = 1; + } + v23 = 0; + if (v108 + 1 <= 0) + goto LABEL_149; + while (colision2_ligne(v104, v103, &v143, &v142, 0, TOTAL_LIGNES) != 1) { + v25 = v115; + v26 = _vm->_globals.essai0; + v26[v25] = v104; + v26[v25 + 1] = v103; + v26[v25 + 2] = v91; + v106 += v102; + v105 += v100; + v104 = v106 / 1000; + v103 = v105 / 1000; + v115 += 3; + ++v23; + if (v23 >= v108 + 1) + goto LABEL_149; + } + if (_vm->_objectsManager.DERLIGNE >= v142) + goto LABEL_157; + v24 = GENIAL(v142, v143, v104, v103, a3, a4, v115, _vm->_globals.essai0, 3); + if (v24 == -1) + goto LABEL_150; + v115 = v24; + if (NVPX != -1 || NVPY != -1) { +LABEL_67: + v142 = -1; + goto LABEL_157; + } + v7 = -1; + v90 = -1; + } + v91 = SMOOTH_SENS; + v14 = 0; + while (1) { + v15 = SMOOTH[v14].field0; + v112 = v15; + v110 = SMOOTH[v14].field2; + if (v15 == -1 || SMOOTH[v14].field2 == -1) { + v126 = 1; + goto LABEL_70; + } + if (colision2_ligne(v15, v110, &v143, &v142, 0, TOTAL_LIGNES) == 1) + break; + v16 = v115; + + v17 = _vm->_globals.essai0; + v17[v16] = v112; + v17[v16 + 1] = v110; + v17[v16 + 2] = v91; + v115 += 3; + ++v14; +LABEL_70: + if (v126 == 1) { + v18 = v14 - 1; + v111 = SMOOTH[v18].field0; + v109 = SMOOTH[v18].field2; + goto LABEL_72; + } + } + if (v142 > _vm->_objectsManager.DERLIGNE) + goto LABEL_67; +LABEL_157: + v31 = v115; + v32 = _vm->_globals.essai0; + v32[v31] = -1; + v32[v31 + 1] = -1; + v32[v31 + 2] = -1; + + v117 = 0; + v33 = v98; + v92 = v97; +LABEL_158: + v113 = v33; + if (a3 >= v33 - 2 && a3 <= v33 + 2 && a4 >= v92 - 2 && a4 <= v92 + 2) + goto LABEL_194; + if (v33 >= a3) { +LABEL_165: + if (v113 > a3) { + v36 = v113; + while (colision2_ligne(v36, v92, &v141, &v140, 0, TOTAL_LIGNES) != 1) { + v37 = v117; + v38 = _vm->_globals.essai1; + v38[v37] = v36; + v38[v37 + 1] = v92; + v38[v37 + 2] = 7; + v117 += 3; + --v36; + if (a3 >= v36) + goto LABEL_171; + } + goto LABEL_168; + } +LABEL_171: + if (v92 >= a4) { +LABEL_181: + if (v92 > a4) { + v43 = v92; + do { + if (colision2_ligne(a3, v43, &v141, &v140, 0, TOTAL_LIGNES) == 1) { + if (_vm->_objectsManager.DERLIGNE < v140) { + v44 = GENIAL(v140, v141, a3, v43, a3, a4, v117, _vm->_globals.essai1, 3); + if (v44 == -1) + goto LABEL_195; + v117 = v44; + if (NVPX != -1) { + if (NVPY != -1) { + v33 = NVPX; + v92 = NVPY; + v45 = colision2_ligne(NVPX, NVPY, &v141, &v140, 0, _vm->_objectsManager.DERLIGNE); + goto LABEL_189; + } + } + } + if (v140 <= _vm->_objectsManager.DERLIGNE) + goto LABEL_202; + } + v46 = v117; + v47 = _vm->_globals.essai1; + v47[v46] = a3; + v47[v46 + 1] = v43; + v47[v46 + 2] = 1; + v117 += 3; + --v43; + } while (a4 < v43); + } +LABEL_194: + v48 = v117; + v49 = _vm->_globals.essai1; + v49[v48] = -1; + v49[v48 + 1] = -1; + v49[v48 + 2] = -1; +LABEL_195: + if (v117) { + v128 = 0; + v118 = 0; + v50 = _vm->_globals.essai1; + do { + v51 = v137; + _vm->_globals.super_parcours[v51] = v50[v118]; + _vm->_globals.super_parcours[v51 + 1] = v50[v118 + 1]; + _vm->_globals.super_parcours[v51 + 2] = v50[v118 + 2]; + _vm->_globals.super_parcours[v51 + 3] = 0; + v118 += 3; + v137 += 4; + if (v50[v118] == -1 && v50[v118 + 1] == -1) + v128 = 1; + } while (v128 != 1); + } + goto LABEL_248; + } + v39 = v92; + while (1) { + if (colision2_ligne(a3, v39, &v141, &v140, 0, TOTAL_LIGNES) == 1) { + if (_vm->_objectsManager.DERLIGNE < v140) { + v40 = GENIAL(v140, v141, a3, v39, a3, a4, v117, _vm->_globals.essai1, 3); + if (v40 == -1) + goto LABEL_195; + v117 = v40; + if (NVPX != -1) { + if (NVPY != -1) { + v33 = NVPX; + v92 = NVPY; + v45 = colision2_ligne(NVPX, NVPY, &v141, &v140, 0, _vm->_objectsManager.DERLIGNE); +LABEL_189: + if (v45 == 1 && v140 <= _vm->_objectsManager.DERLIGNE) + goto LABEL_202; + goto LABEL_158; + } + } + } + if (v140 <= _vm->_objectsManager.DERLIGNE) + goto LABEL_202; + } + v41 = v117; + + v42 = _vm->_globals.essai1; + v42[v41] = a3; + v42[v41 + 1] = v39; + v42[v41 + 2] = 5; + v117 += 3; + ++v39; + if (a4 <= v39) + goto LABEL_181; + } + } + while (colision2_ligne(v33, v92, &v141, &v140, 0, TOTAL_LIGNES) != 1) { + v34 = v117; + v35 = _vm->_globals.essai1; + v35[v34] = v33; + v35[v34 + 1] = v92; + v35[v34 + 2] = 3; + v117 += 3; + ++v33; + if (a3 <= v33) + goto LABEL_165; + } +LABEL_168: + if (v140 > _vm->_objectsManager.DERLIGNE) + v140 = -1; +LABEL_202: + v52 = v117; + v53 = _vm->_globals.essai1; + v53[v52] = -1; + v53[v52 + 1] = -1; + v53[v52 + 2] = -1; + v117 = 0; + v54 = v98; + v93 = v97; +LABEL_203: + v114 = v54; + if (a3 >= v54 - 2 && a3 <= v54 + 2 && a4 >= v93 - 2 && a4 <= v93 + 2) + goto LABEL_241; + if (v93 < a4) { + v55 = v93; + while (colision2_ligne(v114, v55, &v139, &v138, 0, TOTAL_LIGNES) != 1) { + v56 = v117; + v57 = _vm->_globals.essai2; + v57[v56] = v114; + v57[v56 + 1] = v55; + v57[v56 + 2] = 5; + v117 += 3; + ++v55; + if (a4 <= v55) + goto LABEL_211; + } + goto LABEL_214; + } +LABEL_211: + if (v93 > a4) { + v58 = v93; + while (colision2_ligne(v114, v58, &v139, &v138, 0, TOTAL_LIGNES) != 1) { + v59 = v117; + v60 = _vm->_globals.essai2; + v60[v59] = v114; + v60[v59 + 1] = v58; + v60[v59 + 2] = 1; + v117 += 3; + --v58; + if (a4 >= v58) + goto LABEL_217; + } +LABEL_214: + if (v138 > _vm->_objectsManager.DERLIGNE) + v138 = -1; +LABEL_249: + v76 = v117; + v77 = _vm->_globals.essai2; + v77[v76] = -1; + v77[v76 + 1] = -1; + v77[v76 + 2] = -1; + + if (v136 != 1) { + if (a6 > v144) { + if (_vm->_globals.essai0[0] != -1 && v142 > v144 && v140 <= v142 && v138 <= v142 && a6 >= v142) { + NV_LIGNEDEP = v142; + NV_LIGNEOFS = v143; + v130 = 0; + v120 = 0; + v78 = _vm->_globals.essai0; + do { + v79 = v137; + _vm->_globals.super_parcours[v79] = v78[v120]; + _vm->_globals.super_parcours[v79 + 1] = v78[v120 + 1]; + _vm->_globals.super_parcours[v79 + 2] = v78[v120 + 2]; + _vm->_globals.super_parcours[v79 + 3] = 0; + v120 += 3; + v137 += 4; + if (v78[v120] == -1 && v78[v120 + 1] == -1) + v130 = 1; + } while (v130 != 1); +LABEL_323: + NV_POSI = v137; + return 2; + } + v80 = _vm->_globals.essai1; + if (_vm->_globals.essai1[0] != -1 && v144 < v140 && v138 <= v140 && v142 <= v140 && a6 >= v140) { + NV_LIGNEDEP = v140; + NV_LIGNEOFS = v141; + v131 = 0; + v121 = 0; + do { + assert(137 <= 32000); + v81 = v137; + _vm->_globals.super_parcours[v81] = v80[v121]; + _vm->_globals.super_parcours[v81 + 1] = v80[v121 + 1]; + _vm->_globals.super_parcours[v81 + 2] = v80[v121 + 2]; + _vm->_globals.super_parcours[v81 + 3] = 0; + v121 += 3; + v137 += 4; + if (v80[v121] == -1 && v80[v121 + 1] == -1) + v131 = 1; + } while (v131 != 1); +LABEL_301: + NV_POSI = v137; + return 2; + } + v82 = _vm->_globals.essai2; + if (_vm->_globals.essai2[0] != -1) { + if (v144 < v138 && v140 < v138 && v142 < v138 && a6 >= v138) { + NV_LIGNEDEP = v138; + NV_LIGNEOFS = v139; + v132 = 0; + v122 = 0; + do { + assert(v137 <= 32000); + v83 = v137; + _vm->_globals.super_parcours[v83] = v82[v122]; + _vm->_globals.super_parcours[v83 + 1] = v82[v122 + 1]; + _vm->_globals.super_parcours[v83 + 2] = v82[v122 + 2]; + _vm->_globals.super_parcours[v83 + 3] = 0; + v122 += 3; + v137 += 4; + if (v82[v122] == -1 && v82[v122 + 1] == -1) + v132 = 1; + } while (v132 != 1); +LABEL_312: + NV_POSI = v137; + return 2; + } + } + } + if (a6 < v144) { + if (v142 == -1) + v142 = 1300; + if (v140 == -1) + v142 = 1300; + if (v138 == -1) + v142 = 1300; + if (_vm->_globals.essai1[0] != -1 && v140 < v144 && v138 >= v140 && v142 >= v140 && a6 <= v140) { + NV_LIGNEDEP = v140; + NV_LIGNEOFS = v141; + v133 = 0; + v123 = 0; + v84 = _vm->_globals.essai1; + do { + assert(137 <= 32000); + v85 = v137; + _vm->_globals.super_parcours[v85] = v84[v123]; + _vm->_globals.super_parcours[v85 + 1] = v84[v123 + 1]; + _vm->_globals.super_parcours[v85 + 2] = v84[v123 + 2]; + _vm->_globals.super_parcours[v85 + 3] = 0; + v123 += 3; + v137 += 4; + if (v84[v123] == -1 && v84[v123 + 1] == -1) + v133 = 1; + } while (v133 != 1); + goto LABEL_301; + } + v86 = _vm->_globals.essai2; + if (_vm->_globals.essai2[0] != -1 && v144 > v138 && v140 >= v138 && v142 >= v138 && a6 <= v138) { + NV_LIGNEDEP = v138; + NV_LIGNEOFS = v139; + v134 = 0; + v124 = 0; + do { + assert(137 <= 32000); + v87 = v137; + _vm->_globals.super_parcours[v87] = v86[v124]; + _vm->_globals.super_parcours[v87 + 1] = v86[v124 + 1]; + _vm->_globals.super_parcours[v87 + 2] = v86[v124 + 2]; + _vm->_globals.super_parcours[v87 + 3] = 0; + v124 += 3; + v137 += 4; + if (v86[v124] == -1 && v86[v124 + 1] == -1) + v134 = 1; + } while (v134 != 1); + goto LABEL_312; + } + if (_vm->_globals.essai1[0] != -1 && v144 > v142 && v140 >= v142 && v138 >= v142 && a6 <= v142) { + NV_LIGNEDEP = v142; + NV_LIGNEOFS = v143; + v135 = 0; + v125 = 0; + v88 = _vm->_globals.essai0; + do { + assert(137 <= 32000); + v89 = v137; + _vm->_globals.super_parcours[v89] = v88[v125]; + _vm->_globals.super_parcours[v89 + 1] = v88[v125 + 1]; + _vm->_globals.super_parcours[v89 + 2] = v88[v125 + 2]; + _vm->_globals.super_parcours[v89 + 3] = 0; + v125 += 3; + v137 += 4; + if (v88[v125] == -1 && v88[v125 + 1] == -1) + v135 = 1; + } while (v135 != 1); + goto LABEL_323; + } + } + } + return 0; + } +LABEL_217: + if (v114 < a3) { + v61 = v114; + do { + if (colision2_ligne(v61, a4, &v139, &v138, 0, TOTAL_LIGNES) == 1) { + if (_vm->_objectsManager.DERLIGNE < v138) { + v62 = GENIAL(v138, v139, v61, a4, a3, a4, v117, _vm->_globals.essai2, 3); + if (v62 == -1) + goto LABEL_195; + v117 = v62; + if (NVPX != -1) { + if (NVPY != -1) { + v54 = NVPX; + v93 = NVPY; + colResult = colision2_ligne(NVPX, NVPY, &v139, &v138, 0, _vm->_objectsManager.DERLIGNE); +LABEL_235: + if (colResult == 1 && v138 <= _vm->_objectsManager.DERLIGNE) + goto LABEL_249; + goto LABEL_203; + } + } + } + if (v138 <= _vm->_objectsManager.DERLIGNE) + goto LABEL_249; + } + v63 = v117; + + v64 = _vm->_globals.essai2; + v64[v63] = v61; + v64[v63 + 1] = a4; + v64[v63 + 2] = 3; + v117 += 3; + ++v61; + } while (a3 > v61); + } + if (v114 > a3) { + v65 = v114; + do { + if (colision2_ligne(v65, a4, &v139, &v138, 0, TOTAL_LIGNES) == 1) { + if (_vm->_objectsManager.DERLIGNE < v138) { + v66 = GENIAL(v138, v139, v65, a4, a3, a4, v117, _vm->_globals.essai2, 3); + if (v66 == -1) + goto LABEL_242; + v117 = v66; + if (NVPX != -1) { + if (NVPY != -1) { + v54 = NVPX; + v93 = NVPY; + v67 = colision2_ligne(NVPX, NVPY, &v139, &v138, 0, _vm->_objectsManager.DERLIGNE); + goto LABEL_235; + } + } + } + if (v138 <= _vm->_objectsManager.DERLIGNE) + goto LABEL_249; + } + v68 = v117; + v69 = _vm->_globals.essai2; + v69[v68] = v65; + v69[v68 + 1] = a4; + v69[v68 + 2] = 7; + v117 += 3; + --v65; + } while (a3 < v65); + } + v138 = -1; +LABEL_241: + v70 = v117; + v71 = _vm->_globals.essai2; + v71[v70] = -1; + v71[v70 + 1] = -1; + v71[v70 + 2] = -1; +LABEL_242: + if (v117) { + v129 = 0; + v119 = 0; + v72 = _vm->_globals.essai2; + do { + v73 = v137; + _vm->_globals.super_parcours[v73] = v72[v119]; + _vm->_globals.super_parcours[v73 + 1] = v72[v119 + 1]; + _vm->_globals.super_parcours[v73 + 2] = v72[v119 + 2]; + _vm->_globals.super_parcours[v73 + 3] = 0; + v119 += 3; + v137 += 4; + if (v72[v119] == -1 && v72[v119 + 1] == -1) + v129 = 1; + } while (v129 != 1); + } +LABEL_248: + v74 = v137; + _vm->_globals.super_parcours[v74] = -1; + _vm->_globals.super_parcours[v74 + 1] = -1; + _vm->_globals.super_parcours[v74 + 2] = -1; + _vm->_globals.super_parcours[v74 + 3] = -1; + return 1; +} + +int LinesManager::VERIF_SMOOTH(int a1, int a2, int a3, int a4) { + int v4; + int v5; + int v6; + int v7; + int v8; + int v9; + int v11; + int v12; + int v13; + int v14; + int v15; + int v16; + int v17; + int v18; + + v4 = a1 - a3; + if (a1 - a3 < 0) + v4 = -v4; + v5 = v4 + 1; + v11 = a2 - a4; + if (a2 - a4 < 0) + v11 = -(a2 - a4); + v13 = v11 + 1; + if (v5 > (int)(v11 + 1)) + v13 = v5; + if (v13 <= 10) + return -1; + v6 = v13 - 1; + v16 = 1000 * v5 / v6; + v15 = 1000 * (int)(v11 + 1) / v6; + if (a3 < a1) + v16 = -v16; + if (a4 < a2) + v15 = -v15; + v7 = 1000 * a1; + v8 = 1000 * a2; + v9 = 1000 * a1 / 1000; + v12 = 1000 * a2 / 1000; + v14 = 0; + if (v13 + 1 > 0) { + while (colision2_ligne(v9, v12, &v18, &v17, 0, TOTAL_LIGNES) != 1 || v17 > _vm->_objectsManager.DERLIGNE) { + v7 += v16; + v8 += v15; + v9 = v7 / 1000; + v12 = v8 / 1000; + ++v14; + if (v14 >= v13 + 1) + return 0; + } + return -1; + } + return 0; +} + +int LinesManager::SMOOTH_MOVE(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; + int v15; + int v16; + int v17; + int v18; + int v19; + int v20; + int v21; + int v22; + int v23; + int v24; + int v25; + int v26; + int v27; + int v28; + int v29; + int v30; + int v31; + int v32; + int v33; + int v34; + int v35; + 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 = 0; + int v50; + int v51; + int v52; + int v53; + int v54; + int v55; + int v56; + int v57; + int v58; + int v59; + int v60; + int v61; + int v62; + int v63; + + v62 = a3; + v63 = a4; + if (a3 >= a5 || a6 >= a4) { + if (a3 <= a5 || a6 >= a4) { + if (a3 >= a5 || a6 <= a4) { + if (a3 > a5 && a6 > a4) { + v53 = 36; + v61 = 0; + v57 = 0; + do { + v25 = _vm->_globals.Hopkins[v53].field0; + v40 = _vm->_globals.Hopkins[v53].field2; + v26 = _vm->_globals.STAILLE[v63]; + if (v26 < 0) { + v27 = v26; + v28 = v26; + if (v26 < 0) + v28 = -v26; + v48 = _vm->_globals.STAILLE[v63]; + v45 = v63; + v25 = _vm->_graphicsManager.Reel_Reduc(v25, v28); + v29 = v27; + if ((v27 & 0x80000000u) != 0) + v29 = -v27; + v40 = _vm->_graphicsManager.Reel_Reduc(v40, v29); + v63 = v45; + v26 = v48; + } + if (v26 > 0) { + v30 = v26; + v31 = v26; + if (v26 < 0) + v31 = -v26; + v46 = v63; + v25 = _vm->_graphicsManager.Reel_Zoom(v25, v31); + v32 = v30; + if ((v30 & 0x80000000u) != 0) + v32 = -v30; + v40 = _vm->_graphicsManager.Reel_Zoom(v40, v32); + v63 = v46; + } + v33 = v63 + v40; + v34 = 0; + if (v25 > 0) { + do { + --v62; + SMOOTH[v61].field0 = v62; + if (v63 != v33) + v63 = v63 + 1; + SMOOTH[v61++].field2 = v63; + ++v34; + } while (v34 < v25); + } + ++v53; + if (v53 == 48) + v53 = 36; + ++v57; + if (v62 <= a5 || a6 <= v63) + v49 = 1; + } while (v49 != 1); + if (v57 > 5) { + v35 = v61; + SMOOTH[v35].field0 = -1; + SMOOTH[v35].field2 = -1; + _vm->_linesManager.SMOOTH_SENS = 6; + goto LABEL_85; + } + } + } else { + v52 = 36; + v60 = 0; + v56 = 0; + do { + v14 = _vm->_globals.Hopkins[v52].field0; + v39 = _vm->_globals.Hopkins[v52].field2; + v15 = _vm->_globals.STAILLE[v63]; + if (v15 < 0) { + v16 = v15; + v17 = v15; + if (v15 < 0) + v17 = -v15; + v47 = _vm->_globals.STAILLE[v63]; + v43 = v63; + v14 = _vm->_graphicsManager.Reel_Reduc(v14, v17); + v18 = v16; + if ((v16 & 0x80000000u) != 0) + v18 = -v16; + v39 = _vm->_graphicsManager.Reel_Reduc(v39, v18); + v63 = v43; + v15 = v47; + } + if (v15 > 0) { + v19 = v15; + v20 = v15; + if (v15 < 0) + v20 = -v15; + v44 = v63; + v14 = _vm->_graphicsManager.Reel_Zoom(v14, v20); + v21 = v19; + if ((v19 & 0x80000000u) != 0) + v21 = -v19; + v39 = _vm->_graphicsManager.Reel_Zoom(v39, v21); + v63 = v44; + } + v22 = v63 + v39; + v23 = 0; + if (v14 > 0) { + do { + ++v62; + SMOOTH[v60].field0 = v62; + if (v63 != v22) + v63 = v63 + 1; + SMOOTH[v60++].field2 = v63; + ++v23; + } while (v23 < v14); + } + ++v52; + if (v52 == 48) + v52 = 36; + ++v56; + if (v62 >= a5 || a6 <= (int)v63) + v49 = 1; + } while (v49 != 1); + if (v56 > 5) { + v24 = v60; + SMOOTH[v24].field0 = -1; + SMOOTH[v24].field2 = -1; + _vm->_linesManager.SMOOTH_SENS = 4; + goto LABEL_85; + } + } + } else { + v51 = 12; + v59 = 0; + v55 = 0; + do { + v10 = _vm->_globals.Hopkins[v51].field2; + v42 = v63; + v11 = _vm->_graphicsManager.Reel_Reduc(_vm->_globals.Hopkins[v51].field0, 0x19u); + v38 = _vm->_graphicsManager.Reel_Reduc(v10, 0x19u); + v63 = v42; + v12 = 0; + if (v11 > 0) { + do { + --v62; + SMOOTH[v59].field0 = v62; + if ((uint16)v63 != (uint16)v42 + v38) + v63 = v63 - 1; + SMOOTH[v59++].field2 = v63; + ++v12; + } while (v12 < v11); + } + ++v51; + if (v51 == 24) + v51 = 12; + ++v55; + if (v62 <= a5 || a6 >= (int)v63) + v49 = 1; + } while (v49 != 1); + if (v55 > 5) { + v13 = 4 * v59; + SMOOTH[v13].field0 = -1; + SMOOTH[v13].field2 = -1; + _vm->_linesManager.SMOOTH_SENS = 8; + goto LABEL_85; + } + } + } else { + v50 = 12; + v58 = 0; + v54 = 0; + do { + v6 = _vm->_globals.Hopkins[v50].field2; + v41 = v63; + v7 = _vm->_graphicsManager.Reel_Reduc(_vm->_globals.Hopkins[v50].field0, 0x19u); + v37 = _vm->_graphicsManager.Reel_Reduc(v6, 0x19u); + v63 = v41; + v8 = 0; + if (v7 > 0) { + do { + ++v62; + SMOOTH[v58].field0 = v62; + if ((uint16)v63 != (uint16)v41 + v37) + v63 = v63 - 1; + SMOOTH[v58++].field2 = v63; + ++v8; + } while (v8 < v7); + } + ++v50; + if (v50 == 24) + v50 = 12; + ++v54; + if (v62 >= a5 || a6 >= (int)v63) + v49 = 1; + } while (v49 != 1); + if (v54 > 5) { + v9 = v58; + SMOOTH[v9].field0 = -1; + SMOOTH[v9].field2 = -1; + _vm->_linesManager.SMOOTH_SENS = 2; +LABEL_85: + SMOOTH_X = v62; + SMOOTH_Y = v63; + return 0; + } + } + 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; + int16 *v15; + int v16; + int v17; + int v18; + int v19; + int16 *v20; + int v21; + int v22; + int v23; + int16 *v25; + int16 *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].lineData; + v16 = v15[2 * v14]; + v29 = v15[2 * v14 + 1]; + 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; + v25[v18] = v16; + v25[v18 + 1] = v29; + v25[v18 + 2] = Ligne[v32].field6; + v25[v18 + 3] = 0; + } + v41 += 4; + ++v14; + } while (Ligne[v32].field0 > v14); + } + } + if (v33 == 2) { + v19 = Ligne[v34].field0 - 1; + if (v19 > -1) { + v31 = v34; + v26 = _vm->_globals.essai0; + do { + v20 = Ligne[v31].lineData; + v21 = v20[2 * v19]; + v30 = v20[2 * v19 + 1]; + if (a6) { + v23 = v41; + v26[v23] = v21; + v26[v23 + 1] = v30; + v26[v23 + 2] = Ligne[v31].field8; + v26[v23 + 3] = 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; +} + +// Test line +int LinesManager::TEST_LIGNE(int a1, int a2, int *a3, int *a4, int *a5) { + int i; + int v6; + int16 *v7; + int v8; + int v9; + int v10; + int v11; + int16 *v12; + int v13; + int v14; + int v15; + int v16; + int16 *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].lineData; + v8 = Ligne[v6].field0; + v23 = v7[2 * v8 - 2]; + v9 = v7[2 * v8 - 1]; + if (v7[0] == a1 && a2 == v7[1]) { + 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].lineData; + v13 = v12[2 * v11 - 2]; + v14 = v12[2 * v11 - 1]; + v15 = Ligne[v10].field6; + if (v15 == 5 || v15 == 1) + v14 += 2; + v16 = 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].lineData; + v18 = v17[0]; + v19 = v17[1]; + v20 = Ligne[v24].field6; + if (v20 == 5 || v20 == 1) + v19 -= 2; + v21 = 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 |