TombEngine/TR5Main/Objects/TR5/tr5_objects.cpp
TokyoSU 900235c967 Implemented Baboon
- Fixed AIObject not being initialized !
- Fixed ITEM_DEACTIVATED (cause im french and ITEM_DESACTIVATED is more appropriate)
2020-06-04 12:49:08 +02:00

1226 lines
No EOL
31 KiB
C++

#include "framework.h"
#include "tr5_objects.h"
/// entities
#include "tr5_autoguns.h" // OK
#include "tr5_brownbeast.h" // OK
#include "tr5_chef.h" // OK
#include "tr5_cyborg.h" // OK
#include "tr5_doberman.h" // OK
#include "tr5_dog.h" // OK
#include "tr5_ghost.h" // OK
#include "tr5_gladiator.h" // OK
#include "tr5_guard.h" // OK
#include "tr5_gunship.h" // OK
#include "tr5_hydra.h" // OK
#include "tr5_imp.h" // OK
#include "tr5_lagoon_witch.h" // OK
#include "tr5_larson.h" // OK
#include "tr5_laser_head.h" // OK
#include "tr5_lion.h" // OK
#include "tr5_reaper.h" // OK
#include "tr5_roman_statue.h" // OK
#include "tr5_submarine.h" // OK
#include "tr5_willowwisp.h" // OK
/// emitter
#include "tr5_rats_emitter.h"
#include "tr5_bats_emitter.h"
#include "tr5_spider_emitter.h"
#include "tr5_dart_emitter.h"
#include "tr5_smoke_emitter.h"
/// objects
#include "tr5_pushableblock.h"
#include "tr5_twoblockplatform.h"
#include "tr5_raisingcog.h"
#include "tr5_raisingblock.h"
#include "tr5_light.h"
#include "tr5_bodypart.h"
#include "tr5_teleporter.h"
#include "tr5_highobject.h"
#include "tr4_bubbles.h"
#include "tr5_missile.h"
#include "tr5_genslot.h"
/// traps
#include "tr5_teethspike.h"
#include "tr5_ventilator.h"
#include "tr5_deathslide.h"
#include "tr5_electricity.h"
#include "tr5_romehammer.h"
#include "tr5_fallingceiling.h"
#include "tr5_rollingball.h"
/// switch
/// shatter
#include "tr5_smashobject.h"
/// necessary import
#include "collide.h"
#include "laramisc.h"
#include "lara1gun.h"
#include "laraflar.h"
#include "pickup.h"
#include "flmtorch.h"
#include "setup.h"
#include "switch.h"
#include "objects.h"
#include "level.h"
/// register objects
#include "object_helper.h"
static void StartBaddy(ObjectInfo* obj)
{
obj = &Objects[ID_LARA];
if (obj->loaded)
{
obj->initialise = InitialiseLaraLoad;
obj->shadowSize = 160;
obj->hitPoints = 1000;
obj->drawRoutine = nullptr;
obj->saveAnim = true;
obj->saveFlags = true;
obj->saveHitpoints = true;
obj->savePosition = true;
obj->usingDrawAnimatingItem = false;
}
obj = &Objects[ID_SAS];
if (obj->loaded)
{
obj->initialise = InitialiseGuard;
obj->control = GuardControl;
obj->collision = CreatureCollision;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 40;
obj->radius = 102;
obj->pivotLength = 50;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
obj->zoneType = ZONE_HUMAN_CLASSIC;
Bones[obj->boneIndex + 6 * 4] |= ROT_Y;
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
}
obj = &Objects[ID_SWAT];
if (obj->loaded)
{
obj->biteOffset = 0;
obj->initialise = InitialiseGuard;
obj->collision = CreatureCollision;
obj->control = GuardControl;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 24;
obj->pivotLength = 50;
obj->radius = 102;
obj->explodableMeshbits = 0x4000;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
obj->zoneType = ZONE_HUMAN_CLASSIC;
Bones[obj->boneIndex + 6 * 4] |= ROT_Y;
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
}
obj = &Objects[ID_GUARD1];
if (obj->loaded)
{
if (Objects[ID_SWAT].loaded) // object required
obj->animIndex = Objects[ID_SWAT].animIndex;
obj->biteOffset = 4;
obj->initialise = InitialiseGuard;
obj->collision = CreatureCollision;
obj->control = GuardControl;
obj->pivotLength = 50;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 24;
obj->radius = 102;
obj->explodableMeshbits = 0x4000;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
obj->zoneType = ZONE_HUMAN_CLASSIC;
Bones[obj->boneIndex + 6 * 4] |= ROT_Y;
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
}
obj = &Objects[ID_SWAT_PLUS];
if (obj->loaded)
{
short animIndex;
if (!Objects[ID_SWAT].loaded)
animIndex = Objects[ID_GUARD1].animIndex;
else
animIndex = Objects[ID_SWAT].animIndex;
obj->animIndex = animIndex;
obj->biteOffset = 0;
obj->initialise = InitialiseGuard;
obj->collision = CreatureCollision;
obj->control = GuardControl;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 24;
obj->pivotLength = 50;
obj->radius = 102;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
obj->zoneType = ZONE_HUMAN_CLASSIC;
Bones[obj->boneIndex + 6 * 4] |= ROT_Y;
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
}
obj = &Objects[ID_MAFIA];
if (obj->loaded)
{
short animIndex;
if (!Objects[ID_SWAT].loaded)
animIndex = Objects[ID_GUARD1].animIndex;
else
animIndex = Objects[ID_SWAT].animIndex;
obj->animIndex = animIndex;
obj->biteOffset = 0;
obj->initialise = InitialiseGuard;
obj->collision = CreatureCollision;
obj->control = GuardControl;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 24;
obj->pivotLength = 50;
obj->radius = 102;
obj->explodableMeshbits = 0x4000;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
obj->zoneType = ZONE_HUMAN_CLASSIC;
Bones[obj->boneIndex + 6 * 4] |= ROT_Y;
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
}
obj = &Objects[ID_SCIENTIST];
if (obj->loaded)
{
short animIndex;
if (!Objects[ID_SWAT].loaded)
animIndex = Objects[ID_GUARD1].animIndex;
else
animIndex = Objects[ID_SWAT].animIndex;
obj->animIndex = animIndex;
obj->initialise = InitialiseGuard;
obj->control = GuardControl;
obj->collision = CreatureCollision;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 24;
obj->pivotLength = 50;
obj->radius = 102;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
obj->zoneType = ZONE_HUMAN_CLASSIC;
Bones[Objects[69].boneIndex + 6 * 4] |= ROT_Y;
Bones[Objects[69].boneIndex + 6 * 4] |= ROT_X;
Bones[Objects[69].boneIndex + 13 * 4] |= ROT_Y;
Bones[Objects[69].boneIndex + 13 * 4] |= ROT_X;
}
obj = &Objects[ID_GUARD2];
if (obj->loaded)
{
short animIndex;
if (!Objects[ID_SWAT].loaded)
animIndex = Objects[ID_GUARD1].animIndex;
else
animIndex = Objects[ID_SWAT].animIndex;
obj->animIndex = animIndex;
obj->biteOffset = 4;
obj->initialise = InitialiseGuard;
obj->control = GuardControl;
obj->collision = CreatureCollision;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 24;
obj->pivotLength = 50;
obj->radius = 102;
obj->explodableMeshbits = 0x4000;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
obj->zoneType = ZONE_HUMAN_CLASSIC;
Bones[obj->boneIndex + 6 * 4] |= ROT_Y;
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
}
obj = &Objects[ID_GUARD3];
if (obj->loaded)
{
short animIndex;
if (!Objects[ID_SWAT].loaded)
animIndex = Objects[ID_GUARD1].animIndex;
else
animIndex = Objects[ID_SWAT].animIndex;
obj->animIndex = animIndex;
obj->biteOffset = 4;
obj->initialise = InitialiseGuard;
obj->control = GuardControl;
obj->collision = CreatureCollision;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 24;
obj->pivotLength = 50;
obj->radius = 102;
obj->explodableMeshbits = 0x4000;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
obj->zoneType = ZONE_HUMAN_CLASSIC;
Bones[obj->boneIndex + 6 * 4] |= ROT_Y;
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
}
obj = &Objects[ID_ATTACK_SUB];
if (obj->loaded)
{
obj->initialise = InitialiseSubmarine;
obj->collision = CreatureCollision;
obj->control = SubmarineControl;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 100;
obj->pivotLength = 200;
obj->radius = 512;
obj->intelligent = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->saveHitpoints = true;
obj->savePosition = true;
obj->waterCreature = true;
obj->hitEffect = HIT_FRAGMENT;
obj->zoneType = ZONE_FLYER;
obj->undead = true;
Bones[obj->boneIndex] |= ROT_X;
Bones[obj->boneIndex + 4] |= ROT_X;
}
obj = &Objects[ID_CHEF];
if (obj->loaded)
{
obj->initialise = InitialiseChef;
obj->control = ControlChef;
obj->collision = CreatureCollision;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 35;
obj->pivotLength = 50;
obj->radius = 102;
obj->biteOffset = 0;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
obj->zoneType = ZONE_HUMAN_CLASSIC;
Bones[obj->boneIndex + 4 * 6] |= ROT_Y;
Bones[obj->boneIndex + 4 * 6] |= ROT_X;
Bones[obj->boneIndex + 4 * 13] |= ROT_Y;
Bones[obj->boneIndex + 4 * 13] |= ROT_X;
}
obj = &Objects[ID_LION];
if (obj->loaded)
{
obj->initialise = InitialiseLion;
obj->collision = CreatureCollision;
obj->control = LionControl;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 40;
obj->pivotLength = 50;
obj->radius = 341;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
Bones[obj->boneIndex + 6 * 4] |= ROT_Y;
Bones[obj->boneIndex + 19 * 4] |= ROT_Y;
}
obj = &Objects[ID_DOG];
if (obj->loaded)
{
obj->initialise = InitialiseDoberman;
obj->collision = CreatureCollision;
obj->control = DobermanControl;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 18;
obj->pivotLength = 50;
obj->radius = 256;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
Bones[obj->boneIndex + 19 * 4] |= ROT_Y;
}
obj = &Objects[ID_HUSKIE];
if (obj->loaded)
{
obj->initialise = InitialiseTr5Dog;
obj->collision = CreatureCollision;
obj->control = Tr5DogControl;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 24;
obj->pivotLength = 50;
obj->radius = 256;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
Bones[obj->boneIndex + 19 * 4] |= ROT_Y;
}
obj = &Objects[ID_REAPER];
if (obj->loaded)
{
obj->initialise = InitialiseReaper;
obj->collision = CreatureCollision;
obj->control = ReaperControl;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 10;
obj->pivotLength = 50;
obj->radius = 102;
obj->intelligent = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->saveHitpoints = true;
obj->savePosition = true;
obj->hitEffect = HIT_BLOOD;
obj->waterCreature = true;
obj->zoneType = ZONE_FLYER;
}
obj = &Objects[ID_MAFIA2];
if (obj->loaded)
{
obj->biteOffset = 7;
obj->initialise = InitialiseMafia2;
obj->collision = CreatureCollision;
obj->control = Mafia2Control;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 26;
obj->pivotLength = 50;
obj->radius = 102;
obj->explodableMeshbits = 0x4000;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
obj->zoneType = ZONE_HUMAN_CLASSIC;
obj->meshSwapSlot = ID_MESHSWAP_MAFIA2;
Bones[obj->boneIndex + 6 * 4] |= ROT_Y;
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
}
obj = &Objects[ID_PIERRE];
if (obj->loaded)
{
obj->biteOffset = 1;
obj->initialise = InitialiseLarson;
obj->collision = CreatureCollision;
obj->control = LarsonControl;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 60;
obj->pivotLength = 50;
obj->radius = 102;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
Bones[obj->boneIndex + 6 * 4] |= ROT_Y;
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 7 * 4] |= ROT_Y;
Bones[obj->boneIndex + 7 * 4] |= ROT_X;
}
obj = &Objects[ID_LARSON];
if (obj->loaded)
{
obj->biteOffset = 3;
obj->initialise = InitialiseLarson;
obj->collision = CreatureCollision;
obj->control = LarsonControl;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 60;
obj->pivotLength = 50;
obj->radius = 102;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
Bones[obj->boneIndex + 6 * 4] |= ROT_Y;
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 7 * 4] |= ROT_Y;
Bones[obj->boneIndex + 7 * 4] |= ROT_X;
}
obj = &Objects[ID_HITMAN];
if (obj->loaded)
{
obj->biteOffset = 5;
obj->initialise = InitialiseHitman;
obj->collision = CreatureCollision;
obj->control = HitmanControl;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 50;
obj->pivotLength = 50;
obj->radius = 102;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_FRAGMENT;
obj->undead = true;
obj->zoneType = ZONE_HUMAN_CLASSIC;
obj->meshSwapSlot = ID_MESHSWAP_HITMAN;
Bones[obj->boneIndex + 6 * 4] |= ROT_Y;
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
}
obj = &Objects[ID_SNIPER];
if (obj->loaded)
{
obj->biteOffset = 6;
obj->initialise = InitialiseSniper;
obj->collision = CreatureCollision;
obj->control = SniperControl;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 35;
obj->pivotLength = 50;
obj->radius = 102;
obj->explodableMeshbits = 0x4000;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
Bones[obj->boneIndex + 6 * 4] |= ROT_Y;
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
}
obj = &Objects[ID_GUARD_LASER];
if (obj->loaded)
{
obj->biteOffset = 0;
obj->initialise = InitialiseGuardLaser;
obj->collision = CreatureCollision;
//obj->control = GuardControlLaser;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 24;
obj->pivotLength = 50;
obj->radius = 128;
obj->explodableMeshbits = 4;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_FRAGMENT;
obj->undead = true;
Bones[obj->boneIndex] |= ROT_Y;
Bones[obj->boneIndex] |= ROT_X;
Bones[obj->boneIndex + 4] |= ROT_Y;
Bones[obj->boneIndex + 4] |= ROT_X;
}
obj = &Objects[ID_HYDRA];
if (obj->loaded)
{
obj->initialise = InitialiseHydra;
obj->collision = CreatureCollision;
obj->control = HydraControl;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 30;
obj->pivotLength = 50;
obj->radius = 102;
obj->biteOffset = 1024;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_FRAGMENT;
obj->undead = true;
Bones[obj->boneIndex + 0] |= ROT_Y;
Bones[obj->boneIndex + 8 * 4] |= ROT_Y;
Bones[obj->boneIndex + 8 * 4] |= ROT_X;
Bones[obj->boneIndex + 8 * 4] |= ROT_Z;
}
obj = &Objects[ID_IMP];
if (obj->loaded)
{
obj->biteOffset = 256;
obj->initialise = InitialiseImp;
obj->collision = CreatureCollision;
obj->control = ImpControl;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 12;
obj->pivotLength = 20;
obj->radius = 102;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
obj->meshSwapSlot = ID_MESHSWAP_IMP;
Bones[obj->meshIndex + 4 * 4] |= ROT_Z;
Bones[obj->meshIndex + 4 * 4] |= ROT_X;
Bones[obj->meshIndex + 9 * 4] |= ROT_Z;
Bones[obj->meshIndex + 9 * 4] |= ROT_X;
}
obj = &Objects[ID_WILLOWISP];
if (obj->loaded)
{
obj->biteOffset = 256;
obj->initialise = InitialiseLightingGuide;
//obj->control = ControlLightingGuide;
obj->drawRoutine = NULL;
obj->shadowSize = UNIT_SHADOW / 2;
obj->radius = 256;
obj->hitPoints = 16;
obj->pivotLength = 20;
obj->intelligent = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->saveHitpoints = true;
obj->savePosition = true;
obj->zoneType = ZONE_FLYER;
Bones[obj->boneIndex + 4 * 4] |= ROT_Z;
Bones[obj->boneIndex + 4 * 4] |= ROT_X;
Bones[obj->boneIndex + 9 * 4] |= ROT_Z;
Bones[obj->boneIndex + 9 * 4] |= ROT_X;
}
obj = &Objects[ID_BROWN_BEAST];
if (obj->loaded)
{
obj->biteOffset = 256;
obj->initialise = InitialiseBrownBeast;
obj->collision = CreatureCollision;
obj->control = ControlBrowsBeast;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 100;
obj->pivotLength = 20;
obj->radius = 341;
obj->intelligent = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->saveHitpoints = true;
obj->savePosition = true;
obj->hitEffect = HIT_BLOOD;
Bones[obj->boneIndex + 4 * 4] |= ROT_Z;
Bones[obj->boneIndex + 4 * 4] |= ROT_X;
Bones[obj->boneIndex + 9 * 4] |= ROT_Z;
Bones[obj->boneIndex + 9 * 4] |= ROT_X;
}
obj = &Objects[ID_LAGOON_WITCH];
if (obj->loaded)
{
obj->biteOffset = 256;
obj->initialise = InitialiseLagoonWitch;
obj->collision = CreatureCollision;
obj->control = LagoonWitchControl;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 100;
obj->pivotLength = 20;
obj->radius = 256;
obj->intelligent = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->saveHitpoints = true;
obj->savePosition = true;
obj->waterCreature = true;
obj->zoneType = ZONE_FLYER;
Bones[obj->boneIndex + 4 * 4] |= ROT_Z;
Bones[obj->boneIndex + 4 * 4] |= ROT_X;
Bones[obj->boneIndex + 9 * 4] |= ROT_Z;
Bones[obj->boneIndex + 9 * 4] |= ROT_X;
}
obj = &Objects[ID_INVISIBLE_GHOST];
if (obj->loaded)
{
obj->biteOffset = 256;
obj->initialise = InitialiseInvisibleGhost;
obj->collision = CreatureCollision;
obj->control = InvisibleGhostControl;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 100;
obj->pivotLength = 20;
obj->radius = 256;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
Bones[obj->boneIndex + 6 * 4] |= ROT_Y;
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 8 * 4] |= ROT_Y;
Bones[obj->boneIndex + 8 * 4] |= ROT_X;
}
obj = &Objects[ID_RATS_EMITTER];
if (obj->loaded)
{
obj->drawRoutine = NULL;
obj->initialise = InitialiseLittleRats;
obj->control = LittleRatsControl;
obj->usingDrawAnimatingItem = false;
}
obj = &Objects[ID_BATS_EMITTER];
if (obj->loaded)
{
obj->drawRoutine = NULL;
obj->initialise = InitialiseLittleBats;
obj->control = LittleBatsControl;
obj->usingDrawAnimatingItem = false;
}
obj = &Objects[ID_SPIDERS_EMITTER];
if (obj->loaded)
{
obj->drawRoutine = NULL;
obj->initialise = InitialiseSpiders;
obj->control = SpidersEmitterControl;
obj->usingDrawAnimatingItem = false;
}
obj = &Objects[ID_GLADIATOR];
if (obj->loaded)
{
obj->biteOffset = 0;
obj->initialise = InitialiseGladiator;
obj->control = ControlGladiator;
obj->collision = CreatureCollision;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 20;
obj->pivotLength = 50;
obj->radius = 102;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_BLOOD;
Bones[obj->boneIndex + 6 * 4] |= ROT_Y;
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 13 * 4] |= ROT_Y;
Bones[obj->boneIndex + 13 * 4] |= ROT_X;
}
for (int i = 0; i < 2; i++)
{
obj = &Objects[ID_ROMAN_GOD1 + i];
if (obj->loaded)
{
obj->biteOffset = 0;
obj->initialise = InitialiseRomanStatue;
obj->collision = CreatureCollision;
obj->control = RomanStatueControl;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 300;
obj->pivotLength = 50;
obj->radius = 256;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->hitEffect = HIT_SMOKE;
obj->meshSwapSlot = ID_MESHSWAP_ROMAN_GOD1 + i;
Bones[obj->boneIndex + 24] |= ROT_Y;
Bones[obj->boneIndex + 24] |= ROT_X;
Bones[obj->boneIndex + 52] |= ROT_Y;
Bones[obj->boneIndex + 52] |= ROT_X;
}
}
obj = &Objects[ID_LASERHEAD];
if (obj->loaded)
{
obj->initialise = InitialiseLaserHead;
obj->collision = CreatureCollision;
obj->control = LaserHeadControl;
obj->explodableMeshbits = 6;
obj->nonLot = true;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->usingDrawAnimatingItem = false;
obj->undead = true;
obj->hitEffect = HIT_FRAGMENT;
obj->saveMesh = true;
}
obj = &Objects[ID_AUTOGUN];
if (obj->loaded)
{
obj->initialise = InitialiseAutoGuns;
obj->control = AutoGunsControl;
obj->saveHitpoints = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->hitEffect = HIT_BLOOD;
Bones[obj->boneIndex + 6 * 4] |= ROT_Y;
Bones[obj->boneIndex + 6 * 4] |= ROT_X;
Bones[obj->boneIndex + 8 * 4] |= ROT_Y;
}
obj = &Objects[ID_GUNSHIP];
if (obj->loaded)
{
obj->control = ControlGunShip;
obj->saveFlags = true;
obj->saveAnim = true;
Bones[obj->boneIndex + 0] |= ROT_Y;
Bones[obj->boneIndex + 4] |= ROT_X;
}
}
static void StartObject(ObjectInfo* obj)
{
InitPickupItem(obj, FlareControl, ID_FLARE_ITEM);
InitPickupItem(obj, TorchControl, ID_BURNING_TORCH_ITEM, true);
for (int objNumber = ID_SEARCH_OBJECT1; objNumber <= ID_SEARCH_OBJECT4; objNumber++)
InitSearchObject(obj, objNumber);
for (int objNumber = ID_PUSHABLE_OBJECT1; objNumber <= ID_PUSHABLE_OBJECT10; objNumber++)
InitPushableObject(obj, objNumber);
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;
}
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_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->drawRoutine = nullptr;
obj->saveFlags = true;
}
obj = &Objects[ID_BODY_PART];
obj->loaded = true;
obj->control = ControlBodyPart;
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_TELEPORTER];
if (obj->loaded)
{
obj->initialise = InitialiseTeleporter;
obj->control = ControlTeleporter;
obj->drawRoutine = nullptr;
obj->saveFlags = 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_GEN_SLOT1];
if (obj->loaded)
{
obj->control = GenSlot1Control;
obj->saveAnim = true;
obj->saveFlags = true;
}
for (int objectNumber = ID_AI_GUARD; objectNumber <= ID_AI_X2; objectNumber++)
{
obj = &Objects[objectNumber];
if (obj->loaded)
{
obj->drawRoutine = nullptr;
obj->collision = AIPickupCollision;
obj->hitPoints = 0;
}
}
}
static void StartTrap(ObjectInfo* obj)
{
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_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 = &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_FALLING_CEILING];
if (obj->loaded)
{
obj->collision = TrapCollision;
obj->control = FallingCeilingControl;
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_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;
}
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;
}
}
static void StartSwitch(ObjectInfo* obj)
{
obj = &Objects[ID_COG_SWITCH];
if (obj->loaded)
{
obj->collision = CogSwitchCollision;
obj->control = CogSwitchControl;
obj->saveFlags = 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;
}
}
static void StartShatter(ObjectInfo* obj)
{
for (int i = ID_SMASH_OBJECT1; i <= ID_SMASH_OBJECT16; i++)
InitSmashObject(obj, i);
}
static void StartProjectiles(ObjectInfo* obj)
{
InitProjectile(obj, BubblesControl, ID_ENERGY_BUBBLES, true);
InitProjectile(obj, MissileControl, ID_BUBBLES, true);
InitProjectile(obj, MissileControl, ID_IMP_ROCK, true);
InitProjectile(obj, TorpedoControl, ID_TORPEDO);
InitProjectile(obj, ControlGrenade, ID_GRENADE);
InitProjectile(obj, ControlHarpoonBolt, ID_HARPOON);
InitProjectile(obj, ControlCrossbowBolt, ID_CROSSBOW_BOLT);
}
static void StartPickup(ObjectInfo* obj)
{
for (int objNumber = ID_PUZZLE_ITEM1; objNumber <= ID_EXAMINE8_COMBO2; objNumber++)
{
InitPickup(obj, objNumber);
}
InitPickup(obj, ID_HAMMER_ITEM);
InitPickup(obj, ID_CROWBAR_ITEM);
InitPickup(obj, ID_PISTOLS_ITEM);
InitPickup(obj, ID_PISTOLS_AMMO_ITEM);
InitPickup(obj, ID_UZI_ITEM);
InitPickup(obj, ID_UZI_AMMO_ITEM);
InitPickup(obj, ID_SHOTGUN_ITEM);
InitPickup(obj, ID_SHOTGUN_AMMO1_ITEM);
InitPickup(obj, ID_SHOTGUN_AMMO2_ITEM);
InitPickup(obj, ID_CROSSBOW_ITEM);
InitPickup(obj, ID_CROSSBOW_AMMO1_ITEM);
InitPickup(obj, ID_CROSSBOW_AMMO2_ITEM);
InitPickup(obj, ID_CROSSBOW_AMMO3_ITEM);
InitPickup(obj, ID_GRENADE_GUN_ITEM);
InitPickup(obj, ID_GRENADE_AMMO1_ITEM);
InitPickup(obj, ID_GRENADE_AMMO2_ITEM);
InitPickup(obj, ID_GRENADE_AMMO3_ITEM);
InitPickup(obj, ID_HARPOON_ITEM);
InitPickup(obj, ID_HARPOON_AMMO_ITEM);
InitPickup(obj, ID_ROCKET_LAUNCHER_ITEM);
InitPickup(obj, ID_ROCKET_LAUNCHER_AMMO_ITEM);
InitPickup(obj, ID_HK_ITEM);
InitPickup(obj, ID_HK_AMMO_ITEM);
InitPickup(obj, ID_REVOLVER_ITEM);
InitPickup(obj, ID_REVOLVER_AMMO_ITEM);
InitPickup(obj, ID_BIGMEDI_ITEM);
InitPickup(obj, ID_SMALLMEDI_ITEM);
InitPickup(obj, ID_LASERSIGHT_ITEM);
InitPickup(obj, ID_BINOCULARS_ITEM);
InitPickup(obj, ID_SILENCER_ITEM);
InitPickup(obj, ID_FLARE_INV_ITEM);
InitPickup(obj, ID_WATERSKIN1_EMPTY);
InitPickup(obj, ID_WATERSKIN2_EMPTY);
InitPickup(obj, ID_CLOCKWORK_BEETLE);
InitPickup(obj, ID_CLOCKWORK_BEETLE_COMBO1);
InitPickup(obj, ID_CLOCKWORK_BEETLE_COMBO2);
InitPickup(obj, ID_GOLDROSE_ITEM);
}
static ObjectInfo* objToInit;
void InitialiseTR5Objects()
{
StartBaddy(objToInit);
StartObject(objToInit);
StartTrap(objToInit);
StartPickup(objToInit);
StartSwitch(objToInit);
StartShatter(objToInit);
StartProjectiles(objToInit);
}
void AllocTR5Objects()
{
if (Objects[ID_BATS_EMITTER].loaded)
Bats = (BAT_STRUCT*)game_malloc(NUM_BATS * sizeof(BAT_STRUCT));
if (Objects[ID_SPIDERS_EMITTER].loaded)
Spiders = (SPIDER_STRUCT*)game_malloc(NUM_SPIDERS * sizeof(SPIDER_STRUCT));
if (Objects[ID_RATS_EMITTER].loaded)
Rats = (RAT_STRUCT*)game_malloc(NUM_RATS * sizeof(RAT_STRUCT));
}