aboutsummaryrefslogtreecommitdiff
path: root/engines/dm/movesens.cpp
diff options
context:
space:
mode:
authorStrangerke2016-09-04 19:36:41 +0200
committerStrangerke2016-09-04 19:36:41 +0200
commit3b4c06e926d6202b20ef566781eb780c8d349852 (patch)
tree8309cb7a7696ae8345e495121a1c1483181d1849 /engines/dm/movesens.cpp
parentd663f7f7880af69990b4a7af925121b1e5544c31 (diff)
downloadscummvm-rg350-3b4c06e926d6202b20ef566781eb780c8d349852.tar.gz
scummvm-rg350-3b4c06e926d6202b20ef566781eb780c8d349852.tar.bz2
scummvm-rg350-3b4c06e926d6202b20ef566781eb780c8d349852.zip
DM: Refactor sensorIsTriggeredByClickOnWall, remove all GOTOs
Diffstat (limited to 'engines/dm/movesens.cpp')
-rw-r--r--engines/dm/movesens.cpp220
1 files changed, 121 insertions, 99 deletions
diff --git a/engines/dm/movesens.cpp b/engines/dm/movesens.cpp
index cd06c42bca..3ec3f3710a 100644
--- a/engines/dm/movesens.cpp
+++ b/engines/dm/movesens.cpp
@@ -73,6 +73,7 @@ bool MovesensMan::sensorIsTriggeredByClickOnWall(int16 mapX, int16 mapY, uint16
}
Thing lastProcessedThing = thingBeingProcessed = squareFirstThing;
while (thingBeingProcessed != Thing::_endOfList) {
+ bool skipToNextThing = false;
uint16 ProcessedThingType = (thingBeingProcessed).getType();
if (ProcessedThingType == k3_SensorThingType) {
int16 cellIdx = thingBeingProcessed.getCell();
@@ -80,119 +81,140 @@ bool MovesensMan::sensorIsTriggeredByClickOnWall(int16 mapX, int16 mapY, uint16
Sensor *currentSensor = (Sensor *)_vm->_dungeonMan->getThingData(thingBeingProcessed);
SensorType processedSensorType = currentSensor->getType();
if (processedSensorType == k0_SensorDisabled)
- goto T0275058_ProceedToNextThing;
- if ((_vm->_championMan->_leaderIndex == kM1_ChampionNone) && (processedSensorType != k127_SensorWallChampionPortrait))
- goto T0275058_ProceedToNextThing;
- if (cellIdx != cellParam)
- goto T0275058_ProceedToNextThing;
- int16 sensorData = currentSensor->getData();
- int16 sensorEffect = currentSensor->getAttrEffectA();
+ skipToNextThing = true;
+ else if ((_vm->_championMan->_leaderIndex == kM1_ChampionNone) && (processedSensorType != k127_SensorWallChampionPortrait))
+ skipToNextThing = true;
+ else if (cellIdx != cellParam)
+ skipToNextThing = true;
bool doNotTriggerSensor;
- switch (processedSensorType) {
- case k1_SensorWallOrnClick:
- doNotTriggerSensor = false;
- if (currentSensor->getAttrEffectA() == k3_SensorEffHold) {
- goto T0275058_ProceedToNextThing;
- }
- break;
- case k2_SensorWallOrnClickWithAnyObj:
- doNotTriggerSensor = (_vm->_championMan->_leaderEmptyHanded != currentSensor->getAttrRevertEffectA());
- break;
- case k17_SensorWallOrnClickWithSpecObjRemovedSensor:
- case k11_SensorWallOrnClickWithSpecObjRemovedRotateSensors:
- if (sensorCountToProcessPerCell[cellIdx]) /* If the sensor is not the last one of its type on the cell */
- goto T0275058_ProceedToNextThing;
- case k3_SensorWallOrnClickWithSpecObj:
- case k4_SensorWallOrnClickWithSpecObjRemoved:
- doNotTriggerSensor = ((sensorData == _vm->_objectMan->getObjectType(leaderHandObject)) == currentSensor->getAttrRevertEffectA());
- if (!doNotTriggerSensor && (processedSensorType == k17_SensorWallOrnClickWithSpecObjRemovedSensor)) {
- if (lastProcessedThing == thingBeingProcessed) /* If the sensor is the only one of its type on the cell */
+ int16 sensorData = 0;
+ int16 sensorEffect = 0;
+ if (!skipToNextThing) {
+ sensorData = currentSensor->getData();
+ sensorEffect = currentSensor->getAttrEffectA();
+
+ switch (processedSensorType) {
+ case k1_SensorWallOrnClick:
+ doNotTriggerSensor = false;
+ if (currentSensor->getAttrEffectA() == k3_SensorEffHold)
+ skipToNextThing = true;
+ break;
+ case k2_SensorWallOrnClickWithAnyObj:
+ doNotTriggerSensor = (_vm->_championMan->_leaderEmptyHanded != currentSensor->getAttrRevertEffectA());
+ break;
+ case k17_SensorWallOrnClickWithSpecObjRemovedSensor:
+ case k11_SensorWallOrnClickWithSpecObjRemovedRotateSensors:
+ if (sensorCountToProcessPerCell[cellIdx]) { /* If the sensor is not the last one of its type on the cell */
+ skipToNextThing = true;
break;
- Sensor *lastSensor = (Sensor *)_vm->_dungeonMan->getThingData(lastProcessedThing);
- lastSensor->setNextThing(currentSensor->getNextThing());
- currentSensor->setNextThing(Thing::_none);
- thingBeingProcessed = lastProcessedThing;
- }
- if (!doNotTriggerSensor && (processedSensorType == k11_SensorWallOrnClickWithSpecObjRemovedRotateSensors)) {
- triggerLocalEffect(k2_SensorEffToggle, mapX, mapY, cellIdx); /* This will cause a rotation of the sensors at the specified cell on the specified square after all sensors have been processed */
- }
- break;
- case k12_SensorWallObjGeneratorRotateSensors:
- if (sensorCountToProcessPerCell[cellIdx]) /* If the sensor is not the last one of its type on the cell */
- goto T0275058_ProceedToNextThing;
- doNotTriggerSensor = !_vm->_championMan->_leaderEmptyHanded;
- if (!doNotTriggerSensor) {
+ }
+ // No break on purpose
+ case k3_SensorWallOrnClickWithSpecObj:
+ case k4_SensorWallOrnClickWithSpecObjRemoved:
+ doNotTriggerSensor = ((sensorData == _vm->_objectMan->getObjectType(leaderHandObject)) == currentSensor->getAttrRevertEffectA());
+ if (!doNotTriggerSensor && (processedSensorType == k17_SensorWallOrnClickWithSpecObjRemovedSensor)) {
+ if (lastProcessedThing == thingBeingProcessed) /* If the sensor is the only one of its type on the cell */
+ break;
+ Sensor *lastSensor = (Sensor *)_vm->_dungeonMan->getThingData(lastProcessedThing);
+ lastSensor->setNextThing(currentSensor->getNextThing());
+ currentSensor->setNextThing(Thing::_none);
+ thingBeingProcessed = lastProcessedThing;
+ }
+ if (!doNotTriggerSensor && (processedSensorType == k11_SensorWallOrnClickWithSpecObjRemovedRotateSensors)) {
+ triggerLocalEffect(k2_SensorEffToggle, mapX, mapY, cellIdx); /* This will cause a rotation of the sensors at the specified cell on the specified square after all sensors have been processed */
+ }
+ break;
+ case k12_SensorWallObjGeneratorRotateSensors:
+ if (sensorCountToProcessPerCell[cellIdx]) { /* If the sensor is not the last one of its type on the cell */
+ skipToNextThing = true;
+ break;
+ }
+ doNotTriggerSensor = !_vm->_championMan->_leaderEmptyHanded;
+ if (!doNotTriggerSensor)
+ triggerLocalEffect(k2_SensorEffToggle, mapX, mapY, cellIdx); /* This will cause a rotation of the sensors at the specified cell on the specified square after all sensors have been processed */
+ break;
+ case k13_SensorWallSingleObjStorageRotateSensors:
+ if (_vm->_championMan->_leaderEmptyHanded) {
+ leaderHandObject = getObjectOfTypeInCell(mapX, mapY, cellIdx, sensorData);
+ if (leaderHandObject == Thing::_none) {
+ skipToNextThing = true;
+ break;
+ }
+ _vm->_dungeonMan->unlinkThingFromList(leaderHandObject, Thing(0), mapX, mapY);
+ _vm->_championMan->putObjectInLeaderHand(leaderHandObject, true);
+ } else {
+ if ((_vm->_objectMan->getObjectType(leaderHandObject) != sensorData) || (getObjectOfTypeInCell(mapX, mapY, cellIdx, sensorData) != Thing::_none)) {
+ skipToNextThing = true;
+ break;
+ }
+ _vm->_championMan->getObjectRemovedFromLeaderHand();
+ _vm->_dungeonMan->linkThingToList(thingWithNewCell(leaderHandObject, cellIdx), Thing(0), mapX, mapY);
+ leaderHandObject = Thing::_none;
+ }
triggerLocalEffect(k2_SensorEffToggle, mapX, mapY, cellIdx); /* This will cause a rotation of the sensors at the specified cell on the specified square after all sensors have been processed */
- }
- break;
- case k13_SensorWallSingleObjStorageRotateSensors:
- if (_vm->_championMan->_leaderEmptyHanded) {
- if ((leaderHandObject = getObjectOfTypeInCell(mapX, mapY, cellIdx, sensorData)) == Thing::_none)
- goto T0275058_ProceedToNextThing;
- _vm->_dungeonMan->unlinkThingFromList(leaderHandObject, Thing(0), mapX, mapY);
- _vm->_championMan->putObjectInLeaderHand(leaderHandObject, true);
- } else {
- if ((_vm->_objectMan->getObjectType(leaderHandObject) != sensorData) || (getObjectOfTypeInCell(mapX, mapY, cellIdx, sensorData) != Thing::_none))
- goto T0275058_ProceedToNextThing;
+ if ((sensorEffect == k3_SensorEffHold) && !_vm->_championMan->_leaderEmptyHanded)
+ doNotTriggerSensor = true;
+ else
+ doNotTriggerSensor = false;
+
+ break;
+ case k16_SensorWallObjExchanger: {
+ if (sensorCountToProcessPerCell[cellIdx]) { /* If the sensor is not the last one of its type on the cell */
+ skipToNextThing = true;
+ break;
+ }
+ Thing thingOnSquare = _vm->_dungeonMan->getSquareFirstObject(mapX, mapY);
+ if ((_vm->_objectMan->getObjectType(leaderHandObject) != sensorData) || (thingOnSquare == Thing::_none)) {
+ skipToNextThing = true;
+ break;
+ }
+ _vm->_dungeonMan->unlinkThingFromList(thingOnSquare, Thing(0), mapX, mapY);
_vm->_championMan->getObjectRemovedFromLeaderHand();
_vm->_dungeonMan->linkThingToList(thingWithNewCell(leaderHandObject, cellIdx), Thing(0), mapX, mapY);
- leaderHandObject = Thing::_none;
- }
- triggerLocalEffect(k2_SensorEffToggle, mapX, mapY, cellIdx); /* This will cause a rotation of the sensors at the specified cell on the specified square after all sensors have been processed */
- if ((sensorEffect == k3_SensorEffHold) && !_vm->_championMan->_leaderEmptyHanded)
- doNotTriggerSensor = true;
- else
+ _vm->_championMan->putObjectInLeaderHand(thingOnSquare, true);
doNotTriggerSensor = false;
-
- break;
- case k16_SensorWallObjExchanger: {
- if (sensorCountToProcessPerCell[cellIdx]) /* If the sensor is not the last one of its type on the cell */
- goto T0275058_ProceedToNextThing;
- Thing thingOnSquare = _vm->_dungeonMan->getSquareFirstObject(mapX, mapY);
- if ((_vm->_objectMan->getObjectType(leaderHandObject) != sensorData) || (thingOnSquare == Thing::_none))
- goto T0275058_ProceedToNextThing;
- _vm->_dungeonMan->unlinkThingFromList(thingOnSquare, Thing(0), mapX, mapY);
- _vm->_championMan->getObjectRemovedFromLeaderHand();
- _vm->_dungeonMan->linkThingToList(thingWithNewCell(leaderHandObject, cellIdx), Thing(0), mapX, mapY);
- _vm->_championMan->putObjectInLeaderHand(thingOnSquare, true);
- doNotTriggerSensor = false;
+ }
+ break;
+ case k127_SensorWallChampionPortrait:
+ _vm->_championMan->addCandidateChampionToParty(sensorData);
+ skipToNextThing = true;
+ break;
+ default:
+ skipToNextThing = true;
+ break;
}
- break;
- case k127_SensorWallChampionPortrait:
- _vm->_championMan->addCandidateChampionToParty(sensorData);
- goto T0275058_ProceedToNextThing;
- default:
- goto T0275058_ProceedToNextThing;
- }
-
- if (sensorEffect == k3_SensorEffHold) {
- sensorEffect = doNotTriggerSensor ? k1_SensorEffClear : k0_SensorEffSet;
- doNotTriggerSensor = false;
}
- if (!doNotTriggerSensor) {
- atLeastOneSensorWasTriggered = true;
- if (currentSensor->getAttrAudibleA())
- _vm->_sound->requestPlay(k01_soundSWITCH, _vm->_dungeonMan->_partyMapX, _vm->_dungeonMan->_partyMapY, k1_soundModePlayIfPrioritized);
- if (!_vm->_championMan->_leaderEmptyHanded && ((processedSensorType == k4_SensorWallOrnClickWithSpecObjRemoved) || (processedSensorType == k11_SensorWallOrnClickWithSpecObjRemovedRotateSensors) || (processedSensorType == k17_SensorWallOrnClickWithSpecObjRemovedSensor))) {
- Thing *leaderThing = (Thing *)_vm->_dungeonMan->getThingData(leaderHandObject);
- *leaderThing = Thing::_none;
- _vm->_championMan->getObjectRemovedFromLeaderHand();
- leaderHandObject = Thing::_none;
- } else if (_vm->_championMan->_leaderEmptyHanded
- && (processedSensorType == k12_SensorWallObjGeneratorRotateSensors)) {
- leaderHandObject = _vm->_dungeonMan->getObjForProjectileLaucherOrObjGen(sensorData);
- if (leaderHandObject != Thing::_none)
- _vm->_championMan->putObjectInLeaderHand(leaderHandObject, true);
+ if (!skipToNextThing) {
+ if (sensorEffect == k3_SensorEffHold) {
+ sensorEffect = doNotTriggerSensor ? k1_SensorEffClear : k0_SensorEffSet;
+ doNotTriggerSensor = false;
}
- triggerEffect(currentSensor, sensorEffect, mapX, mapY, cellIdx);
+ if (!doNotTriggerSensor) {
+ atLeastOneSensorWasTriggered = true;
+ if (currentSensor->getAttrAudibleA())
+ _vm->_sound->requestPlay(k01_soundSWITCH, _vm->_dungeonMan->_partyMapX, _vm->_dungeonMan->_partyMapY, k1_soundModePlayIfPrioritized);
+
+ if (!_vm->_championMan->_leaderEmptyHanded && ((processedSensorType == k4_SensorWallOrnClickWithSpecObjRemoved) || (processedSensorType == k11_SensorWallOrnClickWithSpecObjRemovedRotateSensors) || (processedSensorType == k17_SensorWallOrnClickWithSpecObjRemovedSensor))) {
+ Thing *leaderThing = (Thing *)_vm->_dungeonMan->getThingData(leaderHandObject);
+ *leaderThing = Thing::_none;
+ _vm->_championMan->getObjectRemovedFromLeaderHand();
+ leaderHandObject = Thing::_none;
+ } else if (_vm->_championMan->_leaderEmptyHanded
+ && (processedSensorType == k12_SensorWallObjGeneratorRotateSensors)) {
+ leaderHandObject = _vm->_dungeonMan->getObjForProjectileLaucherOrObjGen(sensorData);
+ if (leaderHandObject != Thing::_none)
+ _vm->_championMan->putObjectInLeaderHand(leaderHandObject, true);
+ }
+ triggerEffect(currentSensor, sensorEffect, mapX, mapY, cellIdx);
+ }
+ skipToNextThing = true;
}
- goto T0275058_ProceedToNextThing;
}
- if (ProcessedThingType >= k4_GroupThingType)
+ if (!skipToNextThing && (ProcessedThingType >= k4_GroupThingType))
break;
-T0275058_ProceedToNextThing:
+
lastProcessedThing = thingBeingProcessed;
thingBeingProcessed = _vm->_dungeonMan->getNextThing(thingBeingProcessed);
}