diff options
Diffstat (limited to 'engines/dm')
-rw-r--r-- | engines/dm/projexpl.cpp | 141 |
1 files changed, 65 insertions, 76 deletions
diff --git a/engines/dm/projexpl.cpp b/engines/dm/projexpl.cpp index f5c0a71377..a24fb43b46 100644 --- a/engines/dm/projexpl.cpp +++ b/engines/dm/projexpl.cpp @@ -390,94 +390,83 @@ void ProjExpl::projectileDelete(Thing projectileThing, Thing *groupSlot, int16 m } void ProjExpl::processEvents48To49(TimelineEvent* event) { - TimelineEvent* L0519_ps_Event; - Projectile* L0520_ps_Projectile; - Thing L0515_T_ProjectileThingNewCell; - uint16 L0516_ui_Multiple; -#define AL0516_ui_StepEnergy L0516_ui_Multiple -#define AL0516_ui_Square L0516_ui_Multiple - Thing L0521_T_ProjectileThing; - uint16 L0517_ui_ProjectileDirection; - bool L0522_B_ProjectileMovesToOtherSquare; - int16 L0523_i_DestinationMapX; - int16 L0524_i_DestinationMapY; - uint16 L0518_ui_Cell; - int16 L0525_i_SourceMapX = -1; - int16 L0526_i_SourceMapY = -1; - TimelineEvent L0527_s_Event; - - - L0527_s_Event = *event; - L0519_ps_Event = &L0527_s_Event; - L0520_ps_Projectile = (Projectile*)_vm->_dungeonMan->getThingData(L0521_T_ProjectileThing = L0515_T_ProjectileThingNewCell = Thing(L0519_ps_Event->_B._slot)); - L0523_i_DestinationMapX = L0519_ps_Event->_C._projectile.getMapX(); - L0524_i_DestinationMapY = L0519_ps_Event->_C._projectile.getMapY(); - if (L0519_ps_Event->_type == k48_TMEventTypeMoveProjectileIgnoreImpacts) { - L0519_ps_Event->_type = k49_TMEventTypeMoveProjectile; - } else { - L0518_ui_Cell = (L0515_T_ProjectileThingNewCell).getCell(); - if ((_vm->_dungeonMan->_currMapIndex == _vm->_dungeonMan->_partyMapIndex) && (L0523_i_DestinationMapX == _vm->_dungeonMan->_partyMapX) && (L0524_i_DestinationMapY == _vm->_dungeonMan->_partyMapY) && hasProjectileImpactOccurred(kM2_ChampionElemType, L0523_i_DestinationMapX, L0524_i_DestinationMapY, L0518_ui_Cell, L0515_T_ProjectileThingNewCell)) { + int16 sourceMapX = -1; + int16 sourceMapY = -1; + TimelineEvent firstEvent = *event; + TimelineEvent *curEvent = &firstEvent; + Thing projectileThingNewCell = Thing(curEvent->_B._slot); + Thing projectileThing = projectileThingNewCell; + Projectile *projectile = (Projectile*)_vm->_dungeonMan->getThingData(projectileThing); + int16 destinationMapX = curEvent->_C._projectile.getMapX(); + int16 destinationMapY = curEvent->_C._projectile.getMapY(); + + if (curEvent->_type == k48_TMEventTypeMoveProjectileIgnoreImpacts) + curEvent->_type = k49_TMEventTypeMoveProjectile; + else { + uint16 projectileCurCell = projectileThingNewCell.getCell(); + if ((_vm->_dungeonMan->_currMapIndex == _vm->_dungeonMan->_partyMapIndex) && (destinationMapX == _vm->_dungeonMan->_partyMapX) && (destinationMapY == _vm->_dungeonMan->_partyMapY) && hasProjectileImpactOccurred(kM2_ChampionElemType, destinationMapX, destinationMapY, projectileCurCell, projectileThingNewCell)) return; - } - if ((_vm->_groupMan->groupGetThing(L0523_i_DestinationMapX, L0524_i_DestinationMapY) != Thing::_endOfList) && hasProjectileImpactOccurred(kM1_CreatureElemType, L0523_i_DestinationMapX, L0524_i_DestinationMapY, L0518_ui_Cell, L0521_T_ProjectileThing)) { + + if ((_vm->_groupMan->groupGetThing(destinationMapX, destinationMapY) != Thing::_endOfList) && hasProjectileImpactOccurred(kM1_CreatureElemType, destinationMapX, destinationMapY, projectileCurCell, projectileThing)) return; - } - if (L0520_ps_Projectile->_kineticEnergy <= (AL0516_ui_StepEnergy = L0519_ps_Event->_C._projectile.getStepEnergy())) { - _vm->_dungeonMan->unlinkThingFromList(L0515_T_ProjectileThingNewCell = L0521_T_ProjectileThing, Thing(0), L0523_i_DestinationMapX, L0524_i_DestinationMapY); - projectileDelete(L0515_T_ProjectileThingNewCell, NULL, L0523_i_DestinationMapX, L0524_i_DestinationMapY); + + uint16 stepEnergy = curEvent->_C._projectile.getStepEnergy(); + if (projectile->_kineticEnergy <= stepEnergy) { + _vm->_dungeonMan->unlinkThingFromList(projectileThingNewCell = projectileThing, Thing(0), destinationMapX, destinationMapY); + projectileDelete(projectileThingNewCell, NULL, destinationMapX, destinationMapY); return; } - L0520_ps_Projectile->_kineticEnergy -= AL0516_ui_StepEnergy; - if (L0520_ps_Projectile->_attack < AL0516_ui_StepEnergy) { - L0520_ps_Projectile->_attack = 0; - } else { - L0520_ps_Projectile->_attack -= AL0516_ui_StepEnergy; - } + projectile->_kineticEnergy -= stepEnergy; + if (projectile->_attack < stepEnergy) + projectile->_attack = 0; + else + projectile->_attack -= stepEnergy; } - L0517_ui_ProjectileDirection = L0519_ps_Event->_C._projectile.getDir(); - L0515_T_ProjectileThingNewCell = Thing(L0519_ps_Event->_B._slot); - L0518_ui_Cell = L0515_T_ProjectileThingNewCell.getCell(); - L0522_B_ProjectileMovesToOtherSquare = (L0517_ui_ProjectileDirection == L0518_ui_Cell) || (returnNextVal(L0517_ui_ProjectileDirection) == L0518_ui_Cell); - if (L0522_B_ProjectileMovesToOtherSquare) { - L0525_i_SourceMapX = L0523_i_DestinationMapX; - L0526_i_SourceMapY = L0524_i_DestinationMapY; - L0523_i_DestinationMapX += _vm->_dirIntoStepCountEast[L0517_ui_ProjectileDirection], L0524_i_DestinationMapY += _vm->_dirIntoStepCountNorth[L0517_ui_ProjectileDirection]; - AL0516_ui_Square = _vm->_dungeonMan->getSquare(L0523_i_DestinationMapX, L0524_i_DestinationMapY).toByte(); - if ((Square(AL0516_ui_Square).getType() == k0_WallElemType) || - ((Square(AL0516_ui_Square).getType() == k6_FakeWallElemType) && !getFlag(AL0516_ui_Square, (k0x0001_FakeWallImaginary | k0x0004_FakeWallOpen))) || - ((Square(AL0516_ui_Square).getType() == k3_StairsElemType) && (Square(_vm->_dungeonMan->_currMapData[L0525_i_SourceMapX][L0526_i_SourceMapY]).getType() == k3_StairsElemType))) { - if (hasProjectileImpactOccurred(Square(AL0516_ui_Square).getType(), L0525_i_SourceMapX, L0526_i_SourceMapY, L0518_ui_Cell, L0515_T_ProjectileThingNewCell)) { + uint16 projectileDirection = curEvent->_C._projectile.getDir(); + projectileThingNewCell = Thing(curEvent->_B._slot); + uint16 projectileNewCell = projectileThingNewCell.getCell(); + bool projectileMovesToOtherSquare = (projectileDirection == projectileNewCell) || (returnNextVal(projectileDirection) == projectileNewCell); + if (projectileMovesToOtherSquare) { + sourceMapX = destinationMapX; + sourceMapY = destinationMapY; + destinationMapX += _vm->_dirIntoStepCountEast[projectileDirection], destinationMapY += _vm->_dirIntoStepCountNorth[projectileDirection]; + Square destSquare = _vm->_dungeonMan->getSquare(destinationMapX, destinationMapY); + SquareType destSquareType = destSquare.getType(); + if ((destSquareType == k0_WallElemType) || + ((destSquareType == k6_FakeWallElemType) && !getFlag(destSquare.toByte(), (k0x0001_FakeWallImaginary | k0x0004_FakeWallOpen))) || + ((destSquareType == k3_StairsElemType) && (Square(_vm->_dungeonMan->_currMapData[sourceMapX][sourceMapY]).getType() == k3_StairsElemType))) { + if (hasProjectileImpactOccurred(destSquare.getType(), sourceMapX, sourceMapY, projectileNewCell, projectileThingNewCell)) { return; } } } - if ((L0517_ui_ProjectileDirection & 0x0001) == (L0518_ui_Cell & 0x0001)) { - L0518_ui_Cell--; - } else { - L0518_ui_Cell++; - } - L0515_T_ProjectileThingNewCell = thingWithNewCell(L0515_T_ProjectileThingNewCell, L0518_ui_Cell &= 0x0003); - if (L0522_B_ProjectileMovesToOtherSquare) { - _vm->_moveSens->getMoveResult(L0515_T_ProjectileThingNewCell, L0525_i_SourceMapX, L0526_i_SourceMapY, L0523_i_DestinationMapX, L0524_i_DestinationMapY); - L0519_ps_Event->_C._projectile.setMapX(_vm->_moveSens->_moveResultMapX); - L0519_ps_Event->_C._projectile.setMapY(_vm->_moveSens->_moveResultMapY); - L0519_ps_Event->_C._projectile.setDir((Direction)_vm->_moveSens->_moveResultDir); - L0515_T_ProjectileThingNewCell = thingWithNewCell(L0515_T_ProjectileThingNewCell, _vm->_moveSens->_moveResultCell); - M31_setMap(L0519_ps_Event->_mapTime, _vm->_moveSens->_moveResultMapIndex); + + if ((projectileDirection & 0x0001) == (projectileNewCell & 0x0001)) + projectileNewCell--; + else + projectileNewCell++; + + projectileThingNewCell = thingWithNewCell(projectileThingNewCell, projectileNewCell &= 0x0003); + if (projectileMovesToOtherSquare) { + _vm->_moveSens->getMoveResult(projectileThingNewCell, sourceMapX, sourceMapY, destinationMapX, destinationMapY); + curEvent->_C._projectile.setMapX(_vm->_moveSens->_moveResultMapX); + curEvent->_C._projectile.setMapY(_vm->_moveSens->_moveResultMapY); + curEvent->_C._projectile.setDir((Direction)_vm->_moveSens->_moveResultDir); + projectileThingNewCell = thingWithNewCell(projectileThingNewCell, _vm->_moveSens->_moveResultCell); + M31_setMap(curEvent->_mapTime, _vm->_moveSens->_moveResultMapIndex); } else { - if ((Square(_vm->_dungeonMan->getSquare(L0523_i_DestinationMapX, L0524_i_DestinationMapY)).getType() == k4_DoorElemType) && hasProjectileImpactOccurred(k4_DoorElemType, L0523_i_DestinationMapX, L0524_i_DestinationMapY, L0518_ui_Cell, L0521_T_ProjectileThing)) { + if ((Square(_vm->_dungeonMan->getSquare(destinationMapX, destinationMapY)).getType() == k4_DoorElemType) && hasProjectileImpactOccurred(k4_DoorElemType, destinationMapX, destinationMapY, projectileNewCell, projectileThing)) return; - } - _vm->_dungeonMan->unlinkThingFromList(L0515_T_ProjectileThingNewCell, Thing(0), L0523_i_DestinationMapX, L0524_i_DestinationMapY); - _vm->_dungeonMan->linkThingToList(L0515_T_ProjectileThingNewCell, Thing(0), L0523_i_DestinationMapX, L0524_i_DestinationMapY); + + _vm->_dungeonMan->unlinkThingFromList(projectileThingNewCell, Thing(0), destinationMapX, destinationMapY); + _vm->_dungeonMan->linkThingToList(projectileThingNewCell, Thing(0), destinationMapX, destinationMapY); } - L0519_ps_Event->_mapTime += (_vm->_dungeonMan->_currMapIndex == _vm->_dungeonMan->_partyMapIndex) ? 1 : 3; - //Strangerke: CHECKME: Maybe we should keep that piece of code too as it sounds like it's fixing a weird behavior of projectiles on different maps -#ifdef COMPILE42_CSB20EN_CSB21EN /* CHANGE7_20_IMPROVEMENT Projectiles now move at the same speed on all maps instead of moving slower on maps other than the party map */ - L0519_ps_Event->Map_Time++; -#endif - L0519_ps_Event->_B._slot = L0515_T_ProjectileThingNewCell.toUint16(); - L0520_ps_Projectile->_eventIndex = _vm->_timeline->addEventGetEventIndex(L0519_ps_Event); + + // This code is from CSB20. The projectiles move at the same speed on all maps instead of moving slower on maps other than the party map */ + curEvent->_mapTime++; + + curEvent->_B._slot = projectileThingNewCell.toUint16(); + projectile->_eventIndex = _vm->_timeline->addEventGetEventIndex(curEvent); } void ProjExpl::processEvent25(TimelineEvent* event) { |