aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/dm/timeline.cpp184
1 files changed, 78 insertions, 106 deletions
diff --git a/engines/dm/timeline.cpp b/engines/dm/timeline.cpp
index 558ecc8cd7..fc5092fc5b 100644
--- a/engines/dm/timeline.cpp
+++ b/engines/dm/timeline.cpp
@@ -372,162 +372,134 @@ bool Timeline::isFirstEventExpiered() {
return (_eventCount && (filterTime(_events[_timeline[0]]._mapTime) <= _vm->_gameTime));
}
-void Timeline::extractFirstEvent(TimelineEvent* event) {
+void Timeline::extractFirstEvent(TimelineEvent *event) {
uint16 eventIndex = _timeline[0];
*event = _events[eventIndex];
deleteEvent(eventIndex);
}
-void Timeline::processEventDoorAnimation(TimelineEvent* event) {
- uint16 L0593_ui_MapX;
- uint16 L0594_ui_MapY;
- int16 L0595_i_Effect;
- int16 L0596_i_DoorState;
- Square* L0597_puc_Square;
- Door* L0598_ps_Door;
- Thing L0599_T_GroupThing;
- uint16 L0600_ui_CreatureAttributes;
- uint16 L0602_ui_Multiple;
-#define AL0602_ui_VerticalDoor L0602_ui_Multiple
-#define AL0602_ui_Height L0602_ui_Multiple
-
- L0597_puc_Square = (Square*)&_vm->_dungeonMan->_currMapData[L0593_ui_MapX = event->_B._location._mapX][L0594_ui_MapY = event->_B._location._mapY];
- if ((L0596_i_DoorState = Square(*L0597_puc_Square).getDoorState()) == k5_doorState_DESTROYED) {
+void Timeline::processEventDoorAnimation(TimelineEvent *event) {
+ uint16 mapX = event->_B._location._mapX;
+ uint16 mapY = event->_B._location._mapY;
+ Square *curSquare = (Square*)&_vm->_dungeonMan->_currMapData[mapX][mapY];
+ int16 doorState = Square(*curSquare).getDoorState();
+ if (doorState == k5_doorState_DESTROYED)
return;
- }
+
event->_mapTime++;
- L0595_i_Effect = event->_C.A._effect;
- if (L0595_i_Effect == k1_SensorEffClear) {
- L0598_ps_Door = (Door*)_vm->_dungeonMan->getSquareFirstThingData(L0593_ui_MapX, L0594_ui_MapY);
- AL0602_ui_VerticalDoor = L0598_ps_Door->opensVertically();
- if ((_vm->_dungeonMan->_currMapIndex == _vm->_dungeonMan->_partyMapIndex) && (L0593_ui_MapX == _vm->_dungeonMan->_partyMapX) && (L0594_ui_MapY == _vm->_dungeonMan->_partyMapY) && (L0596_i_DoorState != k0_doorState_OPEN)) {
+ int16 sensorEffect = event->_C.A._effect;
+ if (sensorEffect == k1_SensorEffClear) {
+ Door *curDoor = (Door *)_vm->_dungeonMan->getSquareFirstThingData(mapX, mapY);
+ bool verticalDoorFl = curDoor->opensVertically();
+ if ((_vm->_dungeonMan->_currMapIndex == _vm->_dungeonMan->_partyMapIndex) && (mapX == _vm->_dungeonMan->_partyMapX)
+ && (mapY == _vm->_dungeonMan->_partyMapY) && (doorState != k0_doorState_OPEN)) {
if (_vm->_championMan->_partyChampionCount > 0) {
- L0597_puc_Square->setDoorState(k0_doorState_OPEN);
+ curSquare->setDoorState(k0_doorState_OPEN);
// Strangerke
// Original bug fixed - A closing horizontal door wounds champions to the head instead of to the hands. Missing parenthesis in the condition cause all doors to wound the head in addition to the torso
// See BUG0_78
- if (_vm->_championMan->getDamagedChampionCount(5, k0x0008_ChampionWoundTorso | (AL0602_ui_VerticalDoor ? k0x0004_ChampionWoundHead : k0x0001_ChampionWoundReadHand | k0x0002_ChampionWoundActionHand), k2_attackType_SELF)) {
- _vm->_sound->requestPlay(k18_soundPARTY_DAMAGED, L0593_ui_MapX, L0594_ui_MapY, k1_soundModePlayIfPrioritized);
- }
+ int16 wounds = k0x0008_ChampionWoundTorso | (verticalDoorFl ? k0x0004_ChampionWoundHead : k0x0001_ChampionWoundReadHand | k0x0002_ChampionWoundActionHand);
+ if (_vm->_championMan->getDamagedChampionCount(5, wounds, k2_attackType_SELF))
+ _vm->_sound->requestPlay(k18_soundPARTY_DAMAGED, mapX, mapY, k1_soundModePlayIfPrioritized);
}
event->_mapTime++;
addEventGetEventIndex(event);
return;
}
- if (((L0599_T_GroupThing = _vm->_groupMan->groupGetThing(L0593_ui_MapX, L0594_ui_MapY)) != Thing::_endOfList) && !getFlag(L0600_ui_CreatureAttributes = _vm->_dungeonMan->getCreatureAttributes(L0599_T_GroupThing), k0x0040_MaskCreatureInfo_nonMaterial)) {
- if (L0596_i_DoorState >= (AL0602_ui_Height ? CreatureInfo::getHeight(L0600_ui_CreatureAttributes) : 1)) { /* Creature height or 1 */
- if (_vm->_groupMan->getDamageAllCreaturesOutcome((Group*)_vm->_dungeonMan->getThingData(L0599_T_GroupThing), L0593_ui_MapX, L0594_ui_MapY, 5, true) != k2_outcomeKilledAllCreaturesInGroup) {
- _vm->_groupMan->processEvents29to41(L0593_ui_MapX, L0594_ui_MapY, kM3_TMEventTypeCreateReactionEvent29DangerOnSquare, 0);
- }
- L0596_i_DoorState = (L0596_i_DoorState == k0_doorState_OPEN) ? k0_doorState_OPEN : (L0596_i_DoorState - 1);
- L0597_puc_Square->setDoorState(L0596_i_DoorState);
- _vm->_sound->requestPlay(k04_soundWOODEN_THUD_ATTACK_TROLIN_ANTMAN_STONE_GOLEM, L0593_ui_MapX, L0594_ui_MapY, k1_soundModePlayIfPrioritized);
+ Thing groupThing = _vm->_groupMan->groupGetThing(mapX, mapY);
+ uint16 creatureAttributes = _vm->_dungeonMan->getCreatureAttributes(groupThing);
+ if ((groupThing != Thing::_endOfList) && !getFlag(creatureAttributes, k0x0040_MaskCreatureInfo_nonMaterial)) {
+ if (doorState >= (verticalDoorFl ? CreatureInfo::getHeight(creatureAttributes) : 1)) { /* Creature height or 1 */
+ if (_vm->_groupMan->getDamageAllCreaturesOutcome((Group*)_vm->_dungeonMan->getThingData(groupThing), mapX, mapY, 5, true) != k2_outcomeKilledAllCreaturesInGroup)
+ _vm->_groupMan->processEvents29to41(mapX, mapY, kM3_TMEventTypeCreateReactionEvent29DangerOnSquare, 0);
+
+ doorState = (doorState == k0_doorState_OPEN) ? k0_doorState_OPEN : (doorState - 1);
+ curSquare->setDoorState(doorState);
+ _vm->_sound->requestPlay(k04_soundWOODEN_THUD_ATTACK_TROLIN_ANTMAN_STONE_GOLEM, mapX, mapY, k1_soundModePlayIfPrioritized);
event->_mapTime++;
addEventGetEventIndex(event);
return;
}
}
}
- if (((L0595_i_Effect == k0_SensorEffSet) && (L0596_i_DoorState == k0_doorState_OPEN)) || ((L0595_i_Effect == k1_SensorEffClear) && (L0596_i_DoorState == k4_doorState_CLOSED))) {
- goto T0241020_Return;
- }
- L0596_i_DoorState += (L0595_i_Effect == k0_SensorEffSet) ? -1 : 1;
- L0597_puc_Square->setDoorState(L0596_i_DoorState);
- _vm->_sound->requestPlay(k02_soundDOOR_RATTLE, L0593_ui_MapX, L0594_ui_MapY, k1_soundModePlayIfPrioritized);
+ if ((sensorEffect == k0_SensorEffSet) && (doorState == k0_doorState_OPEN))
+ return;
- if (L0595_i_Effect == k0_SensorEffSet) {
- if (L0596_i_DoorState == k0_doorState_OPEN) {
- return;
- }
- } else {
- if (L0596_i_DoorState == k4_doorState_CLOSED) {
+ if ((sensorEffect == k1_SensorEffClear) && (doorState == k4_doorState_CLOSED))
+ return;
+
+ doorState += (sensorEffect == k0_SensorEffSet) ? -1 : 1;
+ curSquare->setDoorState(doorState);
+ _vm->_sound->requestPlay(k02_soundDOOR_RATTLE, mapX, mapY, k1_soundModePlayIfPrioritized);
+
+ if (sensorEffect == k0_SensorEffSet) {
+ if (doorState == k0_doorState_OPEN)
return;
- }
- }
+ } else if (doorState == k4_doorState_CLOSED)
+ return;
+
addEventGetEventIndex(event);
-T0241020_Return:
- ;
}
-void Timeline::processEventSquareFakewall(TimelineEvent* event) {
- uint16 L0603_ui_MapX;
- uint16 L0604_ui_MapY;
- int16 L0605_i_Effect;
- Thing L0606_T_Thing;
- byte* L0607_puc_Square;
+void Timeline::processEventSquareFakewall(TimelineEvent *event) {
+ uint16 mapX = event->_B._location._mapX;
+ uint16 mapY = event->_B._location._mapY;
+ byte *curSquare = &_vm->_dungeonMan->_currMapData[mapX][mapY];
+ int16 effect = event->_C.A._effect;
+ if (effect == k2_SensorEffToggle)
+ effect = getFlag(*curSquare, k0x0004_FakeWallOpen) ? k1_SensorEffClear : k0_SensorEffSet;
-
- L0607_puc_Square = &_vm->_dungeonMan->_currMapData[L0603_ui_MapX = event->_B._location._mapX][L0604_ui_MapY = event->_B._location._mapY];
- L0605_i_Effect = event->_C.A._effect;
- if (L0605_i_Effect == k2_SensorEffToggle) {
- L0605_i_Effect = getFlag(*L0607_puc_Square, k0x0004_FakeWallOpen) ? k1_SensorEffClear : k0_SensorEffSet;
- }
- if (L0605_i_Effect == k1_SensorEffClear) {
- if ((_vm->_dungeonMan->_currMapIndex == _vm->_dungeonMan->_partyMapIndex) && (L0603_ui_MapX == _vm->_dungeonMan->_partyMapX) && (L0604_ui_MapY == _vm->_dungeonMan->_partyMapY)) {
+ if (effect == k1_SensorEffClear) {
+ if ((_vm->_dungeonMan->_currMapIndex == _vm->_dungeonMan->_partyMapIndex) && (mapX == _vm->_dungeonMan->_partyMapX) && (mapY == _vm->_dungeonMan->_partyMapY)) {
event->_mapTime++;
addEventGetEventIndex(event);
} else {
- if (((L0606_T_Thing = _vm->_groupMan->groupGetThing(L0603_ui_MapX, L0604_ui_MapY)) != Thing::_endOfList) && !getFlag(_vm->_dungeonMan->getCreatureAttributes(L0606_T_Thing), k0x0040_MaskCreatureInfo_nonMaterial)) {
+ Thing groupThing = _vm->_groupMan->groupGetThing(mapX, mapY);
+ if ((groupThing != Thing::_endOfList) && !getFlag(_vm->_dungeonMan->getCreatureAttributes(groupThing), k0x0040_MaskCreatureInfo_nonMaterial)) {
event->_mapTime++;
addEventGetEventIndex(event);
- } else {
- clearFlag(*L0607_puc_Square, k0x0004_FakeWallOpen);
- }
+ } else
+ clearFlag(*curSquare, k0x0004_FakeWallOpen);
}
- } else {
- setFlag(*L0607_puc_Square, k0x0004_FakeWallOpen);
- }
+ } else
+ setFlag(*curSquare, k0x0004_FakeWallOpen);
}
-void Timeline::processEventDoorDestruction(TimelineEvent* event) {
- Square* L0608_puc_Square;
-
- L0608_puc_Square = (Square*)&_vm->_dungeonMan->_currMapData[event->_B._location._mapX][event->_B._location._mapY];
- L0608_puc_Square->setDoorState(k5_doorState_DESTROYED);
+void Timeline::processEventDoorDestruction(TimelineEvent *event) {
+ Square *square = (Square*)&_vm->_dungeonMan->_currMapData[event->_B._location._mapX][event->_B._location._mapY];
+ square->setDoorState(k5_doorState_DESTROYED);
}
-void Timeline::processEventSquareDoor(TimelineEvent* event) {
- int16 L0609_i_DoorState;
-
-
- if ((L0609_i_DoorState = Square(_vm->_dungeonMan->_currMapData[event->_B._location._mapX][event->_B._location._mapY]).getDoorState()) == k5_doorState_DESTROYED) {
+void Timeline::processEventSquareDoor(TimelineEvent *event) {
+ int16 doorState = Square(_vm->_dungeonMan->_currMapData[event->_B._location._mapX][event->_B._location._mapY]).getDoorState();
+ if (doorState == k5_doorState_DESTROYED)
return;
- }
- if (event->_C.A._effect == k2_SensorEffToggle) {
- event->_C.A._effect = (L0609_i_DoorState == k0_doorState_OPEN) ? k1_SensorEffClear : k0_SensorEffSet;
- } else {
- if (event->_C.A._effect == k0_SensorEffSet) {
- if (L0609_i_DoorState == k0_doorState_OPEN) {
- return;
- }
- } else {
- if (L0609_i_DoorState == k4_doorState_CLOSED) {
- return;
- }
- }
+
+ if (event->_C.A._effect == k2_SensorEffToggle)
+ event->_C.A._effect = (doorState == k0_doorState_OPEN) ? k1_SensorEffClear : k0_SensorEffSet;
+ else if (event->_C.A._effect == k0_SensorEffSet) {
+ if ((doorState == k0_doorState_OPEN) || (doorState == k4_doorState_CLOSED))
+ return;
}
event->_type = k1_TMEventTypeDoorAnimation;
addEventGetEventIndex(event);
}
-void Timeline::processEventSquarePit(TimelineEvent* event) {
- uint16 L0653_ui_MapX;
- uint16 L0654_ui_MapY;
- byte* L0655_puc_Square;
+void Timeline::processEventSquarePit(TimelineEvent *event) {
+ uint16 L0653_ui_MapX = event->_B._location._mapX;
+ uint16 L0654_ui_MapY = event->_B._location._mapY;
+ byte *square = &_vm->_dungeonMan->_currMapData[L0653_ui_MapX][L0654_ui_MapY];
+ if (event->_C.A._effect == k2_SensorEffToggle)
+ event->_C.A._effect = getFlag(*square, k0x0008_PitOpen) ? k1_SensorEffClear : k0_SensorEffSet;
- L0655_puc_Square = &_vm->_dungeonMan->_currMapData[L0653_ui_MapX = event->_B._location._mapX][L0654_ui_MapY = event->_B._location._mapY];
- if (event->_C.A._effect == k2_SensorEffToggle) {
- event->_C.A._effect = getFlag(*L0655_puc_Square, k0x0008_PitOpen) ? k1_SensorEffClear : k0_SensorEffSet;
- }
if (event->_C.A._effect == k0_SensorEffSet) {
- setFlag(*L0655_puc_Square, k0x0008_PitOpen);
+ setFlag(*square, k0x0008_PitOpen);
moveTeleporterOrPitSquareThings(L0653_ui_MapX, L0654_ui_MapY);
- } else {
- clearFlag(*L0655_puc_Square, k0x0008_PitOpen);
- }
+ } else
+ clearFlag(*square, k0x0008_PitOpen);
}
void Timeline::moveTeleporterOrPitSquareThings(uint16 mapX, uint16 mapY) {