TombEngine/TR5Main/Objects/TR4/tr4_objects.cpp
2021-09-08 18:19:06 +03:00

1222 lines
No EOL
29 KiB
C++

#include "framework.h"
#include "tr4_objects.h"
#include "pickup\pickup.h"
/// entities
#include "tr4_ahmet.h" // OK
#include "tr4_baddy.h" // OK
#include "tr4_bat.h" // OK
#include "tr4_bigscorpion.h" // OK
#include "tr4_crocodile.h" // OK
#include "tr4_demigod.h" // OK
#include "tr4_guide.h" // OK
#include "tr4_harpy.h" // OK
#include "tr4_horseman.h" // OFF
#include "tr4_jeanyves.h" // OK
#include "tr4_knighttemplar.h" // OK
#include "tr4_littlebeetle.h"
#include "tr4_mummy.h" // OK
#include "tr4_sas.h" // OK
#include "tr4_sentrygun.h" // OK
#include "tr4_skeleton.h" // OK
#include "tr4_smallscorpion.h" // OK
#include "tr4_sphinx.h" // OK
#include "tr4_troops.h" // OK
#include "tr4_wildboar.h" // OK
#include "tr4_wraith.h" // OFF
#include "tr4_baboon.h" // OK
#include "tr4_mutant.h" // OK
#include "tr4_locusts.h" // OK
#include "tr4_big_beetle.h" // OFF
#include "tr4_joby_spikes.h"
#include "tr4_mapper.h"
#include "tr4_moving_blade.h"
#include "tr4_element_puzzle.h"
#include "tr4_von_croy.h"
#include "tr4_hammerhead.h"
#include "tr4_dog.h"
/// objects
#include "tr4_sarcophagus.h"
#include "tr4_senet.h"
#include "tr4_clockwork_beetle.h"
/// puzzle
#include "tr4_scales.h"
/// switch
/// traps
#include "tr4_birdblade.h"
#include "tr4_blade.h"
#include "tr4_catwalkblade.h"
#include "tr4_chain.h"
#include "tr4_fourblades.h"
#include "tr4_mine.h"
#include "tr4_plinthblade.h"
#include "tr4_plough.h"
#include "tr4_sethblade.h"
#include "tr4_slicerdicer.h"
#include "tr4_spikeball.h"
#include "tr4_spikywall.h"
#include "tr4_spikyceiling.h"
#include "tr4_stargate.h"
#include "tr4_cog.h"
#include "tr4_laradouble.h"
#include "tr4_setha.h"
/// vehicles
#include "motorbike.h"
#include "jeep.h"
/// necessary import
#include "collide.h"
#include "objects.h"
#include "setup.h"
#include "level.h"
#include "tr4_enemy_jeep.h"
using namespace TEN::Entities::TR4;
static void StartBaddy(OBJECT_INFO* obj)
{
obj = &Objects[ID_SMALL_SCORPION];
if (obj->loaded)
{
obj->initialise = InitialiseSmallScorpion;
obj->control = SmallScorpionControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 8;
obj->hitEffect = HIT_BLOOD;
obj->pivotLength = 20;
obj->radius = 128;
obj->intelligent = true;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->zoneType = ZONE_BASIC;
}
obj = &Objects[ID_BIG_SCORPION];
if (obj->loaded)
{
obj->initialise = InitialiseScorpion;
obj->control = ScorpionControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 80;
obj->hitEffect = HIT_BLOOD;
obj->pivotLength = 50;
obj->radius = 512;
obj->intelligent = true;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->zoneType = ZONE_BASIC;
}
obj = &Objects[ID_HAMMERHEAD];
if (obj->loaded)
{
obj->initialise = InitialiseHammerhead;
obj->control = HammerheadControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 8;
obj->hitEffect = HIT_BLOOD;
obj->pivotLength = 20;
obj->radius = 128;
obj->intelligent = true;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->waterCreature = true;
obj->zoneType = ZONE_WATER;
}
obj = &Objects[ID_WILD_BOAR];
if (obj->loaded)
{
obj->initialise = InitialiseWildBoar;
obj->control = WildBoarControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 40;
obj->hitEffect = HIT_BLOOD;
obj->pivotLength = 50;
obj->radius = 102;
obj->intelligent = true;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->zoneType = ZONE_BASIC;
g_Level.Bones[obj->boneIndex + 48 * 4] |= ROT_Z;
g_Level.Bones[obj->boneIndex + 48 * 4] |= ROT_Y;
g_Level.Bones[obj->boneIndex + 52 * 4] |= ROT_Z;
g_Level.Bones[obj->boneIndex + 52 * 4] |= ROT_Y;
}
obj = &Objects[ID_DOG];
if (obj->loaded)
{
obj->initialise = InitialiseTr4Dog;
obj->collision = CreatureCollision;
obj->control = Tr4DogControl;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 18;
obj->hitEffect = HIT_BLOOD;
obj->pivotLength = 50;
obj->radius = 256;
obj->intelligent = true;
obj->savePosition = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->saveHitpoints = true;
obj->zoneType = ZONE_BASIC;
g_Level.Bones[obj->boneIndex + 19 * 4] |= ROT_Y;
}
obj = &Objects[ID_BAT];
if (obj->loaded)
{
obj->initialise = InitialiseBat;
obj->control = BatControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 5;
obj->hitEffect = HIT_BLOOD;
obj->pivotLength = 10;
obj->radius = 102;
obj->intelligent = true;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->zoneType = ZONE_FLYER;
}
obj = &Objects[ID_AHMET];
if (obj->loaded)
{
obj->initialise = InitialiseAhmet;
obj->control = AhmetControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 80;
obj->hitEffect = HIT_BLOOD;
obj->pivotLength = 300;
obj->radius = 341;
obj->intelligent = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->saveHitpoints = true;
obj->savePosition = true;
obj->zoneType = ZONE_BASIC;
g_Level.Bones[obj->boneIndex + 9 * 4] |= ROT_Y;
}
obj = &Objects[ID_BADDY1];
if (obj->loaded)
{
obj->initialise = InitialiseBaddy;
obj->control = BaddyControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 25;
obj->hitEffect = HIT_BLOOD;
obj->pivotLength = 50;
obj->radius = 102;
obj->intelligent = true;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->meshSwapSlot = ID_MESHSWAP_BADDY1;
obj->zoneType = ZONE_HUMAN_JUMP_AND_MONKEY;
g_Level.Bones[obj->boneIndex + 28 * 4] |= ROT_Y;
g_Level.Bones[obj->boneIndex + 28 * 4] |= ROT_X;
//g_Level.Bones[obj->boneIndex + 88 * 4] |= ROT_Y;
//g_Level.Bones[obj->boneIndex + 88 * 4] |= ROT_X;
}
obj = &Objects[ID_BADDY2];
if (obj->loaded)
{
obj->initialise = InitialiseBaddy;
obj->control = BaddyControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 25;
obj->hitEffect = HIT_BLOOD;
obj->pivotLength = 50;
obj->radius = 102;
obj->intelligent = true;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->meshSwapSlot = ID_MESHSWAP_BADDY2;
obj->zoneType = ZONE_HUMAN_JUMP_AND_MONKEY;
g_Level.Bones[obj->boneIndex + 28 * 4] |= ROT_Y;
g_Level.Bones[obj->boneIndex + 28 * 4] |= ROT_X;
//g_Level.Bones[obj->boneIndex + 88 * 4] |= ROT_Y;
//g_Level.Bones[obj->boneIndex + 88 * 4] |= ROT_X;
}
obj = &Objects[ID_SAS_CAIRO];
if (obj->loaded)
{
obj->initialise = InitialiseSas;
obj->control = SasControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 40;
obj->hitEffect = HIT_BLOOD;
obj->pivotLength = 50;
obj->radius = 102;
obj->intelligent = true;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->zoneType = ZONE_HUMAN_CLASSIC;
g_Level.Bones[obj->boneIndex] |= ROT_Y;
g_Level.Bones[obj->boneIndex] |= ROT_X;
g_Level.Bones[obj->boneIndex + 28 * 4] |= ROT_Y;
g_Level.Bones[obj->boneIndex + 28 * 4] |= ROT_X;
}
obj = &Objects[ID_MUMMY];
if (obj->loaded)
{
obj->initialise = InitialiseMummy;
obj->control = MummyControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 15;
obj->hitEffect = HIT_SMOKE;
obj->radius = 170;
obj->intelligent = true;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->undead = true;
obj->zoneType = ZONE_BASIC;
g_Level.Bones[obj->boneIndex + 7 * 4] |= ROT_Y;
g_Level.Bones[obj->boneIndex + 7 * 4] |= ROT_X;
}
obj = &Objects[ID_SKELETON];
if (obj->loaded)
{
obj->initialise = TEN::Entities::TR4::InitialiseSkeleton;
obj->control = TEN::Entities::TR4::SkeletonControl;
obj->collision = CreatureCollision;
obj->hitPoints = 15;
obj->hitEffect = HIT_SMOKE;
obj->shadowSize = 128;
obj->pivotLength = 50;
obj->radius = 128;
obj->explodableMeshbits = 0xA00;
obj->intelligent = true;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->undead = true;
obj->zoneType = ZONE_SKELLY;
}
obj = &Objects[ID_KNIGHT_TEMPLAR];
if (obj->loaded)
{
obj->initialise = InitialiseKnightTemplar;
obj->control = KnightTemplarControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 15;
obj->hitEffect = HIT_SMOKE;
obj->pivotLength = 50;
obj->radius = 128;
obj->intelligent = true;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->zoneType = ZONE_BASIC;
g_Level.Bones[obj->boneIndex + 6 * 4] |= ROT_X | ROT_Y;
g_Level.Bones[obj->boneIndex + 7 * 4] |= ROT_Y;
}
obj = &Objects[ID_BIG_BEETLE];
if (obj->loaded)
{
obj->initialise = InitialiseBigBeetle;
obj->control = BigBeetleControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 30;
obj->hitEffect = HIT_BLOOD;
obj->pivotLength = 50;
obj->radius = 204;
obj->intelligent = true;
obj->saveHitpoints = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->savePosition = true;
obj->undead = true;
obj->zoneType = ZONE_FLYER;
}
obj = &Objects[ID_SETHA];
if (obj->loaded)
{
obj->initialise = InitialiseSetha;
obj->control = SethaControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 500;
obj->hitEffect = HIT_NONE;
obj->pivotLength = 50;
obj->radius = 341;
obj->intelligent = true;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->undead = true;
obj->zoneType = ZONE_BASIC;
}
obj = &Objects[ID_DEMIGOD1];
if (obj->loaded)
{
obj->initialise = InitialiseDemigod;
obj->control = DemigodControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 200;
obj->hitEffect = HIT_RICOCHET;
obj->pivotLength = 50;
obj->radius = 341;
obj->intelligent = true;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->undead = true;
obj->zoneType = ZONE_BASIC;
g_Level.Bones[obj->boneIndex + 4 * 4] |= ROT_X | ROT_Y | ROT_Z;
g_Level.Bones[obj->boneIndex + 5 * 4] |= ROT_Y;
}
obj = &Objects[ID_DEMIGOD2];
if (obj->loaded)
{
obj->initialise = InitialiseDemigod;
obj->control = DemigodControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 200;
obj->hitEffect = HIT_RICOCHET;
obj->pivotLength = 50;
obj->radius = 341;
obj->intelligent = true;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->zoneType = ZONE_BASIC;
g_Level.Bones[obj->boneIndex + 4 * 4] |= ROT_X | ROT_Y | ROT_Z;
g_Level.Bones[obj->boneIndex + 5 * 4] |= ROT_Y;
}
obj = &Objects[ID_DEMIGOD3];
if (obj->loaded)
{
obj->initialise = InitialiseDemigod;
obj->control = DemigodControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 200;
obj->hitEffect = HIT_RICOCHET;
obj->pivotLength = 50;
obj->radius = 341;
obj->intelligent = true;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveFlags = true;
obj->saveAnim = true;
obj->zoneType = ZONE_BASIC;
g_Level.Bones[obj->boneIndex + 4 * 4] |= ROT_X | ROT_Y | ROT_Z;
g_Level.Bones[obj->boneIndex + 5 * 4] |= ROT_Y;
}
obj = &Objects[ID_JEAN_YVES];
if (obj->loaded)
{
obj->initialise = InitialiseJeanYves;
obj->control = JeanYvesControl;
obj->collision = ObjectCollision;
obj->hitEffect = HIT_BLOOD;
obj->nonLot = true;
obj->savePosition = true;
obj->zoneType = ZONE_BASIC;
}
obj = &Objects[ID_TROOPS];
if (obj->loaded)
{
obj->initialise = InitialiseTroops;
obj->control = TroopsControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 40;
obj->hitEffect = HIT_BLOOD;
obj->pivotLength = 50;
obj->radius = 102;
obj->intelligent = true;
obj->saveHitpoints = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->zoneType = ZONE_BASIC;
g_Level.Bones[obj->boneIndex] |= ROT_X | ROT_Y;
g_Level.Bones[obj->boneIndex + 7 * 4] |= ROT_X | ROT_Y;
}
obj = &Objects[ID_SENTRY_GUN];
if (obj->loaded)
{
obj->initialise = InitialiseSentryGun;
obj->control = SentryGunControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->undead = true;
obj->hitPoints = 30;
obj->hitEffect = HIT_RICOCHET;
obj->pivotLength = 50;
obj->radius = 204;
obj->intelligent = true;
obj->saveHitpoints = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->explodableMeshbits = 64;
obj->zoneType = ZONE_BASIC;
g_Level.Bones[obj->boneIndex + 0] |= ROT_Y;
g_Level.Bones[obj->boneIndex + 1 * 4] |= ROT_X;
g_Level.Bones[obj->boneIndex + 2 * 4] |= ROT_Z;
g_Level.Bones[obj->boneIndex + 3 * 4] |= ROT_Z;
}
obj = &Objects[ID_HARPY];
if (obj->loaded)
{
obj->initialise = InitialiseHarpy;
obj->control = HarpyControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 60;
obj->hitEffect = HIT_SMOKE;
obj->pivotLength = 50;
obj->radius = 409;
obj->intelligent = true;
obj->saveHitpoints = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->zoneType = ZONE_FLYER;
}
obj = &Objects[ID_GUIDE];
if (obj->loaded)
{
obj->initialise = InitialiseGuide;
obj->control = GuideControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = NOT_TARGETABLE;
obj->hitEffect = HIT_BLOOD;
obj->pivotLength = 0;
obj->radius = 128;
obj->intelligent = true;
obj->saveHitpoints = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->zoneType = ZONE_BASIC;
g_Level.Bones[obj->boneIndex + 6 * 4] |= ROT_X | ROT_Y;
g_Level.Bones[obj->boneIndex + 20 * 4] |= ROT_X | ROT_Y;
}
obj = &Objects[ID_CROCODILE];
if (obj->loaded)
{
obj->initialise = InitialiseCrocodile;
obj->control = CrocodileControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 36;
obj->hitEffect = HIT_BLOOD;
obj->pivotLength = 300;
obj->radius = 409;
obj->intelligent = true;
obj->saveHitpoints = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->waterCreature = true;
obj->zoneType = ZONE_WATER;
g_Level.Bones[obj->boneIndex] |= ROT_Y;
g_Level.Bones[obj->boneIndex + 7 * 4] |= ROT_Y;
g_Level.Bones[obj->boneIndex + 9 * 4] |= ROT_Y;
g_Level.Bones[obj->boneIndex + 10 * 4] |= ROT_Y;
}
obj = &Objects[ID_SPHINX];
if (obj->loaded)
{
obj->initialise = InitialiseSphinx;
obj->control = SphinxControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 1000;
obj->hitEffect = HIT_RICOCHET;
obj->pivotLength = 500;
obj->radius = 512;
obj->intelligent = true;
obj->saveHitpoints = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->zoneType = ZONE_BASIC;
}
obj = &Objects[ID_HORSE];
if (obj->loaded)
{
obj->initialise = InitialiseHorse;
obj->control = nullptr;
obj->collision = ObjectCollision;
obj->saveAnim = true;
obj->saveFlags = true;
}
obj = &Objects[ID_HORSEMAN];
if (obj->loaded)
{
obj->initialise = InitialiseHorseman;
obj->control = HorsemanControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 25;
obj->hitEffect = HIT_RICOCHET;
obj->pivotLength = 500;
obj->radius = 409;
obj->intelligent = true;
obj->saveHitpoints = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->savePosition = true;
obj->saveMesh = true;
obj->zoneType = ZONE_BASIC;
}
obj = &Objects[ID_BABOON_NORMAL];
if (obj->loaded)
{
obj->initialise = InitialiseBaboon;
obj->control = BaboonControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 30;
obj->hitEffect = HIT_BLOOD;
obj->pivotLength = 200;
obj->radius = 256;
obj->intelligent = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->saveHitpoints = true;
obj->savePosition = true;
obj->zoneType = ZONE_BASIC;
}
obj = &Objects[ID_BABOON_INV];
if (obj->loaded)
{
obj->initialise = InitialiseBaboon;
obj->control = BaboonControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 30;
obj->hitEffect = HIT_BLOOD;
obj->pivotLength = 200;
obj->radius = 256;
obj->intelligent = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->saveHitpoints = true;
obj->savePosition = true;
obj->zoneType = ZONE_BASIC;
if (Objects[ID_BABOON_NORMAL].loaded)
Objects[ID_BABOON_INV].animIndex = Objects[ID_BABOON_NORMAL].animIndex;
}
obj = &Objects[ID_BABOON_SILENT];
if (obj->loaded)
{
obj->initialise = InitialiseBaboon;
obj->control = BaboonControl;
obj->collision = CreatureCollision;
obj->shadowSize = 128;
obj->hitPoints = 30;
obj->hitEffect = HIT_BLOOD;
obj->pivotLength = 200;
obj->radius = 256;
obj->intelligent = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->saveHitpoints = true;
obj->savePosition = true;
obj->zoneType = ZONE_BASIC;
if (Objects[ID_BABOON_NORMAL].loaded)
Objects[ID_BABOON_SILENT].animIndex = Objects[ID_BABOON_NORMAL].animIndex;
}
obj = &Objects[ID_CROCODILE_GOD];
if (obj->loaded)
{
obj->initialise = TEN::Entities::TR4::InitialiseCrocgod;
obj->control = TEN::Entities::TR4::CrocgodControl;
obj->collision = CreatureCollision;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = NOT_TARGETABLE;
obj->hitEffect = HIT_SMOKE;
obj->pivotLength = 50;
obj->radius = 128;
obj->intelligent = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->saveMesh = true;
obj->savePosition = true;
obj->undead = true;
obj->zoneType = ZONE_WATER;
g_Level.Bones[obj->boneIndex + 6 * 4] |= ROT_Y | ROT_X;
g_Level.Bones[obj->boneIndex + 7 * 4] |= ROT_Y | ROT_X;
}
obj = &Objects[ID_LOCUSTS_EMITTER];
if (obj->loaded)
{
obj->initialise = TEN::Entities::TR4::InitialiseLocust;
obj->control = TEN::Entities::TR4::LocustControl;
obj->drawRoutine = NULL;
obj->saveFlags = true;
obj->zoneType = ZONE_BASIC;
}
obj = &Objects[ID_WRAITH1];
if (obj->loaded)
{
obj->initialise = InitialiseWraith;
obj->control = WraithControl;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveFlags = true;
obj->saveAnim = true;
}
obj = &Objects[ID_WRAITH2];
if (obj->loaded)
{
obj->initialise = InitialiseWraith;
obj->control = WraithControl;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveFlags = true;
obj->saveAnim = true;
}
obj = &Objects[ID_WRAITH3];
if (obj->loaded)
{
obj->initialise = InitialiseWraith;
obj->control = WraithControl;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveFlags = true;
obj->saveAnim = true;
}
obj = &Objects[ID_LITTLE_BEETLE];
if (obj->loaded)
{
obj->initialise = TEN::Entities::TR4::InitialiseScarabs;
obj->control = TEN::Entities::TR4::ScarabsControl;
obj->drawRoutine = NULL;
obj->saveFlags = true;
obj->zoneType = ZONE_BASIC;
}
obj = &Objects[ID_SAS_DYING];
if (obj->loaded)
{
obj->initialise = InitialiseInjuredSas;
obj->control = InjuredSasControl;
obj->collision = ObjectCollision;
obj->hitEffect = HIT_BLOOD;
obj->saveFlags = true;
obj->savePosition = true;
obj->saveAnim = true;
obj->zoneType = ZONE_BASIC;
}
obj = &Objects[ID_SAS_DRAG_BLOKE];
if (obj->loaded)
{
obj->control = AnimatingControl;
obj->collision = SasDragBlokeCollision;
obj->hitEffect = HIT_BLOOD;
obj->saveFlags = true;
obj->savePosition = true;
obj->saveAnim = true;
obj->zoneType = ZONE_BASIC;
}
obj = &Objects[ID_ENEMY_JEEP];
if (obj->loaded)
{
obj->initialise = InitialiseEnemyJeep;
obj->control = EnemyJeepControl;
obj->collision = CreatureCollision;
obj->saveFlags = true;
obj->savePosition = true;
obj->saveAnim = true;
obj->intelligent = true;
obj->saveHitpoints = true;
obj->pivotLength = 500;
obj->shadowSize = 128;
obj->radius = 512;
obj->hitPoints = 40;
obj->zoneType = ZONE_BASIC;
g_Level.Bones[obj->boneIndex + 4 * 8] |= ROT_X;
g_Level.Bones[obj->boneIndex + 4 * 9] |= ROT_X;
g_Level.Bones[obj->boneIndex + 4 * 11] |= ROT_X;
g_Level.Bones[obj->boneIndex + 4 * 12] |= ROT_X;
}
obj = &Objects[ID_VON_CROY];
if (obj->loaded)
{
obj->initialise = InitialiseVonCroy;
obj->control = VonCroyControl;
obj->collision = CreatureCollision;
obj->pivotLength = 0;
obj->shadowSize = 128;
obj->hitPoints = 15;
obj->explodableMeshbits = 0x200000;
obj->intelligent = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveMesh = true;
obj->zoneType = ZONE_HUMAN_LONGJUMP_AND_MONKEY;
g_Level.Bones[obj->boneIndex + 4 * 6] |= ROT_X;
g_Level.Bones[obj->boneIndex + 4 * 6] |= ROT_Y;
g_Level.Bones[obj->boneIndex + 4 * 20] |= ROT_X;
g_Level.Bones[obj->boneIndex + 4 * 20] |= ROT_Y;
}
}
static void StartObject(OBJECT_INFO* obj)
{
obj = &Objects[ID_SARCOPHAGUS];
if (obj->loaded)
{
obj->control = AnimatingControl;
obj->collision = SarcophagusCollision;
obj->hitEffect = HIT_RICOCHET;
obj->saveFlags = true;
obj->saveAnim = true;
}
obj = &Objects[ID_MAPPER];
if (obj->loaded)
{
obj->initialise = InitialiseMapper;
obj->control = MapperControl;
obj->saveFlags = true;
obj->saveAnim = true;
obj->drawRoutine = nullptr;
}
obj = &Objects[ID_ELEMENT_PUZZLE];
if (obj->loaded)
{
obj->initialise = InitialiseElementPuzzle;
obj->control = ElementPuzzleControl;
obj->collision = ElementPuzzleCollision;
obj->saveFlags = true;
obj->saveMesh = true;
}
obj = &Objects[ID_WHEEL_OF_FORTUNE];
if (obj->loaded)
{
obj->initialise = InitialiseGameStix;
obj->control = GameStixControl;
obj->collision = GameStixCollision;
g_Level.Bones[obj->boneIndex] |= 0x10;
g_Level.Bones[obj->boneIndex + 4] |= 0x10;
g_Level.Bones[obj->boneIndex + 8] |= 0x10;
g_Level.Bones[obj->boneIndex + 12] |= 0x10;
obj->saveAnim = 1;
obj->saveFlags = 1;
obj->hitPoints = 1;
}
obj = &Objects[ID_ENEMY_PIECE];
if (obj->loaded)
{
obj->collision = ObjectCollision;
obj->hitEffect = HIT_RICOCHET;
obj->saveAnim = 1;
}
obj = &Objects[ID_GOD_HEAD];
if (obj->loaded)
{
obj->control = ControlGodHead;
// obj->drawRoutine = DrawGodHead;
// obj->usingDrawAnimatingItem = 0;
obj->saveFlags = 1;
}
for (int i = 0; i < 3; i++)
{
obj = &Objects[ID_GAME_PIECE1 + i];
if (obj->loaded)
{
obj->initialise = InitialiseGamePiece;
obj->control = SenetControl;
obj->collision = ObjectCollision;
obj->hitEffect = HIT_RICOCHET;
obj->savePosition = 1;
obj->saveHitpoints = 1;
obj->saveFlags = 1;
}
}
obj = &Objects[ID_CLOCKWORK_BEETLE];
if (obj->loaded)
{
obj->initialise = 0;
obj->control = ClockworkBeetleControl;
obj->collision = PickupCollision;
}
obj = &Objects[ID_CLOCKWORK_BEETLE_COMBO1];
if (obj->loaded)
{
obj->collision = PickupCollision;
}
obj = &Objects[ID_CLOCKWORK_BEETLE_COMBO2];
if (obj->loaded)
{
obj->collision = PickupCollision;
}
}
static void StartTrap(OBJECT_INFO* obj)
{
obj = &Objects[ID_CHAIN];
if (obj->loaded)
{
obj->control = ChainControl;
obj->collision = GenericSphereBoxCollision;
obj->hitEffect = HIT_RICOCHET;
obj->saveAnim = true;
obj->saveFlags = true;
}
obj = &Objects[ID_PLOUGH];
if (obj->loaded)
{
obj->control = PloughControl;
obj->collision = GenericSphereBoxCollision;
obj->hitEffect = HIT_RICOCHET;
obj->saveAnim = true;
obj->saveFlags = true;
}
obj = &Objects[ID_FLOOR_4BLADES];
if (obj->loaded)
{
obj->control = FourBladesControl;
obj->collision = GenericSphereBoxCollision;
obj->hitEffect = HIT_RICOCHET;
obj->saveAnim = true;
obj->saveFlags = true;
}
obj = &Objects[ID_CEILING_4BLADES];
if (obj->loaded)
{
obj->control = FourBladesControl;
obj->collision = GenericSphereBoxCollision;
obj->hitEffect = HIT_RICOCHET;
obj->saveAnim = true;
obj->saveFlags = true;
}
obj = &Objects[ID_CATWALK_BLADE];
if (obj->loaded)
{
obj->control = CatwalkBladeControl;
obj->collision = BladeCollision;
obj->hitEffect = HIT_RICOCHET;
obj->saveAnim = true;
obj->saveFlags = true;
}
obj = &Objects[ID_SETH_BLADE];
if (obj->loaded)
{
obj->initialise = InitialiseSethBlade;
obj->control = SethBladeControl;
obj->collision = GenericSphereBoxCollision;
obj->hitEffect = HIT_RICOCHET;
obj->saveAnim = true;
obj->saveFlags = true;
}
obj = &Objects[ID_PLINTH_BLADE];
if (obj->loaded)
{
obj->control = PlinthBladeControl;
obj->collision = BladeCollision;
obj->hitEffect = HIT_RICOCHET;
obj->saveAnim = true;
obj->saveFlags = true;
}
obj = &Objects[ID_BIRD_BLADE];
if (obj->loaded)
{
obj->control = BirdBladeControl;
obj->collision = GenericSphereBoxCollision;
obj->hitEffect = HIT_RICOCHET;
obj->saveAnim = true;
obj->saveFlags = true;
}
obj = &Objects[ID_JOBY_SPIKES];
if (obj->loaded)
{
obj->initialise = InitialiseJobySpikes;
obj->control = JobySpikesControl;
obj->collision = GenericSphereBoxCollision;
obj->hitEffect = HIT_RICOCHET;
obj->saveFlags = true;
}
obj = &Objects[ID_MOVING_BLADE];
if (obj->loaded)
{
obj->control = MovingBladeControl;
obj->collision = BladeCollision;
obj->hitEffect = HIT_RICOCHET;
obj->saveFlags = true;
obj->saveAnim = true;
}
obj = &Objects[ID_SPIKEBALL];
if (obj->loaded)
{
obj->control = SpikeballControl;
obj->collision = GenericSphereBoxCollision;
obj->saveAnim = true;
obj->saveFlags = true;
}
obj = &Objects[ID_CHAIN];
if (obj->loaded)
{
obj->control = ChainControl;
obj->collision = GenericSphereBoxCollision;
obj->hitEffect = HIT_RICOCHET;
obj->saveAnim = true;
obj->saveFlags = true;
}
obj = &Objects[ID_PLOUGH];
if (obj->loaded)
{
obj->control = PloughControl;
obj->collision = GenericSphereBoxCollision;
obj->hitEffect = HIT_RICOCHET;
obj->saveAnim = true;
obj->saveFlags = true;
}
obj = &Objects[ID_FLOOR_4BLADES];
if (obj->loaded)
{
obj->control = FourBladesControl;
obj->collision = GenericSphereBoxCollision;
obj->saveAnim = true;
obj->saveFlags = true;
}
obj = &Objects[ID_CEILING_4BLADES];
if (obj->loaded)
{
obj->control = FourBladesControl;
obj->collision = GenericSphereBoxCollision;
obj->saveAnim = true;
obj->saveFlags = true;
}
obj = &Objects[ID_STARGATE];
if (obj->loaded)
{
obj->control = StargateControl;
obj->collision = StargateCollision;
obj->hitEffect = HIT_RICOCHET;
obj->saveAnim = true;
obj->saveFlags = true;
}
obj = &Objects[ID_SLICER_DICER];
if (obj->loaded)
{
obj->initialise = InitialiseSlicerDicer;
obj->control = SlicerDicerControl;
obj->collision = BladeCollision;
obj->hitEffect = HIT_RICOCHET;
obj->saveFlags = true;
}
obj = &Objects[ID_MINE];
if (obj->loaded)
{
obj->initialise = InitialiseMine;
obj->control = MineControl;
obj->collision = MineCollision;
obj->saveFlags = true;
obj->saveAnim = true;
obj->savePosition = true;
}
obj = &Objects[ID_SPIKY_WALL];
if (obj->loaded)
{
obj->control = ControlSpikyWall;
obj->collision = ObjectCollision;
obj->hitEffect = HIT_RICOCHET;
obj->savePosition = true;
obj->saveFlags = true;
}
obj = &Objects[ID_SPIKY_CEILING];
if (obj->loaded)
{
obj->control = ControlSpikyCeiling;
obj->collision = TrapCollision;
obj->hitEffect = HIT_RICOCHET;
obj->savePosition = true;
obj->saveFlags = true;
}
obj = &Objects[ID_COG];
if (obj->loaded)
{
obj->control = CogControl;
obj->collision = GenericSphereBoxCollision;
obj->hitEffect = HIT_RICOCHET;
obj->saveAnim = true;
obj->saveFlags = true;
}
obj = &Objects[ID_LARA_DOUBLE];
if (obj->loaded)
{
obj->initialise = InitialiseLaraDouble;
obj->control = LaraDoubleControl;
obj->collision = CreatureCollision;
obj->hitEffect = HIT_SMOKE;
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;
obj->zoneType = ZONE_BASIC;
}
}
static void StartVehicles(OBJECT_INFO* obj)
{
obj = &Objects[ID_JEEP];
if (obj->loaded)
{
obj->initialise = InitialiseJeep;
obj->collision = JeepCollision;
obj->hitEffect = HIT_RICOCHET;
obj->savePosition = true;
obj->saveAnim = true;
obj->saveFlags = true;
}
obj = &Objects[ID_MOTORBIKE];
if (obj->loaded)
{
obj->initialise = InitialiseMotorbike;
obj->collision = MotorbikeCollision;
//obj->drawRoutine = DrawMotorbike; // for wheel rotation
obj->hitEffect = HIT_RICOCHET;
obj->drawRoutineExtra = DrawMotorbikeEffect;
obj->savePosition = true;
obj->saveAnim = true;
obj->saveFlags = true;
}
}
static void StartSwitch(OBJECT_INFO* obj)
{
}
static OBJECT_INFO* objToInit;
void InitialiseTR4Objects()
{
StartBaddy(objToInit);
StartObject(objToInit);
StartSwitch(objToInit);
StartTrap(objToInit);
StartVehicles(objToInit);
}
void AllocTR4Objects()
{
TEN::Entities::TR4::Scarabs = game_malloc<SCARAB_INFO>(TEN::Entities::TR4::NUM_LITTLE_BETTLES);
ZeroMemory(TEN::Entities::TR4::Scarabs, TEN::Entities::TR4::NUM_LITTLE_BETTLES * sizeof(SCARAB_INFO));
}