mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-04-30 08:47:58 +03:00
Added TR3 flamethrower; Added TR3 spiky ceiling; Added TR3 spiky wall; Added TR4 horse and horseman; New slots;
This commit is contained in:
parent
3be58f2b4a
commit
0e49d65c8e
27 changed files with 1478 additions and 185 deletions
Binary file not shown.
BIN
Build/savegame.0
BIN
Build/savegame.0
Binary file not shown.
BIN
Build/savegame.1
BIN
Build/savegame.1
Binary file not shown.
BIN
Build/savegame.2
BIN
Build/savegame.2
Binary file not shown.
BIN
Build/savegame.3
BIN
Build/savegame.3
Binary file not shown.
|
@ -113,7 +113,7 @@ __int32 __cdecl CollideStaticObjects(COLL_INFO* coll, __int32 x, __int32 y, __in
|
|||
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
|
||||
__int16 roomsArray[22];
|
||||
|
@ -283,7 +283,7 @@ __int32 GetCollidedObjects(ITEM_INFO* collidingItem, __int32 radius, __int32 onl
|
|||
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);
|
||||
|
||||
|
@ -311,6 +311,24 @@ __int32 TestWithGlobalCollisionBounds(ITEM_INFO* item, ITEM_INFO* lara, COLL_INF
|
|||
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()
|
||||
{
|
||||
INJECT(0x00411DB0, CollideStaticObjects);
|
||||
|
|
|
@ -14,7 +14,8 @@
|
|||
#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 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 GetCollidedObjects(ITEM_INFO* collidingItem, __int32 radius, __int32 flag1, ITEM_INFO** collidedItems, MESH_INFO** collidedMeshes, __int32 flag2);
|
||||
__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();
|
|
@ -370,6 +370,8 @@ GAME_STATUS __cdecl ControlPhase(__int32 numFrames, __int32 demoMode)
|
|||
SoundEffects();
|
||||
|
||||
HealtBarTimer--;
|
||||
|
||||
GameTimer++;
|
||||
}
|
||||
|
||||
return GAME_STATUS_NONE;
|
||||
|
@ -432,15 +434,10 @@ GAME_STATUS __cdecl DoLevel(__int32 index, __int32 ambient, bool loadFromSavegam
|
|||
if (!loadFromSavegame)
|
||||
{
|
||||
Savegame.Level.Timer = 0;
|
||||
Savegame.Game.Timer = 0;
|
||||
Savegame.Level.Distance = 0;
|
||||
Savegame.Game.Distance = 0;
|
||||
Savegame.Level.AmmoUsed = 0;
|
||||
Savegame.Game.AmmoUsed = 0;
|
||||
Savegame.Level.AmmoHits = 0;
|
||||
Savegame.Game.AmmoHits = 0;
|
||||
Savegame.Level.Kills = 0;
|
||||
Savegame.Game.Kills = 0;
|
||||
}
|
||||
|
||||
// Load the level
|
||||
|
@ -448,7 +445,6 @@ GAME_STATUS __cdecl DoLevel(__int32 index, __int32 ambient, bool loadFromSavegam
|
|||
|
||||
// Initialise items, effects, lots, camera
|
||||
InitialiseFXArray(true);
|
||||
//InitialiseLOTarray(true);
|
||||
InitialisePickUpDisplay();
|
||||
InitialiseCamera();
|
||||
SOUND_Stop();
|
||||
|
@ -461,18 +457,18 @@ GAME_STATUS __cdecl DoLevel(__int32 index, __int32 ambient, bool loadFromSavegam
|
|||
sprintf(fileName, "savegame.%d", g_GameFlow->SelectedSaveGame);
|
||||
SaveGame::Load(fileName);
|
||||
|
||||
gfRequiredStartPos = false;
|
||||
gfInitialiseGame = false;
|
||||
RequiredStartPos = false;
|
||||
InitialiseGame = false;
|
||||
g_GameFlow->SelectedSaveGame = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
gfRequiredStartPos = false;
|
||||
if (gfInitialiseGame)
|
||||
RequiredStartPos = false;
|
||||
if (InitialiseGame)
|
||||
{
|
||||
GameTimer = 0;
|
||||
gfRequiredStartPos = false;
|
||||
gfInitialiseGame = false;
|
||||
RequiredStartPos = false;
|
||||
InitialiseGame = false;
|
||||
}
|
||||
|
||||
Savegame.Level.Timer = 0;
|
||||
|
@ -480,8 +476,7 @@ GAME_STATUS __cdecl DoLevel(__int32 index, __int32 ambient, bool loadFromSavegam
|
|||
Savegame.TLCount = 0;
|
||||
}
|
||||
|
||||
// TODO: deprecated?
|
||||
GlobalLastInventoryItem = -1;
|
||||
LastInventoryItem = -1;
|
||||
DelCutSeqPlayer = 0;
|
||||
TitleControlsLockedOut = false;
|
||||
|
||||
|
@ -982,7 +977,7 @@ void __cdecl TestTriggers(__int16* data, __int32 heavy, __int32 HeavyFlags)
|
|||
break;
|
||||
|
||||
case TO_FINISH:
|
||||
gfRequiredStartPos = false;
|
||||
RequiredStartPos = false;
|
||||
LevelComplete = CurrentLevel + 1;
|
||||
break;
|
||||
|
||||
|
|
|
@ -43,42 +43,3 @@ __int32 __cdecl LoadSavegameInfos()
|
|||
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -22,8 +22,4 @@ extern SavegameInfo g_SavegameInfos[MAX_SAVEGAMES];
|
|||
extern vector<string> g_NewStrings;
|
||||
extern SaveGameHeader g_NewSavegameInfos[MAX_SAVEGAMES];
|
||||
|
||||
//#define DoGameflow ((__int32 (__cdecl*)(void)) 0x004A8570)
|
||||
#define LoadGameflow ((__int32 (__cdecl*)(void)) 0x00434800)
|
||||
|
||||
__int32 __cdecl LoadSavegameInfos();
|
||||
__int32 __cdecl LoadNewStrings();
|
|
@ -477,7 +477,7 @@ void Inventory::LoadObjects(bool isReload)
|
|||
|
||||
// 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[1] = 1000;
|
||||
g_LaraExtra.Weapons[WEAPON_SHOTGUN].SelectedAmmo = WEAPON_AMMO1;
|
||||
|
@ -2487,8 +2487,11 @@ __int32 Inventory::PopupObject()
|
|||
__int32 steps = INV_NUM_FRAMES_POPUP;
|
||||
__int32 deltaAngle = (0 - ring->objects[ring->currentObject].rotation) / 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;
|
||||
|
||||
for (__int32 i = 0; i < steps; i++)
|
||||
{
|
||||
g_Renderer->DrawInventory();
|
||||
|
@ -2497,6 +2500,7 @@ __int32 Inventory::PopupObject()
|
|||
ring->objects[ring->currentObject].rotation += deltaAngle;
|
||||
ring->objects[ring->currentObject].scale += deltaScale;
|
||||
}
|
||||
|
||||
ring->focusState = INV_FOCUS_STATE_FOCUSED;
|
||||
|
||||
return 0;
|
||||
|
@ -2509,8 +2513,11 @@ __int32 Inventory::PopoverObject()
|
|||
__int32 steps = INV_NUM_FRAMES_POPUP;
|
||||
__int32 deltaAngle = (0 - ring->objects[ring->currentObject].rotation) / 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;
|
||||
|
||||
for (__int32 i = 0; i < steps; i++)
|
||||
{
|
||||
g_Renderer->DrawInventory();
|
||||
|
@ -2519,6 +2526,7 @@ __int32 Inventory::PopoverObject()
|
|||
ring->objects[ring->currentObject].rotation -= deltaAngle;
|
||||
ring->objects[ring->currentObject].scale -= deltaScale;
|
||||
}
|
||||
|
||||
ring->focusState = INV_FOCUS_STATE_NONE;
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -195,6 +195,8 @@ void Inject_Inventory();
|
|||
#define INV_OBJECTS_DISTANCE 2048.0f
|
||||
#define INV_CAMERA_TILT 5.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_NUM_FRAMES_OPEN_CLOSE 12
|
||||
#define INV_NUM_FRAMES_ROTATE 8
|
||||
|
@ -236,7 +238,6 @@ struct InventoryObject {
|
|||
__int32 inventoryObject;
|
||||
__int32 rotation;
|
||||
float scale;
|
||||
__int32 distance;
|
||||
};
|
||||
|
||||
struct InventoryRing {
|
||||
|
|
|
@ -151,7 +151,7 @@ void SaveGame::saveItem(__int32 itemNumber, __int32 runtimeItem)
|
|||
void SaveGame::saveGameStatus(__int32 arg1, __int32 arg2)
|
||||
{
|
||||
LEB128::Write(m_stream, FlipStatus);
|
||||
LEB128::Write(m_stream, GlobalLastInventoryItem);
|
||||
LEB128::Write(m_stream, LastInventoryItem);
|
||||
LEB128::Write(m_stream, FlipEffect);
|
||||
LEB128::Write(m_stream, FlipTimer);
|
||||
LEB128::Write(m_stream, CurrentAtmosphere);
|
||||
|
@ -314,12 +314,14 @@ bool SaveGame::Save(char* fileName)
|
|||
m_stream = new FileStream(fileName, true, true);
|
||||
m_writer = new ChunkWriter(0x4D355254, m_stream);
|
||||
|
||||
printf("Timer: %d\n", Savegame.Game.Timer);
|
||||
|
||||
// The header must be here, so no chunks
|
||||
m_stream->WriteString(g_GameFlow->GetString(g_GameFlow->GetLevel(CurrentLevel)->NameStringIndex));
|
||||
LEB128::Write(m_stream, (Savegame.Game.Timer / 30) / 86400);
|
||||
LEB128::Write(m_stream, ((Savegame.Game.Timer / 30) % 86400) / 3600);
|
||||
LEB128::Write(m_stream, ((Savegame.Game.Timer / 30) / 60) % 60);
|
||||
LEB128::Write(m_stream, (Savegame.Game.Timer / 30) % 60);
|
||||
LEB128::Write(m_stream, (GameTimer / 30) / 86400);
|
||||
LEB128::Write(m_stream, ((GameTimer / 30) % 86400) / 3600);
|
||||
LEB128::Write(m_stream, ((GameTimer / 30) / 60) % 60);
|
||||
LEB128::Write(m_stream, (GameTimer / 30) % 60);
|
||||
LEB128::Write(m_stream, CurrentLevel);
|
||||
LEB128::Write(m_stream, GameTimer);
|
||||
LEB128::Write(m_stream, ++LastSaveGame);
|
||||
|
@ -345,7 +347,7 @@ bool SaveGame::Save(char* fileName)
|
|||
bool SaveGame::readGameStatus()
|
||||
{
|
||||
FlipStatus = LEB128::ReadInt32(m_stream);
|
||||
GlobalLastInventoryItem = LEB128::ReadInt32(m_stream);
|
||||
LastInventoryItem = LEB128::ReadInt32(m_stream);
|
||||
FlipEffect = LEB128::ReadInt32(m_stream);
|
||||
FlipTimer = LEB128::ReadInt32(m_stream);
|
||||
CurrentAtmosphere = LEB128::ReadByte(m_stream);
|
||||
|
|
|
@ -72,15 +72,15 @@ typedef enum object_types {
|
|||
ID_LITTLE_BEETLE, // TR4
|
||||
ID_SCIENTIST,
|
||||
ID_MERCENARY, // TR3
|
||||
ID_WILLOWISP,
|
||||
ID_WILLOWISP, // REPLACE?
|
||||
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_REAPER,
|
||||
ID_BADDY2, //TR4 - OK
|
||||
ID_MAZE_MONSTER,
|
||||
ID_MAZE_MONSTER, // Andy2 brown beast TO REPLACE?
|
||||
ID_CHAIN, // TR4 - OK
|
||||
ID_GREEN_TEETH,
|
||||
ID_GREEN_TEETH, // LAGOON WITCH TO REPLACE?
|
||||
ID_PLOUGH, // TR4 - OK
|
||||
ID_ATTACK_SUB,
|
||||
ID_STARGATE, // TR4 - OK
|
||||
|
@ -97,7 +97,7 @@ typedef enum object_types {
|
|||
ID_BATS,
|
||||
ID_RATS,
|
||||
ID_SPIDER,
|
||||
ID_SPIDER_GENERATOR,
|
||||
ID_FLAMETHROWER_BADDY, // TR3 - 50 - OK needs testing
|
||||
ID_AUTOGUN,
|
||||
ID_ELECTRICAL_CABLES,
|
||||
ID_DARTS,
|
||||
|
@ -117,7 +117,7 @@ typedef enum object_types {
|
|||
ID_SCALING_TRAPDOOR,
|
||||
ID_ROLLINGBALL,
|
||||
ID_ROLLINGBARREL,
|
||||
ID_SPIKEY_FLOOR,
|
||||
ID_SPIKY_CEILING, // TR3 - 116
|
||||
ID_TEETH_SPIKES,
|
||||
ID_ROME_HAMMER,
|
||||
ID_HAMMER2,
|
||||
|
@ -125,14 +125,14 @@ typedef enum object_types {
|
|||
ID_FLAME_EMITTER,
|
||||
ID_FLAME_EMITTER2,
|
||||
ID_FLAME_EMITTER3,
|
||||
ID_COOKER_FLAME,
|
||||
ID_ZIPLINE_HANDLE, // TR3
|
||||
ID_BURNING_ROOTS,
|
||||
ID_ROPE,
|
||||
ID_FIREROPE,
|
||||
ID_POLEROPE,
|
||||
ID_PROPELLER_H,
|
||||
ID_PROPELLER_V,
|
||||
ID_ENEMY_JEEP,
|
||||
ID_PROPELLER_H, // TO REPLACE?
|
||||
ID_PROPELLER_V, // TO REPLACE?
|
||||
ID_ENEMY_JEEP, // TR4
|
||||
ID_ONEBLOCK_PLATFORM,
|
||||
ID_TWOBLOCK_PLATFORM,
|
||||
ID_RAISING_BLOCK1,
|
||||
|
@ -147,14 +147,14 @@ typedef enum object_types {
|
|||
ID_DEATH_SLIDE,
|
||||
ID_TORPEDO,
|
||||
ID_CHAFF,
|
||||
ID_SATCHEL_BOMB,
|
||||
ID_SNOWMOBILE, // TR2
|
||||
ID_ELECTRIC_FENCE,
|
||||
ID_LIFT,
|
||||
ID_EXPLOSION,
|
||||
ID_IRIS_LIGHTNING,
|
||||
ID_SNOWMOBILE_LARA_ANIMS, // TR2
|
||||
ID_YETI, // TR2 - 45
|
||||
ID_QUAD, // TR3 - OK
|
||||
ID_LARA_QUAD_ANIMS, // TR3 - OK
|
||||
ID_MOTION_SENSORS,
|
||||
ID_TEMPLE_STATE_PETRIFIED, // TR3 - 122
|
||||
ID_TIGHT_ROPE,
|
||||
ID_PARALLEL_BARS,
|
||||
ID_XRAY_CONTROLLER,
|
||||
|
@ -239,7 +239,7 @@ typedef enum object_types {
|
|||
ID_GAME_PIECE1,
|
||||
ID_GAME_PIECE2,
|
||||
ID_GAME_PIECE3,
|
||||
ID_COSH,
|
||||
ID_TEMPLE_STATUE, // TR3 - 70
|
||||
ID_HAMMER_ITEM,
|
||||
ID_CROWBAR_ITEM,
|
||||
ID_BURNING_TORCH_ITEM,
|
||||
|
@ -324,7 +324,7 @@ typedef enum object_types {
|
|||
ID_KICK_DOOR1,
|
||||
ID_WALL_MOUNTED_BLADE, // TR3 - 111
|
||||
ID_KICK_DOOR2,
|
||||
ID_SPIKEY_WALL, // TR3 - OK
|
||||
ID_SPIKY_WALL, // TR3 - OK
|
||||
ID_UNDERWATER_DOOR,
|
||||
ID_ZIPLINE_HANDLE, // TR3 - 127
|
||||
ID_DOUBLE_DOORS,
|
||||
|
@ -363,7 +363,7 @@ typedef enum object_types {
|
|||
ID_INVENTORY_KEYS,
|
||||
ID_INVENTORY_HEADPHONES,
|
||||
ID_INVENTORY_POLAROID,
|
||||
ID_OBELISK,
|
||||
ID_OBELISK, // TR4
|
||||
ID_SMOKE_EMITTER_WHITE,
|
||||
ID_SMOKE_EMITTER_BLACK,
|
||||
ID_STEAM_EMITTER,
|
||||
|
@ -373,11 +373,11 @@ typedef enum object_types {
|
|||
ID_GUNSHELL,
|
||||
ID_SHOTGUNSHELL,
|
||||
ID_GUN_FLASH,
|
||||
ID_COLOURED_LIGHT,
|
||||
ID_BLINKING_LIGHT,
|
||||
ID_PULSE_LIGHT,
|
||||
ID_STROBE_LIGHT,
|
||||
ID_ELECTRICAL_LIGHT,
|
||||
ID_DYNAMIC_LIGHT, // Merge all lights in a single null mesh
|
||||
ID_SMALL_DINOSAUR, // TR3 - 34
|
||||
ID_LIZARD_THING, // TR3 - 35
|
||||
ID_PUNA_BOSS, // TR3 - 36
|
||||
ID_SOPHIA_LEE_BOSS, // TR3 - 57
|
||||
ID_LENS_FLARE,
|
||||
ID_AI_GUARD,
|
||||
ID_AI_AMBUSH,
|
||||
|
|
|
@ -2,19 +2,14 @@
|
|||
|
||||
#include "..\Game\sound.h"
|
||||
|
||||
// Camera
|
||||
#define Camera VAR_U_(0x00EEF940, CAMERA_INFO)
|
||||
#define ForcedFixedCamera VAR_U_(0x00EEFA20, GAME_VECTOR)
|
||||
#define UseForcedFixedCamera VAR_U_(0x00EEFA50, __int8)
|
||||
|
||||
// Memory
|
||||
#define MallocBuffer VAR_U_(0x00E4B10C, char*)
|
||||
#define MallocSize VAR_U_(0x00E4B058, __int32)
|
||||
#define MallocPtr VAR_U_(0x00E4B0DC, char*)
|
||||
#define MallocFree VAR_U_(0x00E4B0F4, __int32)
|
||||
#define MallocUsed VAR_U_(0x00E4B0F0, __int32)
|
||||
|
||||
// Items & Effects
|
||||
#define Items VAR_U_(0x00EEEFF0, ITEM_INFO*)
|
||||
#define Effects VAR_U_(0x00E5C5E0, FX_INFO*)
|
||||
#define InItemControlLoop VAR_U_(0x0051CA53, byte)
|
||||
|
@ -27,8 +22,6 @@
|
|||
#define SlotsUsed VAR_U_(0x0051CEE8, int)
|
||||
#define nAIObjects VAR_U_(0x00E5B842, int)
|
||||
#define TriggerIndex VAR_U_(0x00EEEF9C, __int16*)
|
||||
|
||||
// Level data
|
||||
#define Boxes VAR_U_(0x00EEFB64, BOX_INFO*)
|
||||
#define NumberBoxes VAR_U_(0x00EEFB68, int)
|
||||
#define GroundZones ARRAY_(0x00EEFB20, __int16*, [10])
|
||||
|
@ -51,21 +44,16 @@
|
|||
#define FloorData VAR_U_(0x00875168, __int16*)
|
||||
#define ObjectTextures VAR_U_(0x008751B0, OBJECT_TEXTURE*)
|
||||
#define RoomLightsCount VAR_U_(0x0087B0EC, __int32)
|
||||
//#define LevelDataPtr VAR_U_(0x00874964, char*)
|
||||
#define NumberRooms VAR_U_(0x0087514C, __int16)
|
||||
#define nAnimUVRanges VAR_U_(0x0087495C, __int32)
|
||||
#define LevelFilePtr VAR_U_(0x00875164, FILE*)
|
||||
//#define StaticObjects ARRAY_(0x00874988, STATIC_INFO, [70])
|
||||
#define NumberCameras VAR_U_(0x00EEFAC0, __int32)
|
||||
#define Cameras VAR_U_(0x00EEF9A2, OBJECT_VECTOR*)
|
||||
#define NumberSpotcams VAR_U_(0x00E4F428, __int32)
|
||||
|
||||
// Lara
|
||||
#define LaraItem VAR_U_(0x00E5BF08, ITEM_INFO*)
|
||||
#define Lara VAR_U_(0x00E5BD60, LARA_INFO)
|
||||
#define LaraDrawType VAR_U_(0x00EEEAD0, __int8)
|
||||
#define Hairs ARRAY_(0x00E5C000, HAIR_STRUCT, [14])
|
||||
|
||||
#define SequenceUsed ARRAY_(0x00E4EA78, __int8, [6])
|
||||
#define SequenceResults ARRAY_(0x00E4EA80, __int8, [27])
|
||||
#define gfNumMips VAR_U_(0x0051CE37, __int8)
|
||||
|
@ -74,8 +62,6 @@
|
|||
#define gfMips ARRAY_(0x00E5C2C0, __int8, [8])
|
||||
#define OldPickupPos VAR_U_(0x00E59700, GAME_VECTOR)
|
||||
#define SetDebounce VAR_U_(0x00EEEA38, __int32)
|
||||
|
||||
// Game
|
||||
#define FlipStatus VAR_U_(0x00EEEAE0, int)
|
||||
#define FlipStats ARRAY_(0x00EEF060, __int32, [255])
|
||||
#define WindowsHandle VAR_U_(0x00D9AB3C, HWND)
|
||||
|
@ -87,62 +73,44 @@
|
|||
#define GlobalPlayingCutscene VAR_U_(0x0051CAB0, __int32)
|
||||
#define Wibble VAR_U_(0x0051CDF0, __int32)
|
||||
#define CdFlags ARRAY_(0x00EEEA40, byte, [136])
|
||||
|
||||
// Input
|
||||
#define DbInput VAR_U_(0x00878DAC, __int32)
|
||||
#define TrInput VAR_U_(0x00878D98, __int32)
|
||||
|
||||
// Math
|
||||
#define MatrixStack ARRAY_(0x0055D66C, __int32, [480])
|
||||
#define MatrixPtr VAR_U_(0x00E4B0F8, __int32*)
|
||||
#define DxMatrixPtr VAR_U_(0x0055DA2C, byte*)
|
||||
//#define phd_MatrixPtr VAR_U_(0x007E70C8, __int32*)
|
||||
|
||||
// Unknown
|
||||
#define Unk_876C48 VAR_U_(0x00876C48, __int32)
|
||||
#define Unk_007E7FE8 VAR_U_(0x007E7FE8, __int32)
|
||||
|
||||
// Sound
|
||||
#define SampleLUT VAR_U_(0x00E528A4, __int16*)
|
||||
#define SampleInfo VAR_U_(0x00E528A8, SAMPLE_INFO*)
|
||||
#define SamplePointer ARRAY_(0x0086BEF0, HSAMPLE, [SOUND_MAX_SAMPLES])
|
||||
#define SoundSlot ARRAY_(0x00E52430, SoundEffectSlot, [SOUND_MAX_CHANNELS])
|
||||
|
||||
#define TrackNamePrefix VAR_U_(0x00511828, char)
|
||||
#define TrackNameTable ARRAY_(0x005108C0, char*, [SOUND_LEGACY_TRACKTABLE_SIZE])
|
||||
#define TrackMap ARRAY_(0x00EEEA40, byte, [SOUND_LEGACY_TRACKTABLE_SIZE])
|
||||
|
||||
#define IsAtmospherePlaying VAR_U_(0x00EEEFFC, byte)
|
||||
#define CurrentAtmosphere VAR_U_(0x00EEEB90, byte)
|
||||
#define GlobalMusicVolume VAR_U_(0x00517B68, unsigned int)
|
||||
#define GlobalFXVolume VAR_U_(0x00517B6C, unsigned int)
|
||||
|
||||
// Gameflow
|
||||
#define gfFilenameOffset VAR_U_(0x00E5C34C, __int16*)
|
||||
#define gfFilenameWad VAR_U_(0x00E5C2CC, char*)
|
||||
#define AllStrings VAR_U_(0x00E5C310, char*)
|
||||
#define AllStringsOffsets VAR_U_(0x00E5C2B8, __int16*)
|
||||
|
||||
#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 CreditsDone VAR_U_(0x00E6D838, byte)
|
||||
#define CanLoad VAR_U_(0x0051CE54, byte)
|
||||
#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 InventoryItemChosen VAR_U_(0x00508E1C, __int32)
|
||||
#define DelCutSeqPlayer VAR_U_(0x0051CE2C, __int16)
|
||||
#define TitleControlsLockedOut VAR_U_(0x00E5C2A8, byte)
|
||||
|
||||
#define TrackCameraInit VAR_U_(0x0051D010, __int32)
|
||||
#define CheckTrigger VAR_U_(0x0051D014, __int32)
|
||||
#define UseSpotCam VAR_U_(0x0051D018, __int32)
|
||||
#define DisableLaraControl VAR_U_(0x0051D01C, byte)
|
||||
#define FramesCount VAR_U_(0x0051CA78, __int32)
|
||||
#define GlobalCounter VAR_U_(0x0051CA58, __int16)
|
||||
|
||||
#define LevelComplete VAR_U_(0x00E5C2F0, byte)
|
||||
#define ResetFlag VAR_U_(0x0051CA6C, __int32)
|
||||
#define LegacyGameFlow VAR_U_(0x00E5C2BC, GAMEFLOW*)
|
||||
|
@ -150,41 +118,29 @@
|
|||
#define nFrames VAR_U_(0x005082C4, __int32)
|
||||
#define GameStatus VAR_U_(0x00E5C2B0, __int32)
|
||||
#define GotLaraSpheres VAR_U_(0x00E51F2E, byte)
|
||||
|
||||
#define EffectRoutines ARRAY_(0x00507964, EFFECT_ROUTINE, [100])
|
||||
#define DashTimer VAR_U_(0x00E5BF04, __int16)
|
||||
#define LaraCollisionRoutines ARRAY_(0x005089A8, LARA_COLLISION_ROUTINE, [500])
|
||||
#define LaraControlRoutines ARRAY_(0x0050877C, LARA_CONTROL_ROUTINE, [500])
|
||||
|
||||
#define ShockWaves ARRAY_(0x00E4C1A0, SHOCKWAVE_STRUCT, [16])
|
||||
//#define Drips ARRAY_(0x00E4D740, DRIP_STRUCT, [32])
|
||||
#define Bubbles ARRAY_(0x00E4D160, BUBBLE_STRUCT, [40])
|
||||
#define Ripples ARRAY_(0x00E5C600, RIPPLE_STRUCT, [32])
|
||||
#define Blood ARRAY_(0x00E4C9C0, BLOOD_STRUCT, [32])
|
||||
|
||||
#define CurrentFOV VAR_U_(0x00E4F504, __int16)
|
||||
|
||||
#define SpotCam ARRAY_(0x00E4F6C0, SPOTCAM, [64])
|
||||
#define CurrentSplineCamera VAR_U_(0x00E4F500, __int16)
|
||||
#define OldHitPoints VAR_U_(0x005084DC, __int16)
|
||||
|
||||
#define GameTimer VAR_U_(0x00E5C27C, __int32)
|
||||
|
||||
// Inventory
|
||||
#define InventoryObjectsList ARRAY_(0x00508E38, INVOBJ, [100])
|
||||
#define Friggrimmer VAR_U_(0x00E598F4, byte)
|
||||
#define InventoryRings ARRAY_(0x00E59900, INVENTORYRING*, [2])
|
||||
|
||||
#define PickupX VAR_U_(0x00E5BF38, __int16)
|
||||
#define CurrentPickup VAR_U_(0x00E5BF3C, __int16)
|
||||
#define Pickups ARRAY_(0x00E5BF40, DISPLAY_PICKUP, [8])
|
||||
#define PickupVel VAR_U_(0x00E5BF3A, __int16)
|
||||
|
||||
#define GnFrameCounter VAR_U_(0x00E4B0FC, __int32)
|
||||
#define gfLevelFlags VAR_U_(0x00E5C2A0, __int32)
|
||||
|
||||
#define OptionAutoTarget VAR_U_(0x00D9AC30, __int32)
|
||||
|
||||
#define PhdLeft VAR_U_(0x0055D20C, __int32)
|
||||
#define PhdTop VAR_U_(0x0051D0A8, __int32)
|
||||
#define PhdRight VAR_U_(0x0055DA3C, __int32)
|
||||
|
@ -204,11 +160,9 @@
|
|||
#define Unknown_00E6CAE8 VAR_U_(0x00E6CAE8, __int32)
|
||||
#define PhdWindowXmax VAR_U_(0x0055D218, __int16)
|
||||
#define PhdWindowYmax VAR_U_(0x0055D240, __int16)
|
||||
|
||||
#define Fires ARRAY_(0x00E4C7A0, FIRE_LIST, [32])
|
||||
#define Dynamics ARRAY_(0x00E6C3E0, DYNAMIC, [64])
|
||||
#define NumDynamics VAR_U_(0x00E6D82C, __int32)
|
||||
|
||||
#define Sprites VAR_U_(0x008751B4, SPRITE*)
|
||||
#define FireSparks ARRAY_(0x00E4CE40, FIRE_SPARKS, [20])
|
||||
#define NextFreeFireSpark VAR_U_(0x0050A17C, __int16)
|
||||
|
@ -220,12 +174,10 @@
|
|||
#define Bubbles ARRAY_(0x00E4D160, BUBBLE_STRUCT, [40])
|
||||
#define Splashes ARRAY_(0x00E6CA00, SPLASH_STRUCT, [4])
|
||||
#define Ripples ARRAY_(0x00E5C600, RIPPLE_STRUCT, [32])
|
||||
|
||||
#define SkyPos1 VAR_U_(0x00E6E4B0, __int16)
|
||||
#define SkyPos2 VAR_U_(0x00E6D73E, __int16)
|
||||
#define SkyVelocity1 VAR_U_(0x00E5C276, signed char)
|
||||
#define SkyVelocity2 VAR_U_(0x00E5C275, signed char)
|
||||
|
||||
#define SkyColor1 VAR_U_(0x00E5C2A4, CVECTOR)
|
||||
#define SkyColor2 VAR_U_(0x00E5C280, CVECTOR)
|
||||
#define SkyStormColor ARRAY_(0x00E6CAF0, __int16, [3])
|
||||
|
@ -235,25 +187,18 @@
|
|||
#define Unk_00E6D73C VAR_U_(0x00E6D73C, __int16)
|
||||
#define Unk_00E6D74C VAR_U_(0x00E6D74C, __int16)
|
||||
#define Unk_00E6E4DC VAR_U_(0x00E6E4DC, __int16)
|
||||
|
||||
#define CurrentAtmosphere VAR_U_(0x00EEEB90, byte)
|
||||
#define IsAtmospherePlaying VAR_U_(0x00EEEFFC, byte)
|
||||
|
||||
#define SmokeCountL VAR_U_(0x00E6C9E8, byte)
|
||||
#define SmokeCountR VAR_U_(0x00E6C9EC, byte)
|
||||
#define SplashCount VAR_U_(0x0051CDF8, byte)
|
||||
#define WeaponDelay VAR_U_(0x0051CA52, byte)
|
||||
|
||||
#define HealtBarTimer VAR_U_(0x0051CEA8, __int32)
|
||||
|
||||
#define AnimatedTextureRanges VAR_U_(0x00D9ADA0, __int16*)
|
||||
//#define Savegame VAR_U_(0x00E52EB3, savegame_info);
|
||||
#define gfRequiredStartPos VAR_U_(0x00E5C2B4, byte)
|
||||
#define gfInitialiseGame VAR_U_(0x005082C1, byte)
|
||||
|
||||
#define RequiredStartPos VAR_U_(0x00E5C2B4, byte)
|
||||
#define InitialiseGame VAR_U_(0x005082C1, byte)
|
||||
#define TorchRoom VAR_U_(0x00507AB0, __int16)
|
||||
#define WeaponEnemyTimer VAR_U_(0x0080E016, byte)
|
||||
|
||||
#define HeightType VAR_U_(0x00EEEFF4, __int32)
|
||||
#define HeavyTriggered VAR_U_(0x00EEEA34, byte)
|
||||
#define FlipEffect VAR_U_(0x00506C60, __int32)
|
||||
|
@ -265,30 +210,23 @@
|
|||
#define FlipMap ARRAY_(0x00EEEBA0, __int32, [255])
|
||||
#define TriggerTimer VAR_U_(0x0051CA5A, byte)
|
||||
#define JustLoaded VAR_U_(0x0051D001, byte)
|
||||
//#define Weapons ARRAY_(0x005085B0, WEAPON_INFO, [9])
|
||||
#define SmokeWeapon VAR_U_(0x00E6CAA0, __int32)
|
||||
#define HKTimer VAR_U_(0x0051CEC9, __int32)
|
||||
#define HKFlag VAR_U_(0x0051CECC, __int32)
|
||||
#define HKFlag2 VAR_U_(0x0051CEC8, byte)
|
||||
|
||||
#define Ropes ARRAY_(0x00E54CC0, ROPE_STRUCT, [12])
|
||||
#define NumRopes VAR_U_(0x0051CA60, __int32)
|
||||
|
||||
#define PhdWidth VAR_U_(0x0055D29C, __int32)
|
||||
#define PhdHeight VAR_U_(0x0055D164, __int32)
|
||||
#define PhdPerspective VAR_U_(0x0055D208, __int32)
|
||||
|
||||
#define Bats VAR_U_(0x00EEEFE8, BAT_STRUCT*)
|
||||
#define Rats VAR_U_(0x00EEEFEC, RAT_STRUCT*)
|
||||
#define Spiders VAR_U_(0x00EEF45C, SPIDER_STRUCT*)
|
||||
|
||||
#define PoisonFlags VAR_U_(0x00E5BF3E, byte)
|
||||
#define SmashedMeshCount VAR_U_(0x0051CA5C, __int16)
|
||||
#define SmashedMesh ARRAY_(0x00EEF8C0, MESH_INFO*, [16])
|
||||
#define SmashedMeshRoom ARRAY_(0x00EEF480, __int16, [16])
|
||||
|
||||
#define Debris ARRAY_(0x00E8CAC0, DEBRIS_STRUCT, [256])
|
||||
|
||||
#define SniperCameraActive VAR_U_(0x0051CA1D, byte)
|
||||
#define BinocularRange VAR_U_(0x0051CA30, __int32)
|
||||
#define BinocularOn VAR_U_(0x0051CA34, __int32)
|
||||
|
@ -298,30 +236,23 @@
|
|||
#define ExitingBinocular VAR_U_(00051CA20, __int32)
|
||||
#define OldLaraBusy VAR_U_(0x00E59898, byte)
|
||||
#define Infrared VAR_U_(0x0051CA40, __int32)
|
||||
|
||||
#define SpotcamOverlay VAR_U_(0x0051D020, byte)
|
||||
#define SpotcamDontDrawLara VAR_U_(0x0051D021, byte)
|
||||
#define SniperOverlay VAR_U_(0x0051D022, byte)
|
||||
#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 CollidedMeshes ARRAY_(0x00E89EA0, MESH_INFO*, [1024])
|
||||
|
||||
#define FlashFadeR VAR_U_(0x0051D07A, __int16)
|
||||
#define FlashFadeG VAR_U_(0x0051D07C, __int16)
|
||||
#define FlashFadeB VAR_U_(0x0051D07E, __int16)
|
||||
#define FlashFader VAR_U_(0x0051D080, __int16)
|
||||
|
||||
#define GlobalCollisionBounds VAR_U_(0x00EEF910, BOUNDING_BOX)
|
||||
#define SphereList ARRAY_(0x00E51FE0, SPHERE, [34])
|
||||
|
||||
#define IsRoomOutsideNo VAR_U_(0x007FE6C2, __int16)
|
||||
|
||||
#define App_Unk00D9AC2B VAR_U_(0x00D9AC2B, byte)
|
||||
#define App_Unk00D9AC19 VAR_U_(0x00D9AC19, byte)
|
||||
#define App_Unk00D9ABFD VAR_U_(0x00D9ABFD, __int32)
|
||||
|
||||
#define WaterfallTextures ARRAY_(0x00E59720, OBJECT_TEXTURE*, [6])
|
||||
#define WaterfallY ARRAY_(0x00E59760, float, [6])
|
||||
#define KeyboardLayout0 ARRAY_(0x00516C3C, __int16, [18])
|
||||
|
|
531
TR5Main/Objects/flamethrower.cpp
Normal file
531
TR5Main/Objects/flamethrower.cpp
Normal 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;
|
||||
}
|
747
TR5Main/Objects/horseman.cpp
Normal file
747
TR5Main/Objects/horseman.cpp
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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 HarpoonControl(__int16 itemNum);
|
||||
void __cdecl ScubaControl(__int16 itemNumber);
|
||||
void InitialiseEagle(__int16 itemNum);
|
||||
void EagleControl(__int16 itemNum);
|
||||
void __cdecl InitialiseEagle(__int16 itemNum);
|
||||
void __cdecl EagleControl(__int16 itemNum);
|
||||
void __cdecl TribemanAxeControl(__int16 itemNum);
|
||||
void __cdecl TribesmanShotDart(ITEM_INFO* item);
|
||||
void __cdecl TribesmanDartsControl(__int16 itemNum);
|
||||
void __cdecl ControlSpikeWall(__int16 itemNum);
|
||||
void LaraTyrannosaurDeath(ITEM_INFO* item);
|
||||
void TyrannosaurControl(__int16 itemNum);
|
||||
void __cdecl ControlSpikyWall(__int16 itemNum);
|
||||
void __cdecl LaraTyrannosaurDeath(ITEM_INFO* item);
|
||||
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 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 InitialiseBurningFloor(__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;
|
||||
//void __cdecl InitialiseMotorbike(__int16 itemNum);
|
||||
|
|
|
@ -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];
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -5618,7 +5618,7 @@ __int32 Renderer11::drawInventoryScene()
|
|||
ring->objects[objectIndex].rotation = 0;
|
||||
|
||||
__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);
|
||||
|
||||
// Prepare the object transform
|
||||
|
|
|
@ -105,6 +105,7 @@ bool __cdecl readGameFlowFlags()
|
|||
g_GameFlow->FlyCheat = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream());
|
||||
g_GameFlow->DebugMode = LEB128::ReadByte(g_ScriptChunkIO->GetRawStream());
|
||||
g_GameFlow->LevelFarView = LEB128::ReadInt32(g_ScriptChunkIO->GetRawStream());
|
||||
g_GameFlow->TitleType = LEB128::ReadInt32(g_ScriptChunkIO->GetRawStream());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -458,7 +459,7 @@ bool GameFlow::DoGameflow()
|
|||
case GAME_STATUS_NEW_GAME:
|
||||
CurrentLevel = (SelectedLevelForNewGame != 0 ? SelectedLevelForNewGame : 1);
|
||||
SelectedLevelForNewGame = 0;
|
||||
gfInitialiseGame = true;
|
||||
InitialiseGame = true;
|
||||
break;
|
||||
case GAME_STATUS_LOAD_GAME:
|
||||
// Load the header of the savegame for getting the level to load
|
||||
|
|
|
@ -13,12 +13,15 @@
|
|||
#include "..\Specific\IO\LEB128.h"
|
||||
#include "LanguageScript.h"
|
||||
|
||||
#define TITLE_FLYBY 0
|
||||
#define TITLE_BACKGROUND 1
|
||||
|
||||
struct ChunkId;
|
||||
struct LEB128;
|
||||
|
||||
using namespace std;
|
||||
|
||||
typedef struct GameScriptSettings {
|
||||
struct GameScriptSettings {
|
||||
__int32 ScreenWidth;
|
||||
__int32 ScreenHeight;
|
||||
bool EnableLoadSave;
|
||||
|
@ -31,7 +34,7 @@ typedef struct GameScriptSettings {
|
|||
bool ShowDebugInfo;
|
||||
};
|
||||
|
||||
typedef struct GameScriptSkyLayer {
|
||||
struct GameScriptSkyLayer {
|
||||
bool Enabled;
|
||||
byte R;
|
||||
byte G;
|
||||
|
@ -54,7 +57,7 @@ typedef struct GameScriptSkyLayer {
|
|||
}
|
||||
};
|
||||
|
||||
typedef struct GameScriptFog {
|
||||
struct GameScriptFog {
|
||||
byte R;
|
||||
byte G;
|
||||
byte B;
|
||||
|
@ -72,7 +75,7 @@ typedef struct GameScriptFog {
|
|||
}
|
||||
};
|
||||
|
||||
typedef struct GameScriptMirror {
|
||||
struct GameScriptMirror {
|
||||
__int16 Room;
|
||||
__int32 StartX;
|
||||
__int32 EndX;
|
||||
|
@ -95,7 +98,7 @@ typedef struct GameScriptMirror {
|
|||
}
|
||||
};
|
||||
|
||||
typedef struct GameScriptLevel {
|
||||
struct GameScriptLevel {
|
||||
__int32 NameStringIndex;
|
||||
string FileName;
|
||||
string ScriptFileName;
|
||||
|
@ -168,6 +171,7 @@ public:
|
|||
bool FlyCheat;
|
||||
bool DebugMode;
|
||||
__int32 LevelFarView;
|
||||
__int32 TitleType;
|
||||
|
||||
// Selected language set
|
||||
LanguageScript* CurrentStrings;
|
||||
|
|
|
@ -93,7 +93,7 @@ void __cdecl LoadScreen(__int32 index, __int32 num)
|
|||
//while(true)
|
||||
// TestRenderer();
|
||||
|
||||
GlobalLastInventoryItem = -1;
|
||||
LastInventoryItem = -1;
|
||||
DelCutSeqPlayer = 0;
|
||||
|
||||
InitSpotCamSequences();
|
||||
|
|
|
@ -570,7 +570,7 @@ unsigned __stdcall LoadLevel(void* data)
|
|||
Wibble = 0;
|
||||
TorchRoom = -1;
|
||||
InitialiseGameFlags();
|
||||
InitialiseLara(!(gfInitialiseGame || CurrentLevel == 1 || level->ResetHub));
|
||||
InitialiseLara(!(InitialiseGame || CurrentLevel == 1 || level->ResetHub));
|
||||
GetCarriedItems();
|
||||
GetAIPickups();
|
||||
SeedRandomDraw(0xD371F947);
|
||||
|
|
|
@ -935,6 +935,45 @@ void __cdecl NewObjects()
|
|||
obj->saveAnim = 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()
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<ProjectGuid>{15AB0220-541C-4DA1-94EB-ED3C47E4582E}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>TR5Main</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
|
@ -265,6 +265,8 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts"</Command>
|
|||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="dllmain.cpp" />
|
||||
<ClCompile Include="Objects\flamethrower.cpp" />
|
||||
<ClCompile Include="Objects\horseman.cpp" />
|
||||
<ClCompile Include="Scripting\LanguageScript.cpp" />
|
||||
<ClCompile Include="Objects\demigod.cpp" />
|
||||
<ClCompile Include="Objects\guide.cpp" />
|
||||
|
|
|
@ -542,6 +542,12 @@
|
|||
<ClCompile Include="Scripting\LanguageScript.cpp">
|
||||
<Filter>File di origine</Filter>
|
||||
</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>
|
||||
<None Include="Shaders\Shader.fx" />
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue