diff options
| author | Eugene Sandulenko | 2016-07-26 19:50:47 +0300 | 
|---|---|---|
| committer | Eugene Sandulenko | 2016-07-26 19:50:47 +0300 | 
| commit | e19922d181e775791f9105b8be7ff410770ede51 (patch) | |
| tree | b3c51a1ee51601284e57d76c049edafc0e0fc1f7 | |
| parent | a6efdf642238e0f54bedeb8cd0dfef6a93eb838e (diff) | |
| download | scummvm-rg350-e19922d181e775791f9105b8be7ff410770ede51.tar.gz scummvm-rg350-e19922d181e775791f9105b8be7ff410770ede51.tar.bz2 scummvm-rg350-e19922d181e775791f9105b8be7ff410770ede51.zip  | |
FULLPIPE: Few fixes to the pathfinding code
| -rw-r--r-- | engines/fullpipe/mgm.cpp | 83 | ||||
| -rw-r--r-- | engines/fullpipe/statics.cpp | 2 | 
2 files changed, 45 insertions, 40 deletions
diff --git a/engines/fullpipe/mgm.cpp b/engines/fullpipe/mgm.cpp index c64404cd13..ca2ec060e2 100644 --- a/engines/fullpipe/mgm.cpp +++ b/engines/fullpipe/mgm.cpp @@ -391,7 +391,7 @@ int MGM::countPhases(int idx, int subIdx, int endIdx, int flag) {  		if (subIdx < 0)  			break; -		res += _items[idx]->subItems[subIdx + endIdx * _items[idx]->statics.size()]->movement->countPhasesWithFlag(-1, flag); +		res += _items[idx]->subItems[subIdx + endIdx * _items[idx]->statics.size()]->movement->countPhasesWithFlag(0xffffffff, flag);  		subIdx = _items[idx]->subItems[subIdx + endIdx * _items[idx]->statics.size()]->staticsIndex;  	} @@ -476,7 +476,7 @@ int MGM::getStaticsIndexById(int idx, int16 id) {  			return i;  	} -	return 0; +	return -1;  }  int MGM::getStaticsIndex(int idx, Statics *st) { @@ -488,7 +488,7 @@ int MGM::getStaticsIndex(int idx, Statics *st) {  			return i;  	} -	return 0; +	return -1;  }  void MGM::clearMovements2(int idx) { @@ -513,54 +513,59 @@ int MGM::recalcOffsets(int idx, int st1idx, int st2idx, bool flip, bool flop) {  		Movement *mov = item->movements1[i];  		if (mov->_staticsObj1 == item->statics[st1idx]) { -			if (!item->movements2[i] && (!flop || mov->_field_50)) { -				item->movements2[i] = 1; +			if (item->movements2[i] || (flop && !mov->_field_50)) +				continue; -				int stidx = getStaticsIndex(idx, item->movements1[i]->_staticsObj2); -				int recalc = recalcOffsets(idx, stidx, st2idx, flip, flop); -				int sz = mov->_currMovement ? mov->_currMovement->_dynamicPhases.size() : mov->_dynamicPhases.size(); -				int newsz = sz + item->subItems[stidx + st2idx * _items[idx]->statics.size()]->field_C; +			item->movements2[i] = 1; -				if (recalc >= 0) { -					if (!item->subItems[subIdx]->movement || item->subItems[subIdx]->field_8 > recalc + 1 || -						(item->subItems[subIdx]->field_8 == recalc + 1 && item->subItems[subIdx]->field_C > newsz)) { -						item->subItems[subIdx]->movement = mov; -						item->subItems[subIdx]->staticsIndex = stidx; -						item->subItems[subIdx]->field_8 = recalc + 1; -						item->subItems[subIdx]->field_C = newsz; +			int stidx = getStaticsIndex(idx, mov->_staticsObj2); +			int recalc = recalcOffsets(idx, stidx, st2idx, flip, flop); +			int sz = mov->_currMovement ? mov->_currMovement->_dynamicPhases.size() : mov->_dynamicPhases.size(); +			int newsz = sz + item->subItems[stidx + st2idx * _items[idx]->statics.size()]->field_C; -						mov->calcSomeXY(point, 0, -1); +			if (recalc < 0) +				continue; -						item->subItems[subIdx]->x = item->subItems[stidx + st2idx * _items[idx]->statics.size()]->x + point.x; -						item->subItems[subIdx]->y = item->subItems[stidx + st2idx * _items[idx]->statics.size()]->y + point.y; -					} -				} +			if (!item->subItems[subIdx]->movement || item->subItems[subIdx]->field_8 > recalc + 1 || +				(item->subItems[subIdx]->field_8 == recalc + 1 && item->subItems[subIdx]->field_C > newsz)) { +				item->subItems[subIdx]->movement = mov; +				item->subItems[subIdx]->staticsIndex = stidx; +				item->subItems[subIdx]->field_8 = recalc + 1; +				item->subItems[subIdx]->field_C = newsz; + +				mov->calcSomeXY(point, 0, -1); + +				item->subItems[subIdx]->x = item->subItems[stidx + st2idx * _items[idx]->statics.size()]->x + point.x; +				item->subItems[subIdx]->y = item->subItems[stidx + st2idx * _items[idx]->statics.size()]->y + point.y;  			}  		} else if (flip) { -			if (mov->_staticsObj2 == item->statics[st1idx]) { -				if (!item->movements2[i] && (!flop || mov->_field_50)) { -					item->movements2[i] = 1; +			if (mov->_staticsObj2 != item->statics[st1idx]) +				continue; -					int stidx = getStaticsIndex(idx, mov->_staticsObj1); -					int recalc = recalcOffsets(idx, stidx, st2idx, flip, flop); +			if (item->movements2[i] || (flop && !mov->_field_50)) +				continue; -					if (recalc >= 0) { -						if (!item->subItems[subIdx]->movement || item->subItems[subIdx]->field_8 > recalc + 1) { -							item->subItems[subIdx]->movement = mov; -							item->subItems[subIdx]->staticsIndex = stidx; -							item->subItems[subIdx]->field_8 = recalc + 1; +			item->movements2[i] = 1; -							int sz = mov->_currMovement ? mov->_currMovement->_dynamicPhases.size() : mov->_dynamicPhases.size(); +			int stidx = getStaticsIndex(idx, mov->_staticsObj1); +			int recalc = recalcOffsets(idx, stidx, st2idx, flip, flop); -							item->subItems[subIdx]->field_C = sz + item->subItems[stidx + st2idx * _items[idx]->statics.size()]->field_C; +			if (recalc < 0) +				continue; -							mov->calcSomeXY(point, 0, -1); +			if (!item->subItems[subIdx]->movement || item->subItems[subIdx]->field_8 > recalc + 1) { +				item->subItems[subIdx]->movement = mov; +				item->subItems[subIdx]->staticsIndex = stidx; +				item->subItems[subIdx]->field_8 = recalc + 1; -							item->subItems[subIdx]->x = item->subItems[stidx + st2idx * _items[idx]->statics.size()]->x - point.x; -							item->subItems[subIdx]->y = item->subItems[stidx + st2idx * _items[idx]->statics.size()]->y - point.y; -						} -					} -				} +				int sz = mov->_currMovement ? mov->_currMovement->_dynamicPhases.size() : mov->_dynamicPhases.size(); + +				item->subItems[subIdx]->field_C = sz + item->subItems[stidx + st2idx * _items[idx]->statics.size()]->field_C; + +				mov->calcSomeXY(point, 0, -1); + +				item->subItems[subIdx]->x = item->subItems[stidx + st2idx * _items[idx]->statics.size()]->x - point.x; +				item->subItems[subIdx]->y = item->subItems[stidx + st2idx * _items[idx]->statics.size()]->y - point.y;  			}  		}  	} diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp index 36fbb73037..059fd82e79 100644 --- a/engines/fullpipe/statics.cpp +++ b/engines/fullpipe/statics.cpp @@ -1766,8 +1766,8 @@ Common::Point *Movement::calcSomeXY(Common::Point &p, int idx, int dynidx) {  		Common::Point point;  		_staticsObj1->getSomeXY(point); -		int y1 = _my - point.y;  		int x1 = _mx - point.x; +		int y1 = _my - point.y;  		setDynamicPhaseIndex(0);  | 
