Decompiled InitialiseHair() and InitialiseSpecialEffects()

- added macro for getting mesh: MESHES(slot, mesh).
- fixed duplicate array in vars.h.
- fixed lara left hand flare mesh.
This commit is contained in:
TokyoSU 2019-12-04 13:20:21 +01:00
parent 8a6dffe0d2
commit 04e93b1998
13 changed files with 220 additions and 140 deletions

View file

@ -7,13 +7,13 @@
PISTOL_DEF PistolsTable[4] = PISTOL_DEF PistolsTable[4] =
{ {
{ ID_LARA, 0, 0, 0, 0 }, { ID_LARA, 0, 0, 0, 0 },
{ ID_PISTOLS_ANIM, 4, 5, 0xD, 0x18 }, { ID_PISTOLS_ANIM, 4, 5, 13, 24 },
{ ID_REVOLVER_ANIM , 7, 8, 0xF, 0x1D }, { ID_REVOLVER_ANIM , 7, 8, 15, 29 },
{ ID_UZI_ANIM, 4, 5, 0xD, 0x18 } { ID_UZI_ANIM, 4, 5, 13, 24 }
}; };
int UziLeft; bool UziLeft;
int UziRight; bool UziRight;
void AnimatePistols(int weaponType) void AnimatePistols(int weaponType)
{ {
@ -302,7 +302,7 @@ void PistolHandler(int weaponType)
void undraw_pistol_mesh_right(int weaponType) void undraw_pistol_mesh_right(int weaponType)
{ {
Lara.meshPtrs[HAND_R] = Meshes[Objects[ID_LARA].meshIndex + HAND_R * 2]; LARA_MESHES(ID_LARA, HAND_R);
switch (weaponType) switch (weaponType)
{ {
@ -323,7 +323,7 @@ void undraw_pistol_mesh_left(int weaponType)
{ {
if (weaponType != WEAPON_REVOLVER) if (weaponType != WEAPON_REVOLVER)
{ {
Lara.meshPtrs[HAND_L] = Meshes[Objects[ID_LARA].meshIndex + HAND_L * 2]; LARA_MESHES(ID_LARA, HAND_L);
switch (weaponType) switch (weaponType)
{ {
@ -340,14 +340,12 @@ void undraw_pistol_mesh_left(int weaponType)
void draw_pistol_meshes(int weaponType) void draw_pistol_meshes(int weaponType)
{ {
Lara.holster = ID_LARA_HOLSTERS; Lara.holster = ID_LARA_HOLSTERS;
Lara.meshPtrs[HAND_R] = Meshes[Objects[WeaponObjectMesh(weaponType)].meshIndex + HAND_R * 2]; LARA_MESHES(WeaponObjectMesh(weaponType), HAND_R);
//Lara.meshPtrs[THIGH_R] = Meshes[Objects[ID_LARA].meshIndex + THIGH_R * 2];
if (weaponType != WEAPON_REVOLVER) if (weaponType != WEAPON_REVOLVER)
{ {
Lara.meshPtrs[HAND_L] = Meshes[Objects[WeaponObjectMesh(weaponType)].meshIndex + HAND_L * 2]; LARA_MESHES(WeaponObjectMesh(weaponType), HAND_L);
//Lara.meshPtrs[THIGH_L] = Meshes[Objects[ID_LARA].meshIndex + THIGH_L * 2];
} }
} }

View file

@ -289,16 +289,11 @@ void AimWeapon(WEAPON_INFO* winfo, LARA_ARM* arm)
void SmashItem(short itemNum) void SmashItem(short itemNum)
{ {
ITEM_INFO* item = &Items[itemNum]; ITEM_INFO* item = &Items[itemNum];
short objectNumber = item->objectNumber; if (item->objectNumber >= ID_SMASH_OBJECT1 && item->objectNumber <= ID_SMASH_OBJECT8)
if (objectNumber >= ID_SMASH_OBJECT1 && objectNumber <= ID_SMASH_OBJECT8) {
SmashObject(itemNum); SmashObject(itemNum);
}
/*ITEM_INFO* item = &Items[itemNum]; /*else if (item->objectNumber == ID_BELL_SWITCH)
short objectNumber = item->objectNumber;
printf("SmashItem\n");
if (objectNumber >= ID_SMASH_OBJECT1 && objectNumber <= ID_SMASH_OBJECT8)
SmashObject(itemNum);
else if (objectNumber == ID_BELL_SWITCH)
{ {
if (item->status != ITEM_ACTIVE) if (item->status != ITEM_ACTIVE)
{ {
@ -310,8 +305,6 @@ void SmashItem(short itemNum)
void LaraGun() void LaraGun()
{ {
int meshIndex;
if (Lara.leftArm.flash_gun > 0) if (Lara.leftArm.flash_gun > 0)
--Lara.leftArm.flash_gun; --Lara.leftArm.flash_gun;
if (Lara.rightArm.flash_gun > 0) if (Lara.rightArm.flash_gun > 0)
@ -323,11 +316,8 @@ void LaraGun()
return; return;
} }
int gunStatus = Lara.gunStatus;
if (LaraItem->hitPoints <= 0) if (LaraItem->hitPoints <= 0)
{ {
gunStatus = LG_NO_ARMS;
Lara.gunStatus = LG_NO_ARMS; Lara.gunStatus = LG_NO_ARMS;
} }
else if (!Lara.gunStatus) else if (!Lara.gunStatus)
@ -447,7 +437,7 @@ void LaraGun()
break; break;
case LG_UNDRAW_GUNS: case LG_UNDRAW_GUNS:
Lara.meshPtrs[HEAD] = Meshes[Objects[ID_LARA].meshIndex + 14 * 2]; LARA_MESHES(ID_LARA, HEAD);
switch (Lara.gunType) switch (Lara.gunType)
{ {
@ -477,20 +467,18 @@ void LaraGun()
case LG_READY: case LG_READY:
if (!(TrInput & IN_ACTION)) if (!(TrInput & IN_ACTION))
meshIndex = Objects[ID_LARA].meshIndex; LARA_MESHES(ID_LARA, HEAD);
else else
meshIndex = Objects[ID_LARA_SCREAM].meshIndex; LARA_MESHES(ID_LARA_SCREAM, HEAD);
Lara.meshPtrs[HEAD] = Meshes[meshIndex + HEAD * 2];
if (Camera.type != CAMERA_TYPE::CINEMATIC_CAMERA && Camera.type != CAMERA_TYPE::LOOK_CAMERA && if (Camera.type != CAMERA_TYPE::CINEMATIC_CAMERA && Camera.type != CAMERA_TYPE::LOOK_CAMERA && Camera.type != CAMERA_TYPE::HEAVY_CAMERA)
Camera.type != CAMERA_TYPE::HEAVY_CAMERA)
Camera.type = CAMERA_TYPE::COMBAT_CAMERA; Camera.type = CAMERA_TYPE::COMBAT_CAMERA;
if (TrInput & IN_ACTION) if (TrInput & IN_ACTION)
{ {
if (!GetAmmo(Lara.gunType)) if (!*GetAmmo(Lara.gunType))
{ {
Lara.requestGunType = Objects[ID_PISTOLS_ITEM].loaded; Lara.requestGunType = (Objects[ID_PISTOLS_ITEM].loaded == true) ? WEAPON_PISTOLS : WEAPON_NONE;
return; return;
} }
} }
@ -549,7 +537,7 @@ void LaraGun()
case LG_HANDS_BUSY: case LG_HANDS_BUSY:
if (Lara.gunType == WEAPON_FLARE) if (Lara.gunType == WEAPON_FLARE)
{ {
if (Lara.meshPtrs[HAND_L] == Meshes[Objects[ID_FLARE_ANIM].meshIndex + HAND_L * 2]) if (CHECK_LARA_MESHES(ID_FLARE_ANIM, HAND_L))
{ {
Lara.flareControlLeft = (g_LaraExtra.Vehicle != NO_ITEM || CheckForHoldingState(LaraItem->currentAnimState)); Lara.flareControlLeft = (g_LaraExtra.Vehicle != NO_ITEM || CheckForHoldingState(LaraItem->currentAnimState));
DoFlareInHand(Lara.flareAge); DoFlareInHand(Lara.flareAge);
@ -623,7 +611,7 @@ int WeaponObjectMesh(int weaponType)
switch (weaponType) switch (weaponType)
{ {
case WEAPON_REVOLVER: case WEAPON_REVOLVER:
return ((g_LaraExtra.Weapons[WEAPON_REVOLVER].HasLasersight) != 0 ? ID_LARA_REVOLVER_LASER : ID_REVOLVER_ANIM); return (g_LaraExtra.Weapons[WEAPON_REVOLVER].HasLasersight == true ? ID_LARA_REVOLVER_LASER : ID_REVOLVER_ANIM);
case WEAPON_UZI: case WEAPON_UZI:
return ID_UZI_ANIM; return ID_UZI_ANIM;
@ -635,7 +623,7 @@ int WeaponObjectMesh(int weaponType)
return ID_HK_ANIM; return ID_HK_ANIM;
case WEAPON_CROSSBOW: case WEAPON_CROSSBOW:
return ((g_LaraExtra.Weapons[WEAPON_CROSSBOW].HasLasersight) != 0 ? ID_LARA_CROSSBOW_LASER : ID_CROSSBOW_ANIM); return (g_LaraExtra.Weapons[WEAPON_CROSSBOW].HasLasersight == true ? ID_LARA_CROSSBOW_LASER : ID_CROSSBOW_ANIM);
case WEAPON_GRENADE_LAUNCHER: case WEAPON_GRENADE_LAUNCHER:
return ID_GRENADE_ANIM; return ID_GRENADE_ANIM;
@ -696,7 +684,7 @@ int FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles)
pos.yPos = 0; pos.yPos = 0;
pos.zPos = 0; pos.zPos = 0;
GetLaraJointPosition((PHD_VECTOR*)&pos, 11); GetLaraJointPosition((PHD_VECTOR*)&pos, LJ_RHAND);
short* ammo = GetAmmo(weaponType); short* ammo = GetAmmo(weaponType);
if (!*ammo) if (!*ammo)
return 0; return 0;
@ -708,9 +696,9 @@ int FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles)
pos.xPos = src->pos.xPos; pos.xPos = src->pos.xPos;
pos.yPos = src->pos.yPos - weapon->gunHeight; pos.yPos = src->pos.yPos - weapon->gunHeight;
pos.zPos = src->pos.zPos; pos.zPos = src->pos.zPos;
int r = (int)((GetRandomControl() - 16384) * weapon->shotAccuracy) / 65536; int r = (int)((GetRandomControl() - 0x4000) * weapon->shotAccuracy) / 0x10000;
pos.xRot = angles[1] + (short)r; pos.xRot = angles[1] + (short)r;
r = (int)((GetRandomControl() - 16384) * weapon->shotAccuracy) / 65536; r = (int)((GetRandomControl() - 0x4000) * weapon->shotAccuracy) / 0x10000;
pos.yRot = angles[0] + (short)r; pos.yRot = angles[0] + (short)r;
pos.zRot = 0; pos.zRot = 0;
@ -751,9 +739,9 @@ int FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles)
{ {
GAME_VECTOR vDest; GAME_VECTOR vDest;
vDest.x = vSrc.x + ((*(MatrixPtr + M20) * weapon->targetDist) >> W2V_SHIFT); vDest.x = vSrc.x + ((MatrixPtr[M20] * weapon->targetDist) >> W2V_SHIFT);
vDest.y = vSrc.y + ((*(MatrixPtr + M21) * weapon->targetDist) >> W2V_SHIFT); vDest.y = vSrc.y + ((MatrixPtr[M21] * weapon->targetDist) >> W2V_SHIFT);
vDest.z = vSrc.z + ((*(MatrixPtr + M22) * weapon->targetDist) >> W2V_SHIFT); vDest.z = vSrc.z + ((MatrixPtr[M22] * weapon->targetDist) >> W2V_SHIFT);
GetTargetOnLOS(&vSrc, &vDest, 0, 1); GetTargetOnLOS(&vSrc, &vDest, 0, 1);
@ -765,16 +753,13 @@ int FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles)
GAME_VECTOR vDest; GAME_VECTOR vDest;
vDest.x = vSrc.x + ((*(MatrixPtr + M20) * bestDistance) >> W2V_SHIFT); vDest.x = vSrc.x + ((MatrixPtr[M20] * bestDistance) >> W2V_SHIFT);
vDest.y = vSrc.y + ((*(MatrixPtr + M21) * bestDistance) >> W2V_SHIFT); vDest.y = vSrc.y + ((MatrixPtr[M21] * bestDistance) >> W2V_SHIFT);
vDest.z = vSrc.z + ((*(MatrixPtr + M22) * bestDistance) >> W2V_SHIFT); vDest.z = vSrc.z + ((MatrixPtr[M22] * bestDistance) >> W2V_SHIFT);
// TODO: enable it when the slot is created ! // TODO: enable it when the slot is created !
/*if (target->objectNumber != ID_SHIVA && target->objectNumber != ID_ARMY_WINSTON && target->objectNumber != ID_LONDONBOSS && (target->objectNumber != ID_TRIBEBOSS || TribeBossShieldOn == false)) // Hit TRIBEBOSS's shield if on. /*
{ if (target->objectNumber == ID_TRIBEBOSS)
HitTarget(target, &vDest, weapon->damage, 0);
}
else if (target->objectNumber == ID_TRIBEBOSS)
{ {
long dx, dy, dz; long dx, dy, dz;
@ -816,15 +801,17 @@ int FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles)
return 1; return 1;
} }
return 0;
} }
void find_target_point(ITEM_INFO* item, GAME_VECTOR* target) void find_target_point(ITEM_INFO* item, GAME_VECTOR* target)
{ {
short* bounds = GetBestFrame(item); short* bounds = GetBestFrame(item);
int x = (int)((*(bounds + 0) + *(bounds + 1)) / 2); int x = (int)((bounds[0] + bounds[1]) / 2);
int y = (int)(*(bounds + 2) + (*(bounds + 3) - *(bounds + 2)) / 3); int y = (int)(bounds[2] + (bounds[3] - bounds[2]) / 3);
int z = (int)((*(bounds + 4) + *(bounds + 5)) / 2); int z = (int)((bounds[4] + bounds[5]) / 2);
int c = COS(item->pos.yRot); int c = COS(item->pos.yRot);
int s = SIN(item->pos.yRot); int s = SIN(item->pos.yRot);
@ -871,33 +858,33 @@ void LaraTargetInfo(WEAPON_INFO* weapon)
if (LOS(&pos, &targetPoint)) if (LOS(&pos, &targetPoint))
{ {
if (angles[0] >= weapon->lockAngles[0] if (angles[0] >= weapon->lockAngles[0]
&& angles[0] <= weapon->lockAngles[1] && angles[0] <= weapon->lockAngles[1]
&& angles[1] >= weapon->lockAngles[2] && angles[1] >= weapon->lockAngles[2]
&& angles[1] <= weapon->lockAngles[3]) && angles[1] <= weapon->lockAngles[3])
{ {
Lara.rightArm.lock = 1; Lara.rightArm.lock = true;
Lara.leftArm.lock = 1; Lara.leftArm.lock = true;
Lara.targetAngles[0] = angles[0]; Lara.targetAngles[0] = angles[0];
Lara.targetAngles[1] = angles[1]; Lara.targetAngles[1] = angles[1];
return; return;
} }
if (Lara.leftArm.lock if (Lara.leftArm.lock
&& (angles[0] < weapon->leftAngles[0] && (angles[0] < weapon->leftAngles[0]
|| angles[0] > weapon->leftAngles[1] || angles[0] > weapon->leftAngles[1]
|| angles[1] < weapon->leftAngles[2] || angles[1] < weapon->leftAngles[2]
|| angles[1] > weapon->leftAngles[3])) || angles[1] > weapon->leftAngles[3]))
{ {
Lara.leftArm.lock = 0; Lara.leftArm.lock = false;
} }
if (Lara.rightArm.lock if (Lara.rightArm.lock
&& (angles[0] < weapon->rightAngles[0] && (angles[0] < weapon->rightAngles[0]
|| angles[0] > weapon->rightAngles[1] || angles[0] > weapon->rightAngles[1]
|| angles[1] < weapon->rightAngles[2] || angles[1] < weapon->rightAngles[2]
|| angles[1] > weapon->rightAngles[3])) || angles[1] > weapon->rightAngles[3]))
{ {
Lara.rightArm.lock = 0; Lara.rightArm.lock = false;
Lara.targetAngles[0] = angles[0]; Lara.targetAngles[0] = angles[0];
Lara.targetAngles[1] = angles[1]; Lara.targetAngles[1] = angles[1];
return; return;
@ -905,8 +892,8 @@ void LaraTargetInfo(WEAPON_INFO* weapon)
} }
else else
{ {
Lara.rightArm.lock = 0; Lara.rightArm.lock = false;
Lara.leftArm.lock = 0; Lara.leftArm.lock = false;
} }
Lara.targetAngles[0] = angles[0]; Lara.targetAngles[0] = angles[0];

View file

@ -91,11 +91,11 @@ void ready_flare()//4A3E4(<), 4A848(<) (F)
void undraw_flare_meshes() void undraw_flare_meshes()
{ {
Lara.meshPtrs[LM_LHAND] = Meshes[Objects[ID_LARA].meshIndex + 104]; LARA_MESHES(ID_LARA, HAND_L);
} }
void draw_flare_meshes()//4A394(<), 4A7F8(<) (F) void draw_flare_meshes()//4A394(<), 4A7F8(<) (F)
{ {
Lara.meshPtrs[LM_LHAND] = Meshes[Objects[ID_FLARE_ANIM].meshIndex + 104]; LARA_MESHES(ID_FLARE_ANIM, HAND_L);
} }
void undraw_flare()//4A108, 4A56C void undraw_flare()//4A108, 4A56C

View file

@ -561,7 +561,7 @@ void LaraInitialiseMeshes()//4A684, 4AAE8 (F)
{ {
for (int i = 0; i < 15; i++) for (int i = 0; i < 15; i++)
{ {
Lara.meshPtrs[i] = Meshes[Objects[ID_LARA].meshIndex + 2 * i] = Meshes[Objects[ID_LARA_SKIN].meshIndex + 2 * i]; INIT_LARA_MESHES(i, ID_LARA, ID_LARA_SKIN);
} }
/*if (gfCurrentLevel >= LVL5_GALLOWS_TREE && gfCurrentLevel <= LVL5_OLD_MILL) /*if (gfCurrentLevel >= LVL5_GALLOWS_TREE && gfCurrentLevel <= LVL5_OLD_MILL)

View file

@ -1,5 +1,8 @@
#pragma once #pragma once
#define HAIR_SEGMENTS 7 // only classic lara (young lara have more segments !)
#define DOUBLE_HAIR_SEGMENTS 14
#define TEXTURE_PAGE (256 * 256) #define TEXTURE_PAGE (256 * 256)
#define W2V_SHIFT 14 // Shift scale of View.Frame to World.Frame #define W2V_SHIFT 14 // Shift scale of View.Frame to World.Frame
@ -42,6 +45,22 @@
#define MAX_DRAW_STATICS 16384 #define MAX_DRAW_STATICS 16384
#define MAX_BONES 32 #define MAX_BONES 32
#define MAX_SPRITES 16384 #define MAX_SPRITES 16384
#define MAX_SPARKS 1024 // 128 normally
#define MAX_SPARKS_FIRE 20
#define MAX_FIRE_LIST 32 // FIRE_SPARKS list
#define MAX_SPARKS_SMOKE 64
#define MAX_SPARKS_BLOOD 64
#define MAX_GUNSHELL 24
#define MAX_GUNFLASH 6
#define MAX_DRIPS 32
#define MAX_BUBBLES 40
#define MAX_DYNAMICS 64
#define MAX_SPLASH 4
#define MAX_RIPPLES 32
#define MAX_CAMERA 18
#define MAX_SHOCKWAVE 16
#define MAX_EFFECTS 100
#define MAX_DEBRIS 256
#define NO_ROOM 0xFF #define NO_ROOM 0xFF
#define NO_HEIGHT (-0x7F00) #define NO_HEIGHT (-0x7F00)
#define NUM_PICKUPS 64 #define NUM_PICKUPS 64

View file

@ -11,4 +11,9 @@
#define ADD_PTR(p, t, n) p = (t*)((char*)(p) + (ptrdiff_t)(n)); #define ADD_PTR(p, t, n) p = (t*)((char*)(p) + (ptrdiff_t)(n));
#define ZONE(A) (((A) >> (WALL_SIZE - 2)) - 1) #define ZONE(A) (((A) >> (WALL_SIZE - 2)) - 1)
#define MESHES(slot, mesh) Meshes[Objects[slot].meshIndex + mesh * 2]
#define LARA_MESHES(slot, mesh) Lara.meshPtrs[mesh] = MESHES(slot, mesh)
#define CHECK_LARA_MESHES(slot, mesh) Lara.meshPtrs[mesh] == MESHES(slot, mesh)
#define INIT_LARA_MESHES(mesh, to, from) Lara.meshPtrs[mesh] = LARA_MESHES(to, mesh) = LARA_MESHES(from, mesh)

View file

@ -122,6 +122,7 @@ typedef struct item_light_t
typedef struct hair_struct typedef struct hair_struct
{ {
PHD_3DPOS pos; PHD_3DPOS pos;
//PHD_VECTOR hvel;
byte unknown[24]; byte unknown[24];
} HAIR_STRUCT; } HAIR_STRUCT;
@ -156,10 +157,10 @@ typedef struct ai_info_t
} AI_INFO; } AI_INFO;
typedef struct bite_info_t { // Offset into given Mesh typedef struct bite_info_t { // Offset into given Mesh
int x; // where Baddie kicks off Bite Effect int x; // where Baddie kicks off Bite Effect
int y; int y;
int z; int z;
int meshNum; int meshNum;
} BITE_INFO; } BITE_INFO;
typedef struct lot_info_t typedef struct lot_info_t

View file

@ -2,6 +2,8 @@
#include "..\Game\sound.h" #include "..\Game\sound.h"
#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, char) #define UseForcedFixedCamera VAR_U_(0x00EEFA50, char)
@ -53,7 +55,7 @@
#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, char) #define LaraDrawType VAR_U_(0x00EEEAD0, char)
#define Hairs ARRAY_(0x00E5C000, HAIR_STRUCT, [14]) #define Hairs ARRAY_(0x00E5C000, HAIR_STRUCT, [DOUBLE_HAIR_SEGMENTS])
#define gfNumMips VAR_U_(0x0051CE37, char) #define gfNumMips VAR_U_(0x0051CE37, char)
#define Frames VAR_U_(0x00875174, short*) #define Frames VAR_U_(0x00875174, short*)
#define gfMips ARRAY_(0x00E5C2C0, char, [8]) #define gfMips ARRAY_(0x00E5C2C0, char, [8])
@ -109,14 +111,10 @@
#define nFrames VAR_U_(0x005082C4, int) #define nFrames VAR_U_(0x005082C4, int)
#define GameStatus VAR_U_(0x00E5C2B0, int) #define GameStatus VAR_U_(0x00E5C2B0, int)
#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, [MAX_EFFECTS])
#define DashTimer VAR_U_(0x00E5BF04, short) #define DashTimer VAR_U_(0x00E5BF04, short)
#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 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, short) #define CurrentFOV VAR_U_(0x00E4F504, short)
#define SpotCam ARRAY_(0x00E4F6C0, SPOTCAM, [64]) #define SpotCam ARRAY_(0x00E4F6C0, SPOTCAM, [64])
#define CurrentSplineCamera VAR_U_(0x00E4F500, short) #define CurrentSplineCamera VAR_U_(0x00E4F500, short)
@ -147,20 +145,30 @@
#define Unknown_00E6CAE8 VAR_U_(0x00E6CAE8, int) #define Unknown_00E6CAE8 VAR_U_(0x00E6CAE8, int)
#define PhdWindowXmax VAR_U_(0x0055D218, short) #define PhdWindowXmax VAR_U_(0x0055D218, short)
#define PhdWindowYmax VAR_U_(0x0055D240, short) #define PhdWindowYmax VAR_U_(0x0055D240, short)
#define Fires ARRAY_(0x00E4C7A0, FIRE_LIST, [32]) #define Fires ARRAY_(0x00E4C7A0, FIRE_LIST, [MAX_FIRE_LIST])
#define Dynamics ARRAY_(0x00E6C3E0, DYNAMIC, [64]) #define Dynamics ARRAY_(0x00E6C3E0, DYNAMIC, [MAX_DYNAMICS])
#define NumDynamics VAR_U_(0x00E6D82C, int) #define NumDynamics VAR_U_(0x00E6D82C, int)
#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, [MAX_SPARKS_FIRE])
#define NextFreeFireSpark VAR_U_(0x0050A17C, short) #define NextFreeFireSpark VAR_U_(0x0050A17C, short)
#define SmokeSparks ARRAY_(0x00E4B940, SMOKE_SPARKS, [32]) #define SmokeSparks ARRAY_(0x00E4B940, SMOKE_SPARKS, [MAX_SPARKS_SMOKE])
#define Blood ARRAY_(0x00E4C9C0, BLOOD_STRUCT, [32]) #define Blood ARRAY_(0x00E4C9C0, BLOOD_STRUCT, [MAX_SPARKS_BLOOD])
#define GunShells ARRAY_(0x00E4BEC0, GUNSHELL_STRUCT, [24]) #define GunShells ARRAY_(0x00E4BEC0, GUNSHELL_STRUCT, [MAX_GUNSHELL])
#define Sparks ARRAY_(0x00E5F380, SPARKS, [128]) #define GunFlashes ARRAY_(0x00E4D660, GUNFLASH_STRUCT, [MAX_GUNFLASH])
#define Drips ARRAY_(0x00E4D740, DRIP_STRUCT, [32]) #define Sparks ARRAY_(0x00E5F380, SPARKS, [MAX_SPARKS])
#define Bubbles ARRAY_(0x00E4D160, BUBBLE_STRUCT, [40]) #define Drips ARRAY_(0x00E4D740, DRIP_STRUCT, [MAX_DRIPS])
#define Splashes ARRAY_(0x00E6CA00, SPLASH_STRUCT, [4]) #define Bubbles ARRAY_(0x00E4D160, BUBBLE_STRUCT, [MAX_BUBBLES])
#define Ripples ARRAY_(0x00E5C600, RIPPLE_STRUCT, [32]) #define Splashes ARRAY_(0x00E6CA00, SPLASH_STRUCT, [MAX_SPLASH])
#define Ripples ARRAY_(0x00E5C600, RIPPLE_STRUCT, [MAX_RIPPLES])
#define ShockWaves ARRAY_(0x00E4C1A0, SHOCKWAVE_STRUCT, [MAX_SHOCKWAVE])
#define NextFireSpark VAR_U_(0x0050A17C, int)
#define NextSmokeSpark VAR_U_(0x0051D084, int)
#define NextGunShell VAR_U_(0x0051D08C, int)
#define NextBubble VAR_U_(0x0051D090, int)
#define NextDrip VAR_U_(0x0051D094, int)
#define NextDebris VAR_U_(0x0051CA8C, int)
#define NextBlood VAR_U_(0x0051D088, int)
#define NextItem VAR_U_(0x00EEF044, short)
#define SkyPos1 VAR_U_(0x00E6E4B0, short) #define SkyPos1 VAR_U_(0x00E6E4B0, short)
#define SkyPos2 VAR_U_(0x00E6D73E, short) #define SkyPos2 VAR_U_(0x00E6D73E, short)
#define SkyVelocity1 VAR_U_(0x00E5C276, signed char) #define SkyVelocity1 VAR_U_(0x00E5C276, signed char)
@ -213,7 +221,7 @@
#define SmashedMeshCount VAR_U_(0x0051CA5C, short) #define SmashedMeshCount VAR_U_(0x0051CA5C, short)
#define SmashedMesh ARRAY_(0x00EEF8C0, MESH_INFO*, [16]) #define SmashedMesh ARRAY_(0x00EEF8C0, MESH_INFO*, [16])
#define SmashedMeshRoom ARRAY_(0x00EEF480, short, [16]) #define SmashedMeshRoom ARRAY_(0x00EEF480, short, [16])
#define Debris ARRAY_(0x00E8CAC0, DEBRIS_STRUCT, [256]) #define Debris ARRAY_(0x00E8CAC0, DEBRIS_STRUCT, [MAX_DEBRIS])
#define SniperCameraActive VAR_U_(0x0051CA1D, byte) #define SniperCameraActive VAR_U_(0x0051CA1D, byte)
#define BinocularRange VAR_U_(0x0051CA30, int) #define BinocularRange VAR_U_(0x0051CA30, int)
#define BinocularOn VAR_U_(0x0051CA34, int) #define BinocularOn VAR_U_(0x0051CA34, int)
@ -262,15 +270,15 @@
#define FirstCamera VAR_U_(0x00E51F24, short) #define FirstCamera VAR_U_(0x00E51F24, short)
#define LastCamera VAR_U_(0x00E4F6AC, short) #define LastCamera VAR_U_(0x00E4F6AC, short)
#define CurrentCameraCnt VAR_U_(0x00E4EAA0, int) #define CurrentCameraCnt VAR_U_(0x00E4EAA0, int)
#define CameraXposition ARRAY_(0x00E4F440, int, [18]) #define CameraXposition ARRAY_(0x00E4F440, int, [MAX_CAMERA])
#define CameraYposition ARRAY_(0x00E4F600, int, [18]) #define CameraYposition ARRAY_(0x00E4F600, int, [MAX_CAMERA])
#define CameraZposition ARRAY_(0x00E4F540, int, [18]) #define CameraZposition ARRAY_(0x00E4F540, int, [MAX_CAMERA])
#define CameraXtarget ARRAY_(0x00E4F3E0, int, [18]) #define CameraXtarget ARRAY_(0x00E4F3E0, int, [MAX_CAMERA])
#define CameraYtarget ARRAY_(0x00E51EC0, int, [18]) #define CameraYtarget ARRAY_(0x00E51EC0, int, [MAX_CAMERA])
#define CameraZtarget ARRAY_(0x00E4F5A0, int, [18]) #define CameraZtarget ARRAY_(0x00E4F5A0, int, [MAX_CAMERA])
#define CameraRoll ARRAY_(0x00E4F4A0, int, [18]) #define CameraRoll ARRAY_(0x00E4F4A0, int, [MAX_CAMERA])
#define CameraFOV ARRAY_(0x00E4F380, int, [18]) #define CameraFOV ARRAY_(0x00E4F380, int, [MAX_CAMERA])
#define CameraSpeed ARRAY_(0x00E4F660, int, [18]) #define CameraSpeed ARRAY_(0x00E4F660, int, [MAX_CAMERA])
#define SpotcamDontDrawLara VAR_U_(0x0051D021, byte) #define SpotcamDontDrawLara VAR_U_(0x0051D021, byte)
#define QuakeCam VAR_U_(0x00E4F520, QUAKE_CAMERA) #define QuakeCam VAR_U_(0x00E4F520, QUAKE_CAMERA)
#define SplineFromCamera VAR_U_(0x00E4F3DC, int) #define SplineFromCamera VAR_U_(0x00E4F3DC, int)
@ -278,6 +286,7 @@
#define PoisonFlag VAR_U_(0x00E5BF3E, byte) #define PoisonFlag VAR_U_(0x00E5BF3E, byte)
#define SplashSetup VAR_U_(0x00E6CAC0, SPLASH_SETUP) #define SplashSetup VAR_U_(0x00E6CAC0, SPLASH_SETUP)
#define NullRotations ARRAY_(0x0051CD68, short, [12]) #define NullRotations ARRAY_(0x0051CD68, short, [12])
#define FirstHair VAR_U_(0x00E5BF60, int)
// JeepBaddieCollision // JeepBaddieCollision
#define Unk_0080DE1A VAR_U_(0x0080DE1A, short) #define Unk_0080DE1A VAR_U_(0x0080DE1A, short)

View file

@ -248,7 +248,7 @@ void DragonCollision(short itemNum, ITEM_INFO* laraitem, COLL_INFO* coll)
Lara.gunStatus = LG_HANDS_BUSY; Lara.gunStatus = LG_HANDS_BUSY;
Lara.hitDirection = -1; Lara.hitDirection = -1;
Lara.meshPtrs[HAND_R] = Meshes[Objects[ID_LARA_EXTRA_ANIMS].meshIndex + HAND_R]; LARA_MESHES(ID_LARA_EXTRA_ANIMS, HAND_R);
/* Do cinematic camera */ /* Do cinematic camera */
Camera.type = CINEMATIC_CAMERA; Camera.type = CINEMATIC_CAMERA;

View file

@ -955,7 +955,7 @@ void KayakUserInput(ITEM_INFO* kayak, ITEM_INFO* lara, KAYAK_INFO* kinfo)
short* tmp; short* tmp;
tmp = Lara.meshPtrs[HAND_R]; tmp = Lara.meshPtrs[HAND_R];
Lara.meshPtrs[HAND_R] = Meshes[Objects[ID_KAYAK_LARA_ANIMS].meshIndex + HAND_R]; LARA_MESHES(ID_KAYAK_LARA_ANIMS, HAND_R);
Meshes[Objects[ID_KAYAK_LARA_ANIMS].meshIndex + HAND_R] = tmp; Meshes[Objects[ID_KAYAK_LARA_ANIMS].meshIndex + HAND_R] = tmp;
lara->meshBits &= ~LARA_LEG_BITS; lara->meshBits &= ~LARA_LEG_BITS;

View file

@ -623,8 +623,8 @@ static void DoUserInput(ITEM_INFO* v, ITEM_INFO* l, CART_INFO* cart)
short* tmp; short* tmp;
tmp = Lara.meshPtrs[HAND_R]; tmp = Lara.meshPtrs[HAND_R];
Lara.meshPtrs[HAND_R] = Meshes[Objects[ID_MINECART_ANIMS].meshIndex + HAND_R]; LARA_MESHES(ID_MINECART_ANIMS, HAND_R);
Meshes[Objects[ID_MINECART_ANIMS].meshIndex + HAND_R] = tmp; Meshes[Objects[ID_MINECART_ANIMS].meshIndex + HAND_R] = tmp;
cart->Flags &= ~CF_MESH; cart->Flags &= ~CF_MESH;

View file

@ -72,10 +72,10 @@ void NewObjects()
obj->saveAnim = true; obj->saveAnim = true;
obj->saveFlags = true; obj->saveFlags = true;
Bones[obj->boneIndex + 192] |= ROT_Z; Bones[obj->boneIndex + 48 * 4] |= ROT_Z;
Bones[obj->boneIndex + 192] |= ROT_Y; Bones[obj->boneIndex + 48 * 4] |= ROT_Y;
Bones[obj->boneIndex + 208] |= ROT_Z; Bones[obj->boneIndex + 52 * 4] |= ROT_Z;
Bones[obj->boneIndex + 208] |= ROT_Y; Bones[obj->boneIndex + 52 * 4] |= ROT_Y;
} }
obj = &Objects[ID_BAT]; obj = &Objects[ID_BAT];
@ -165,14 +165,14 @@ void NewObjects()
obj->saveAnim = true; obj->saveAnim = true;
obj->saveFlags = true; obj->saveFlags = true;
Bones[obj->boneIndex + 112] |= ROT_Y; Bones[obj->boneIndex + 28 * 4] |= ROT_Y;
Bones[obj->boneIndex + 112] |= ROT_X; Bones[obj->boneIndex + 28 * 4] |= ROT_X;
Bones[obj->boneIndex + 352] |= ROT_Y; Bones[obj->boneIndex + 88 * 4] |= ROT_Y;
Bones[obj->boneIndex + 352] |= ROT_X; Bones[obj->boneIndex + 88 * 4] |= ROT_X;
Meshes[obj->meshIndex + 36] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 32]; Meshes[obj->meshIndex + 18 * 2] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 16 * 2];
Meshes[obj->meshIndex + 60] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 56]; Meshes[obj->meshIndex + 30 * 2] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 28 * 2];
Meshes[obj->meshIndex + 36] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 22]; Meshes[obj->meshIndex + 18 * 2] = Meshes[Objects[ID_MESHSWAP1].meshIndex + 11 * 2];
} }
obj = &Objects[ID_BADDY2]; obj = &Objects[ID_BADDY2];
@ -191,10 +191,10 @@ void NewObjects()
obj->saveAnim = true; obj->saveAnim = true;
obj->saveFlags = true; obj->saveFlags = true;
Bones[obj->boneIndex + 112] |= ROT_Y; Bones[obj->boneIndex + 28 * 4] |= ROT_Y;
Bones[obj->boneIndex + 112] |= ROT_X; Bones[obj->boneIndex + 28 * 4] |= ROT_X;
Bones[obj->boneIndex + 352] |= ROT_Y; Bones[obj->boneIndex + 88 * 4] |= ROT_Y;
Bones[obj->boneIndex + 352] |= ROT_X; Bones[obj->boneIndex + 88 * 4] |= ROT_X;
} }
obj = &Objects[ID_SAS_CAIRO]; obj = &Objects[ID_SAS_CAIRO];
@ -215,8 +215,8 @@ void NewObjects()
Bones[obj->boneIndex] |= ROT_Y; Bones[obj->boneIndex] |= ROT_Y;
Bones[obj->boneIndex] |= ROT_X; Bones[obj->boneIndex] |= ROT_X;
Bones[obj->boneIndex + 112] |= ROT_Y; Bones[obj->boneIndex + 28 * 4] |= ROT_Y;
Bones[obj->boneIndex + 112] |= ROT_X; Bones[obj->boneIndex + 28 * 4] |= ROT_X;
} }
obj = &Objects[ID_MUMMY]; obj = &Objects[ID_MUMMY];
@ -234,9 +234,9 @@ void NewObjects()
obj->saveAnim = true; obj->saveAnim = true;
obj->saveFlags = true; obj->saveFlags = true;
Bones[obj->boneIndex + 112] |= ROT_Y; Bones[obj->boneIndex + 28 * 4] |= ROT_Y;
Bones[obj->boneIndex + 112] |= ROT_X; Bones[obj->boneIndex + 28 * 4] |= ROT_X;
Bones[obj->boneIndex + 288] |= ROT_Y; Bones[obj->boneIndex + 72 * 4] |= ROT_Y;
} }
obj = &Objects[ID_QUAD]; obj = &Objects[ID_QUAD];
@ -913,9 +913,9 @@ void NewObjects()
Bones[obj->boneIndex + 20 * 4] |= ROT_X | ROT_Y; Bones[obj->boneIndex + 20 * 4] |= ROT_X | ROT_Y;
// TODO: check if constants are byte, short or int // TODO: check if constants are byte, short or int
Meshes[obj->meshIndex + 124] = Meshes[Objects[ID_MESHSWAP2].meshIndex + 120]; Meshes[obj->meshIndex + 60 * 2] = Meshes[Objects[ID_MESHSWAP2].meshIndex + 60 * 2];
Meshes[obj->meshIndex + 148] = Meshes[Objects[ID_MESHSWAP2].meshIndex + 144]; Meshes[obj->meshIndex + 72 * 2] = Meshes[Objects[ID_MESHSWAP2].meshIndex + 72 * 2];
Meshes[obj->meshIndex + 172] = Meshes[Objects[ID_MESHSWAP2].meshIndex + 168]; Meshes[obj->meshIndex + 84 * 2] = Meshes[Objects[ID_MESHSWAP2].meshIndex + 84 * 2];
} }
obj = &Objects[ID_CROCODILE]; obj = &Objects[ID_CROCODILE];
@ -2939,6 +2939,67 @@ void TrapObjects()
} }
} }
void InitialiseHair()
{
int* bone;
FirstHair = 1;
bone = &Bones[Objects[ID_HAIR].boneIndex];
Hairs[0].pos.yRot = 0;
Hairs[0].pos.xRot = -0x4000;
// normal hair
for (int i = 1; i < HAIR_SEGMENTS; i++, bone += 4)
{
Hairs[i].pos.xPos = *(bone + 1);
Hairs[i].pos.yPos = *(bone + 2);
Hairs[i].pos.zPos = *(bone + 3);
Hairs[i].pos.xRot = -0x4000;
Hairs[i].pos.yRot = 0;
Hairs[i].pos.zRot = 0;
//Hairs[i].hvel.x = 0;
//Hairs[i].hvel.y = 0;
//Hairs[i].hvel.z = 0;
}
}
void InitialiseSpecialEffects()
{
int i;
SPARKS* sptr;
memset(&Sparks, 0, MAX_SPARKS * sizeof(SPARKS));
memset(&FireSparks, 0, MAX_SPARKS_FIRE * sizeof(FIRE_SPARKS));
memset(&SmokeSparks, 0, MAX_SPARKS_SMOKE * sizeof(SMOKE_SPARKS));
memset(&GunShells, 0, MAX_GUNSHELL * sizeof(GUNSHELL_STRUCT));
memset(&GunFlashes, 0, (MAX_GUNFLASH * sizeof(GUNFLASH_STRUCT)) - sizeof(int)); // the size is 200 on IDA (without -4 it's 204 ??)
memset(&Debris, 0, MAX_DEBRIS * sizeof(DEBRIS_STRUCT));
memset(&Blood, 0, MAX_SPARKS_BLOOD * sizeof(BLOOD_STRUCT));
memset(&Splashes, 0, MAX_SPLASH * sizeof(SPLASH_STRUCT));
memset(&Ripples, 0, MAX_RIPPLES * sizeof(RIPPLE_STRUCT));
memset(&Bubbles, 0, MAX_BUBBLES * sizeof(BUBBLE_STRUCT));
memset(&Drips, 0, MAX_DRIPS * sizeof(DRIP_STRUCT));
memset(&ShockWaves, 0, MAX_SHOCKWAVE * sizeof(SHOCKWAVE_STRUCT));
sptr = &Sparks[0];
for (i = 0; i < MAX_SPARKS; i++)
{
sptr->on = false;
sptr->dynamic = -1;
sptr++;
}
NextFireSpark = 1;
NextSmokeSpark = 0;
NextGunShell = 0;
NextBubble = 0;
NextDrip = 0;
NextDebris = 0;
NextBlood = 0;
NextItem = NO_ITEM;
}
void PickupObjects() void PickupObjects()
{ {
OBJECT_INFO* obj; OBJECT_INFO* obj;
@ -3569,14 +3630,14 @@ void InitialiseObjects()
// Reset MIP flag so we can reuse slots // Reset MIP flag so we can reuse slots
//for (short i = 0; i < ID_NUMBER_OBJECTS; i++) //for (short i = 0; i < ID_NUMBER_OBJECTS; i++)
// Objects[i].objectMip = NULL; // Objects[i].objectMip = NULL;
// New objects imported from old TRs // New objects imported from old TRs
NewObjects(); NewObjects();
// User defined objects // User defined objects
CustomObjects(); CustomObjects();
InitialiseHairs(); InitialiseHair();
InitialiseSpecialEffects(); InitialiseSpecialEffects();
NumRPickups = 0; NumRPickups = 0;

View file

@ -2,11 +2,11 @@
#include "..\Global\global.h" #include "..\Global\global.h"
void BaddyObjects(); //#define BaddyObjects ((void (__cdecl*)()) 0x004737C0) void BaddyObjects();
void ObjectObjects(); //#define ObjectObjects ((void (__cdecl*)()) 0x00476360) void ObjectObjects();
void TrapObjects(); //#define TrapObjects ((void (__cdecl*)()) 0x00475D40) void TrapObjects();
#define InitialiseHairs ((void (__cdecl*)()) 0x00438BE0) void InitialiseHair();
#define InitialiseSpecialEffects ((void (__cdecl*)()) 0x0043D8B0) void InitialiseSpecialEffects();
void CustomObjects(); void CustomObjects();
void InitialiseObjects(); void InitialiseObjects();