aboutsummaryrefslogtreecommitdiff
path: root/engines/dm
diff options
context:
space:
mode:
Diffstat (limited to 'engines/dm')
-rw-r--r--engines/dm/timeline.cpp201
1 files changed, 95 insertions, 106 deletions
diff --git a/engines/dm/timeline.cpp b/engines/dm/timeline.cpp
index 1123900f23..5fc07b4a50 100644
--- a/engines/dm/timeline.cpp
+++ b/engines/dm/timeline.cpp
@@ -172,203 +172,192 @@ void Timeline::fixChronology(uint16 timelineIndex) {
_timeline[timelineIndex] = eventIndex;
}
-bool Timeline::isEventABeforeB(TimelineEvent* eventA, TimelineEvent* eventB) {
- bool L0578_B_Simultaneous;
+bool Timeline::isEventABeforeB(TimelineEvent *eventA, TimelineEvent *eventB) {
+ bool simultaneousFl = (filterTime(eventA->_mapTime) == filterTime(eventB->_mapTime));
return (filterTime(eventA->_mapTime) < filterTime(eventB->_mapTime)) ||
- ((L0578_B_Simultaneous = (filterTime(eventA->_mapTime) == filterTime(eventB->_mapTime))) && (eventA->getTypePriority() > eventB->getTypePriority())) ||
- (L0578_B_Simultaneous && (eventA->getTypePriority() == eventB->getTypePriority()) && (eventA <= eventB));
+ (simultaneousFl && (eventA->getTypePriority() > eventB->getTypePriority())) ||
+ (simultaneousFl && (eventA->getTypePriority() == eventB->getTypePriority()) && (eventA <= eventB));
}
uint16 Timeline::getIndex(uint16 eventIndex) {
- uint16 L0579_ui_TimelineIndex;
- uint16* L0580_pui_TimelineEntry;
+ uint16 timelineIndex;
+ uint16 *timelineEntry = _timeline;
-
- for (L0579_ui_TimelineIndex = 0, L0580_pui_TimelineEntry = _timeline; L0579_ui_TimelineIndex < _eventMaxCount; L0579_ui_TimelineIndex++) {
- if (*L0580_pui_TimelineEntry++ == eventIndex)
+ for (timelineIndex = 0; timelineIndex < _eventMaxCount; timelineIndex++) {
+ if (*timelineEntry++ == eventIndex)
break;
}
- if (L0579_ui_TimelineIndex >= _eventMaxCount) { /* BUG0_00 Useless code. The function is always called with event indices that are in the timeline */
- L0579_ui_TimelineIndex = 0; /* BUG0_01 Coding error without consequence. Wrong return value. If the specified event index is not found in the timeline the function returns 0 which is the same value that is returned if the event index is found in the first timeline entry. No consequence because this code is never executed */
- }
- return L0579_ui_TimelineIndex;
-}
-uint16 Timeline::addEventGetEventIndex(TimelineEvent* event) {
- uint16 L0588_ui_EventIndex;
- uint16 L0590_ui_NewEventIndex;
- TimelineEvent* L0591_ps_Event;
+ if (timelineIndex >= _eventMaxCount) /* BUG0_00 Useless code. The function is always called with event indices that are in the timeline */
+ timelineIndex = 0; /* BUG0_01 Coding error without consequence. Wrong return value. If the specified event index is not found in the timeline the function returns 0 which is the same value that is returned if the event index is found in the first timeline entry. No consequence because this code is never executed */
+ return timelineIndex;
+}
+uint16 Timeline::addEventGetEventIndex(TimelineEvent *event) {
if (_eventCount == _eventMaxCount)
error("Too many events");
if ((event->_type >= k5_TMEventTypeCorridor) && (event->_type <= k10_TMEventTypeDoor)) {
- for (L0588_ui_EventIndex = 0, L0591_ps_Event = _events; L0588_ui_EventIndex < _eventMaxCount; L0588_ui_EventIndex++, L0591_ps_Event++) {
- if ((L0591_ps_Event->_type >= k5_TMEventTypeCorridor) && (L0591_ps_Event->_type <= k10_TMEventTypeDoor)) {
- if ((event->_mapTime == L0591_ps_Event->_mapTime) && (event->getMapXY() == L0591_ps_Event->getMapXY()) && ((L0591_ps_Event->_type != k6_TMEventTypeWall) || (L0591_ps_Event->_C.A._cell == event->_C.A._cell))) {
- L0591_ps_Event->_C.A._effect = event->_C.A._effect;
- return L0588_ui_EventIndex;
+ TimelineEvent *curEvent = _events;
+ for (uint16 eventIndex = 0; eventIndex < _eventMaxCount; eventIndex++, curEvent++) {
+ if ((curEvent->_type >= k5_TMEventTypeCorridor) && (curEvent->_type <= k10_TMEventTypeDoor)) {
+ if ((event->_mapTime == curEvent->_mapTime) && (event->getMapXY() == curEvent->getMapXY()) && ((curEvent->_type != k6_TMEventTypeWall) || (curEvent->_C.A._cell == event->_C.A._cell))) {
+ curEvent->_C.A._effect = event->_C.A._effect;
+ return eventIndex;
}
continue;
- } else {
- if ((L0591_ps_Event->_type == k1_TMEventTypeDoorAnimation) && (event->_mapTime == L0591_ps_Event->_mapTime) && (event->getMapXY() == L0591_ps_Event->getMapXY())) {
- if (event->_C.A._effect == k2_SensorEffToggle) {
- event->_C.A._effect = 1 - L0591_ps_Event->_C.A._effect;
- }
- deleteEvent(L0588_ui_EventIndex);
- break;
- }
+ } else if ((curEvent->_type == k1_TMEventTypeDoorAnimation) && (event->_mapTime == curEvent->_mapTime) && (event->getMapXY() == curEvent->getMapXY())) {
+ if (event->_C.A._effect == k2_SensorEffToggle)
+ event->_C.A._effect = 1 - curEvent->_C.A._effect;
+
+ deleteEvent(eventIndex);
+ break;
}
}
- } else {
- if (event->_type == k1_TMEventTypeDoorAnimation) {
- for (L0588_ui_EventIndex = 0, L0591_ps_Event = _events; L0588_ui_EventIndex < _eventMaxCount; L0588_ui_EventIndex++, L0591_ps_Event++) {
- if ((event->_mapTime == L0591_ps_Event->_mapTime) && (event->getMapXY() == L0591_ps_Event->getMapXY())) {
- if (L0591_ps_Event->_type == k10_TMEventTypeDoor) {
- if (L0591_ps_Event->_C.A._effect == k2_SensorEffToggle) {
- L0591_ps_Event->_C.A._effect = 1 - event->_C.A._effect;
- }
- return L0588_ui_EventIndex;
- }
- if (L0591_ps_Event->_type == k1_TMEventTypeDoorAnimation) {
- L0591_ps_Event->_C.A._effect = event->_C.A._effect;
- return L0588_ui_EventIndex;
- }
+ } else if (event->_type == k1_TMEventTypeDoorAnimation) {
+ TimelineEvent *curEvent = _events;
+ for (uint16 eventIndex = 0; eventIndex < _eventMaxCount; eventIndex++, curEvent++) {
+ if ((event->_mapTime == curEvent->_mapTime) && (event->getMapXY() == curEvent->getMapXY())) {
+ if (curEvent->_type == k10_TMEventTypeDoor) {
+ if (curEvent->_C.A._effect == k2_SensorEffToggle)
+ curEvent->_C.A._effect = 1 - event->_C.A._effect;
+
+ return eventIndex;
}
- }
- } else {
- if (event->_type == k2_TMEventTypeDoorDestruction) {
- for (L0588_ui_EventIndex = 0, L0591_ps_Event = _events; L0588_ui_EventIndex < _eventMaxCount; L0588_ui_EventIndex++, L0591_ps_Event++) {
- if ((event->getMapXY() == L0591_ps_Event->getMapXY()) && (getMap(event->_mapTime) == getMap(L0591_ps_Event->_mapTime))) {
- if ((L0591_ps_Event->_type == k1_TMEventTypeDoorAnimation) || (L0591_ps_Event->_type == k10_TMEventTypeDoor)) {
- deleteEvent(L0588_ui_EventIndex);
- }
- }
+ if (curEvent->_type == k1_TMEventTypeDoorAnimation) {
+ curEvent->_C.A._effect = event->_C.A._effect;
+ return eventIndex;
}
}
}
+ } else if (event->_type == k2_TMEventTypeDoorDestruction) {
+ TimelineEvent *curEvent = _events;
+ for (uint16 eventIndex = 0; eventIndex < _eventMaxCount; eventIndex++, curEvent++) {
+ if ((event->getMapXY() == curEvent->getMapXY()) && (getMap(event->_mapTime) == getMap(curEvent->_mapTime))) {
+ if ((curEvent->_type == k1_TMEventTypeDoorAnimation) || (curEvent->_type == k10_TMEventTypeDoor))
+ deleteEvent(eventIndex);
+ }
+ }
}
- _events[L0590_ui_NewEventIndex = _firstUnusedEventIndex] = *event; /* Copy the event data (Megamax C can assign structures) */
+
+ uint16 newEventIndex = _firstUnusedEventIndex;
+ _events[newEventIndex] = *event; /* Copy the event data (Megamax C can assign structures) */
do {
if (_firstUnusedEventIndex == _eventMaxCount)
break;
_firstUnusedEventIndex++;
} while ((_events[_firstUnusedEventIndex])._type != k0_TMEventTypeNone);
- _timeline[_eventCount] = L0590_ui_NewEventIndex;
+ _timeline[_eventCount] = newEventIndex;
fixChronology(_eventCount++);
- return L0590_ui_NewEventIndex;
+ return newEventIndex;
}
void Timeline::processTimeline() {
- uint16 L0680_ui_Multiple;
-#define AL0680_ui_EventType L0680_ui_Multiple
-#define AL0680_ui_ChampionIndex L0680_ui_Multiple
- TimelineEvent* L0681_ps_Event;
- TimelineEvent L0682_s_Event;
-
-
while (isFirstEventExpiered()) {
- L0681_ps_Event = &L0682_s_Event;
- extractFirstEvent(L0681_ps_Event);
- _vm->_dungeonMan->setCurrentMap(getMap(L0682_s_Event._mapTime));
- AL0680_ui_EventType = L0682_s_Event._type;
- if ((AL0680_ui_EventType > (k29_TMEventTypeGroupReactionDangerOnSquare - 1)) && (AL0680_ui_EventType < (k41_TMEventTypeUpdateBehaviour_3 + 1))) {
- _vm->_groupMan->processEvents29to41(L0682_s_Event._B._location._mapX, L0682_s_Event._B._location._mapY, AL0680_ui_EventType, L0682_s_Event._C._ticks);
- } else {
- switch (AL0680_ui_EventType) {
+ TimelineEvent newEvent;
+ TimelineEvent *curEvent = &newEvent;
+ extractFirstEvent(curEvent);
+ _vm->_dungeonMan->setCurrentMap(getMap(newEvent._mapTime));
+ uint16 curEventType = newEvent._type;
+ if ((curEventType > (k29_TMEventTypeGroupReactionDangerOnSquare - 1)) && (curEventType < (k41_TMEventTypeUpdateBehaviour_3 + 1)))
+ _vm->_groupMan->processEvents29to41(newEvent._B._location._mapX, newEvent._B._location._mapY, curEventType, newEvent._C._ticks);
+ else {
+ switch (curEventType) {
case k48_TMEventTypeMoveProjectileIgnoreImpacts:
case k49_TMEventTypeMoveProjectile:
- _vm->_projexpl->processEvents48To49(L0681_ps_Event);
+ _vm->_projexpl->processEvents48To49(curEvent);
break;
case k1_TMEventTypeDoorAnimation:
- processEventDoorAnimation(L0681_ps_Event);
+ processEventDoorAnimation(curEvent);
break;
case k25_TMEventTypeExplosion:
- _vm->_projexpl->processEvent25(L0681_ps_Event);
+ _vm->_projexpl->processEvent25(curEvent);
break;
case k7_TMEventTypeFakeWall:
- processEventSquareFakewall(L0681_ps_Event);
+ processEventSquareFakewall(curEvent);
break;
case k2_TMEventTypeDoorDestruction:
- processEventDoorDestruction(L0681_ps_Event);
+ processEventDoorDestruction(curEvent);
break;
case k10_TMEventTypeDoor:
- processEventSquareDoor(L0681_ps_Event);
+ processEventSquareDoor(curEvent);
break;
case k9_TMEventTypePit:
- processEventSquarePit(L0681_ps_Event);
+ processEventSquarePit(curEvent);
break;
case k8_TMEventTypeTeleporter:
- processEventSquareTeleporter(L0681_ps_Event);
+ processEventSquareTeleporter(curEvent);
break;
case k6_TMEventTypeWall:
- processEventSquareWall(L0681_ps_Event);
+ processEventSquareWall(curEvent);
break;
case k5_TMEventTypeCorridor:
- processEventSquareCorridor(L0681_ps_Event);
+ processEventSquareCorridor(curEvent);
break;
case k60_TMEventTypeMoveGroupSilent:
case k61_TMEventTypeMoveGroupAudible:
- processEventsMoveGroup(L0681_ps_Event);
+ processEventsMoveGroup(curEvent);
break;
case k65_TMEventTypeEnableGroupGenerator:
- procesEventEnableGroupGenerator(L0681_ps_Event);
+ procesEventEnableGroupGenerator(curEvent);
break;
case k20_TMEventTypePlaySound:
- _vm->_sound->requestPlay(L0682_s_Event._C._soundIndex, L0682_s_Event._B._location._mapX, L0682_s_Event._B._location._mapY, k1_soundModePlayIfPrioritized);
+ _vm->_sound->requestPlay(newEvent._C._soundIndex, newEvent._B._location._mapX, newEvent._B._location._mapY, k1_soundModePlayIfPrioritized);
break;
case k24_TMEventTypeRemoveFluxcage:
if (!_vm->_gameWon) {
- _vm->_dungeonMan->unlinkThingFromList(Thing(L0682_s_Event._C._slot), Thing(0), L0682_s_Event._B._location._mapX, L0682_s_Event._B._location._mapY);
- L0681_ps_Event = (TimelineEvent*)_vm->_dungeonMan->getThingData(Thing(L0682_s_Event._C._slot));
- ((Explosion*)L0681_ps_Event)->setNextThing(Thing::_none);
+ _vm->_dungeonMan->unlinkThingFromList(Thing(newEvent._C._slot), Thing(0), newEvent._B._location._mapX, newEvent._B._location._mapY);
+ curEvent = (TimelineEvent*)_vm->_dungeonMan->getThingData(Thing(newEvent._C._slot));
+ ((Explosion*)curEvent)->setNextThing(Thing::_none);
}
break;
case k11_TMEventTypeEnableChampionAction:
- processEventEnableChampionAction(L0682_s_Event._priority);
- if (L0682_s_Event._B._slotOrdinal) {
- processEventMoveWeaponFromQuiverToSlot(L0682_s_Event._priority, _vm->ordinalToIndex(L0682_s_Event._B._slotOrdinal));
+ processEventEnableChampionAction(newEvent._priority);
+ if (newEvent._B._slotOrdinal) {
+ processEventMoveWeaponFromQuiverToSlot(newEvent._priority, _vm->ordinalToIndex(newEvent._B._slotOrdinal));
}
goto T0261048;
case k12_TMEventTypeHideDamageReceived:
- processEventHideDamageReceived(L0682_s_Event._priority);
+ processEventHideDamageReceived(newEvent._priority);
break;
case k70_TMEventTypeLight:
_vm->_dungeonMan->setCurrentMap(_vm->_dungeonMan->_partyMapIndex);
- processEventLight(L0681_ps_Event);
+ processEventLight(curEvent);
_vm->_inventoryMan->setDungeonViewPalette();
break;
case k71_TMEventTypeInvisibility:
_vm->_championMan->_party._event71Count_Invisibility--;
break;
case k72_TMEventTypeChampionShield:
- _vm->_championMan->_champions[L0682_s_Event._priority]._shieldDefense -= L0682_s_Event._B._defense;
- setFlag(_vm->_championMan->_champions[L0682_s_Event._priority]._attributes, k0x1000_ChampionAttributeStatusBox);
+ _vm->_championMan->_champions[newEvent._priority]._shieldDefense -= newEvent._B._defense;
+ setFlag(_vm->_championMan->_champions[newEvent._priority]._attributes, k0x1000_ChampionAttributeStatusBox);
T0261048:
- _vm->_championMan->drawChampionState((ChampionIndex)L0682_s_Event._priority);
+ _vm->_championMan->drawChampionState((ChampionIndex)newEvent._priority);
break;
case k73_TMEventTypeThievesEye:
_vm->_championMan->_party._event73Count_ThievesEye--;
break;
case k74_TMEventTypePartyShield:
- _vm->_championMan->_party._shieldDefense -= L0682_s_Event._B._defense;
+ _vm->_championMan->_party._shieldDefense -= newEvent._B._defense;
T0261053:
refreshAllChampionStatusBoxes();
break;
case k77_TMEventTypeSpellShield:
- _vm->_championMan->_party._spellShieldDefense -= L0682_s_Event._B._defense;
+ _vm->_championMan->_party._spellShieldDefense -= newEvent._B._defense;
goto T0261053;
case k78_TMEventTypeFireShield:
- _vm->_championMan->_party._fireShieldDefense -= L0682_s_Event._B._defense;
+ _vm->_championMan->_party._fireShieldDefense -= newEvent._B._defense;
goto T0261053;
- case k75_TMEventTypePoisonChampion:
- _vm->_championMan->_champions[AL0680_ui_ChampionIndex = L0682_s_Event._priority]._poisonEventCount--;
- _vm->_championMan->championPoison(AL0680_ui_ChampionIndex, L0682_s_Event._B._attack);
+ case k75_TMEventTypePoisonChampion: {
+ uint16 championIndex = newEvent._priority;
+ _vm->_championMan->_champions[championIndex = newEvent._priority]._poisonEventCount--;
+ _vm->_championMan->championPoison(championIndex, newEvent._B._attack);
+ }
break;
case k13_TMEventTypeViAltarRebirth:
- processEventViAltarRebirth(L0681_ps_Event);
+ processEventViAltarRebirth(curEvent);
break;
case k79_TMEventTypeFootprints:
_vm->_championMan->_party._event79Count_Footprints--;
@@ -383,10 +372,10 @@ bool Timeline::isFirstEventExpiered() {
}
void Timeline::extractFirstEvent(TimelineEvent* event) {
- uint16 L0592_ui_EventIndex;
+ uint16 eventIndex = _timeline[0];
- *event = _events[L0592_ui_EventIndex = _timeline[0]];
- deleteEvent(L0592_ui_EventIndex);
+ *event = _events[eventIndex];
+ deleteEvent(eventIndex);
}
void Timeline::processEventDoorAnimation(TimelineEvent* event) {