diff options
Diffstat (limited to 'engines/hopkins/objects.cpp')
-rw-r--r-- | engines/hopkins/objects.cpp | 238 |
1 files changed, 90 insertions, 148 deletions
diff --git a/engines/hopkins/objects.cpp b/engines/hopkins/objects.cpp index b715ac0b80..e0e49d7a67 100644 --- a/engines/hopkins/objects.cpp +++ b/engines/hopkins/objects.cpp @@ -2640,25 +2640,17 @@ void ObjectsManager::computeAndSetSpriteSize() { } void ObjectsManager::PACOURS_PROPRE(int16 *a1) { - int v1; - int v2; int v4; int v5; - int v6; - int v7; int v9; int v10; int v11; int v12; - int v13; - int v14; - int v15; - v1 = 0; - v13 = 0; - v14 = -1; - v2 = a1[1]; - v15 = a1[2]; + int v1 = 0; + int v14 = -1; + int v2 = a1[1]; + int v15 = a1[2]; if (a1[0] == -1 && v2 == -1) return; @@ -2670,21 +2662,18 @@ void ObjectsManager::PACOURS_PROPRE(int16 *a1) { v4 = a1[v1]; v9 = a1[v1]; v5 = a1[v1 + 1]; - v6 = 0; while (v4 != -1 || v5 != -1) { int idx = v1; v1 += 4; ++v12; if (a1[idx + 2] != v15) - v6 = 1; - if (v6 == 1) break; v4 = a1[v1]; v9 = a1[v1]; v5 = a1[v1 + 1]; } if (v12 < v10) { - v7 = v11; + int v7 = v11; for (int v8 = 0; v8 < v12; v8++) { a1[v7 + 2] = v14; v7 += 4; @@ -2693,30 +2682,22 @@ void ObjectsManager::PACOURS_PROPRE(int16 *a1) { } v1 = v11; if (v9 == -1 && v5 == -1) - v13 = 1; + break; } v1 += 4; - if (v13 == 1) - break; v14 = v15; v2 = a1[v1 + 1]; v15 = a1[v1 + 2]; - if (a1[v1] == -1) { - if (v2 == -1) - break; - } + if (a1[v1] == -1 && v2 == -1) + break; } } int16 *ObjectsManager::cityMapCarRoute(int x1, int y1, int x2, int y2) { int16 *result; - int v23; int v27; int v28; int v29; - int v34; - int v35; - int16 *v37; int16 *v41; int16 *v45; int v48; @@ -2781,11 +2762,7 @@ int16 *ObjectsManager::cityMapCarRoute(int x1, int y1, int x2, int y2) { break; arrDataIdx[7] = 0; arrLineIdx[7] = -1; - if (arrDelta[1] <= delta && arrLineIdx[1] != -1) - break; - if (arrDelta[5] <= delta && arrLineIdx[5] != -1) - break; - if (arrDelta[3] <= delta && arrLineIdx[3] != -1) + if ((arrDelta[1] <= delta && arrLineIdx[1] != -1) || arrDelta[3] <= delta && arrLineIdx[3] != -1 || arrDelta[5] <= delta && arrLineIdx[5] != -1) break; } arrDelta[7] = delta; @@ -2799,21 +2776,21 @@ int16 *ObjectsManager::cityMapCarRoute(int x1, int y1, int x2, int y2) { if (arrLineIdx[7] == -1) arrDelta[7] = 1300; if (arrLineIdx[1] != -1 || arrLineIdx[3] != -1 || arrLineIdx[5] != -1 || arrLineIdx[7] != -1) { - v23 = 0; + bool v23 = false; if (arrLineIdx[5] != -1 && arrDelta[1] >= arrDelta[5] && arrDelta[3] >= arrDelta[5] && arrDelta[7] >= arrDelta[5]) { v73 = arrLineIdx[5]; v72 = arrDataIdx[5]; - v23 = 1; + v23 = true; } if (arrLineIdx[1] != -1 && !v23 && arrDelta[5] >= arrDelta[1] && arrDelta[3] >= arrDelta[1] && arrDelta[7] >= arrDelta[1]) { v73 = arrLineIdx[1]; v72 = arrDataIdx[1]; - v23 = 1; + v23 = true; } if (arrLineIdx[3] != -1 && !v23 && arrDelta[1] >= arrDelta[3] && arrDelta[5] >= arrDelta[3] && arrDelta[7] >= arrDelta[3]) { v73 = arrLineIdx[3]; v72 = arrDataIdx[3]; - v23 = 1; + v23 = true; } if (arrLineIdx[7] != -1 && !v23 && arrDelta[5] >= arrDelta[7] && arrDelta[3] >= arrDelta[7] && arrDelta[1] >= arrDelta[7]) { v73 = arrLineIdx[7]; @@ -2862,17 +2839,14 @@ int16 *ObjectsManager::cityMapCarRoute(int x1, int y1, int x2, int y2) { } LABEL_90: if (v69 < v73) { - v34 = v68; - v35 = v68; - for (int i = _vm->_linesManager.Ligne[v69]._lineDataEndIdx; v35 < i - 2; i = _vm->_linesManager.Ligne[v69]._lineDataEndIdx) { - v37 = _vm->_linesManager.Ligne[v69]._lineData; - _vm->_globals.super_parcours[superRouteIdx] = v37[2 * v35]; - _vm->_globals.super_parcours[superRouteIdx + 1] = v37[2 * v35 + 1]; + int v34 = v68; + for (int i = _vm->_linesManager.Ligne[v69]._lineDataEndIdx; v34 < i - 2; i = _vm->_linesManager.Ligne[v69]._lineDataEndIdx) { + _vm->_globals.super_parcours[superRouteIdx] = _vm->_linesManager.Ligne[v69]._lineData[2 * v34]; + _vm->_globals.super_parcours[superRouteIdx + 1] = _vm->_linesManager.Ligne[v69]._lineData[2 * v34 + 1]; _vm->_globals.super_parcours[superRouteIdx + 2] = _vm->_linesManager.Ligne[v69].field6; _vm->_globals.super_parcours[superRouteIdx + 3] = 0; superRouteIdx += 4; ++v34; - v35 = v34; } for (j = v69 + 1; j < v73; ++j) { if (_vm->_linesManager.PLAN_TEST( @@ -3127,129 +3101,96 @@ void ObjectsManager::handleRightButton() { } int ObjectsManager::MZONE() { - signed int result; - int16 v2; - int v3; - int16 v4; - int16 v5; - int v6; - int v8; - int v9; - int16 yCurrent; - int16 v11; - int16 j; - int16 k; - int16 xCurrent; - int v15; - int16 v16; - int16 v17; - int16 v18; - int16 v19; - int16 yp; - int16 xp; + int result; - v19 = 0; - v18 = 0; - v17 = 0; - v16 = 0; - xp = _vm->_eventsManager._mousePos.x + _vm->_eventsManager._mouseOffset.x; - yp = _vm->_eventsManager._mousePos.y + _vm->_eventsManager._mouseOffset.y; + int xp = _vm->_eventsManager._mousePos.x + _vm->_eventsManager._mouseOffset.x; + int yp = _vm->_eventsManager._mousePos.y + _vm->_eventsManager._mouseOffset.y; if ((_vm->_eventsManager._mousePos.y + _vm->_eventsManager._mouseOffset.y) > 19) { for (int v1 = 0; v1 <= 48; v1++) { - v2 = _vm->_globals.BOBZONE[v1]; - if (v2) { - if (_vm->_globals.BOBZONE_FLAG[v1]) { - v3 = v2; - v15 = v3; - if (_vm->_globals._bob[v3].field0) { - if (_vm->_globals._bob[v3]._frameIndex != 250) { - if (!_vm->_globals._bob[v3]._disabledAnimationFl) { - v4 = _vm->_globals._bob[v3]._oldX; - if (xp > v4) { - if (xp < _vm->_globals._bob[v3]._oldWidth + v4) { - v5 = _vm->_globals._bob[v3]._oldY; - if (yp > v5) { - if (yp < _vm->_globals._bob[v3]._oldHeight + v5) { - v6 = v1; - if (_vm->_globals.ZONEP[v1].field4 == -1) { - _vm->_globals.ZONEP[v6]._destX = 0; - _vm->_globals.ZONEP[v1]._destY = 0; - } - if (!_vm->_globals.ZONEP[v6]._destX) { - if (!_vm->_globals.ZONEP[v1]._destY) { - _vm->_globals.ZONEP[v6]._destX = _vm->_globals._bob[v15]._oldWidth + _vm->_globals._bob[v15]._oldX; - _vm->_globals.ZONEP[v1]._destY = _vm->_globals._bob[v15]._oldHeight + _vm->_globals._bob[v15]._oldY + 6; - _vm->_globals.ZONEP[v1].field4 = -1; - } - } - return v1; - } - } - } - } - } - } + int v2 = _vm->_globals.BOBZONE[v1]; + if (v2 && _vm->_globals.BOBZONE_FLAG[v1] && _vm->_globals._bob[v2].field0 && _vm->_globals._bob[v2]._frameIndex != 250 && + !_vm->_globals._bob[v2]._disabledAnimationFl && xp > _vm->_globals._bob[v2]._oldX && + xp < _vm->_globals._bob[v2]._oldWidth + _vm->_globals._bob[v2]._oldX && yp > _vm->_globals._bob[v2]._oldY) { + if (yp < _vm->_globals._bob[v2]._oldHeight + _vm->_globals._bob[v2]._oldY) { + if (_vm->_globals.ZONEP[v1].field4 == -1) { + _vm->_globals.ZONEP[v1]._destX = 0; + _vm->_globals.ZONEP[v1]._destY = 0; } + if (!_vm->_globals.ZONEP[v1]._destX && !_vm->_globals.ZONEP[v1]._destY) { + _vm->_globals.ZONEP[v1]._destX = _vm->_globals._bob[v2]._oldWidth + _vm->_globals._bob[v2]._oldX; + _vm->_globals.ZONEP[v1]._destY = _vm->_globals._bob[v2]._oldHeight + _vm->_globals._bob[v2]._oldY + 6; + _vm->_globals.ZONEP[v1].field4 = -1; + } + return v1; } } } _vm->_globals.SegmentEnCours = 0; for (int v7 = 0; v7 <= 99; v7++) { - if (_vm->_globals.ZONEP[v7].field10 == 1) { - v8 = v7; - if (_vm->_globals.CarreZone[v8].field0 == 1) { - if (_vm->_globals.CarreZone[v7].field2 <= xp - && _vm->_globals.CarreZone[v7].field4 >= xp - && _vm->_globals.CarreZone[v7].field6 <= yp - && _vm->_globals.CarreZone[v7].field8 >= yp) { - if (_vm->_globals.CarreZone[v7].fieldE == 1) { - _vm->_globals.oldzone_46 = _vm->_linesManager._zoneLine[_vm->_globals.CarreZone[v7].fieldA].field2; - return _vm->_globals.oldzone_46; - } - v9 = _vm->_globals.SegmentEnCours; - _vm->_globals.Segment[v9].field2 = _vm->_globals.CarreZone[v7].fieldA; - _vm->_globals.Segment[v9].field4 = _vm->_globals.CarreZone[v7].fieldC; - ++_vm->_globals.SegmentEnCours; - } + if (_vm->_globals.ZONEP[v7].field10 == 1 && _vm->_globals.CarreZone[v7].field0 == 1 + && _vm->_globals.CarreZone[v7].field2 <= xp + && _vm->_globals.CarreZone[v7].field4 >= xp + && _vm->_globals.CarreZone[v7].field6 <= yp + && _vm->_globals.CarreZone[v7].field8 >= yp) { + if (_vm->_globals.CarreZone[v7].fieldE == 1) { + _vm->_globals.oldzone_46 = _vm->_linesManager._zoneLine[_vm->_globals.CarreZone[v7].fieldA].field2; + return _vm->_globals.oldzone_46; } + _vm->_globals.Segment[_vm->_globals.SegmentEnCours].field2 = _vm->_globals.CarreZone[v7].fieldA; + _vm->_globals.Segment[_vm->_globals.SegmentEnCours].field4 = _vm->_globals.CarreZone[v7].fieldC; + ++_vm->_globals.SegmentEnCours; } } - if (!_vm->_globals.SegmentEnCours) - goto LABEL_58; + if (!_vm->_globals.SegmentEnCours) { + _vm->_globals.oldzone_46 = -1; + return -1; + } - for (yCurrent = yp; yCurrent >= 0; --yCurrent) { - v11 = colision(xp, yCurrent); - v19 = v11; - if (v11 != -1 && _vm->_globals.ZONEP[v11].field10 == 1) + int colRes1 = 0; + for (int yCurrent = yp; yCurrent >= 0; --yCurrent) { + colRes1 = colision(xp, yCurrent); + if (colRes1 != -1 && _vm->_globals.ZONEP[colRes1].field10 == 1) break; } - if (v19 == -1) - goto LABEL_58; - for (j = yp; j < _vm->_graphicsManager.max_y; ++j) { - v18 = colision(xp, j); - if (v18 != -1 && _vm->_globals.ZONEP[v19].field10 == 1) + + if (colRes1 == -1) { + _vm->_globals.oldzone_46 = -1; + return -1; + } + + int colRes2 = 0; + for (int j = yp; j < _vm->_graphicsManager.max_y; ++j) { + colRes2 = colision(xp, j); + if (colRes2 != -1 && _vm->_globals.ZONEP[colRes1].field10 == 1) break; } - if (v18 == -1) - goto LABEL_58; - for (k = xp; k >= 0; --k) { - v16 = colision(k, yp); - if (v16 != -1 && _vm->_globals.ZONEP[v19].field10 == 1) + + if (colRes2 == -1) { + _vm->_globals.oldzone_46 = -1; + return -1; + } + + int colRes3 = 0; + for (int k = xp; k >= 0; --k) { + colRes3 = colision(k, yp); + if (colRes3 != -1 && _vm->_globals.ZONEP[colRes1].field10 == 1) break; } - if (v16 == -1) - goto LABEL_58; + if (colRes3 == -1) { + _vm->_globals.oldzone_46 = -1; + return -1; + } - for (xCurrent = xp; _vm->_graphicsManager.max_x > xCurrent; ++xCurrent) { - v17 = colision(xCurrent, yp); - if (v17 != -1 && _vm->_globals.ZONEP[v19].field10 == 1) + int colRes4 = 0; + for (int xCurrent = xp; _vm->_graphicsManager.max_x > xCurrent; ++xCurrent) { + colRes4 = colision(xCurrent, yp); + if (colRes4 != -1 && _vm->_globals.ZONEP[colRes1].field10 == 1) break; } - if (v19 == v18 && v19 == v16 && v19 == v17) { - _vm->_globals.oldzone_46 = v19; - result = v19; + if (colRes1 == colRes2 && colRes1 == colRes3 && colRes1 == colRes4) { + _vm->_globals.oldzone_46 = colRes1; + result = colRes1; } else { -LABEL_58: _vm->_globals.oldzone_46 = -1; result = -1; } @@ -3421,23 +3362,24 @@ void ObjectsManager::OPTI_OBJET() { if (data[0] != 'I' || data[1] != 'N' || data[2] != 'I') error("File %s is not an INI file", file.c_str()); - bool v7 = false; - do { + for (;;) { v5 = _vm->_scriptManager.handleOpcode(data + 20 * v0); if (_vm->shouldQuit()) return; if (v5 == 2) v0 = _vm->_scriptManager.handleGoto(data + 20 * v0); - if (v5 == 3) + else if (v5 == 3) v0 = _vm->_scriptManager.handleIf(data, v0); + if (v0 == -1) error("defective IFF function"); + if (v5 == 1 || v5 == 4) ++v0; if (!v5 || v5 == 5) - v7 = true; - } while (!v7); + break; + } _vm->_globals.freeMemory(data); } |