TombEngine/TR5Main/Objects/TR5/tr5_objects.cpp

936 lines
25 KiB
C++
Raw Normal View History

#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"
/// objects
/// traps
/// 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 "objects.h"
#include "level.h"
#include "ObjectsUtils.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;
}
else
{
printf("lara not found !");
}
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_GUARDIAN];
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->unknown = 3;
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);
}
static void StartTrap(ObjectInfo* obj)
{
}
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, 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_GAME_PIECE1);
InitPickup(obj, ID_GAME_PIECE2);
InitPickup(obj, ID_GAME_PIECE3);
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);
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));
}