mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-04-28 15:57:59 +03:00
Fixed original issue with classic switch off trigger wrongly activating some trigger actions
This commit is contained in:
parent
29ebdf452f
commit
c13bd9ab19
3 changed files with 48 additions and 34 deletions
|
@ -1,3 +1,9 @@
|
|||
Version 1.5
|
||||
===========
|
||||
|
||||
* Fixed original issue with classic switch off trigger wrongly activating some trigger actions.
|
||||
|
||||
|
||||
Version 1.4
|
||||
===========
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue