Added TR3 flamethrower; Added TR3 spiky ceiling; Added TR3 spiky wall; Added TR4 horse and horseman; New slots;

This commit is contained in:
MontyTRC89 2019-05-06 23:48:35 +02:00
parent 3be58f2b4a
commit 0e49d65c8e
27 changed files with 1478 additions and 185 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -113,7 +113,7 @@ __int32 __cdecl CollideStaticObjects(COLL_INFO* coll, __int32 x, __int32 y, __in
return false; return false;
} }
__int32 GetCollidedObjects(ITEM_INFO* collidingItem, __int32 radius, __int32 onlyVisible, ITEM_INFO** collidedItems, MESH_INFO** collidedMeshes, __int32 ignoreLara) __int32 __cdecl GetCollidedObjects(ITEM_INFO* collidingItem, __int32 radius, __int32 onlyVisible, ITEM_INFO** collidedItems, MESH_INFO** collidedMeshes, __int32 ignoreLara)
{ {
// Collect all the rooms where to check // Collect all the rooms where to check
__int16 roomsArray[22]; __int16 roomsArray[22];
@ -283,7 +283,7 @@ __int32 GetCollidedObjects(ITEM_INFO* collidingItem, __int32 radius, __int32 onl
return (numItems | numMeshes); return (numItems | numMeshes);
} }
__int32 TestWithGlobalCollisionBounds(ITEM_INFO* item, ITEM_INFO* lara, COLL_INFO* coll) __int32 __cdecl TestWithGlobalCollisionBounds(ITEM_INFO* item, ITEM_INFO* lara, COLL_INFO* coll)
{ {
__int16* framePtr = GetBestFrame(lara); __int16* framePtr = GetBestFrame(lara);
@ -311,6 +311,24 @@ __int32 TestWithGlobalCollisionBounds(ITEM_INFO* item, ITEM_INFO* lara, COLL_INF
return true; return true;
} }
void __cdecl TrapCollision(__int16 itemNumber, ITEM_INFO* l, COLL_INFO* c)
{
ITEM_INFO* item = &Items[itemNumber];
if (item->status == ITEM_ACTIVE)
{
if (!TestBoundsCollide(item, l, c->radius))
return;
TestCollision(item, LaraItem);
/*if (item->object_number == FAN && item->current_anim_state == 1) // Is the fan moving slow ?
ObjectCollision(item_num, laraitem, coll);*/
}
else if (item->status != ITEM_INVISIBLE)
ObjectCollision(itemNumber, l, c);
}
void Inject_Collide() void Inject_Collide()
{ {
INJECT(0x00411DB0, CollideStaticObjects); INJECT(0x00411DB0, CollideStaticObjects);

View file

@ -14,7 +14,8 @@
#define MoveLaraPosition ((__int32 (__cdecl*)(PHD_VECTOR*, ITEM_INFO*, ITEM_INFO*)) 0x00413840) #define MoveLaraPosition ((__int32 (__cdecl*)(PHD_VECTOR*, ITEM_INFO*, ITEM_INFO*)) 0x00413840)
__int32 __cdecl CollideStaticObjects(COLL_INFO* coll, __int32 x, __int32 y, __int32 z, __int16 roomNumber, __int32 hite); __int32 __cdecl CollideStaticObjects(COLL_INFO* coll, __int32 x, __int32 y, __int32 z, __int16 roomNumber, __int32 hite);
__int32 GetCollidedObjects(ITEM_INFO* collidingItem, __int32 radius, __int32 flag1, ITEM_INFO** collidedItems, MESH_INFO** collidedMeshes, __int32 flag2); __int32 __cdecl GetCollidedObjects(ITEM_INFO* collidingItem, __int32 radius, __int32 flag1, ITEM_INFO** collidedItems, MESH_INFO** collidedMeshes, __int32 flag2);
__int32 TestWithGlobalCollisionBounds(ITEM_INFO* item, ITEM_INFO* lara, COLL_INFO* coll); __int32 __cdecl TestWithGlobalCollisionBounds(ITEM_INFO* item, ITEM_INFO* lara, COLL_INFO* coll);
void __cdecl TrapCollision(__int16 itemNumber, ITEM_INFO* l, COLL_INFO* c);
void Inject_Collide(); void Inject_Collide();

View file

@ -370,6 +370,8 @@ GAME_STATUS __cdecl ControlPhase(__int32 numFrames, __int32 demoMode)
SoundEffects(); SoundEffects();
HealtBarTimer--; HealtBarTimer--;
GameTimer++;
} }
return GAME_STATUS_NONE; return GAME_STATUS_NONE;
@ -432,15 +434,10 @@ GAME_STATUS __cdecl DoLevel(__int32 index, __int32 ambient, bool loadFromSavegam
if (!loadFromSavegame) if (!loadFromSavegame)
{ {
Savegame.Level.Timer = 0; Savegame.Level.Timer = 0;
Savegame.Game.Timer = 0;
Savegame.Level.Distance = 0; Savegame.Level.Distance = 0;
Savegame.Game.Distance = 0;
Savegame.Level.AmmoUsed = 0; Savegame.Level.AmmoUsed = 0;
Savegame.Game.AmmoUsed = 0;
Savegame.Level.AmmoHits = 0; Savegame.Level.AmmoHits = 0;
Savegame.Game.AmmoHits = 0;
Savegame.Level.Kills = 0; Savegame.Level.Kills = 0;
Savegame.Game.Kills = 0;
} }
// Load the level // Load the level
@ -448,7 +445,6 @@ GAME_STATUS __cdecl DoLevel(__int32 index, __int32 ambient, bool loadFromSavegam
// Initialise items, effects, lots, camera // Initialise items, effects, lots, camera
InitialiseFXArray(true); InitialiseFXArray(true);
//InitialiseLOTarray(true);
InitialisePickUpDisplay(); InitialisePickUpDisplay();
InitialiseCamera(); InitialiseCamera();
SOUND_Stop(); SOUND_Stop();
@ -461,18 +457,18 @@ GAME_STATUS __cdecl DoLevel(__int32 index, __int32 ambient, bool loadFromSavegam
sprintf(fileName, "savegame.%d", g_GameFlow->SelectedSaveGame); sprintf(fileName, "savegame.%d", g_GameFlow->SelectedSaveGame);
SaveGame::Load(fileName); SaveGame::Load(fileName);
gfRequiredStartPos = false; RequiredStartPos = false;
gfInitialiseGame = false; InitialiseGame = false;
g_GameFlow->SelectedSaveGame = 0; g_GameFlow->SelectedSaveGame = 0;
} }
else else
{ {
gfRequiredStartPos = false; RequiredStartPos = false;
if (gfInitialiseGame) if (InitialiseGame)
{ {
GameTimer = 0; GameTimer = 0;
gfRequiredStartPos = false; RequiredStartPos = false;
gfInitialiseGame = false; InitialiseGame = false;
} }
Savegame.Level.Timer = 0; Savegame.Level.Timer = 0;
@ -480,8 +476,7 @@ GAME_STATUS __cdecl DoLevel(__int32 index, __int32 ambient, bool loadFromSavegam
Savegame.TLCount = 0; Savegame.TLCount = 0;
} }
// TODO: deprecated? LastInventoryItem = -1;
GlobalLastInventoryItem = -1;
DelCutSeqPlayer = 0; DelCutSeqPlayer = 0;
TitleControlsLockedOut = false; TitleControlsLockedOut = false;
@ -982,7 +977,7 @@ void __cdecl TestTriggers(__int16* data, __int32 heavy, __int32 HeavyFlags)
break; break;
case TO_FINISH: case TO_FINISH:
gfRequiredStartPos = false; RequiredStartPos = false;
LevelComplete = CurrentLevel + 1; LevelComplete = CurrentLevel + 1;
break; break;

View file

@ -43,42 +43,3 @@ __int32 __cdecl LoadSavegameInfos()
return 0; return 0;
} }
__int32 __cdecl LoadNewStrings()
{
FILE* filePtr = fopen("english.txt", "r");
if (filePtr == NULL) return false;
char buffer[1000];
ZeroMemory(buffer, 1000);
__int32 stringLength = 0;
char c = getc(filePtr);
while (c != EOF)
{
if (c == '\r')
{
c = getc(filePtr);
continue;
}
if (c == '\n')
{
buffer[stringLength] = 0;
g_NewStrings.push_back(string(buffer));
ZeroMemory(buffer, 1000);
c = getc(filePtr);
stringLength = 0;
continue;
}
buffer[stringLength] = c;
c = getc(filePtr);
stringLength++;
}
fclose(filePtr);
return true;
}

View file

@ -22,8 +22,4 @@ extern SavegameInfo g_SavegameInfos[MAX_SAVEGAMES];
extern vector<string> g_NewStrings; extern vector<string> g_NewStrings;
extern SaveGameHeader g_NewSavegameInfos[MAX_SAVEGAMES]; extern SaveGameHeader g_NewSavegameInfos[MAX_SAVEGAMES];
//#define DoGameflow ((__int32 (__cdecl*)(void)) 0x004A8570)
#define LoadGameflow ((__int32 (__cdecl*)(void)) 0x00434800)
__int32 __cdecl LoadSavegameInfos(); __int32 __cdecl LoadSavegameInfos();
__int32 __cdecl LoadNewStrings();

View file

@ -477,7 +477,7 @@ void Inventory::LoadObjects(bool isReload)
// DEBUG // DEBUG
{ {
g_LaraExtra.Weapons[WEAPON_SHOTGUN].Present = true; /*g_LaraExtra.Weapons[WEAPON_SHOTGUN].Present = true;
g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[0] = 1000; g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[0] = 1000;
g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[1] = 1000; g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[1] = 1000;
g_LaraExtra.Weapons[WEAPON_SHOTGUN].SelectedAmmo = WEAPON_AMMO1; g_LaraExtra.Weapons[WEAPON_SHOTGUN].SelectedAmmo = WEAPON_AMMO1;
@ -2487,8 +2487,11 @@ __int32 Inventory::PopupObject()
__int32 steps = INV_NUM_FRAMES_POPUP; __int32 steps = INV_NUM_FRAMES_POPUP;
__int32 deltaAngle = (0 - ring->objects[ring->currentObject].rotation) / steps; __int32 deltaAngle = (0 - ring->objects[ring->currentObject].rotation) / steps;
float deltaScale = INV_OBJECTS_SCALE / (float)steps; float deltaScale = INV_OBJECTS_SCALE / (float)steps;
float deltaTilt = 90.0f / steps;
float deltaDistance = INV_OBJECT_DISTANCE / steps;
ring->focusState = INV_FOCUS_STATE_POPUP; ring->focusState = INV_FOCUS_STATE_POPUP;
for (__int32 i = 0; i < steps; i++) for (__int32 i = 0; i < steps; i++)
{ {
g_Renderer->DrawInventory(); g_Renderer->DrawInventory();
@ -2497,6 +2500,7 @@ __int32 Inventory::PopupObject()
ring->objects[ring->currentObject].rotation += deltaAngle; ring->objects[ring->currentObject].rotation += deltaAngle;
ring->objects[ring->currentObject].scale += deltaScale; ring->objects[ring->currentObject].scale += deltaScale;
} }
ring->focusState = INV_FOCUS_STATE_FOCUSED; ring->focusState = INV_FOCUS_STATE_FOCUSED;
return 0; return 0;
@ -2509,8 +2513,11 @@ __int32 Inventory::PopoverObject()
__int32 steps = INV_NUM_FRAMES_POPUP; __int32 steps = INV_NUM_FRAMES_POPUP;
__int32 deltaAngle = (0 - ring->objects[ring->currentObject].rotation) / steps; __int32 deltaAngle = (0 - ring->objects[ring->currentObject].rotation) / steps;
float deltaScale = INV_OBJECTS_SCALE / (float)steps; float deltaScale = INV_OBJECTS_SCALE / (float)steps;
float deltaTilt = INV_OBJECT_TILT / steps;
float deltaDistance = INV_OBJECT_DISTANCE / steps;
ring->focusState = INV_FOCUS_STATE_POPOVER; ring->focusState = INV_FOCUS_STATE_POPOVER;
for (__int32 i = 0; i < steps; i++) for (__int32 i = 0; i < steps; i++)
{ {
g_Renderer->DrawInventory(); g_Renderer->DrawInventory();
@ -2519,6 +2526,7 @@ __int32 Inventory::PopoverObject()
ring->objects[ring->currentObject].rotation -= deltaAngle; ring->objects[ring->currentObject].rotation -= deltaAngle;
ring->objects[ring->currentObject].scale -= deltaScale; ring->objects[ring->currentObject].scale -= deltaScale;
} }
ring->focusState = INV_FOCUS_STATE_NONE; ring->focusState = INV_FOCUS_STATE_NONE;
return 0; return 0;

View file

@ -195,6 +195,8 @@ void Inject_Inventory();
#define INV_OBJECTS_DISTANCE 2048.0f #define INV_OBJECTS_DISTANCE 2048.0f
#define INV_CAMERA_TILT 5.0f #define INV_CAMERA_TILT 5.0f
#define INV_CAMERA_ANIMATION_TILT 60.0f #define INV_CAMERA_ANIMATION_TILT 60.0f
#define INV_OBJECT_TILT 5.0f
#define INV_OBJECT_DISTANCE 512.0f
#define INV_CAMERA_DISTANCE 3072.0f #define INV_CAMERA_DISTANCE 3072.0f
#define INV_NUM_FRAMES_OPEN_CLOSE 12 #define INV_NUM_FRAMES_OPEN_CLOSE 12
#define INV_NUM_FRAMES_ROTATE 8 #define INV_NUM_FRAMES_ROTATE 8
@ -236,7 +238,6 @@ struct InventoryObject {
__int32 inventoryObject; __int32 inventoryObject;
__int32 rotation; __int32 rotation;
float scale; float scale;
__int32 distance;
}; };
struct InventoryRing { struct InventoryRing {

View file

@ -151,7 +151,7 @@ void SaveGame::saveItem(__int32 itemNumber, __int32 runtimeItem)
void SaveGame::saveGameStatus(__int32 arg1, __int32 arg2) void SaveGame::saveGameStatus(__int32 arg1, __int32 arg2)
{ {
LEB128::Write(m_stream, FlipStatus); LEB128::Write(m_stream, FlipStatus);
LEB128::Write(m_stream, GlobalLastInventoryItem); LEB128::Write(m_stream, LastInventoryItem);
LEB128::Write(m_stream, FlipEffect); LEB128::Write(m_stream, FlipEffect);
LEB128::Write(m_stream, FlipTimer); LEB128::Write(m_stream, FlipTimer);
LEB128::Write(m_stream, CurrentAtmosphere); LEB128::Write(m_stream, CurrentAtmosphere);
@ -314,12 +314,14 @@ bool SaveGame::Save(char* fileName)
m_stream = new FileStream(fileName, true, true); m_stream = new FileStream(fileName, true, true);
m_writer = new ChunkWriter(0x4D355254, m_stream); m_writer = new ChunkWriter(0x4D355254, m_stream);
printf("Timer: %d\n", Savegame.Game.Timer);
// The header must be here, so no chunks // The header must be here, so no chunks
m_stream->WriteString(g_GameFlow->GetString(g_GameFlow->GetLevel(CurrentLevel)->NameStringIndex)); m_stream->WriteString(g_GameFlow->GetString(g_GameFlow->GetLevel(CurrentLevel)->NameStringIndex));
LEB128::Write(m_stream, (Savegame.Game.Timer / 30) / 86400); LEB128::Write(m_stream, (GameTimer / 30) / 86400);
LEB128::Write(m_stream, ((Savegame.Game.Timer / 30) % 86400) / 3600); LEB128::Write(m_stream, ((GameTimer / 30) % 86400) / 3600);
LEB128::Write(m_stream, ((Savegame.Game.Timer / 30) / 60) % 60); LEB128::Write(m_stream, ((GameTimer / 30) / 60) % 60);
LEB128::Write(m_stream, (Savegame.Game.Timer / 30) % 60); LEB128::Write(m_stream, (GameTimer / 30) % 60);
LEB128::Write(m_stream, CurrentLevel); LEB128::Write(m_stream, CurrentLevel);
LEB128::Write(m_stream, GameTimer); LEB128::Write(m_stream, GameTimer);
LEB128::Write(m_stream, ++LastSaveGame); LEB128::Write(m_stream, ++LastSaveGame);
@ -345,7 +347,7 @@ bool SaveGame::Save(char* fileName)
bool SaveGame::readGameStatus() bool SaveGame::readGameStatus()
{ {
FlipStatus = LEB128::ReadInt32(m_stream); FlipStatus = LEB128::ReadInt32(m_stream);
GlobalLastInventoryItem = LEB128::ReadInt32(m_stream); LastInventoryItem = LEB128::ReadInt32(m_stream);
FlipEffect = LEB128::ReadInt32(m_stream); FlipEffect = LEB128::ReadInt32(m_stream);
FlipTimer = LEB128::ReadInt32(m_stream); FlipTimer = LEB128::ReadInt32(m_stream);
CurrentAtmosphere = LEB128::ReadByte(m_stream); CurrentAtmosphere = LEB128::ReadByte(m_stream);

View file

@ -72,15 +72,15 @@ typedef enum object_types {
ID_LITTLE_BEETLE, // TR4 ID_LITTLE_BEETLE, // TR4
ID_SCIENTIST, ID_SCIENTIST,
ID_MERCENARY, // TR3 ID_MERCENARY, // TR3
ID_WILLOWISP, ID_WILLOWISP, // REPLACE?
ID_SHARK, // TR2 - OK ID_SHARK, // TR2 - OK
ID_INVISIBLE_GHOST, ID_INVISIBLE_GHOST, // Andy2 invisible ghost TO REPLACE?
ID_BADDY1, // TR4 - OK (implement picking, correct special moves) ID_BADDY1, // TR4 - OK (implement picking, correct special moves)
ID_REAPER, ID_REAPER,
ID_BADDY2, //TR4 - OK ID_BADDY2, //TR4 - OK
ID_MAZE_MONSTER, ID_MAZE_MONSTER, // Andy2 brown beast TO REPLACE?
ID_CHAIN, // TR4 - OK ID_CHAIN, // TR4 - OK
ID_GREEN_TEETH, ID_GREEN_TEETH, // LAGOON WITCH TO REPLACE?
ID_PLOUGH, // TR4 - OK ID_PLOUGH, // TR4 - OK
ID_ATTACK_SUB, ID_ATTACK_SUB,
ID_STARGATE, // TR4 - OK ID_STARGATE, // TR4 - OK
@ -97,7 +97,7 @@ typedef enum object_types {
ID_BATS, ID_BATS,
ID_RATS, ID_RATS,
ID_SPIDER, ID_SPIDER,
ID_SPIDER_GENERATOR, ID_FLAMETHROWER_BADDY, // TR3 - 50 - OK needs testing
ID_AUTOGUN, ID_AUTOGUN,
ID_ELECTRICAL_CABLES, ID_ELECTRICAL_CABLES,
ID_DARTS, ID_DARTS,
@ -117,7 +117,7 @@ typedef enum object_types {
ID_SCALING_TRAPDOOR, ID_SCALING_TRAPDOOR,
ID_ROLLINGBALL, ID_ROLLINGBALL,
ID_ROLLINGBARREL, ID_ROLLINGBARREL,
ID_SPIKEY_FLOOR, ID_SPIKY_CEILING, // TR3 - 116
ID_TEETH_SPIKES, ID_TEETH_SPIKES,
ID_ROME_HAMMER, ID_ROME_HAMMER,
ID_HAMMER2, ID_HAMMER2,
@ -125,14 +125,14 @@ typedef enum object_types {
ID_FLAME_EMITTER, ID_FLAME_EMITTER,
ID_FLAME_EMITTER2, ID_FLAME_EMITTER2,
ID_FLAME_EMITTER3, ID_FLAME_EMITTER3,
ID_COOKER_FLAME, ID_ZIPLINE_HANDLE, // TR3
ID_BURNING_ROOTS, ID_BURNING_ROOTS,
ID_ROPE, ID_ROPE,
ID_FIREROPE, ID_FIREROPE,
ID_POLEROPE, ID_POLEROPE,
ID_PROPELLER_H, ID_PROPELLER_H, // TO REPLACE?
ID_PROPELLER_V, ID_PROPELLER_V, // TO REPLACE?
ID_ENEMY_JEEP, ID_ENEMY_JEEP, // TR4
ID_ONEBLOCK_PLATFORM, ID_ONEBLOCK_PLATFORM,
ID_TWOBLOCK_PLATFORM, ID_TWOBLOCK_PLATFORM,
ID_RAISING_BLOCK1, ID_RAISING_BLOCK1,
@ -147,14 +147,14 @@ typedef enum object_types {
ID_DEATH_SLIDE, ID_DEATH_SLIDE,
ID_TORPEDO, ID_TORPEDO,
ID_CHAFF, ID_CHAFF,
ID_SATCHEL_BOMB, ID_SNOWMOBILE, // TR2
ID_ELECTRIC_FENCE, ID_ELECTRIC_FENCE,
ID_LIFT, ID_LIFT,
ID_EXPLOSION, ID_SNOWMOBILE_LARA_ANIMS, // TR2
ID_IRIS_LIGHTNING, ID_YETI, // TR2 - 45
ID_QUAD, // TR3 - OK ID_QUAD, // TR3 - OK
ID_LARA_QUAD_ANIMS, // TR3 - OK ID_LARA_QUAD_ANIMS, // TR3 - OK
ID_MOTION_SENSORS, ID_TEMPLE_STATE_PETRIFIED, // TR3 - 122
ID_TIGHT_ROPE, ID_TIGHT_ROPE,
ID_PARALLEL_BARS, ID_PARALLEL_BARS,
ID_XRAY_CONTROLLER, ID_XRAY_CONTROLLER,
@ -239,7 +239,7 @@ typedef enum object_types {
ID_GAME_PIECE1, ID_GAME_PIECE1,
ID_GAME_PIECE2, ID_GAME_PIECE2,
ID_GAME_PIECE3, ID_GAME_PIECE3,
ID_COSH, ID_TEMPLE_STATUE, // TR3 - 70
ID_HAMMER_ITEM, ID_HAMMER_ITEM,
ID_CROWBAR_ITEM, ID_CROWBAR_ITEM,
ID_BURNING_TORCH_ITEM, ID_BURNING_TORCH_ITEM,
@ -324,7 +324,7 @@ typedef enum object_types {
ID_KICK_DOOR1, ID_KICK_DOOR1,
ID_WALL_MOUNTED_BLADE, // TR3 - 111 ID_WALL_MOUNTED_BLADE, // TR3 - 111
ID_KICK_DOOR2, ID_KICK_DOOR2,
ID_SPIKEY_WALL, // TR3 - OK ID_SPIKY_WALL, // TR3 - OK
ID_UNDERWATER_DOOR, ID_UNDERWATER_DOOR,
ID_ZIPLINE_HANDLE, // TR3 - 127 ID_ZIPLINE_HANDLE, // TR3 - 127
ID_DOUBLE_DOORS, ID_DOUBLE_DOORS,
@ -363,7 +363,7 @@ typedef enum object_types {
ID_INVENTORY_KEYS, ID_INVENTORY_KEYS,
ID_INVENTORY_HEADPHONES, ID_INVENTORY_HEADPHONES,
ID_INVENTORY_POLAROID, ID_INVENTORY_POLAROID,
ID_OBELISK, ID_OBELISK, // TR4
ID_SMOKE_EMITTER_WHITE, ID_SMOKE_EMITTER_WHITE,
ID_SMOKE_EMITTER_BLACK, ID_SMOKE_EMITTER_BLACK,
ID_STEAM_EMITTER, ID_STEAM_EMITTER,
@ -373,11 +373,11 @@ typedef enum object_types {
ID_GUNSHELL, ID_GUNSHELL,
ID_SHOTGUNSHELL, ID_SHOTGUNSHELL,
ID_GUN_FLASH, ID_GUN_FLASH,
ID_COLOURED_LIGHT, ID_DYNAMIC_LIGHT, // Merge all lights in a single null mesh
ID_BLINKING_LIGHT, ID_SMALL_DINOSAUR, // TR3 - 34
ID_PULSE_LIGHT, ID_LIZARD_THING, // TR3 - 35
ID_STROBE_LIGHT, ID_PUNA_BOSS, // TR3 - 36
ID_ELECTRICAL_LIGHT, ID_SOPHIA_LEE_BOSS, // TR3 - 57
ID_LENS_FLARE, ID_LENS_FLARE,
ID_AI_GUARD, ID_AI_GUARD,
ID_AI_AMBUSH, ID_AI_AMBUSH,

View file

@ -2,19 +2,14 @@
#include "..\Game\sound.h" #include "..\Game\sound.h"
// Camera
#define Camera VAR_U_(0x00EEF940, CAMERA_INFO) #define Camera VAR_U_(0x00EEF940, CAMERA_INFO)
#define ForcedFixedCamera VAR_U_(0x00EEFA20, GAME_VECTOR) #define ForcedFixedCamera VAR_U_(0x00EEFA20, GAME_VECTOR)
#define UseForcedFixedCamera VAR_U_(0x00EEFA50, __int8) #define UseForcedFixedCamera VAR_U_(0x00EEFA50, __int8)
// Memory
#define MallocBuffer VAR_U_(0x00E4B10C, char*) #define MallocBuffer VAR_U_(0x00E4B10C, char*)
#define MallocSize VAR_U_(0x00E4B058, __int32) #define MallocSize VAR_U_(0x00E4B058, __int32)
#define MallocPtr VAR_U_(0x00E4B0DC, char*) #define MallocPtr VAR_U_(0x00E4B0DC, char*)
#define MallocFree VAR_U_(0x00E4B0F4, __int32) #define MallocFree VAR_U_(0x00E4B0F4, __int32)
#define MallocUsed VAR_U_(0x00E4B0F0, __int32) #define MallocUsed VAR_U_(0x00E4B0F0, __int32)
// Items & Effects
#define Items VAR_U_(0x00EEEFF0, ITEM_INFO*) #define Items VAR_U_(0x00EEEFF0, ITEM_INFO*)
#define Effects VAR_U_(0x00E5C5E0, FX_INFO*) #define Effects VAR_U_(0x00E5C5E0, FX_INFO*)
#define InItemControlLoop VAR_U_(0x0051CA53, byte) #define InItemControlLoop VAR_U_(0x0051CA53, byte)
@ -27,8 +22,6 @@
#define SlotsUsed VAR_U_(0x0051CEE8, int) #define SlotsUsed VAR_U_(0x0051CEE8, int)
#define nAIObjects VAR_U_(0x00E5B842, int) #define nAIObjects VAR_U_(0x00E5B842, int)
#define TriggerIndex VAR_U_(0x00EEEF9C, __int16*) #define TriggerIndex VAR_U_(0x00EEEF9C, __int16*)
// Level data
#define Boxes VAR_U_(0x00EEFB64, BOX_INFO*) #define Boxes VAR_U_(0x00EEFB64, BOX_INFO*)
#define NumberBoxes VAR_U_(0x00EEFB68, int) #define NumberBoxes VAR_U_(0x00EEFB68, int)
#define GroundZones ARRAY_(0x00EEFB20, __int16*, [10]) #define GroundZones ARRAY_(0x00EEFB20, __int16*, [10])
@ -51,21 +44,16 @@
#define FloorData VAR_U_(0x00875168, __int16*) #define FloorData VAR_U_(0x00875168, __int16*)
#define ObjectTextures VAR_U_(0x008751B0, OBJECT_TEXTURE*) #define ObjectTextures VAR_U_(0x008751B0, OBJECT_TEXTURE*)
#define RoomLightsCount VAR_U_(0x0087B0EC, __int32) #define RoomLightsCount VAR_U_(0x0087B0EC, __int32)
//#define LevelDataPtr VAR_U_(0x00874964, char*)
#define NumberRooms VAR_U_(0x0087514C, __int16) #define NumberRooms VAR_U_(0x0087514C, __int16)
#define nAnimUVRanges VAR_U_(0x0087495C, __int32) #define nAnimUVRanges VAR_U_(0x0087495C, __int32)
#define LevelFilePtr VAR_U_(0x00875164, FILE*) #define LevelFilePtr VAR_U_(0x00875164, FILE*)
//#define StaticObjects ARRAY_(0x00874988, STATIC_INFO, [70])
#define NumberCameras VAR_U_(0x00EEFAC0, __int32) #define NumberCameras VAR_U_(0x00EEFAC0, __int32)
#define Cameras VAR_U_(0x00EEF9A2, OBJECT_VECTOR*) #define Cameras VAR_U_(0x00EEF9A2, OBJECT_VECTOR*)
#define NumberSpotcams VAR_U_(0x00E4F428, __int32) #define NumberSpotcams VAR_U_(0x00E4F428, __int32)
// Lara
#define LaraItem VAR_U_(0x00E5BF08, ITEM_INFO*) #define LaraItem VAR_U_(0x00E5BF08, ITEM_INFO*)
#define Lara VAR_U_(0x00E5BD60, LARA_INFO) #define Lara VAR_U_(0x00E5BD60, LARA_INFO)
#define LaraDrawType VAR_U_(0x00EEEAD0, __int8) #define LaraDrawType VAR_U_(0x00EEEAD0, __int8)
#define Hairs ARRAY_(0x00E5C000, HAIR_STRUCT, [14]) #define Hairs ARRAY_(0x00E5C000, HAIR_STRUCT, [14])
#define SequenceUsed ARRAY_(0x00E4EA78, __int8, [6]) #define SequenceUsed ARRAY_(0x00E4EA78, __int8, [6])
#define SequenceResults ARRAY_(0x00E4EA80, __int8, [27]) #define SequenceResults ARRAY_(0x00E4EA80, __int8, [27])
#define gfNumMips VAR_U_(0x0051CE37, __int8) #define gfNumMips VAR_U_(0x0051CE37, __int8)
@ -74,8 +62,6 @@
#define gfMips ARRAY_(0x00E5C2C0, __int8, [8]) #define gfMips ARRAY_(0x00E5C2C0, __int8, [8])
#define OldPickupPos VAR_U_(0x00E59700, GAME_VECTOR) #define OldPickupPos VAR_U_(0x00E59700, GAME_VECTOR)
#define SetDebounce VAR_U_(0x00EEEA38, __int32) #define SetDebounce VAR_U_(0x00EEEA38, __int32)
// Game
#define FlipStatus VAR_U_(0x00EEEAE0, int) #define FlipStatus VAR_U_(0x00EEEAE0, int)
#define FlipStats ARRAY_(0x00EEF060, __int32, [255]) #define FlipStats ARRAY_(0x00EEF060, __int32, [255])
#define WindowsHandle VAR_U_(0x00D9AB3C, HWND) #define WindowsHandle VAR_U_(0x00D9AB3C, HWND)
@ -87,62 +73,44 @@
#define GlobalPlayingCutscene VAR_U_(0x0051CAB0, __int32) #define GlobalPlayingCutscene VAR_U_(0x0051CAB0, __int32)
#define Wibble VAR_U_(0x0051CDF0, __int32) #define Wibble VAR_U_(0x0051CDF0, __int32)
#define CdFlags ARRAY_(0x00EEEA40, byte, [136]) #define CdFlags ARRAY_(0x00EEEA40, byte, [136])
// Input
#define DbInput VAR_U_(0x00878DAC, __int32) #define DbInput VAR_U_(0x00878DAC, __int32)
#define TrInput VAR_U_(0x00878D98, __int32) #define TrInput VAR_U_(0x00878D98, __int32)
// Math
#define MatrixStack ARRAY_(0x0055D66C, __int32, [480]) #define MatrixStack ARRAY_(0x0055D66C, __int32, [480])
#define MatrixPtr VAR_U_(0x00E4B0F8, __int32*) #define MatrixPtr VAR_U_(0x00E4B0F8, __int32*)
#define DxMatrixPtr VAR_U_(0x0055DA2C, byte*) #define DxMatrixPtr VAR_U_(0x0055DA2C, byte*)
//#define phd_MatrixPtr VAR_U_(0x007E70C8, __int32*)
// Unknown
#define Unk_876C48 VAR_U_(0x00876C48, __int32) #define Unk_876C48 VAR_U_(0x00876C48, __int32)
#define Unk_007E7FE8 VAR_U_(0x007E7FE8, __int32) #define Unk_007E7FE8 VAR_U_(0x007E7FE8, __int32)
// Sound
#define SampleLUT VAR_U_(0x00E528A4, __int16*) #define SampleLUT VAR_U_(0x00E528A4, __int16*)
#define SampleInfo VAR_U_(0x00E528A8, SAMPLE_INFO*) #define SampleInfo VAR_U_(0x00E528A8, SAMPLE_INFO*)
#define SamplePointer ARRAY_(0x0086BEF0, HSAMPLE, [SOUND_MAX_SAMPLES]) #define SamplePointer ARRAY_(0x0086BEF0, HSAMPLE, [SOUND_MAX_SAMPLES])
#define SoundSlot ARRAY_(0x00E52430, SoundEffectSlot, [SOUND_MAX_CHANNELS]) #define SoundSlot ARRAY_(0x00E52430, SoundEffectSlot, [SOUND_MAX_CHANNELS])
#define TrackNamePrefix VAR_U_(0x00511828, char) #define TrackNamePrefix VAR_U_(0x00511828, char)
#define TrackNameTable ARRAY_(0x005108C0, char*, [SOUND_LEGACY_TRACKTABLE_SIZE]) #define TrackNameTable ARRAY_(0x005108C0, char*, [SOUND_LEGACY_TRACKTABLE_SIZE])
#define TrackMap ARRAY_(0x00EEEA40, byte, [SOUND_LEGACY_TRACKTABLE_SIZE]) #define TrackMap ARRAY_(0x00EEEA40, byte, [SOUND_LEGACY_TRACKTABLE_SIZE])
#define IsAtmospherePlaying VAR_U_(0x00EEEFFC, byte) #define IsAtmospherePlaying VAR_U_(0x00EEEFFC, byte)
#define CurrentAtmosphere VAR_U_(0x00EEEB90, byte) #define CurrentAtmosphere VAR_U_(0x00EEEB90, byte)
#define GlobalMusicVolume VAR_U_(0x00517B68, unsigned int) #define GlobalMusicVolume VAR_U_(0x00517B68, unsigned int)
#define GlobalFXVolume VAR_U_(0x00517B6C, unsigned int) #define GlobalFXVolume VAR_U_(0x00517B6C, unsigned int)
// Gameflow
#define gfFilenameOffset VAR_U_(0x00E5C34C, __int16*) #define gfFilenameOffset VAR_U_(0x00E5C34C, __int16*)
#define gfFilenameWad VAR_U_(0x00E5C2CC, char*) #define gfFilenameWad VAR_U_(0x00E5C2CC, char*)
#define AllStrings VAR_U_(0x00E5C310, char*) #define AllStrings VAR_U_(0x00E5C310, char*)
#define AllStringsOffsets VAR_U_(0x00E5C2B8, __int16*) #define AllStringsOffsets VAR_U_(0x00E5C2B8, __int16*)
#define RenderLoadBar VAR_U_(0x008FBDC0, __int32) #define RenderLoadBar VAR_U_(0x008FBDC0, __int32)
//#define IsLevelLoading VAR_U_(0x00874968, __int32)
//#define ThreadId VAR_U_(0x00874978, unsigned int)
#define WeatherType VAR_U_(0x00EEF4A0, byte) #define WeatherType VAR_U_(0x00EEF4A0, byte)
#define CreditsDone VAR_U_(0x00E6D838, byte) #define CreditsDone VAR_U_(0x00E6D838, byte)
#define CanLoad VAR_U_(0x0051CE54, byte) #define CanLoad VAR_U_(0x0051CE54, byte)
#define Savegame VAR_U_(0x00E52EB3, SAVEGAME_INFO) #define Savegame VAR_U_(0x00E52EB3, SAVEGAME_INFO)
#define GlobalLastInventoryItem VAR_U_(0x00508E14, __int32) #define LastInventoryItem VAR_U_(0x00508E14, __int32)
#define GlobalEnterInventory VAR_U_(0x00508E18, __int32) #define GlobalEnterInventory VAR_U_(0x00508E18, __int32)
#define InventoryItemChosen VAR_U_(0x00508E1C, __int32) #define InventoryItemChosen VAR_U_(0x00508E1C, __int32)
#define DelCutSeqPlayer VAR_U_(0x0051CE2C, __int16) #define DelCutSeqPlayer VAR_U_(0x0051CE2C, __int16)
#define TitleControlsLockedOut VAR_U_(0x00E5C2A8, byte) #define TitleControlsLockedOut VAR_U_(0x00E5C2A8, byte)
#define TrackCameraInit VAR_U_(0x0051D010, __int32) #define TrackCameraInit VAR_U_(0x0051D010, __int32)
#define CheckTrigger VAR_U_(0x0051D014, __int32) #define CheckTrigger VAR_U_(0x0051D014, __int32)
#define UseSpotCam VAR_U_(0x0051D018, __int32) #define UseSpotCam VAR_U_(0x0051D018, __int32)
#define DisableLaraControl VAR_U_(0x0051D01C, byte) #define DisableLaraControl VAR_U_(0x0051D01C, byte)
#define FramesCount VAR_U_(0x0051CA78, __int32) #define FramesCount VAR_U_(0x0051CA78, __int32)
#define GlobalCounter VAR_U_(0x0051CA58, __int16) #define GlobalCounter VAR_U_(0x0051CA58, __int16)
#define LevelComplete VAR_U_(0x00E5C2F0, byte) #define LevelComplete VAR_U_(0x00E5C2F0, byte)
#define ResetFlag VAR_U_(0x0051CA6C, __int32) #define ResetFlag VAR_U_(0x0051CA6C, __int32)
#define LegacyGameFlow VAR_U_(0x00E5C2BC, GAMEFLOW*) #define LegacyGameFlow VAR_U_(0x00E5C2BC, GAMEFLOW*)
@ -150,41 +118,29 @@
#define nFrames VAR_U_(0x005082C4, __int32) #define nFrames VAR_U_(0x005082C4, __int32)
#define GameStatus VAR_U_(0x00E5C2B0, __int32) #define GameStatus VAR_U_(0x00E5C2B0, __int32)
#define GotLaraSpheres VAR_U_(0x00E51F2E, byte) #define GotLaraSpheres VAR_U_(0x00E51F2E, byte)
#define EffectRoutines ARRAY_(0x00507964, EFFECT_ROUTINE, [100]) #define EffectRoutines ARRAY_(0x00507964, EFFECT_ROUTINE, [100])
#define DashTimer VAR_U_(0x00E5BF04, __int16) #define DashTimer VAR_U_(0x00E5BF04, __int16)
#define LaraCollisionRoutines ARRAY_(0x005089A8, LARA_COLLISION_ROUTINE, [500]) #define LaraCollisionRoutines ARRAY_(0x005089A8, LARA_COLLISION_ROUTINE, [500])
#define LaraControlRoutines ARRAY_(0x0050877C, LARA_CONTROL_ROUTINE, [500]) #define LaraControlRoutines ARRAY_(0x0050877C, LARA_CONTROL_ROUTINE, [500])
#define ShockWaves ARRAY_(0x00E4C1A0, SHOCKWAVE_STRUCT, [16]) #define ShockWaves ARRAY_(0x00E4C1A0, SHOCKWAVE_STRUCT, [16])
//#define Drips ARRAY_(0x00E4D740, DRIP_STRUCT, [32])
#define Bubbles ARRAY_(0x00E4D160, BUBBLE_STRUCT, [40]) #define Bubbles ARRAY_(0x00E4D160, BUBBLE_STRUCT, [40])
#define Ripples ARRAY_(0x00E5C600, RIPPLE_STRUCT, [32]) #define Ripples ARRAY_(0x00E5C600, RIPPLE_STRUCT, [32])
#define Blood ARRAY_(0x00E4C9C0, BLOOD_STRUCT, [32]) #define Blood ARRAY_(0x00E4C9C0, BLOOD_STRUCT, [32])
#define CurrentFOV VAR_U_(0x00E4F504, __int16) #define CurrentFOV VAR_U_(0x00E4F504, __int16)
#define SpotCam ARRAY_(0x00E4F6C0, SPOTCAM, [64]) #define SpotCam ARRAY_(0x00E4F6C0, SPOTCAM, [64])
#define CurrentSplineCamera VAR_U_(0x00E4F500, __int16) #define CurrentSplineCamera VAR_U_(0x00E4F500, __int16)
#define OldHitPoints VAR_U_(0x005084DC, __int16) #define OldHitPoints VAR_U_(0x005084DC, __int16)
#define GameTimer VAR_U_(0x00E5C27C, __int32) #define GameTimer VAR_U_(0x00E5C27C, __int32)
// Inventory
#define InventoryObjectsList ARRAY_(0x00508E38, INVOBJ, [100]) #define InventoryObjectsList ARRAY_(0x00508E38, INVOBJ, [100])
#define Friggrimmer VAR_U_(0x00E598F4, byte) #define Friggrimmer VAR_U_(0x00E598F4, byte)
#define InventoryRings ARRAY_(0x00E59900, INVENTORYRING*, [2]) #define InventoryRings ARRAY_(0x00E59900, INVENTORYRING*, [2])
#define PickupX VAR_U_(0x00E5BF38, __int16) #define PickupX VAR_U_(0x00E5BF38, __int16)
#define CurrentPickup VAR_U_(0x00E5BF3C, __int16) #define CurrentPickup VAR_U_(0x00E5BF3C, __int16)
#define Pickups ARRAY_(0x00E5BF40, DISPLAY_PICKUP, [8]) #define Pickups ARRAY_(0x00E5BF40, DISPLAY_PICKUP, [8])
#define PickupVel VAR_U_(0x00E5BF3A, __int16) #define PickupVel VAR_U_(0x00E5BF3A, __int16)
#define GnFrameCounter VAR_U_(0x00E4B0FC, __int32) #define GnFrameCounter VAR_U_(0x00E4B0FC, __int32)
#define gfLevelFlags VAR_U_(0x00E5C2A0, __int32) #define gfLevelFlags VAR_U_(0x00E5C2A0, __int32)
#define OptionAutoTarget VAR_U_(0x00D9AC30, __int32) #define OptionAutoTarget VAR_U_(0x00D9AC30, __int32)
#define PhdLeft VAR_U_(0x0055D20C, __int32) #define PhdLeft VAR_U_(0x0055D20C, __int32)
#define PhdTop VAR_U_(0x0051D0A8, __int32) #define PhdTop VAR_U_(0x0051D0A8, __int32)
#define PhdRight VAR_U_(0x0055DA3C, __int32) #define PhdRight VAR_U_(0x0055DA3C, __int32)
@ -204,11 +160,9 @@
#define Unknown_00E6CAE8 VAR_U_(0x00E6CAE8, __int32) #define Unknown_00E6CAE8 VAR_U_(0x00E6CAE8, __int32)
#define PhdWindowXmax VAR_U_(0x0055D218, __int16) #define PhdWindowXmax VAR_U_(0x0055D218, __int16)
#define PhdWindowYmax VAR_U_(0x0055D240, __int16) #define PhdWindowYmax VAR_U_(0x0055D240, __int16)
#define Fires ARRAY_(0x00E4C7A0, FIRE_LIST, [32]) #define Fires ARRAY_(0x00E4C7A0, FIRE_LIST, [32])
#define Dynamics ARRAY_(0x00E6C3E0, DYNAMIC, [64]) #define Dynamics ARRAY_(0x00E6C3E0, DYNAMIC, [64])
#define NumDynamics VAR_U_(0x00E6D82C, __int32) #define NumDynamics VAR_U_(0x00E6D82C, __int32)
#define Sprites VAR_U_(0x008751B4, SPRITE*) #define Sprites VAR_U_(0x008751B4, SPRITE*)
#define FireSparks ARRAY_(0x00E4CE40, FIRE_SPARKS, [20]) #define FireSparks ARRAY_(0x00E4CE40, FIRE_SPARKS, [20])
#define NextFreeFireSpark VAR_U_(0x0050A17C, __int16) #define NextFreeFireSpark VAR_U_(0x0050A17C, __int16)
@ -220,12 +174,10 @@
#define Bubbles ARRAY_(0x00E4D160, BUBBLE_STRUCT, [40]) #define Bubbles ARRAY_(0x00E4D160, BUBBLE_STRUCT, [40])
#define Splashes ARRAY_(0x00E6CA00, SPLASH_STRUCT, [4]) #define Splashes ARRAY_(0x00E6CA00, SPLASH_STRUCT, [4])
#define Ripples ARRAY_(0x00E5C600, RIPPLE_STRUCT, [32]) #define Ripples ARRAY_(0x00E5C600, RIPPLE_STRUCT, [32])
#define SkyPos1 VAR_U_(0x00E6E4B0, __int16) #define SkyPos1 VAR_U_(0x00E6E4B0, __int16)
#define SkyPos2 VAR_U_(0x00E6D73E, __int16) #define SkyPos2 VAR_U_(0x00E6D73E, __int16)
#define SkyVelocity1 VAR_U_(0x00E5C276, signed char) #define SkyVelocity1 VAR_U_(0x00E5C276, signed char)
#define SkyVelocity2 VAR_U_(0x00E5C275, signed char) #define SkyVelocity2 VAR_U_(0x00E5C275, signed char)
#define SkyColor1 VAR_U_(0x00E5C2A4, CVECTOR) #define SkyColor1 VAR_U_(0x00E5C2A4, CVECTOR)
#define SkyColor2 VAR_U_(0x00E5C280, CVECTOR) #define SkyColor2 VAR_U_(0x00E5C280, CVECTOR)
#define SkyStormColor ARRAY_(0x00E6CAF0, __int16, [3]) #define SkyStormColor ARRAY_(0x00E6CAF0, __int16, [3])
@ -235,25 +187,18 @@
#define Unk_00E6D73C VAR_U_(0x00E6D73C, __int16) #define Unk_00E6D73C VAR_U_(0x00E6D73C, __int16)
#define Unk_00E6D74C VAR_U_(0x00E6D74C, __int16) #define Unk_00E6D74C VAR_U_(0x00E6D74C, __int16)
#define Unk_00E6E4DC VAR_U_(0x00E6E4DC, __int16) #define Unk_00E6E4DC VAR_U_(0x00E6E4DC, __int16)
#define CurrentAtmosphere VAR_U_(0x00EEEB90, byte) #define CurrentAtmosphere VAR_U_(0x00EEEB90, byte)
#define IsAtmospherePlaying VAR_U_(0x00EEEFFC, byte) #define IsAtmospherePlaying VAR_U_(0x00EEEFFC, byte)
#define SmokeCountL VAR_U_(0x00E6C9E8, byte) #define SmokeCountL VAR_U_(0x00E6C9E8, byte)
#define SmokeCountR VAR_U_(0x00E6C9EC, byte) #define SmokeCountR VAR_U_(0x00E6C9EC, byte)
#define SplashCount VAR_U_(0x0051CDF8, byte) #define SplashCount VAR_U_(0x0051CDF8, byte)
#define WeaponDelay VAR_U_(0x0051CA52, byte) #define WeaponDelay VAR_U_(0x0051CA52, byte)
#define HealtBarTimer VAR_U_(0x0051CEA8, __int32) #define HealtBarTimer VAR_U_(0x0051CEA8, __int32)
#define AnimatedTextureRanges VAR_U_(0x00D9ADA0, __int16*) #define AnimatedTextureRanges VAR_U_(0x00D9ADA0, __int16*)
//#define Savegame VAR_U_(0x00E52EB3, savegame_info); #define RequiredStartPos VAR_U_(0x00E5C2B4, byte)
#define gfRequiredStartPos VAR_U_(0x00E5C2B4, byte) #define InitialiseGame VAR_U_(0x005082C1, byte)
#define gfInitialiseGame VAR_U_(0x005082C1, byte)
#define TorchRoom VAR_U_(0x00507AB0, __int16) #define TorchRoom VAR_U_(0x00507AB0, __int16)
#define WeaponEnemyTimer VAR_U_(0x0080E016, byte) #define WeaponEnemyTimer VAR_U_(0x0080E016, byte)
#define HeightType VAR_U_(0x00EEEFF4, __int32) #define HeightType VAR_U_(0x00EEEFF4, __int32)
#define HeavyTriggered VAR_U_(0x00EEEA34, byte) #define HeavyTriggered VAR_U_(0x00EEEA34, byte)
#define FlipEffect VAR_U_(0x00506C60, __int32) #define FlipEffect VAR_U_(0x00506C60, __int32)
@ -265,30 +210,23 @@
#define FlipMap ARRAY_(0x00EEEBA0, __int32, [255]) #define FlipMap ARRAY_(0x00EEEBA0, __int32, [255])
#define TriggerTimer VAR_U_(0x0051CA5A, byte) #define TriggerTimer VAR_U_(0x0051CA5A, byte)
#define JustLoaded VAR_U_(0x0051D001, byte) #define JustLoaded VAR_U_(0x0051D001, byte)
//#define Weapons ARRAY_(0x005085B0, WEAPON_INFO, [9])
#define SmokeWeapon VAR_U_(0x00E6CAA0, __int32) #define SmokeWeapon VAR_U_(0x00E6CAA0, __int32)
#define HKTimer VAR_U_(0x0051CEC9, __int32) #define HKTimer VAR_U_(0x0051CEC9, __int32)
#define HKFlag VAR_U_(0x0051CECC, __int32) #define HKFlag VAR_U_(0x0051CECC, __int32)
#define HKFlag2 VAR_U_(0x0051CEC8, byte) #define HKFlag2 VAR_U_(0x0051CEC8, byte)
#define Ropes ARRAY_(0x00E54CC0, ROPE_STRUCT, [12]) #define Ropes ARRAY_(0x00E54CC0, ROPE_STRUCT, [12])
#define NumRopes VAR_U_(0x0051CA60, __int32) #define NumRopes VAR_U_(0x0051CA60, __int32)
#define PhdWidth VAR_U_(0x0055D29C, __int32) #define PhdWidth VAR_U_(0x0055D29C, __int32)
#define PhdHeight VAR_U_(0x0055D164, __int32) #define PhdHeight VAR_U_(0x0055D164, __int32)
#define PhdPerspective VAR_U_(0x0055D208, __int32) #define PhdPerspective VAR_U_(0x0055D208, __int32)
#define Bats VAR_U_(0x00EEEFE8, BAT_STRUCT*) #define Bats VAR_U_(0x00EEEFE8, BAT_STRUCT*)
#define Rats VAR_U_(0x00EEEFEC, RAT_STRUCT*) #define Rats VAR_U_(0x00EEEFEC, RAT_STRUCT*)
#define Spiders VAR_U_(0x00EEF45C, SPIDER_STRUCT*) #define Spiders VAR_U_(0x00EEF45C, SPIDER_STRUCT*)
#define PoisonFlags VAR_U_(0x00E5BF3E, byte) #define PoisonFlags VAR_U_(0x00E5BF3E, byte)
#define SmashedMeshCount VAR_U_(0x0051CA5C, __int16) #define SmashedMeshCount VAR_U_(0x0051CA5C, __int16)
#define SmashedMesh ARRAY_(0x00EEF8C0, MESH_INFO*, [16]) #define SmashedMesh ARRAY_(0x00EEF8C0, MESH_INFO*, [16])
#define SmashedMeshRoom ARRAY_(0x00EEF480, __int16, [16]) #define SmashedMeshRoom ARRAY_(0x00EEF480, __int16, [16])
#define Debris ARRAY_(0x00E8CAC0, DEBRIS_STRUCT, [256]) #define Debris ARRAY_(0x00E8CAC0, DEBRIS_STRUCT, [256])
#define SniperCameraActive VAR_U_(0x0051CA1D, byte) #define SniperCameraActive VAR_U_(0x0051CA1D, byte)
#define BinocularRange VAR_U_(0x0051CA30, __int32) #define BinocularRange VAR_U_(0x0051CA30, __int32)
#define BinocularOn VAR_U_(0x0051CA34, __int32) #define BinocularOn VAR_U_(0x0051CA34, __int32)
@ -298,30 +236,23 @@
#define ExitingBinocular VAR_U_(00051CA20, __int32) #define ExitingBinocular VAR_U_(00051CA20, __int32)
#define OldLaraBusy VAR_U_(0x00E59898, byte) #define OldLaraBusy VAR_U_(0x00E59898, byte)
#define Infrared VAR_U_(0x0051CA40, __int32) #define Infrared VAR_U_(0x0051CA40, __int32)
#define SpotcamOverlay VAR_U_(0x0051D020, byte) #define SpotcamOverlay VAR_U_(0x0051D020, byte)
#define SpotcamDontDrawLara VAR_U_(0x0051D021, byte) #define SpotcamDontDrawLara VAR_U_(0x0051D021, byte)
#define SniperOverlay VAR_U_(0x0051D022, byte) #define SniperOverlay VAR_U_(0x0051D022, byte)
#define TargetGraphicsMeshPointer VAR_U_(0x00E6E460, __int16*) #define TargetGraphicsMeshPointer VAR_U_(0x00E6E460, __int16*)
#define BinocularGraphicsMeshPointer VAR_U_(0x00E6D744, __int16*) #define BinocularGraphicsMeshPtr VAR_U_(0x00E6D744, __int16*)
#define CollidedItems ARRAY_(0x00E88EA0, ITEM_INFO*, [1024]) #define CollidedItems ARRAY_(0x00E88EA0, ITEM_INFO*, [1024])
#define CollidedMeshes ARRAY_(0x00E89EA0, MESH_INFO*, [1024]) #define CollidedMeshes ARRAY_(0x00E89EA0, MESH_INFO*, [1024])
#define FlashFadeR VAR_U_(0x0051D07A, __int16) #define FlashFadeR VAR_U_(0x0051D07A, __int16)
#define FlashFadeG VAR_U_(0x0051D07C, __int16) #define FlashFadeG VAR_U_(0x0051D07C, __int16)
#define FlashFadeB VAR_U_(0x0051D07E, __int16) #define FlashFadeB VAR_U_(0x0051D07E, __int16)
#define FlashFader VAR_U_(0x0051D080, __int16) #define FlashFader VAR_U_(0x0051D080, __int16)
#define GlobalCollisionBounds VAR_U_(0x00EEF910, BOUNDING_BOX) #define GlobalCollisionBounds VAR_U_(0x00EEF910, BOUNDING_BOX)
#define SphereList ARRAY_(0x00E51FE0, SPHERE, [34]) #define SphereList ARRAY_(0x00E51FE0, SPHERE, [34])
#define IsRoomOutsideNo VAR_U_(0x007FE6C2, __int16) #define IsRoomOutsideNo VAR_U_(0x007FE6C2, __int16)
#define App_Unk00D9AC2B VAR_U_(0x00D9AC2B, byte) #define App_Unk00D9AC2B VAR_U_(0x00D9AC2B, byte)
#define App_Unk00D9AC19 VAR_U_(0x00D9AC19, byte) #define App_Unk00D9AC19 VAR_U_(0x00D9AC19, byte)
#define App_Unk00D9ABFD VAR_U_(0x00D9ABFD, __int32) #define App_Unk00D9ABFD VAR_U_(0x00D9ABFD, __int32)
#define WaterfallTextures ARRAY_(0x00E59720, OBJECT_TEXTURE*, [6]) #define WaterfallTextures ARRAY_(0x00E59720, OBJECT_TEXTURE*, [6])
#define WaterfallY ARRAY_(0x00E59760, float, [6]) #define WaterfallY ARRAY_(0x00E59760, float, [6])
#define KeyboardLayout0 ARRAY_(0x00516C3C, __int16, [18]) #define KeyboardLayout0 ARRAY_(0x00516C3C, __int16, [18])

View file

@ -0,0 +1,531 @@
#include "newobjects.h"
#include "..\Global\global.h"
#include "..\Game\Box.h"
#include "..\Game\items.h"
#include "..\Game\lot.h"
#include "..\Game\control.h"
#include "..\Game\effects.h"
#include "..\Game\draw.h"
#include "..\Game\sphere.h"
#include "..\Game\effect2.h"
#include "..\Game\people.h"
#include "..\Game\lara.h"
BITE_INFO flamerBite = { 0, 340, 64, 7 };
void __cdecl FlamerControl(__int16 itemNumber)
{
if (!CreatureActive(itemNumber))
return;
ITEM_INFO* item = &Items[itemNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
__int16 angle = 0;
__int16 tilt = 0;
__int16 torsoX = 0;
__int16 torsoY = 0;
__int16 head = 0;
PHD_VECTOR pos;
pos.x = flamerBite.x;
pos.y = flamerBite.y;
pos.z = flamerBite.z;
GetJointAbsPosition(item, &pos, flamerBite.meshNum);
__int32 random = GetRandomControl();
if (item->currentAnimState != 6 && item->currentAnimState != 11)
{
TriggerDynamics(pos.x, pos.y, pos.z, (random & 3) + 6, 24 - ((random >> 4) & 3), 16 - ((random >> 6) & 3), random & 3); // Pilot light.
TriggerPilotFlame(itemNumber);
}
else
TriggerDynamics(pos.x, pos.y, pos.z, (random & 3) + 10, 31 - ((random >> 4) & 3), 24 - ((random >> 6) & 3), random & 7); // Full monty.
if (item->hitPoints <= 0)
{
if (item->currentAnimState != 7)
{
item->animNumber = Objects[item->objectNumber].animIndex + 19;
item->frameNumber = Anims[item->animNumber].frameBase;
item->currentAnimState = 7;
}
}
else
{
if (item->aiBits)
GetAITarget(creature);
else if (creature->hurtByLara)
creature->enemy = LaraItem;
else
{
// Find another enemy different from Lara
creature->enemy = NULL;
__int32 minDistance = 0x7fffffff;
CREATURE_INFO* currentCreature = BaddieSlots;
ITEM_INFO* target = NULL;
for (__int32 i = 0; i < NUM_SLOTS; i++, currentCreature++)
{
if (currentCreature->itemNum == NO_ITEM || currentCreature->itemNum == itemNumber)
continue;
target = &Items[currentCreature->itemNum];
if (target->objectNumber == ID_LARA /*|| target->objectNumber == WHITE_SOLDIER || target->objectNumber == FLAMETHROWER_BLOKE*/ || target->hitPoints <= 0)
continue;
/* Is this target closest? */
__int32 x = target->pos.xPos - item->pos.xPos;
__int32 z = target->pos.zPos - item->pos.zPos;
__int32 distance = SQUARE(x) + SQUARE(z);
if (distance < minDistance)
{
creature->enemy = target;
minDistance = distance;
}
}
}
AI_INFO info;
AI_INFO laraInfo;
CreatureAIInfo(item, &info);
if (creature->enemy == LaraItem)
{
laraInfo.angle = info.angle;
laraInfo.distance = info.distance;
if (!creature->hurtByLara /*&& CurrentLevel != LV_CHAMBER*/)
creature->enemy = NULL;
}
else
{
__int32 dx = LaraItem->pos.xPos - item->pos.xPos;
__int32 dz = LaraItem->pos.zPos - item->pos.zPos;
laraInfo.angle = ATAN(dz, dz) - item->pos.yRot; //only need to fill out the bits of laraInfo that will be needed by TargetVisible
laraInfo.distance = SQUARE(dx) + SQUARE(dz);
info.xAngle -= 0x800;
}
// if (creature->enemy != LaraItem) //Should eventually change this to be any person
// meta_mood = VIOLENT; //Shooters run up to their target if it's not a person
// else
//meta_mood = TIMID; //Else they stay their distance
GetCreatureMood(item, &info, TIMID);
CreatureMood(item, &info, TIMID);
angle = CreatureTurn(item, creature->maximumTurn);
ITEM_INFO* realEnemy = creature->enemy; //TargetVisible uses enemy, so need to fill this in as lara if we're doing other things
if (item->hitStatus || laraInfo.distance < SQUARE(1024) || TargetVisible(item, &laraInfo)) //Only change flamer's AI bits if hurt (by Lara or Sealmute)
{
if (!creature->alerted)
SoundEffect(300, &item->pos, 0);
AlertAllGuards(itemNumber);
}
switch (item->currentAnimState)
{
case 1:
head = laraInfo.angle;
creature->flags = 0;
creature->maximumTurn = 0;
if (item->aiBits & GUARD)
{
head = AIGuard(creature);
if (!(GetRandomControl() & 0xFF))
item->goalAnimState = 4;
break;
}
else if (item->aiBits & PATROL1)
item->goalAnimState = 2;
else if (creature->mood == ESCAPE_MOOD)
item->goalAnimState = 2;
else if (Targetable(item, &info) && (realEnemy != LaraItem || creature->hurtByLara))
{
if (info.distance < SQUARE(4096))
item->goalAnimState = 10;
else
item->goalAnimState = 2;
}
else if (creature->mood == BORED_MOOD && info.ahead && !(GetRandomControl() & 0xFF))
item->goalAnimState = 4;
else if (creature->mood == ATTACK_MOOD || !(GetRandomControl() & 0xFF))
item->goalAnimState = 2;
break;
case 4:
head = laraInfo.angle;
if (item->aiBits & GUARD)
{
head = AIGuard(creature);
if (!(GetRandomControl() & 0xFF))
item->goalAnimState = 1;
break;
}
else if ((Targetable(item, &info) &&
info.distance < SQUARE(4096) &&
(realEnemy != LaraItem || creature->hurtByLara) ||
creature->mood != BORED_MOOD ||
!(GetRandomControl() & 0xFF)))
item->goalAnimState = 1;
break;
case 2:
head = laraInfo.angle;
creature->flags = 0;
creature->maximumTurn = ANGLE(5);
if (item->aiBits & GUARD) //Complete frig so I don't have to write InitialiseFlamer - only ever happens immediately on being triggered
{
item->animNumber = Objects[item->objectNumber].animIndex + 12;
item->frameNumber = Anims[item->animNumber].frameBase;
item->currentAnimState = 1;
item->goalAnimState = 1;
}
else if (item->aiBits & PATROL1)
item->goalAnimState = 2;
else if (creature->mood == ESCAPE_MOOD)
item->goalAnimState = 2;
else if (Targetable(item, &info) &&
(realEnemy != LaraItem || creature->hurtByLara))
{
if (info.distance < SQUARE(4096))
item->goalAnimState = 1;
else
item->goalAnimState = 9;
}
else if (creature->mood == BORED_MOOD && info.ahead)
item->goalAnimState = 1;
else
item->goalAnimState = 2;
break;
case 10:
creature->flags = 0;
if (info.ahead)
{
torsoY = info.angle;
torsoX = info.xAngle;
if (Targetable(item, &info) &&
info.distance < SQUARE(4096) &&
(realEnemy != LaraItem || creature->hurtByLara))
item->goalAnimState = 11;
else
item->goalAnimState = 1;
}
break;
case 9:
creature->flags = 0;
if (info.ahead)
{
torsoY = info.angle;
torsoX = info.xAngle;
if (Targetable(item, &info) &&
info.distance < SQUARE(4096) &&
(realEnemy != LaraItem || creature->hurtByLara))
item->goalAnimState = 6;
else
item->goalAnimState = 2;
}
break;
case 11:
if (creature->flags < 40)
creature->flags += (creature->flags >> 2) + 1; // Length of flame.
if (info.ahead)
{
torsoY = info.angle;
torsoX = info.xAngle;
if (Targetable(item, &info) &&
info.distance < SQUARE(4096) &&
(realEnemy != LaraItem || creature->hurtByLara))
item->goalAnimState = 11;
else
item->goalAnimState = 1;
}
else
item->goalAnimState = 1;
if (creature->flags < 40)
TriggerFlameThrower(item, &flamerBite, creature->flags);
else
{
TriggerFlameThrower(item, &flamerBite, (GetRandomControl() & 31) + 12);
if (realEnemy)
{
/*if (realEnemy->objectNumber == BURNT_MUTANT)
realEnemy->item_flags[0]++;*/
}
}
SoundEffect(204, &item->pos, 0);
break;
case 6:
if (creature->flags < 40)
creature->flags += (creature->flags >> 2) + 1; // Length of flame.
if (info.ahead)
{
torsoY = info.angle;
torsoX = info.xAngle;
if (Targetable(item, &info) &&
info.distance < SQUARE(4096) &&
(realEnemy != LaraItem || creature->hurtByLara))
item->goalAnimState = 6;
else
item->goalAnimState = 2;
}
else
item->goalAnimState = 2;
if (creature->flags < 40)
TriggerFlameThrower(item, &flamerBite, creature->flags);
else
{
TriggerFlameThrower(item, &flamerBite, (GetRandomControl() & 31) + 12);
if (realEnemy)
{
/*if (realEnemy->objectNumber == BURNT_MUTANT)
realEnemy->item_flags[0]++;*/
}
}
SoundEffect(204, &item->pos, 0);
break;
}
}
CreatureTilt(item, tilt);
CreatureJoint(item, 0, torsoY);
CreatureJoint(item, 1, torsoX);
CreatureJoint(item, 2, head);
CreatureAnimation(itemNumber, angle, 0);
}
__int16 __cdecl TriggerFlameThrower(ITEM_INFO* item, BITE_INFO* bite, __int16 speed)
{
__int32 xv, yv, zv, vel, speed, lp;
PHD_VECTOR pos1;
PHD_VECTOR pos2;
__int16 angles[2];
__int32 speed;
__int32 velocity;
__int32 xv;
__int32 yv;
__int32 zv;
__int16 effectNumber = CreateNewEffect(item->roomNumber);
if (effectNumber != NO_ITEM)
{
FX_INFO* fx = &Effects[effectNumber];
pos1.x = bite->x;
pos1.y = bite->y;
pos1.z = bite->z;
GetJointAbsPosition(item, &pos1, bite->meshNum);
pos2.x = bite->x;
pos2.y = bite->y / 2;
pos2.z = bite->z;
GetJointAbsPosition(item, &pos2, bite->meshNum);
phd_GetVectorAngles(pos2.x - pos1.x, pos2.y - pos1.y, pos2.z - pos1.z, angles);
fx->pos.xPos = pos1.x;
fx->pos.yPos = pos1.y;
fx->pos.zPos = pos1.z;
fx->roomNumber = item->roomNumber;
fx->pos.xRot = angles[1];
fx->pos.zRot = 0;
fx->pos.yRot = angles[0];
fx->speed = speed << 2;
//fx->objectNumber = DRAGON_FIRE;
fx->counter = 20;
fx->flag1 = 0; // Set to orange flame.
TriggerFlamethrowerFlame(0, 0, 0, 0, 0, 0, effectNumber);
for (__int32 i = 0; i < 2; i++)
{
speed = (GetRandomControl() % (speed << 2)) + 32;
velocity = (speed * COS(fx->pos.xRot)) >> W2V_SHIFT;
xv = (velocity * SIN(fx->pos.yRot)) >> W2V_SHIFT;
yv = -((speed * SIN(fx->pos.xRot)) >> W2V_SHIFT);
zv = (velocity * COS(fx->pos.yRot)) >> W2V_SHIFT;
TriggerFlamethrowerFlame(fx->pos.xPos, fx->pos.yPos, fx->pos.zPos, xv << 5, yv << 5, zv << 5, -1);
}
velocity = ((speed << 1) * COS(fx->pos.xRot)) >> W2V_SHIFT;
zv = (velocity * COS(fx->pos.yRot)) >> W2V_SHIFT;
xv = (velocity * SIN(fx->pos.yRot)) >> W2V_SHIFT;
yv = -(((speed << 1) * SIN(fx->pos.xRot)) >> W2V_SHIFT);
TriggerFlamethrowerFlame(fx->pos.xPos, fx->pos.yPos, fx->pos.zPos, xv << 5, yv << 5, zv << 5, -2);
}
return effectNumber;
}
void __cdecl TriggerFlamethrowerFlame(__int32 x, __int32 y, __int32 z, __int32 xv, __int32 yv, __int32 zv, __int32 fxnum)
{
SPARKS* spark = &Sparks[GetFreeSpark()];
spark->on = true;
spark->sR = 48 + (GetRandomControl() & 31);
spark->sG = spark->sR;
spark->sB = 192 + (GetRandomControl() & 63);
spark->dR = 192 + (GetRandomControl() & 63);
spark->dG = 128 + (GetRandomControl() & 63);
spark->dB = 32;
if (xv || yv || zv)
{
spark->colFadeSpeed = 6;
spark->fadeToBlack = 2;
spark->sLife = spark->life = (GetRandomControl() & 1) + 12;
}
else
{
spark->colFadeSpeed = 8;
spark->fadeToBlack = 16;
spark->sLife = spark->life = (GetRandomControl() & 3) + 20;
}
spark->transType = 2;
spark->extras = 0;
spark->dynamic = -1;
spark->x = x + ((GetRandomControl() & 31) - 16);
spark->y = y;
spark->z = z + ((GetRandomControl() & 31) - 16);
spark->xVel = ((GetRandomControl() & 15) - 16) + xv;
spark->yVel = yv;
spark->zVel = ((GetRandomControl() & 15) - 16) + zv;
spark->friction = 0;
if (GetRandomControl() & 1)
{
if (fxnum >= 0)
spark->flags = SP_SCALE | SP_DEF | SP_ROTATE | SP_EXPDEF | SP_FX;
else
spark->flags = SP_SCALE | SP_DEF | SP_ROTATE | SP_EXPDEF;
spark->rotAng = GetRandomControl() & 4095;
if (GetRandomControl() & 1)
spark->rotAdd = -(GetRandomControl() & 15) - 16;
else
spark->rotAdd = (GetRandomControl() & 15) + 16;
}
else
{
if (fxnum >= 0)
spark->flags = SP_SCALE | SP_DEF | SP_EXPDEF | SP_FX;
else
spark->flags = SP_SCALE | SP_DEF | SP_EXPDEF;
}
spark->fxObj = fxnum;
spark->gravity = 0;
spark->maxYvel = 0;
//spark->def = Objects[EXPLOSION1].mesh_index;
__int32 size = (GetRandomControl() & 31) + 64;
if (xv || yv || zv)
{
spark->size = size >> 5;
if (fxnum == -2)
spark->scalar = 2;
else
spark->scalar = 3;
}
else
{
spark->size = size >> 4;
spark->scalar = 4;
}
spark->dSize = size >> 1;
}
void TriggerPilotFlame(__int32 itemnum)
{
__int32 dx = LaraItem->pos.xPos - Items[itemnum].pos.xPos;
__int32 dz = LaraItem->pos.zPos - Items[itemnum].pos.zPos;
if (dx < -16384 || dx > 16384 || dz < -16384 || dz > 16384)
return;
SPARKS* spark = &spark[GetFreeSpark()];
spark->on = 1;
spark->sR = 48 + (GetRandomControl() & 31);
spark->sG = spark->sR;
spark->sB = 192 + (GetRandomControl() & 63);
spark->dR = 192 + (GetRandomControl() & 63);
spark->dG = 128 + (GetRandomControl() & 63);
spark->dB = 32;
spark->colFadeSpeed = 12 + (GetRandomControl() & 3);
spark->fadeToBlack = 4;
spark->sLife = spark->life = (GetRandomControl() & 3) + 20;
spark->transType = 2;
spark->extras = 0;
spark->dynamic = -1;
spark->x = (GetRandomControl() & 31) - 16;
spark->y = (GetRandomControl() & 31) - 16;
spark->z = (GetRandomControl() & 31) - 16;
spark->xVel = (GetRandomControl() & 31) - 16;
spark->yVel = -(GetRandomControl() & 3);
spark->zVel = (GetRandomControl() & 31) - 16;
spark->flags = SP_SCALE | SP_DEF | SP_EXPDEF | SP_ITEM | SP_NODEATTATCH;
spark->fxObj = itemnum;
spark->nodeNumber = 0;
spark->friction = 4;
spark->gravity = -(GetRandomControl() & 3) - 2;
spark->maxYvel = -(GetRandomControl() & 3) - 4;
//spark->def = objects[EXPLOSION1].mesh_index;
spark->scalar = 0;
__int32 size = (GetRandomControl() & 7) + 32;
spark->size = size >> 1;
spark->dSize = size;
}

View file

@ -0,0 +1,747 @@
#include "newobjects.h"
#include "..\Global\global.h"
#include "..\Game\Box.h"
#include "..\Game\items.h"
#include "..\Game\lot.h"
#include "..\Game\control.h"
#include "..\Game\people.h"
#include "..\Game\effects.h"
#include "..\Game\effect2.h"
#include "..\Game\draw.h"
#include "..\Game\sphere.h"
#include "..\Game\inventory.h"
#include "..\Game\collide.h"
#include "..\Game\draw.h"
BITE_INFO horseBite1 = { 0, 0, 0, 0x0D };
BITE_INFO horseBite2 = { 0, 0, 0, 0x11 };
BITE_INFO horseBite3 = { 0, 0, 0, 0x13 };
BITE_INFO horsemanBite1 = { 0, 0, 0, 0x06 };
BITE_INFO horsemanBite2 = { 0, 0, 0, 0x0E };
BITE_INFO horsemanBite3 = { 0, 0, 0, 0x0A };
void __cdecl InitialiseHorse(__int16 itemNum)
{
ITEM_INFO* item = &Items[itemNum];
OBJECT_INFO* obj = &Objects[ID_HORSE];
item->animNumber = obj->animIndex + 2;
item->frameNumber = Anims[item->animNumber].frameBase;
item->goalAnimState = 1;
item->currentAnimState = 1;
}
void __cdecl InitialiseHorseman(__int16 itemNum)
{
ITEM_INFO* item = &Items[itemNum];
OBJECT_INFO* obj = &Objects[ID_HORSEMAN];
ClearItem(itemNum);
item->animNumber = obj->animIndex + 8;
item->frameNumber = Anims[item->animNumber].frameBase;
item->goalAnimState = 9;
item->currentAnimState = 9;
item->itemFlags[0] = NO_ITEM; // No horse yet
}
void __cdecl HorsemanControl(__int16 itemNum)
{
if (!CreatureActive(itemNum))
return;
ITEM_INFO* item = &Items[itemNum];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
// Try to find the horse
if (item->itemFlags[0] == NO_ITEM)
{
for (__int32 i = 0; i < LevelItems; i++)
{
ITEM_INFO* currentItem = &Items[i];
if (item->objectNumber == ID_HORSE && item->triggerFlags == currentItem->triggerFlags)
{
item->itemFlags[0] = i;
currentItem->flags |= 0x20;
}
}
}
// If no horse was found, then set it to 0 so it won't be searched anymore in the future
if (item->itemFlags[0] == NO_ITEM)
item->itemFlags[0] = 0;
// The horse
ITEM_INFO * horseItem = NULL;
if (item->itemFlags[0] != 0)
horseItem = &Items[item->itemFlags[0]];
__int32 x;
__int32 y;
__int32 z;
__int16 roomNumber;
__int32 deltaX;
__int32 deltaZ;
FLOOR_INFO * floor;
__int16 height;
__int16 height1;
__int16 height2;
__int32 xRot = 0;
if (horseItem != NULL)
{
roomNumber = item->roomNumber;
x = horseItem->pos.xPos;
y = horseItem->pos.yPos;
z = horseItem->pos.zPos;
x = horseItem->pos.xPos + 341 * SIN(horseItem->pos.yRot) >> 14;
y = horseItem->pos.yPos;
z = horseItem->pos.zPos + 341 * COS(horseItem->pos.yRot) >> 14;
floor = GetFloor(x, y, z, &roomNumber);
height1 = GetFloorHeight(floor, x, y, z);
x = horseItem->pos.xPos - 341 * SIN(horseItem->pos.yRot) >> 14;
y = horseItem->pos.yPos;
z = horseItem->pos.zPos - 341 * COS(horseItem->pos.yRot) >> 14;
floor = GetFloor(x, y, z, &roomNumber);
height2 = GetFloorHeight(floor, x, y, z);
xRot = ATAN(682, height2 - height1);
}
if (item->hitPoints <= 0)
{
item->hitPoints = 0;
if (item->itemFlags[1] == 0)
{
if (item->currentAnimState != 16)
{
item->animNumber = Objects[ID_HORSEMAN].animIndex + 21;
item->currentAnimState = 16;
item->frameNumber = Anims[item->animNumber].frameBase;
if (item->itemFlags[0])
{
Items[item->itemFlags[0]].afterDeath = 1;
}
}
}
else
{
item->hitPoints = 100;
item->aiBits = 0;
item->itemFlags[1] = 0;
item->animNumber = Objects[ID_HORSEMAN].animIndex + 3;
item->currentAnimState = 8;
item->frameNumber = Anims[item->animNumber].frameBase;
creature->enemy = NULL;
horseItem->goalAnimState = 1;
}
}
if (item->aiBits)
{
GetAITarget(creature);
}
else if (creature->hurtByLara)
{
creature->enemy = LaraItem;
}
AI_INFO info;
AI_INFO laraInfo;
CreatureAIInfo(item, &info);
if (creature->enemy == LaraItem)
{
laraInfo.angle = info.angle;
laraInfo.distance = info.distance;
}
else
{
deltaX = LaraItem->pos.zPos - item->pos.zPos;
deltaZ = LaraItem->pos.zPos - item->pos.zPos;
laraInfo.angle = ATAN(deltaX, deltaZ) - item->pos.yRot;
laraInfo.distance = SQUARE(deltaX) + SQUARE(deltaZ);
}
__int16 angle = 0;
__int16 tilt = 0;
if (item->hitStatus
&& laraInfo.angle < 12288
&& laraInfo.angle > -12288
&& laraInfo.distance < SQUARE(2048))
{
if (!horseItem || !item->itemFlags[1])
{
Objects[ID_HORSEMAN].radius = item->itemFlags[1] != 0 ? 409 : 170;
CreatureAnimation(itemNum, angle, 0);
return;
}
if (abs(xRot - item->pos.xRot) < 256)
{
item->pos.xRot = xRot;
}
else
{
if (xRot > item->pos.xRot)
{
item->pos.xRot += 256;
}
else if (xRot < item->pos.xRot)
{
item->pos.xRot -= 256;
}
}
horseItem->pos.xPos = item->pos.xPos;
horseItem->pos.yPos = item->pos.yPos;
horseItem->pos.zPos = item->pos.zPos;
horseItem->pos.xRot = item->pos.xRot;
horseItem->pos.yRot = item->pos.yRot;
horseItem->pos.zRot = item->pos.zRot;
if (horseItem->roomNumber != item->roomNumber)
{
ItemNewRoom(item->itemFlags[0], item->roomNumber);
}
AnimateItem(horseItem);
Objects[ID_HORSEMAN].radius = item->itemFlags[1] != 0 ? 409 : 170;
CreatureAnimation(itemNum, angle, 0);
if (item->currentAnimState != 15)
{
if (laraInfo.angle > 0)
{
goto LABEL_188;
}
if (laraInfo.angle <= 0)
{
if (item->itemFlags[1])
{
LABEL_47:
if (!item->itemFlags[1])
{
v36 = item->meshBits;
if (item->meshBits & 0x400)
{
item->requiredAnimState = 15;
}
}
goto LABEL_50;
}
}
if (item->itemFlags[1])
{
LABEL_47:
if (!item->itemFlags[1])
{
v36 = item->meshBits;
if (v36 & 0x400)
{
item->requiredAnimState = 15;
}
}
goto LABEL_50;
}
v35 = item->meshBits;
if (!(v35 & 0x400))
{
LABEL_188:
if (Lara_GunType == 4)
{
item->hitPoints -= 10;
LOBYTE(v34) = v34 | 0x10;
item->MainFlags = v34;
}
else if (Lara_GunType == 2)
{
item->hitPoints -= 20;
LOBYTE(v34) = v34 | 0x10;
item->MainFlags = v34;
}
else
{
--item->hitPoints;
}
SoundEffect(301, &item->pos, 0);
SoundEffect(213, &item->pos, 0);
v68 = 0;
v69 = -128;
v70 = 80;
GetJointAbsPosition((int)item, &v68, 1);
sub_408D90(&v68, (signed __int16)item->pos.yRot, 7);
goto LABEL_47;
}
}
if (!(GetRandomControl() & 7))
{
if (item->currentAnimState == 15)
{
item->goalAnimState = 9;
}
ExplodeItemNode((int)item, 10, 1, -24);
}
return;
}
creature->hurtByLara = false;
GetCreatureMood(item, &info, VIOLENT);
CreatureMood(item, &info, VIOLENT);
angle = CreatureTurn(item, creature->maximumTurn);
switch (item->currentAnimState)
{
case 1:
creature->maximumTurn = ANGLE(3);
horseItem->goalAnimState = 2;
if (item->requiredAnimState)
{
item->goalAnimState = 17;
horseItem->goalAnimState = 5;
}
else if (creature->flags || creature->reachedGoal || item->hitStatus && !GetRandomControl())
{
if (laraInfo.distance > SQUARE(4096) || creature->reachedGoal)
{
creature->flags = 0;
creature->enemy = LaraItem;
if (laraInfo.angle > -8192 && laraInfo.angle < 0x2000)
{
item->goalAnimState = 3;
horseItem->goalAnimState = 1;
}
}
else
{
item->aiBits = FOLLOW;
item->itemFlags[3] = (-(item->itemFlags[3] != 1)) + 2;
}
}
if (info.distance >= SQUARE(1024) || info.bite || info.angle >= -ANGLE(10) && info.angle <= ANGLE(10))
{
if (info.bite)
{
if (info.angle >= -ANGLE(10)
|| info.distance >= SQUARE(1024) && (info.distance >= SQUARE(1365) || info.angle <= -ANGLE(20)))
{
if (info.angle > ANGLE(10) && (info.distance < SQUARE(1024) || info.distance < SQUARE(1365) &&
info.angle < ANGLE(20)))
{
creature->maximumTurn = 0;
item->goalAnimState = 6;
}
}
else
{
creature->maximumTurn = 0;
item->goalAnimState = 7;
}
}
}
else
{
item->goalAnimState = 3;
horseItem->goalAnimState = 1;
}
break;
case 2:
creature->maximumTurn = 273;
if (laraInfo.distance > SQUARE(4096) || creature->reachedGoal || creature->enemy == LaraItem)
{
creature->reachedGoal = false;
creature->flags = 0;
item->goalAnimState = 1;
horseItem->goalAnimState = 2;
creature->enemy = LaraItem;
}
break;
case 3:
creature->maximumTurn = 0;
horseItem->goalAnimState = 1;
if (creature->flags)
{
item->aiBits = FOLLOW;
item->itemFlags[3] = -(item->itemFlags[3] != 1) + 2;
}
else
{
creature->flags = 0;
}
if (item->requiredAnimState)
{
item->goalAnimState = 1;
horseItem->goalAnimState = 2;
horseItem->flags = 0;
}
else if (creature->reachedGoal
|| !horseItem->flags
&& info.distance < SQUARE(1024)
&& info.bite
&& info.angle < ANGLE(10)
&& info.angle > -ANGLE(10))
{
item->goalAnimState = 4;
if (creature->reachedGoal)
{
item->requiredAnimState = 17;
}
horseItem->flags = 0;
}
else
{
item->goalAnimState = 1;
horseItem->goalAnimState = 2;
horseItem->flags = 0;
}
break;
case 4:
creature->maximumTurn = 0;
if (item->frameNumber == Anims[item->animNumber].frameBase)
{
horseItem->animNumber = Objects[ID_HORSE].animIndex + 1;
horseItem->currentAnimState = 4;
horseItem->frameNumber = Anims[item->animNumber].frameBase;
}
if (!horseItem->flags)
{
if (horseItem->touchBits & 0x22000)
{
LaraItem->hitPoints -= 150;
LaraItem->hitStatus = true;
if (horseItem->touchBits & 0x2000)
{
CreatureEffect2(
horseItem,
&horseBite1,
10,
-1,
DoBloodSplat);
}
else
{
CreatureEffect2(
horseItem,
&horseBite2,
10,
-1,
DoBloodSplat);
}
horseItem->flags = 1;
}
}
break;
case 6:
if (!creature->flags)
{
if (item->touchBits & 0x60)
{
LaraItem->hitPoints -= 250;
LaraItem->hitStatus = true;
CreatureEffect2(
item,
&horsemanBite1,
10,
item->pos.yRot,
DoBloodSplat);
creature->flags = 1;
}
}
if (item->hitStatus)
{
item->goalAnimState = 9;
}
break;
case 7:
if (!creature->flags)
{
if (item->touchBits & 0x4000)
{
LaraItem->hitPoints -= 100;
LaraItem->hitStatus = true;
CreatureEffect2(
item,
&horsemanBite2,
3,
item->pos.yRot,
DoBloodSplat);
creature->flags = 1;
}
}
break;
case 9:
creature->maximumTurn = 0;
creature->flags = 0;
if (!item->aiBits || item->itemFlags[3])
{
if (item->requiredAnimState)
{
item->goalAnimState = item->requiredAnimState;
}
else if (info.bite && info.distance < SQUARE(682))
{
item->goalAnimState = 14;
}
else if (info.distance < SQUARE(6144) && info.distance > SQUARE(682))
{
item->goalAnimState = 10;
}
}
else
{
item->goalAnimState = 10;
}
break;
case 10:
creature->maximumTurn = ANGLE(3);
creature->flags = 0;
if (creature->reachedGoal)
{
item->aiBits = 0;
item->itemFlags[1] = 1;
item->pos.xPos = horseItem->pos.xPos;
item->pos.yPos = horseItem->pos.yPos;
item->pos.zPos = horseItem->pos.zPos;
item->pos.xRot = horseItem->pos.xRot;
item->pos.yRot = horseItem->pos.yRot;
item->pos.zRot = horseItem->pos.zRot;
creature->reachedGoal = false;
creature->enemy = NULL;
item->animNumber = Objects[ID_HORSEMAN].animIndex + 14;
item->currentAnimState = 5;
item->frameNumber = Anims[item->animNumber].frameBase;
creature->maximumTurn = 0;
break;
}
if (item->hitStatus)
{
item->goalAnimState = 9;
break;
}
if (info.bite && info.distance < SQUARE(682))
{
if (GetRandomControl() & 1)
{
item->goalAnimState = 12;
}
else if (GetRandomControl() & 1)
{
item->goalAnimState = 13;
}
else
{
item->goalAnimState = 9;
}
}
else if (info.distance < SQUARE(5120) && info.distance > SQUARE(1365))
{
item->goalAnimState = 11;
}
break;
case 11:
if (info.distance < SQUARE(1365))
{
item->goalAnimState = 10;
}
break;
case 12:
case 13:
case 14:
creature->maximumTurn = 0;
if (abs(info.angle) >= ANGLE(3))
{
if (info.angle >= 0)
{
item->pos.yRot += ANGLE(3);
}
else
{
item->pos.yRot -= ANGLE(3);
}
}
else
{
item->pos.yRot += info.angle;
}
if (!creature->flags)
{
if (item->touchBits & 0x4000)
{
LaraItem->hitPoints -= 100;
LaraItem->hitStatus = true;
CreatureEffect2(
item,
&horsemanBite2,
3,
item->pos.yRot,
DoBloodSplat);
creature->flags = 1;
}
}
break;
case 15:
if (Lara.target != item || info.bite && info.distance < SQUARE(682))
{
item->goalAnimState = 9;
}
break;
case 17:
creature->reachedGoal = false;
creature->maximumTurn = 546;
if (!horseItem->flags)
{
if (horseItem->touchBits & 0xA2000)
{
LaraItem->hitPoints -= 150;
LaraItem->hitStatus = true;
if (horseItem->touchBits & 0x2000)
{
CreatureEffect2(
horseItem,
&horseBite1,
10,
-1,
DoBloodSplat);
}
if (horseItem->touchBits & 0x20000)
{
CreatureEffect2(
horseItem,
&horseBite2,
10,
-1,
DoBloodSplat);
}
if (horseItem->touchBits & 0x80000)
{
CreatureEffect2(
horseItem,
&horseBite3,
10,
-1,
DoBloodSplat);
}
horseItem->flags = 1;
}
}
if (!creature->flags)
{
if (item->touchBits & 0x460)
{
LaraItem->hitStatus = true;
if (item->touchBits & 0x60)
{
CreatureEffect2(
horseItem,
&horsemanBite1,
20,
-1,
DoBloodSplat);
LaraItem->hitPoints -= 250;
}
else if (item->touchBits & 0x400)
{
CreatureEffect2(
horseItem,
&horsemanBite3,
10,
-1,
DoBloodSplat);
LaraItem->hitPoints -= 150;
}
creature->flags = 1;
}
}
if (item->animNumber == Objects[ID_HORSEMAN].animIndex + 29 &&
item->frameNumber == Anims[item->animNumber].frameBase)
{
horseItem->animNumber = Objects[ID_HORSE].animIndex + 10;
horseItem->frameNumber = Anims[horseItem->animNumber].frameBase;
}
if (laraInfo.distance > SQUARE(4096) || creature->reachedGoal)
{
creature->reachedGoal = false;
creature->flags = 0;
creature->enemy = LaraItem;
}
else if (!info.ahead)
{
item->goalAnimState = 3;
horseItem->goalAnimState = 1;
}
break;
default:
break;
}
}

View file

@ -45,14 +45,18 @@ __int32 __cdecl GetWaterSurface(__int32 x, __int32 y, __int32 z, __int16 roomNum
void __cdecl ShootHarpoon(ITEM_INFO* frogman, __int32 x, __int32 y, __int32 z, __int16 speed, __int16 yRot, __int16 roomNumber); void __cdecl ShootHarpoon(ITEM_INFO* frogman, __int32 x, __int32 y, __int32 z, __int16 speed, __int16 yRot, __int16 roomNumber);
void __cdecl HarpoonControl(__int16 itemNum); void __cdecl HarpoonControl(__int16 itemNum);
void __cdecl ScubaControl(__int16 itemNumber); void __cdecl ScubaControl(__int16 itemNumber);
void InitialiseEagle(__int16 itemNum); void __cdecl InitialiseEagle(__int16 itemNum);
void EagleControl(__int16 itemNum); void __cdecl EagleControl(__int16 itemNum);
void __cdecl TribemanAxeControl(__int16 itemNum); void __cdecl TribemanAxeControl(__int16 itemNum);
void __cdecl TribesmanShotDart(ITEM_INFO* item); void __cdecl TribesmanShotDart(ITEM_INFO* item);
void __cdecl TribesmanDartsControl(__int16 itemNum); void __cdecl TribesmanDartsControl(__int16 itemNum);
void __cdecl ControlSpikeWall(__int16 itemNum); void __cdecl ControlSpikyWall(__int16 itemNum);
void LaraTyrannosaurDeath(ITEM_INFO* item); void __cdecl LaraTyrannosaurDeath(ITEM_INFO* item);
void TyrannosaurControl(__int16 itemNum); void __cdecl TyrannosaurControl(__int16 itemNum);
void __cdecl TriggerFlamethrowerFlame(__int32 x, __int32 y, __int32 z, __int32 xv, __int32 yv, __int32 zv, __int32 fxnum);
__int16 __cdecl TriggerFlameThrower(ITEM_INFO* item, BITE_INFO* bite, __int16 speed);
void __cdecl FlamerControl(__int16 itemNumber);
void __cdecl ControlSpikyCeiling(__int16 itemNumber);
__int32 __cdecl GetCollisionAnim(ITEM_INFO* item, PHD_VECTOR* p); __int32 __cdecl GetCollisionAnim(ITEM_INFO* item, PHD_VECTOR* p);
__int32 __cdecl TestHeight(ITEM_INFO* item, __int32 dz, __int32 dx, PHD_VECTOR* pos); __int32 __cdecl TestHeight(ITEM_INFO* item, __int32 dz, __int32 dx, PHD_VECTOR* pos);
@ -137,6 +141,9 @@ void __cdecl InitialiseSphinx(__int16 itemNum);
void __cdecl SphinxControl(__int16 itemNum); void __cdecl SphinxControl(__int16 itemNum);
void __cdecl InitialiseBurningFloor(__int16 itemNum); void __cdecl InitialiseBurningFloor(__int16 itemNum);
void __cdecl BurningFloorControl(__int16 itemNum); void __cdecl BurningFloorControl(__int16 itemNum);
void __cdecl InitialiseHorse(__int16 itemNum);
void __cdecl InitialiseHorseman(__int16 itemNum);
void __cdecl HorsemanControl(__int16 itemNum);
//extern __int16 LaraMotorbike; //extern __int16 LaraMotorbike;
//void __cdecl InitialiseMotorbike(__int16 itemNum); //void __cdecl InitialiseMotorbike(__int16 itemNum);

View file

@ -377,7 +377,7 @@ void __cdecl StargateCollision(__int16 itemNum, ITEM_INFO* l, COLL_INFO* c)
} }
} }
void __cdecl ControlSpikeWall(__int16 itemNum) void __cdecl ControlSpikyWall(__int16 itemNum)
{ {
ITEM_INFO* item = &Items[itemNum]; ITEM_INFO* item = &Items[itemNum];
@ -1004,3 +1004,46 @@ void __cdecl BurningFloorControl(__int16 itemNum)
{ {
} }
void __cdecl ControlSpikyCeiling(__int16 itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
if (TriggerActive(item) && item->status != ITEM_DEACTIVATED)
{
__int32 y = item->pos.yPos + ((item->itemFlags[0] == 1) ? 10 : 5);
__int16 roomNumber = item->roomNumber;
FLOOR_INFO* floor = GetFloor(item->pos.xPos, y, item->pos.zPos, &roomNumber);
if (GetFloorHeight(floor, item->pos.xPos, y, item->pos.zPos) < y + 1024)
{
item->status = ITEM_DEACTIVATED;
StopSoundEffect(147);
}
else
{
item->pos.yPos = y;
if (roomNumber != item->roomNumber)
ItemNewRoom(itemNumber, roomNumber);
SoundEffect(147, &item->pos, 0);
}
}
if (item->touchBits)
{
LaraItem->hitPoints -= 20;
LaraItem->hitStatus = true;
DoLotsOfBlood(LaraItem->pos.xPos, item->pos.yPos + 768, LaraItem->pos.zPos,
4, item->pos.yRot, LaraItem->roomNumber, 3);
item->touchBits = 0;
SoundEffect(56, &item->pos, 0);
}
if (TriggerActive(item) && item->status != ITEM_DEACTIVATED && item->itemFlags[0] == 1)
AnimateItem(item);
}

View file

@ -5618,7 +5618,7 @@ __int32 Renderer11::drawInventoryScene()
ring->objects[objectIndex].rotation = 0; ring->objects[objectIndex].rotation = 0;
__int32 x = ring->distance * cos(currentAngle * RADIAN); __int32 x = ring->distance * cos(currentAngle * RADIAN);
__int32 y = g_Inventory->GetRing(k)->y; // (k < 3 ? lastRing * INV_RINGS_OFFSET : 0.0f); __int32 y = g_Inventory->GetRing(k)->y;
__int32 z = ring->distance * sin(currentAngle * RADIAN); __int32 z = ring->distance * sin(currentAngle * RADIAN);
// Prepare the object transform // Prepare the object transform

View file

@ -105,6 +105,7 @@ bool __cdecl readGameFlowFlags()
g_GameFlow->FlyCheat = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream()); g_GameFlow->FlyCheat = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream());
g_GameFlow->DebugMode = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream()); g_GameFlow->DebugMode = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream());
g_GameFlow->LevelFarView = LEB128::ReadInt32(g_ScriptChunkIO->GetRawStream()); g_GameFlow->LevelFarView = LEB128::ReadInt32(g_ScriptChunkIO->GetRawStream());
g_GameFlow->TitleType = LEB128::ReadInt32(g_ScriptChunkIO->GetRawStream());
return true; return true;
} }
@ -458,7 +459,7 @@ bool GameFlow::DoGameflow()
case GAME_STATUS_NEW_GAME: case GAME_STATUS_NEW_GAME:
CurrentLevel = (SelectedLevelForNewGame != 0 ? SelectedLevelForNewGame : 1); CurrentLevel = (SelectedLevelForNewGame != 0 ? SelectedLevelForNewGame : 1);
SelectedLevelForNewGame = 0; SelectedLevelForNewGame = 0;
gfInitialiseGame = true; InitialiseGame = true;
break; break;
case GAME_STATUS_LOAD_GAME: case GAME_STATUS_LOAD_GAME:
// Load the header of the savegame for getting the level to load // Load the header of the savegame for getting the level to load

View file

@ -13,12 +13,15 @@
#include "..\Specific\IO\LEB128.h" #include "..\Specific\IO\LEB128.h"
#include "LanguageScript.h" #include "LanguageScript.h"
#define TITLE_FLYBY 0
#define TITLE_BACKGROUND 1
struct ChunkId; struct ChunkId;
struct LEB128; struct LEB128;
using namespace std; using namespace std;
typedef struct GameScriptSettings { struct GameScriptSettings {
__int32 ScreenWidth; __int32 ScreenWidth;
__int32 ScreenHeight; __int32 ScreenHeight;
bool EnableLoadSave; bool EnableLoadSave;
@ -31,7 +34,7 @@ typedef struct GameScriptSettings {
bool ShowDebugInfo; bool ShowDebugInfo;
}; };
typedef struct GameScriptSkyLayer { struct GameScriptSkyLayer {
bool Enabled; bool Enabled;
byte R; byte R;
byte G; byte G;
@ -54,7 +57,7 @@ typedef struct GameScriptSkyLayer {
} }
}; };
typedef struct GameScriptFog { struct GameScriptFog {
byte R; byte R;
byte G; byte G;
byte B; byte B;
@ -72,7 +75,7 @@ typedef struct GameScriptFog {
} }
}; };
typedef struct GameScriptMirror { struct GameScriptMirror {
__int16 Room; __int16 Room;
__int32 StartX; __int32 StartX;
__int32 EndX; __int32 EndX;
@ -95,7 +98,7 @@ typedef struct GameScriptMirror {
} }
}; };
typedef struct GameScriptLevel { struct GameScriptLevel {
__int32 NameStringIndex; __int32 NameStringIndex;
string FileName; string FileName;
string ScriptFileName; string ScriptFileName;
@ -168,6 +171,7 @@ public:
bool FlyCheat; bool FlyCheat;
bool DebugMode; bool DebugMode;
__int32 LevelFarView; __int32 LevelFarView;
__int32 TitleType;
// Selected language set // Selected language set
LanguageScript* CurrentStrings; LanguageScript* CurrentStrings;

View file

@ -93,7 +93,7 @@ void __cdecl LoadScreen(__int32 index, __int32 num)
//while(true) //while(true)
// TestRenderer(); // TestRenderer();
GlobalLastInventoryItem = -1; LastInventoryItem = -1;
DelCutSeqPlayer = 0; DelCutSeqPlayer = 0;
InitSpotCamSequences(); InitSpotCamSequences();

View file

@ -570,7 +570,7 @@ unsigned __stdcall LoadLevel(void* data)
Wibble = 0; Wibble = 0;
TorchRoom = -1; TorchRoom = -1;
InitialiseGameFlags(); InitialiseGameFlags();
InitialiseLara(!(gfInitialiseGame || CurrentLevel == 1 || level->ResetHub)); InitialiseLara(!(InitialiseGame || CurrentLevel == 1 || level->ResetHub));
GetCarriedItems(); GetCarriedItems();
GetAIPickups(); GetAIPickups();
SeedRandomDraw(0xD371F947); SeedRandomDraw(0xD371F947);

View file

@ -935,6 +935,45 @@ void __cdecl NewObjects()
obj->saveAnim = true; obj->saveAnim = true;
obj->saveFlags = true; obj->saveFlags = true;
} }
obj = &Objects[ID_FLAMETHROWER_BADDY];
if (obj->loaded)
{
obj->control = FlamerControl;
obj->collision = CreatureCollision;
obj->shadowSize = UNIT_SHADOW / 2;
obj->hitPoints = 36;
obj->radius = 102;
obj->intelligent = 1;
obj->intelligent = true;
obj->savePosition = true;
obj->saveHitpoints = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->pivotLength = 0;
Bones[obj->boneIndex + 0 * 4] |= ROT_Y;
Bones[obj->boneIndex + 0 * 4] |= ROT_X;
Bones[obj->boneIndex + 7 * 4] |= ROT_Y;
}
obj = &Objects[ID_SPIKY_WALL];
if (obj->loaded)
{
obj->control = ControlSpikyWall;
obj->collision = ObjectCollision;
obj->savePosition = true;
obj->saveFlags = true;
}
obj = &Objects[ID_SPIKY_CEILING];
if (obj->loaded)
{
obj->control = ControlSpikyCeiling;
obj->collision = TrapCollision;
obj->savePosition = true;
obj->saveFlags = true;
}
} }
void __cdecl CustomObjects() void __cdecl CustomObjects()

View file

@ -23,7 +23,7 @@
<ProjectGuid>{15AB0220-541C-4DA1-94EB-ED3C47E4582E}</ProjectGuid> <ProjectGuid>{15AB0220-541C-4DA1-94EB-ED3C47E4582E}</ProjectGuid>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<RootNamespace>TR5Main</RootNamespace> <RootNamespace>TR5Main</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
@ -265,6 +265,8 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts"</Command>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="dllmain.cpp" /> <ClCompile Include="dllmain.cpp" />
<ClCompile Include="Objects\flamethrower.cpp" />
<ClCompile Include="Objects\horseman.cpp" />
<ClCompile Include="Scripting\LanguageScript.cpp" /> <ClCompile Include="Scripting\LanguageScript.cpp" />
<ClCompile Include="Objects\demigod.cpp" /> <ClCompile Include="Objects\demigod.cpp" />
<ClCompile Include="Objects\guide.cpp" /> <ClCompile Include="Objects\guide.cpp" />

View file

@ -542,6 +542,12 @@
<ClCompile Include="Scripting\LanguageScript.cpp"> <ClCompile Include="Scripting\LanguageScript.cpp">
<Filter>File di origine</Filter> <Filter>File di origine</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Objects\horseman.cpp">
<Filter>File di origine</Filter>
</ClCompile>
<ClCompile Include="Objects\flamethrower.cpp">
<Filter>File di origine</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="Shaders\Shader.fx" /> <None Include="Shaders\Shader.fx" />