mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-02 09:47:58 +03:00

- Less Compile Time - ObjectInfo now use std::function. - added isPickup and isPuzzleHole in ObjectInfo. - Renamed EVIL_LARA to LARA_DOPPELGANGER (DOPPELGANGER in xml) - Removed TR1 Larson/Pierre and TR1 Raptor.
1194 lines
27 KiB
C++
1194 lines
27 KiB
C++
#include "framework.h"
|
|
#include "setup.h"
|
|
#include "draw.h"
|
|
#include "collide.h"
|
|
#include "effect2.h"
|
|
#include "effect.h"
|
|
#include "tomb4fx.h"
|
|
#include "box.h"
|
|
#include "switch.h"
|
|
#include "missile.h"
|
|
#include "control.h"
|
|
#include "pickup.h"
|
|
#include "camera.h"
|
|
#include "lara1gun.h"
|
|
#include "laraflar.h"
|
|
#include "larafire.h"
|
|
#include "laramisc.h"
|
|
#include "objects.h"
|
|
#include "door.h"
|
|
#include "rope.h"
|
|
#include "traps.h"
|
|
#include "flmtorch.h"
|
|
#include "level.h"
|
|
#include "oldobjects.h"
|
|
#include "newobjects.h"
|
|
#include "tr1_objects.h"
|
|
#include "tr2_objects.h"
|
|
#include "tr3_objects.h"
|
|
#include "tr4_objects.h"
|
|
#include "tr5_objects.h"
|
|
#include "ObjectsUtils.h"
|
|
|
|
extern byte SequenceUsed[6];
|
|
extern byte SequenceResults[3][3][3];
|
|
extern byte Sequences[3];
|
|
extern byte CurrentSequence;
|
|
extern int NumRPickups;
|
|
|
|
extern GUNSHELL_STRUCT Gunshells[MAX_GUNSHELL];
|
|
extern BLOOD_STRUCT Blood[MAX_SPARKS_BLOOD];
|
|
extern FIRE_SPARKS FireSparks[MAX_SPARKS_FIRE];
|
|
extern SMOKE_SPARKS SmokeSparks[MAX_SPARKS_SMOKE];
|
|
extern DRIP_STRUCT Drips[MAX_DRIPS];
|
|
extern SHOCKWAVE_STRUCT ShockWaves[MAX_SHOCKWAVE];
|
|
extern FIRE_LIST Fires[MAX_FIRE_LIST];
|
|
extern GUNFLASH_STRUCT Gunflashes[MAX_GUNFLASH];
|
|
extern SPARKS Sparks[MAX_SPARKS];
|
|
extern SPLASH_STRUCT Splashes[MAX_SPLASH];
|
|
extern RIPPLE_STRUCT Ripples[MAX_RIPPLES];
|
|
|
|
ObjectInfo Objects[ID_NUMBER_OBJECTS];
|
|
STATIC_INFO StaticObjects[NUM_STATICS];
|
|
|
|
void NewObjects()
|
|
{
|
|
ObjectInfo* obj;
|
|
|
|
obj = &Objects[ID_SARCOPHAGUS];
|
|
if (obj->loaded)
|
|
{
|
|
obj->control = AnimatingControl;
|
|
obj->collision = SarcophagusCollision;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
}
|
|
|
|
obj = &Objects[ID_LARA_DOUBLE];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseLaraDouble;
|
|
obj->control = LaraDoubleControl;
|
|
obj->collision = CreatureCollision;
|
|
obj->shadowSize = 128;
|
|
obj->hitPoints = 1000;
|
|
obj->pivotLength = 50;
|
|
obj->radius = 128;
|
|
obj->intelligent = true;
|
|
obj->savePosition = true;
|
|
obj->saveHitpoints = true;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
}
|
|
}
|
|
|
|
void BaddyObjects()
|
|
{
|
|
|
|
}
|
|
|
|
// TODO: add the flags
|
|
void ObjectObjects()
|
|
{
|
|
ObjectInfo* obj;
|
|
|
|
obj = &Objects[ID_CAMERA_TARGET];
|
|
if (obj->loaded)
|
|
{
|
|
obj->drawRoutine = nullptr;
|
|
obj->usingDrawAnimatingItem = false;
|
|
}
|
|
|
|
obj = &Objects[ID_SMASH_OBJECT1];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseSmashObject;
|
|
obj->collision = ObjectCollision;
|
|
obj->control = SmashObjectControl;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
obj->saveMesh = true;
|
|
}
|
|
|
|
obj = &Objects[ID_SMASH_OBJECT2];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseSmashObject;
|
|
obj->collision = ObjectCollision;
|
|
obj->control = SmashObjectControl;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
obj->saveMesh = true;
|
|
}
|
|
|
|
obj = &Objects[ID_SMASH_OBJECT3];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseSmashObject;
|
|
obj->collision = ObjectCollision;
|
|
obj->control = SmashObjectControl;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
obj->saveMesh = true;
|
|
}
|
|
|
|
obj = &Objects[ID_SMASH_OBJECT4];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseSmashObject;
|
|
obj->collision = ObjectCollision;
|
|
obj->control = SmashObjectControl;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
obj->saveMesh = true;
|
|
}
|
|
|
|
obj = &Objects[ID_SMASH_OBJECT5];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseSmashObject;
|
|
obj->collision = ObjectCollision;
|
|
obj->control = SmashObjectControl;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
obj->saveMesh = true;
|
|
}
|
|
|
|
obj = &Objects[ID_SMASH_OBJECT6];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseSmashObject;
|
|
obj->collision = ObjectCollision;
|
|
obj->control = SmashObjectControl;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
obj->saveMesh = true;
|
|
}
|
|
|
|
obj = &Objects[ID_SMASH_OBJECT7];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseSmashObject;
|
|
obj->collision = ObjectCollision;
|
|
obj->control = SmashObjectControl;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
obj->saveMesh = true;
|
|
}
|
|
|
|
obj = &Objects[ID_SMASH_OBJECT8];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseSmashObject;
|
|
obj->collision = ObjectCollision;
|
|
obj->control = SmashObjectControl;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
obj->saveMesh = true;
|
|
}
|
|
|
|
obj = &Objects[ID_BRIDGE_FLAT];
|
|
if (obj->loaded)
|
|
{
|
|
obj->floor = BridgeFlatFloor;
|
|
obj->ceiling = BridgeFlatCeiling;
|
|
}
|
|
|
|
obj = &Objects[ID_BRIDGE_TILT1];
|
|
if (obj->loaded)
|
|
{
|
|
obj->floor = BridgeTilt1Floor;
|
|
obj->ceiling = BridgeTilt1Ceiling;
|
|
}
|
|
|
|
obj = &Objects[ID_BRIDGE_TILT2];
|
|
if (obj->loaded)
|
|
{
|
|
obj->floor = BridgeTilt2Floor;
|
|
obj->ceiling = BridgeTilt2Ceiling;
|
|
}
|
|
|
|
obj = &Objects[ID_CRUMBLING_FLOOR];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseFallingBlock;
|
|
obj->collision = FallingBlockCollision;
|
|
obj->control = FallingBlockControl;
|
|
obj->floor = FallingBlockFloor;
|
|
obj->ceiling = FallingBlockCeiling;
|
|
obj->saveFlags = true;
|
|
obj->savePosition = true;
|
|
obj->saveMesh = true;
|
|
}
|
|
|
|
for (int objNum = ID_SWITCH_TYPE1; objNum <= ID_SWITCH_TYPE16; objNum++)
|
|
{
|
|
obj = &Objects[objNum];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseSwitch;
|
|
obj->collision = SwitchCollision;
|
|
obj->control = SwitchControl;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
obj->saveMesh = true;
|
|
}
|
|
}
|
|
|
|
obj = &Objects[ID_AIRLOCK_SWITCH];
|
|
if (obj->loaded)
|
|
{
|
|
obj->collision = SwitchCollision;
|
|
obj->control = SwitchControl;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
}
|
|
|
|
obj = &Objects[ID_SEQUENCE_SWITCH1];
|
|
if (obj->loaded)
|
|
{
|
|
obj->collision = FullBlockSwitchCollision;
|
|
obj->control = FullBlockSwitchControl;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
}
|
|
|
|
obj = &Objects[ID_SEQUENCE_SWITCH2];
|
|
if (obj->loaded)
|
|
{
|
|
obj->collision = FullBlockSwitchCollision;
|
|
obj->control = FullBlockSwitchControl;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
}
|
|
|
|
obj = &Objects[ID_SEQUENCE_SWITCH3];
|
|
if (obj->loaded)
|
|
{
|
|
obj->collision = FullBlockSwitchCollision;
|
|
obj->control = FullBlockSwitchControl;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
}
|
|
|
|
for (int objNum = ID_UNDERWATER_SWITCH1; objNum <= ID_UNDERWATER_SWITCH4; objNum++)
|
|
{
|
|
obj = &Objects[objNum];
|
|
if (obj->loaded)
|
|
{
|
|
obj->control = SwitchControl;
|
|
obj->collision = UnderwaterSwitchCollision;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
}
|
|
}
|
|
|
|
obj = &Objects[ID_LEVER_SWITCH];
|
|
if (obj->loaded)
|
|
{
|
|
obj->collision = RailSwitchCollision;
|
|
obj->control = SwitchControl;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
}
|
|
|
|
obj = &Objects[ID_JUMP_SWITCH];
|
|
if (obj->loaded)
|
|
{
|
|
obj->collision = JumpSwitchCollision;
|
|
obj->control = SwitchControl;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
}
|
|
|
|
obj = &Objects[ID_CROWBAR_SWITCH];
|
|
if (obj->loaded)
|
|
{
|
|
obj->collision = CrowbarSwitchCollision;
|
|
obj->control = SwitchControl;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
}
|
|
|
|
obj = &Objects[ID_PULLEY];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialisePulleySwitch;
|
|
obj->control = SwitchControl;
|
|
obj->collision = PulleyCollision;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
}
|
|
|
|
obj = &Objects[ID_COG_SWITCH];
|
|
if (obj->loaded)
|
|
{
|
|
obj->collision = CogSwitchCollision;
|
|
obj->control = CogSwitchControl;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
}
|
|
|
|
obj = &Objects[ID_CROWDOVE_SWITCH];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseCrowDoveSwitch;
|
|
obj->collision = CrowDoveSwitchCollision;
|
|
obj->control = CrowDoveSwitchControl;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
obj->saveMesh = true;
|
|
}
|
|
|
|
for (int objNum = ID_DOOR_TYPE1; objNum <= ID_CLOSED_DOOR6; objNum++)
|
|
{
|
|
obj = &Objects[objNum];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseDoor;
|
|
obj->control = DoorControl;
|
|
obj->collision = DoorCollision;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
obj->saveMesh = true;
|
|
}
|
|
}
|
|
|
|
obj = &Objects[ID_LIFT_DOORS1];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseDoor;
|
|
obj->control = DoorControl;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_LIFT_DOORS2];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseDoor;
|
|
obj->control = DoorControl;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_SEQUENCE_DOOR1];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseDoor;
|
|
obj->collision = DoorCollision;
|
|
obj->control = SequenceDoorControl;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
for (int i = ID_DOUBLE_DOORS1; i <= ID_DOUBLE_DOORS4; i++)
|
|
{
|
|
obj = &Objects[i];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseDoor;
|
|
obj->collision = DoubleDoorCollision;
|
|
obj->control = PushPullKickDoorControl;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
}
|
|
}
|
|
|
|
for (int i = ID_UNDERWATER_DOOR1; i <= ID_UNDERWATER_DOOR4; i++)
|
|
{
|
|
obj = &Objects[i];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseDoor;
|
|
obj->collision = UnderwaterDoorCollision;
|
|
obj->control = PushPullKickDoorControl;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
}
|
|
}
|
|
|
|
for (int objNum = ID_PUSHPULL_DOOR1; objNum <= ID_KICK_DOOR4; objNum++)
|
|
{
|
|
obj = &Objects[objNum];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseDoor;
|
|
obj->collision = PushPullKickDoorCollision;
|
|
obj->control = PushPullKickDoorControl;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
}
|
|
}
|
|
|
|
obj = &Objects[ID_FLOOR_TRAPDOOR1];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseTrapDoor;
|
|
obj->collision = FloorTrapDoorCollision;
|
|
obj->control = TrapDoorControl;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_FLOOR_TRAPDOOR2];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseTrapDoor;
|
|
obj->collision = FloorTrapDoorCollision;
|
|
obj->control = TrapDoorControl;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_CEILING_TRAPDOOR1];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseTrapDoor;
|
|
obj->collision = CeilingTrapDoorCollision;
|
|
obj->control = TrapDoorControl;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_CEILING_TRAPDOOR2];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseTrapDoor;
|
|
obj->collision = CeilingTrapDoorCollision;
|
|
obj->control = TrapDoorControl;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_TRAPDOOR1];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseTrapDoor;
|
|
obj->collision = TrapDoorCollision;
|
|
obj->control = TrapDoorControl;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_TRAPDOOR2];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseTrapDoor;
|
|
obj->collision = TrapDoorCollision;
|
|
obj->control = TrapDoorControl;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_TRAPDOOR3];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseTrapDoor;
|
|
obj->collision = TrapDoorCollision;
|
|
obj->control = TrapDoorControl;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
|
|
|
|
obj = &Objects[ID_TWOBLOCK_PLATFORM];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseTwoBlocksPlatform;
|
|
obj->control = TwoBlocksPlatformControl;
|
|
obj->floor = TwoBlocksPlatformFloor;
|
|
obj->ceiling = TwoBlocksPlatformCeiling;
|
|
obj->saveFlags = true;
|
|
obj->savePosition = true;
|
|
obj->saveAnim = true;
|
|
}
|
|
|
|
obj = &Objects[ID_RAISING_COG];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseRaisingCog;
|
|
obj->control = RaisingCogControl;
|
|
obj->saveFlags = true;
|
|
obj->savePosition = true;
|
|
obj->saveAnim = true;
|
|
}
|
|
|
|
obj = &Objects[ID_ELECTRICAL_LIGHT];
|
|
if (obj->loaded)
|
|
{
|
|
obj->control = ElectricalLightControl;
|
|
obj->drawRoutine = nullptr;
|
|
obj->usingDrawAnimatingItem = false;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_PULSE_LIGHT];
|
|
if (obj->loaded)
|
|
{
|
|
obj->control = PulseLightControl;
|
|
obj->drawRoutine = nullptr;
|
|
obj->usingDrawAnimatingItem = false;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_STROBE_LIGHT];
|
|
if (obj->loaded)
|
|
{
|
|
obj->control = StrobeLightControl;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_COLOR_LIGHT];
|
|
if (obj->loaded)
|
|
{
|
|
obj->control = ColorLightControl;
|
|
obj->drawRoutine = nullptr;
|
|
obj->usingDrawAnimatingItem = false;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_BLINKING_LIGHT];
|
|
if (obj->loaded)
|
|
{
|
|
obj->control = BlinkingLightControl;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
for (int objNum = ID_KEY_HOLE1; objNum <= ID_KEY_HOLE16; objNum++)
|
|
{
|
|
InitKeyHole(obj, objNum);
|
|
}
|
|
|
|
for (int objNum = ID_PUZZLE_HOLE1; objNum <= ID_PUZZLE_HOLE16; objNum++)
|
|
{
|
|
InitPuzzleHole(obj, objNum);
|
|
}
|
|
|
|
for (int objNum = ID_PUZZLE_DONE1; objNum <= ID_PUZZLE_DONE16; objNum++)
|
|
{
|
|
InitPuzzleDone(obj, objNum);
|
|
}
|
|
|
|
for (int objNum = ID_ANIMATING1; objNum <= ID_ANIMATING128; objNum++)
|
|
{
|
|
InitAnimating(obj, objNum);
|
|
}
|
|
|
|
InitAnimating(obj, ID_GUARDIAN_BASE);
|
|
InitAnimating(obj, ID_GUARDIAN_TENTACLE);
|
|
|
|
obj = &Objects[ID_ANIMATING13];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseAnimating;
|
|
obj->control = AnimatingControl;
|
|
obj->collision = nullptr;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
obj->saveMesh = true;
|
|
Bones[obj->boneIndex] |= ROT_Y;
|
|
Bones[obj->boneIndex + 4] |= ROT_X;
|
|
}
|
|
|
|
obj = &Objects[ID_ANIMATING14];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseAnimating;
|
|
obj->control = AnimatingControl;
|
|
obj->collision = nullptr;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
obj->saveMesh = true;
|
|
Bones[obj->boneIndex] |= ROT_Y;
|
|
Bones[obj->boneIndex + 4] |= ROT_X;
|
|
}
|
|
|
|
obj = &Objects[ID_ANIMATING15];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseAnimating;
|
|
obj->control = AnimatingControl;
|
|
obj->collision = nullptr;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
obj->saveMesh = true;
|
|
Bones[obj->boneIndex] |= ROT_Y;
|
|
Bones[obj->boneIndex + 4] |= ROT_X;
|
|
}
|
|
|
|
obj = &Objects[ID_ANIMATING16];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseAnimating;
|
|
obj->control = AnimatingControl;
|
|
obj->collision = nullptr;
|
|
obj->saveFlags = true;
|
|
obj->saveAnim = true;
|
|
obj->saveMesh = true;
|
|
Bones[obj->boneIndex] |= ROT_Y;
|
|
Bones[obj->boneIndex + 4] |= ROT_X;
|
|
}
|
|
|
|
obj = &Objects[ID_TIGHT_ROPE];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseTightRope;
|
|
obj->collision = TightRopeCollision;
|
|
obj->drawRoutine = nullptr;
|
|
obj->saveFlags = true;
|
|
obj->usingDrawAnimatingItem = false;
|
|
}
|
|
|
|
obj = &Objects[ID_PARALLEL_BARS];
|
|
if (obj->loaded)
|
|
{
|
|
obj->collision = ParallelBarsCollision;
|
|
}
|
|
|
|
obj = &Objects[ID_STEEL_DOOR];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseSteelDoor;
|
|
obj->collision = SteelDoorCollision;
|
|
//obj->control = Legacy_SteelDoorControl;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
obj->saveMesh = true;
|
|
obj->savePosition = true;
|
|
}
|
|
|
|
/*obj = &Objects[ID_XRAY_CONTROLLER];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseXRayMachine;
|
|
obj->control = ControlXRayMachine;
|
|
obj->drawRoutine = nullptr;
|
|
obj->saveFlags = true;
|
|
}*/
|
|
|
|
// by default loaded, explosion time :D
|
|
obj = &Objects[ID_BODY_PART];
|
|
obj->loaded = true;
|
|
obj->control = ControlBodyPart;
|
|
|
|
obj = &Objects[ID_EARTHQUAKE];
|
|
if (obj->loaded)
|
|
{
|
|
obj->drawRoutine = nullptr;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_HIGH_OBJECT2];
|
|
if (obj->loaded)
|
|
{
|
|
obj->drawRoutine = nullptr;
|
|
obj->control = HighObject2Control;
|
|
}
|
|
|
|
for (int objNum = ID_RAISING_BLOCK1; objNum <= ID_RAISING_BLOCK4; objNum++)
|
|
{
|
|
obj = &Objects[objNum];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseRaisingBlock;
|
|
obj->control = ControlRaisingBlock;
|
|
obj->saveFlags = true;
|
|
}
|
|
}
|
|
|
|
obj = &Objects[ID_SMOKE_EMITTER_BLACK];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseSmokeEmitter;
|
|
obj->control = SmokeEmitterControl;
|
|
obj->drawRoutine = nullptr;
|
|
obj->usingDrawAnimatingItem = false;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_SMOKE_EMITTER_WHITE];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseSmokeEmitter;
|
|
obj->control = SmokeEmitterControl;
|
|
obj->drawRoutine = nullptr;
|
|
obj->usingDrawAnimatingItem = false;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_SMOKE_EMITTER];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseSmokeEmitter;
|
|
obj->control = SmokeEmitterControl;
|
|
obj->drawRoutine = nullptr;
|
|
obj->usingDrawAnimatingItem = false;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_LENS_FLARE];
|
|
if (obj->loaded)
|
|
{
|
|
//obj->drawRoutine = DrawLensFlare;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
InitProjectile(obj, BubblesControl, ID_ENERGY_BUBBLES, true);
|
|
InitProjectile(obj, MissileControl, ID_BUBBLES, true);
|
|
InitProjectile(obj, MissileControl, ID_IMP_ROCK, true);
|
|
|
|
obj = &Objects[ID_WATERFALLMIST];
|
|
if (obj->loaded)
|
|
{
|
|
obj->control = ControlWaterfallMist;
|
|
obj->drawRoutine = nullptr;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
for (int objNum = ID_WATERFALL1; objNum <= ID_WATERFALL6; objNum++)
|
|
{
|
|
obj = &Objects[objNum];
|
|
if (obj->loaded)
|
|
{
|
|
obj->control = ControlWaterfall;
|
|
obj->saveFlags = true;
|
|
}
|
|
}
|
|
|
|
obj = &Objects[ID_WATERFALLSS1];
|
|
if (obj->loaded)
|
|
{
|
|
obj->control = ControlWaterfall;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_WATERFALLSS2];
|
|
if (obj->loaded)
|
|
{
|
|
obj->control = ControlWaterfall;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
for (int objNum = ID_SHOOT_SWITCH1; objNum <= ID_SHOOT_SWITCH4; objNum++)
|
|
{
|
|
obj = &Objects[objNum];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseShootSwitch;
|
|
obj->control = ControlAnimatingSlots;
|
|
obj->collision = ShootSwitchCollision;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
obj->saveMesh = true;
|
|
}
|
|
}
|
|
|
|
obj = &Objects[ID_TELEPORTER];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseTeleporter;
|
|
obj->control = ControlTeleporter;
|
|
obj->drawRoutine = nullptr;
|
|
obj->saveFlags = true;
|
|
}
|
|
}
|
|
|
|
void TrapObjects()
|
|
{
|
|
ObjectInfo* obj;
|
|
|
|
obj = &Objects[ID_ELECTRICAL_CABLES];
|
|
if (obj->loaded)
|
|
{
|
|
obj->control = ElectricityWiresControl;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_ROME_HAMMER];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseRomeHammer;
|
|
obj->collision = GenericSphereBoxCollision;
|
|
obj->control = AnimatingControl;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_ZIPLINE_HANDLE];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseDeathSlide;
|
|
obj->collision = DeathSlideCollision;
|
|
obj->control = ControlDeathSlide;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
obj->savePosition = true;
|
|
}
|
|
|
|
obj = &Objects[ID_ROLLINGBALL];
|
|
if (obj->loaded)
|
|
{
|
|
obj->collision = RollingBallCollision;
|
|
obj->control = RollingBallControl;
|
|
obj->savePosition = true;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_KILL_ALL_TRIGGERS];
|
|
if (obj->loaded)
|
|
{
|
|
obj->control = KillAllCurrentItems;
|
|
obj->drawRoutine = nullptr;
|
|
obj->hitPoints = 0;
|
|
obj->saveFlags = true;
|
|
obj->usingDrawAnimatingItem = false;
|
|
}
|
|
|
|
obj = &Objects[ID_FALLING_CEILING];
|
|
if (obj->loaded)
|
|
{
|
|
obj->collision = TrapCollision;
|
|
obj->control = FallingCeilingControl;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
obj->savePosition = true;
|
|
}
|
|
|
|
obj = &Objects[ID_FALLING_BLOCK];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseFallingBlock;
|
|
obj->collision = FallingBlockCollision;
|
|
obj->control = FallingBlockControl;
|
|
obj->floor = FallingBlockFloor;
|
|
obj->ceiling = FallingBlockCeiling;
|
|
obj->saveFlags = true;
|
|
obj->savePosition = true;
|
|
}
|
|
|
|
obj = &Objects[ID_FALLING_BLOCK2];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseFallingBlock;
|
|
obj->collision = FallingBlockCollision;
|
|
obj->control = FallingBlockControl;
|
|
obj->floor = FallingBlockFloor;
|
|
obj->ceiling = FallingBlockCeiling;
|
|
obj->saveFlags = true;
|
|
obj->savePosition = true;
|
|
}
|
|
|
|
obj = &Objects[ID_DARTS];
|
|
if (obj->loaded)
|
|
{
|
|
obj->shadowSize = UNIT_SHADOW / 2;
|
|
//obj->drawRoutine = DrawDart;
|
|
obj->collision = ObjectCollision;
|
|
obj->control = DartControl;
|
|
obj->usingDrawAnimatingItem = false;
|
|
}
|
|
|
|
obj = &Objects[ID_DART_EMITTER];
|
|
if (obj->loaded)
|
|
{
|
|
obj->control = DartEmitterControl;
|
|
obj->drawRoutine = nullptr;
|
|
obj->saveFlags = true;
|
|
obj->usingDrawAnimatingItem = false;
|
|
}
|
|
|
|
obj = &Objects[ID_HOMING_DART_EMITTER];
|
|
if (obj->loaded)
|
|
{
|
|
obj->control = DartEmitterControl;
|
|
obj->drawRoutine = nullptr;
|
|
obj->saveFlags = true;
|
|
obj->usingDrawAnimatingItem = false;
|
|
}
|
|
|
|
// Flame is always loaded
|
|
obj = &Objects[ID_FLAME];
|
|
{
|
|
obj->control = FlameControl;
|
|
obj->drawRoutine = nullptr;
|
|
obj->saveFlags = true;
|
|
obj->usingDrawAnimatingItem = false;
|
|
}
|
|
|
|
obj = &Objects[ID_FLAME_EMITTER];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseFlameEmitter;
|
|
obj->collision = FlameEmitterCollision;
|
|
obj->control = FlameEmitterControl;
|
|
obj->drawRoutine = nullptr;
|
|
obj->saveFlags = true;
|
|
obj->usingDrawAnimatingItem = false;
|
|
}
|
|
|
|
obj = &Objects[ID_FLAME_EMITTER2];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseFlameEmitter2;
|
|
obj->collision = FlameEmitterCollision;
|
|
obj->control = FlameEmitter2Control;
|
|
obj->drawRoutine = nullptr;
|
|
obj->saveFlags = true;
|
|
obj->usingDrawAnimatingItem = false;
|
|
}
|
|
|
|
obj = &Objects[ID_FLAME_EMITTER3];
|
|
if (obj->loaded)
|
|
{
|
|
obj->control = FlameEmitter3Control;
|
|
obj->drawRoutine = nullptr;
|
|
obj->saveFlags = true;
|
|
obj->usingDrawAnimatingItem = false;
|
|
}
|
|
|
|
obj = &Objects[ID_GEN_SLOT1];
|
|
if (obj->loaded)
|
|
{
|
|
obj->control = GenSlot1Control;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_GEN_SLOT2];
|
|
if (obj->loaded)
|
|
{
|
|
/*obj->initialise = InitialiseGenSlot2;
|
|
obj->control = GenSlot2Control;
|
|
obj->drawRoutine = DrawGenSlot2;*/
|
|
obj->usingDrawAnimatingItem = false;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_GEN_SLOT3];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseGenSlot3;
|
|
obj->collision = HybridCollision;
|
|
obj->control = AnimatingControl;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_GEN_SLOT4];
|
|
if (obj->loaded)
|
|
{
|
|
//obj->initialise = InitialiseGenSlot4;
|
|
//obj->control = GenSlot4Control;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
obj->savePosition = true;
|
|
}
|
|
|
|
obj = &Objects[ID_HIGH_OBJECT1];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseHighObject1;
|
|
obj->control = ControlHighObject1;
|
|
obj->collision = ObjectCollision;
|
|
obj->saveFlags = true;
|
|
obj->savePosition = true;
|
|
}
|
|
|
|
obj = &Objects[ID_PORTAL];
|
|
if (obj->loaded)
|
|
{
|
|
//obj->initialise = InitialisePortal;
|
|
//obj->control = PortalControl; // TODO: found the control procedure !
|
|
obj->drawRoutine = nullptr; // go to nullsub_44() !
|
|
obj->saveFlags = true;
|
|
obj->usingDrawAnimatingItem = false;
|
|
}
|
|
|
|
obj = &Objects[ID_TRIGGER_TRIGGERER];
|
|
if (obj->loaded)
|
|
{
|
|
obj->control = ControlTriggerTriggerer;
|
|
obj->drawRoutine = nullptr;
|
|
obj->saveFlags = true;
|
|
obj->usingDrawAnimatingItem = false;
|
|
}
|
|
|
|
//FIXME
|
|
//InitialiseRopeTrap();
|
|
|
|
obj = &Objects[ID_ROPE];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseRope;
|
|
obj->control = RopeControl;
|
|
obj->collision = RopeCollision;
|
|
obj->drawRoutine = nullptr;
|
|
obj->saveFlags = true;
|
|
obj->usingDrawAnimatingItem = false;
|
|
}
|
|
|
|
obj = &Objects[ID_POLEROPE];
|
|
if (obj->loaded)
|
|
{
|
|
obj->collision = PoleCollision;
|
|
obj->saveFlags = true;
|
|
}
|
|
|
|
obj = &Objects[ID_WRECKING_BALL];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseWreckingBall;
|
|
obj->collision = WreckingBallCollision;
|
|
obj->control = WreckingBallControl;
|
|
//obj->drawRoutineExtra = DrawWreckingBall;
|
|
obj->saveAnim = true;
|
|
obj->saveFlags = true;
|
|
obj->savePosition = true;
|
|
}
|
|
|
|
obj = &Objects[ID_PROPELLER_H];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseVentilator;
|
|
obj->control = VentilatorControl;
|
|
}
|
|
|
|
obj = &Objects[ID_PROPELLER_V];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseVentilator;
|
|
obj->control = VentilatorControl;
|
|
}
|
|
|
|
obj = &Objects[ID_TEETH_SPIKES];
|
|
if (obj->loaded)
|
|
{
|
|
obj->initialise = InitialiseTeethSpikes;
|
|
obj->control = ControlTeethSpikes;
|
|
//obj->drawRoutine = DrawScaledSpike;
|
|
}
|
|
}
|
|
|
|
void InitialiseSpecialEffects()
|
|
{
|
|
int i;
|
|
SPARKS* sptr;
|
|
|
|
memset(&Sparks, 0, MAX_SPARKS * sizeof(SPARKS));
|
|
memset(&FireSparks, 0, MAX_SPARKS_FIRE * sizeof(FIRE_SPARKS));
|
|
memset(&SmokeSparks, 0, MAX_SPARKS_SMOKE * sizeof(SMOKE_SPARKS));
|
|
memset(&Gunshells, 0, MAX_GUNSHELL * sizeof(GUNSHELL_STRUCT));
|
|
memset(&Gunflashes, 0, (MAX_GUNFLASH * sizeof(GUNFLASH_STRUCT)));
|
|
memset(&Blood, 0, MAX_SPARKS_BLOOD * sizeof(BLOOD_STRUCT));
|
|
memset(&Splashes, 0, MAX_SPLASH * sizeof(SPLASH_STRUCT));
|
|
memset(&Ripples, 0, MAX_RIPPLES * sizeof(RIPPLE_STRUCT));
|
|
memset(&Drips, 0, MAX_DRIPS * sizeof(DRIP_STRUCT));
|
|
memset(&ShockWaves, 0, MAX_SHOCKWAVE * sizeof(SHOCKWAVE_STRUCT));
|
|
|
|
sptr = &Sparks[0];
|
|
for (i = 0; i < MAX_SPARKS; i++)
|
|
{
|
|
sptr->on = false;
|
|
sptr->dynamic = -1;
|
|
sptr++;
|
|
}
|
|
|
|
NextFireSpark = 1;
|
|
NextSmokeSpark = 0;
|
|
NextGunShell = 0;
|
|
NextBubble = 0;
|
|
NextDrip = 0;
|
|
NextBlood = 0;
|
|
WBRoom = -1;
|
|
}
|
|
|
|
void CustomObjects()
|
|
{
|
|
BaddyObjects();
|
|
ObjectObjects();
|
|
TrapObjects();
|
|
}
|
|
|
|
void InitialiseObjects()
|
|
{
|
|
ObjectInfo* obj;
|
|
|
|
for (int i = 0; i < ID_NUMBER_OBJECTS; i++)
|
|
{
|
|
obj = &Objects[i];
|
|
obj->initialise = nullptr;
|
|
obj->collision = nullptr;
|
|
obj->control = nullptr;
|
|
obj->floor = nullptr;
|
|
obj->ceiling = nullptr;
|
|
obj->drawRoutine = DrawAnimatingItem;
|
|
obj->drawRoutineExtra = nullptr;
|
|
obj->pivotLength = 0;
|
|
obj->radius = DEFAULT_RADIUS;
|
|
obj->shadowSize = NO_SHADOW;
|
|
obj->hitPoints = -16384;
|
|
obj->hitEffect = HIT_NONE;
|
|
obj->explodableMeshbits = 0;
|
|
obj->intelligent = false;
|
|
obj->waterCreature = false;
|
|
obj->saveMesh = false;
|
|
obj->saveAnim = false;
|
|
obj->saveFlags = false;
|
|
obj->saveHitpoints = false;
|
|
obj->savePosition = false;
|
|
obj->nonLot = true;
|
|
obj->usingDrawAnimatingItem = true;
|
|
obj->semiTransparent = false;
|
|
obj->undead = false;
|
|
obj->zoneType = ZONE_NULL;
|
|
obj->biteOffset = -1;
|
|
obj->meshSwapSlot = NO_ITEM;
|
|
obj->isPickup = false;
|
|
obj->isPuzzleHole = false;
|
|
obj->frameBase += (short)Frames;
|
|
}
|
|
|
|
InitialiseTR1Objects(); // Standard TR1 objects
|
|
InitialiseTR2Objects(); // Standard TR2 objects
|
|
InitialiseTR3Objects(); // Standard TR3 objects
|
|
InitialiseTR4Objects(); // Standard TR4 objects
|
|
InitialiseTR5Objects(); // Standard TR5 objects
|
|
|
|
// New objects imported from old TRs
|
|
NewObjects();
|
|
|
|
// User defined objects
|
|
CustomObjects();
|
|
|
|
InitialiseHair();
|
|
InitialiseSpecialEffects();
|
|
|
|
NumRPickups = 0;
|
|
CurrentSequence = 0;
|
|
SequenceResults[0][1][2] = 0;
|
|
SequenceResults[0][2][1] = 1;
|
|
SequenceResults[1][0][2] = 2;
|
|
SequenceResults[1][2][0] = 3;
|
|
SequenceResults[2][0][1] = 4;
|
|
SequenceResults[2][1][0] = 5;
|
|
SequenceUsed[0] = 0;
|
|
SequenceUsed[1] = 0;
|
|
SequenceUsed[2] = 0;
|
|
SequenceUsed[3] = 0;
|
|
SequenceUsed[4] = 0;
|
|
SequenceUsed[5] = 0;
|
|
|
|
AllocTR5Objects();
|
|
}
|
|
|
|
void InitialiseGameFlags()
|
|
{
|
|
ZeroMemory(FlipMap, MAX_FLIPMAP * sizeof(int));
|
|
ZeroMemory(FlipStats, MAX_FLIPMAP * sizeof(int));
|
|
|
|
FlipEffect = -1;
|
|
FlipStatus = 0;
|
|
IsAtmospherePlaying = 0;
|
|
Camera.underwater = 0;
|
|
}
|