Fixed original issue with classic switch off trigger wrongly activating some trigger actions

This commit is contained in:
Lwmte 2024-04-24 00:21:00 +02:00
parent 29ebdf452f
commit c13bd9ab19
3 changed files with 48 additions and 34 deletions

View file

@ -1,3 +1,9 @@
Version 1.5
===========
* Fixed original issue with classic switch off trigger wrongly activating some trigger actions.
Version 1.4
===========

View file

@ -114,7 +114,7 @@ int GetSwitchTrigger(ItemInfo* item, short* itemNumbersPtr, int attatchedToSwitc
return k;
}
int SwitchTrigger(short itemNumber, short timer)
bool SwitchTrigger(short itemNumber, short timer)
{
auto& item = g_Level.Items[itemNumber];
const auto& player = Lara;
@ -127,7 +127,7 @@ int SwitchTrigger(short itemNumber, short timer)
item.Status = ITEM_ACTIVE;
item.ItemFlags[1] = false;
return 1;
return true;
}
if (item.ObjectNumber >= ID_PUZZLE_HOLE1 && item.ObjectNumber <= ID_PUZZLE_HOLE16 &&
@ -137,13 +137,13 @@ int SwitchTrigger(short itemNumber, short timer)
item.Status = ITEM_DEACTIVATED;
item.ItemFlags[1] = false;
return 1;
return true;
}
if ((item.ObjectNumber >= ID_PUZZLE_DONE1 && item.ObjectNumber <= ID_PUZZLE_DONE16) ||
(item.ObjectNumber >= ID_PUZZLE_HOLE1 && item.ObjectNumber <= ID_PUZZLE_HOLE16))
{
return 0;
return false;
}
// Handle reusable receptacles.
@ -156,7 +156,7 @@ int SwitchTrigger(short itemNumber, short timer)
item.Status = ITEM_ACTIVE;
item.ItemFlags[5] = (int)ReusableReceptacleState::Done;
item.ItemFlags[1] = false;
return 1;
return true;
}
if (item.ObjectNumber >= ID_KEY_HOLE1 && item.ObjectNumber <= ID_KEY_HOLE16 &&
@ -167,11 +167,11 @@ int SwitchTrigger(short itemNumber, short timer)
item.Status = ITEM_DEACTIVATED;
item.ItemFlags[5] = (int)ReusableReceptacleState::Empty;
item.ItemFlags[1] = false;
return 1;
return true;
}
if (item.ObjectNumber >= ID_KEY_HOLE1 && item.ObjectNumber <= ID_KEY_HOLE16)
return 0;
return false;
// Handle switches.
if (item.Status == ITEM_DEACTIVATED)
@ -186,7 +186,7 @@ int SwitchTrigger(short itemNumber, short timer)
if (timer != 1)
item.Timer = FPS * timer;
return 1;
return true;
}
if (item.TriggerFlags >= 0 || item.Animation.ActiveState != SWITCH_OFF)
@ -197,12 +197,12 @@ int SwitchTrigger(short itemNumber, short timer)
if (!item.ItemFlags[0] == 0)
item.Flags |= ONESHOT;
return 1;
return true;
}
else
{
item.Status = ITEM_ACTIVE;
return 1;
return true;
}
}
else if (item.Status != ITEM_NOT_ACTIVE)
@ -211,13 +211,14 @@ int SwitchTrigger(short itemNumber, short timer)
item.Animation.AnimNumber == GetAnimIndex(item, 2) &&
item.Animation.FrameNumber == GetFrameIndex(&item, 0))
{
return 1;
return true;
}
return ((item.Flags & ONESHOT) >> 8);
if (item.Flags & ONESHOT)
return true;
}
return 0;
return false;
}
int KeyTrigger(short itemNumber)
@ -398,15 +399,11 @@ void Trigger(short const value, short const flags)
void TestTriggers(int x, int y, int z, FloorInfo* floor, Activator activator, bool heavy, int heavyFlags)
{
int flip = -1;
int flipAvailable = 0;
int newEffect = -1;
int switchOff = 0;
//int switchFlag = 0;
short objectNumber = 0;
bool switchOff = false;
bool flipAvailable = false;
int flip = NO_VALUE;
int newEffect = NO_VALUE;
int keyResult = 0;
short cameraFlags = 0;
short cameraTimer = 0;
int spotCamIndex = 0;
auto data = GetTriggerIndex(floor, x, y, z);
@ -466,13 +463,7 @@ void TestTriggers(int x, int y, int z, FloorInfo* floor, Activator activator, bo
if (!SwitchTrigger(value, timer))
return;
objectNumber = g_Level.Items[value].ObjectNumber;
//This disables the antitrigger of the Valve switch (ocb 5). I don't know the purpose of this in TR4.
//if (objectNumber >= ID_SWITCH_TYPE1 && objectNumber <= ID_SWITCH_TYPE6 && g_Level.Items[value].TriggerFlags == 5)
//switchFlag = 1;
switchOff = (g_Level.Items[value].Animation.ActiveState == 1);
switchOff = (triggerType == TRIGGER_TYPES::SWITCH && timer && g_Level.Items[value].Animation.ActiveState == 1);
break;
case TRIGGER_TYPES::MONKEY:
@ -571,8 +562,8 @@ void TestTriggers(int x, int y, int z, FloorInfo* floor, Activator activator, bo
if (keyResult >= 2 ||
(triggerType == TRIGGER_TYPES::ANTIPAD ||
triggerType == TRIGGER_TYPES::ANTITRIGGER ||
triggerType == TRIGGER_TYPES::HEAVYANTITRIGGER) &&
triggerType == TRIGGER_TYPES::ANTITRIGGER ||
triggerType == TRIGGER_TYPES::HEAVYANTITRIGGER) &&
item->Flags & ATONESHOT)
break;
@ -656,7 +647,7 @@ void TestTriggers(int x, int y, int z, FloorInfo* floor, Activator activator, bo
if (triggerType == TRIGGER_TYPES::COMBAT)
break;
if (triggerType == TRIGGER_TYPES::SWITCH && timer && switchOff)
if (switchOff)
break;
if (Camera.number != Camera.last || triggerType == TRIGGER_TYPES::SWITCH)
@ -674,6 +665,9 @@ void TestTriggers(int x, int y, int z, FloorInfo* floor, Activator activator, bo
if (keyResult == 1)
break;
if (switchOff)
break;
if (triggerType == TRIGGER_TYPES::ANTIPAD ||
triggerType == TRIGGER_TYPES::ANTITRIGGER ||
triggerType == TRIGGER_TYPES::HEAVYANTITRIGGER)
@ -748,16 +742,25 @@ void TestTriggers(int x, int y, int z, FloorInfo* floor, Activator activator, bo
break;
case TO_FLIPEFFECT:
if (switchOff)
break;
TriggerTimer = timer;
newEffect = value;
break;
case TO_FINISH:
if (switchOff)
break;
NextLevel = value ? value : (CurrentLevel + 1);
RequiredStartPos = timer;
break;
case TO_CD:
if (switchOff)
break;
PlaySoundTrack(value, flags);
break;
@ -766,6 +769,9 @@ void TestTriggers(int x, int y, int z, FloorInfo* floor, Activator activator, bo
break;
case TO_SECRET:
if (switchOff)
break;
if (!(SaveGame::Statistics.Level.Secrets & (1 << value)))
{
PlaySecretTrack();
@ -777,6 +783,8 @@ void TestTriggers(int x, int y, int z, FloorInfo* floor, Activator activator, bo
case TO_VOLUMEEVENT:
case TO_GLOBALEVENT:
trigger = *(data++);
if (!switchOff)
{
auto& list = targetType == TO_VOLUMEEVENT ? g_Level.VolumeEventSets : g_Level.GlobalEventSets;
@ -815,10 +823,10 @@ void TestTriggers(int x, int y, int z, FloorInfo* floor, Activator activator, bo
if (cameraItem && (Camera.type == CameraType::Fixed || Camera.type == CameraType::Heavy))
Camera.item = cameraItem;
if (flip != -1)
if (flip != NO_VALUE)
DoFlipMap(flip);
if (newEffect != -1 && (flip || !flipAvailable))
if (newEffect != NO_VALUE && (flip || !flipAvailable))
FlipEffect = newEffect;
}

View file

@ -63,7 +63,7 @@ extern int KeyTriggerActive;
bool GetKeyTrigger(ItemInfo* item);
int GetSwitchTrigger(ItemInfo* item, short* itemNumbersPtr, int attatchedToSwitch);
int SwitchTrigger(short itemNumber, short timer);
bool SwitchTrigger(short itemNumber, short timer);
int KeyTrigger(short itemNumber);
bool PickupTrigger(short itemNumber);
void RefreshCamera(short type, short* data);