Decompiled ID_DARTS, ID_DART_EMITTER, ID_FALLING_CEILING, ID_PROPELLER_H, ID_PROPELLER_V, KillAllTriggersControl, InitialiseFlameEmitter, FlameEmitterCollision, InitialiseFlameEmitter2 , GenSlot1Control, InitialiseGenSlot3, InitialiseGenSlot4;

This commit is contained in:
Montagna Marco 2020-01-28 07:30:58 +01:00
parent 1dfe773ee2
commit 0c4792baf1
11 changed files with 847 additions and 34 deletions

View file

@ -4,6 +4,8 @@
extern COLL_INFO coll;
#define GetLaraDeadlyBounds ((void (__cdecl*)()) 0x004569C0)
#define phd_SetTrans ((void (__cdecl*)(int, int, int)) 0x0048FA40)
#define phd_RotBoundingBoxNoPersp ((void (__cdecl*)(short*, short*)) 0x0042E240)
//void GetLaraDeadlyBounds();
void DelAlignLaraToRope(ITEM_INFO* item);

View file

@ -2,6 +2,24 @@
#include "..\Global\types.h"
#include "..\Global\constants.h"
struct ENERGY_ARC
{
PHD_VECTOR pos1; // 0
PHD_VECTOR pos2; // 12
PHD_VECTOR pos3; // 24
PHD_VECTOR pos4; // 36
byte r; // 48
byte g; // 49
byte b; // 50
byte on; // 51
byte byte34; // 52
byte gap35[8]; // 53
byte byte3D; // 61
byte flags; // 62
byte byte3F; // 63
byte byte40; // 64
};
extern int LaserSightX;
extern int LaserSightY;
extern int LaserSightZ;

View file

@ -6,6 +6,7 @@
#include "effects.h"
#include "lara.h"
#include "collide.h"
#include "switch.h"
static short CeilingTrapDoorBounds[12] = {-256, 256, 0, 900, -768, -256, -1820, 1820, -5460, 5460, -1820, 1820};
static PHD_VECTOR CeilingTrapDoorPos = {0, 1056, -480};
@ -659,3 +660,218 @@ void _WreckingBallControl(short itemNumber)
}
}
void FlameEmitterCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll)
{
ITEM_INFO* item = &Items[itemNumber];
if (Lara.gunType != WEAPON_TORCH
|| Lara.gunStatus != LG_READY
|| Lara.leftArm.lock
|| Lara.litTorch == (item->status & 1)
|| item->timer == -1
|| !(TrInput & IN_ACTION)
|| l->currentAnimState != STATE_LARA_STOP
|| l->animNumber != ANIMATION_LARA_STAY_IDLE
|| l->gravityStatus)
{
if (item->objectNumber == ID_BURNING_ROOTS)
ObjectCollision(itemNumber, l, coll);
}
else
{
short bounds[6];
switch (item->objectNumber)
{
case ID_FLAME_EMITTER:
bounds[0] = -256;
bounds[1] = 256;
bounds[2] = 0;
bounds[3] = 1024;
bounds[4] = -800;
bounds[5] = 800;
break;
case ID_FLAME_EMITTER2:
bounds[0] = -256;
bounds[1] = 256;
bounds[2] = 0;
bounds[3] = 1024;
bounds[4] = -600;
bounds[5] = 600;
break;
case ID_BURNING_ROOTS:
bounds[0] = -384;
bounds[1] = 384;
bounds[2] = 0;
bounds[3] = 2048;
bounds[4] = -384;
bounds[5] = 384;
break;
}
short oldYrot = item->pos.yRot;
item->pos.yRot = l->pos.yRot;
if (TestLaraPosition(bounds, item, l))
{
if (item->objectNumber == ID_BURNING_ROOTS)
{
l->animNumber = ANIMATION_LARA_TORCH_LIGHT_5;
}
else
{
int dy = abs(l->pos.yPos - item->pos.yPos);
l->itemFlags[3] = 1;
l->animNumber = (dy >> 8) + ANIMATION_LARA_TORCH_LIGHT_1;
}
l->currentAnimState = STATE_LARA_MISC_CONTROL;
l->frameNumber = Anims[l->animNumber].frameBase;
Lara.flareControlLeft = false;
Lara.leftArm.lock = 3;
Lara.generalPtr = (void*)itemNumber;
}
item->pos.yRot = oldYrot;
}
if (Lara.generalPtr == (void*)itemNumber
&& item->status != ITEM_ACTIVE
&& l->currentAnimState == STATE_LARA_MISC_CONTROL)
{
if (l->animNumber >= ANIMATION_LARA_TORCH_LIGHT_1 && l->animNumber <= ANIMATION_LARA_TORCH_LIGHT_5)
{
if (l->frameNumber - Anims[l->animNumber].frameBase == 40)
{
TestTriggersAtXYZ(item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, 1, item->flags & 0x3E00);
item->flags |= 0x3E00;
item->itemFlags[3] = 0;
item->status = ITEM_ACTIVE;
AddActiveItem(itemNumber);
}
}
}
}
void InitialiseFlameEmitter2(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
item->pos.yPos -= 64;
if (item->triggerFlags != 123)
{
if (item->pos.yRot > 0)
{
if (item->pos.yRot == ANGLE(90))
{
if (item->triggerFlags == 2)
item->pos.xPos += 80;
else
item->pos.xPos += 256;
}
}
else if (item->pos.yRot < 0)
{
if (item->pos.yRot == -ANGLE(180))
{
if (item->triggerFlags == 2)
item->pos.zPos -= 80;
else
item->pos.zPos -= 256;
}
else if (item->pos.yRot == -ANGLE(90))
{
if (item->triggerFlags == 2)
item->pos.xPos -= 80;
else
item->pos.xPos -= 256;
}
}
else
{
if (item->triggerFlags == 2)
item->pos.zPos += 80;
else
item->pos.zPos += 256;
}
}
}
void InitialiseFlameEmitter(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
if (item->triggerFlags > 0)
{
if (item->triggerFlags == 33)
{
if (item->pos.yRot > 0)
{
if (item->pos.yRot == ANGLE(90))
item->pos.xPos += 144;
}
else
{
if (item->pos.yRot == 0)
{
item->pos.zPos += 144;
item->pos.yPos += 32;
return;
}
else if (item->pos.yRot == -ANGLE(180))
{
item->pos.zPos -= 144;
item->pos.yPos += 32;
return;
}
else if (item->pos.yRot == -ANGLE(90))
{
item->pos.xPos -= 144;
item->pos.yPos += 32;
return;
}
}
item->pos.yPos += 32;
return;
}
}
else
{
item->itemFlags[0] = (GetRandomControl() & 0x3F) + 90;
item->itemFlags[2] = 256;
if (((-item->triggerFlags) & 7) == 7)
{
if (item->pos.yRot > 0)
{
if (item->pos.yRot == ANGLE(90))
{
item->pos.xPos += 512;
}
}
else if (item->pos.yRot < 0)
{
if (item->pos.yRot == -ANGLE(180))
{
item->pos.zPos -= 512;
}
else if (item->pos.yRot == -ANGLE(90))
{
item->pos.xPos -= 512;
}
}
else
{
item->pos.zPos += 512;
}
}
}
}

View file

@ -13,9 +13,9 @@
//#define TwoBlocksPlatformControl ((void (__cdecl*)(short)) 0x0048BBB0)
//#define TwoBlocksPlatformFloor ((void (__cdecl*)(ITEM_INFO*,int,int,int,int*)) 0x0048B9E0)
//#define TwoBlocksPlatformCeiling ((void (__cdecl*)(ITEM_INFO*,int,int,int,int*)) 0x0048BA50)
#define KillAllTriggersControl ((void (__cdecl*)(short)) 0x00431030)
#define FallingCeilingCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x004127C0)
#define FallingCeilingControl ((void (__cdecl*)(short)) 0x004899D0)
//#define KillAllTriggersControl ((void (__cdecl*)(short)) 0x00431030)
//#define FallingCeilingCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x004127C0)
//#define FallingCeilingControl ((void (__cdecl*)(short)) 0x004899D0)
//#define InitialiseFallingBlock ((void (__cdecl*)(short)) 0x0043D330)
//#define FallingBlockCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x00489750)
//#define FallingBlockControl ((void (__cdecl*)(short)) 0x00489820)
@ -24,23 +24,23 @@
//#define InitialisePushableBlock ((void (__cdecl*)(short)) 0x0045E720)
//#define PushableBlockControl ((void (__cdecl*)(short)) 0x0045EA30)
//#define PushableBlockCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x0045F570)
#define DartEmitterControl ((void (__cdecl*)(short)) 0x00489B30)
//#define DartEmitterControl ((void (__cdecl*)(short)) 0x00489B30)
#define DrawDart ((void (__cdecl*)(ITEM_INFO*)) 0x004CBB10)
#define DartControl ((void (__cdecl*)(short)) 0x00489D60)
#define InitialiseFlameEmitter ((void (__cdecl*)(short)) 0x0043D370)
#define FlameEmitterCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x00433B40)
//#define DartControl ((void (__cdecl*)(short)) 0x00489D60)
//#define InitialiseFlameEmitter ((void (__cdecl*)(short)) 0x0043D370)
//#define FlameEmitterCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x00433B40)
//#define FlameEmitterControl ((void (__cdecl*)(short)) 0x00489F70)
#define InitialiseFlameEmitter2 ((void (__cdecl*)(short)) 0x0043D4E0)
//#define InitialiseFlameEmitter2 ((void (__cdecl*)(short)) 0x0043D4E0)
//#define FlameEmitter2Control ((void (__cdecl*)(short)) 0x0048A3B0)
#define FlameEmitter3Control ((void (__cdecl*)(short)) 0x0048A570)
//#define FlameControl ((void (__cdecl*)(short)) 0x0048AB80)
#define InitialiseRopeTrap ((void (__cdecl*)()) 0x0046EE40)
#define GenSlot1Control ((void (__cdecl*)(short)) 0x00406580)
//#define GenSlot1Control ((void (__cdecl*)(short)) 0x00406580)
#define InitialiseGenSlot2 ((void (__cdecl*)(short)) 0x0043FD70)
#define GenSlot2Control ((void (__cdecl*)(short)) 0x00488710)
#define DrawGenSlot2 ((void (__cdecl*)(ITEM_INFO*)) 0x004CFF80)
#define InitialiseGenSlot3 ((void (__cdecl*)(short)) 0x004402E0)
#define InitialiseGenSlot4 ((void (__cdecl*)(short)) 0x00440440)
//#define InitialiseGenSlot3 ((void (__cdecl*)(short)) 0x004402E0)
//#define InitialiseGenSlot4 ((void (__cdecl*)(short)) 0x00440440)
#define GenSlot4Control ((void (__cdecl*)(short)) 0x00486450)
//#define InitialiseHighObject1 ((void (__cdecl*)(short)) 0x0043FC30)
//#define HighObject1Control ((void (__cdecl*)(short)) 0x004067E0)
@ -51,8 +51,8 @@
//#define WreckingBallCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x00441D50)
#define WreckingBallControl ((void (__cdecl*)(short)) 0x00441410)
#define DrawWreckingBall ((void (__cdecl*)(ITEM_INFO*)) 0x00441F50)
#define InitialiseVentilator ((void (__cdecl*)(short)) 0x0043F3D0)
#define VentilatorControl ((void (__cdecl*)(short)) 0x00405610)
//#define InitialiseVentilator ((void (__cdecl*)(short)) 0x0043F3D0)
//#define VentilatorControl ((void (__cdecl*)(short)) 0x00405610)
//#define InitialiseTeethSpike ((void (__cdecl*)(short)) 0x0043FBC0)
//#define TeethSpikeControl ((void (__cdecl*)(short)) 0x0043FBC0)
//#define DrawScaledSpike ((void (__cdecl*)(ITEM_INFO*)) 0x0043FBC0)
@ -77,3 +77,6 @@ void FallingBlockCeiling(ITEM_INFO* item, int x, int y, int z, int* height);
void InitialiseWreckingBall(short itemNumber);
void WreckingBallCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll);
void _WreckingBallControl(short itemNumber);
void FlameEmitterCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll);
void InitialiseFlameEmitter2(short itemNumber);
void InitialiseFlameEmitter(short itemNumber);

View file

@ -1213,4 +1213,99 @@ void ControlHighObject1(short itemNumber)
targetItem->flags |= 0x20;
targetItem->pos.yPos = item->pos.yPos - 560;
}
}
void GenSlot1Control(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
if (TriggerActive(item) && !item->triggerFlags)
{
int df = item->frameNumber - Anims[item->animNumber].frameBase;
if (df == 10 || df == 11)
{
GetLaraDeadlyBounds();
DeadlyBounds[0] -= 350;
DeadlyBounds[1] += 350;
DeadlyBounds[4] -= 350;
DeadlyBounds[5] += 350;
bool found = false;
for (int i = 0; i < 6; i++)
{
PHD_VECTOR pos;
pos.x = 0;
pos.y = -350;
pos.z = 0;
GetJointAbsPosition(item, &pos, i + 1);
if (pos.x > DeadlyBounds[0]
&& pos.x < DeadlyBounds[1]
&& pos.y > DeadlyBounds[2]
&& pos.y < DeadlyBounds[3]
&& pos.z > DeadlyBounds[4]
&& pos.z < DeadlyBounds[5])
{
found = true;
}
}
if (found)
{
for (int i = 0; i < 8; i++)
{
PHD_VECTOR pos;
pos.x = 0;
pos.y = 0;
pos.z = 0;
GetLaraJointPosition(&pos, i + 7);
int x = pos.x + (GetRandomControl() & 0xFF) - 128;
int y = pos.y + (GetRandomControl() & 0xFF) - 128;
int z = pos.z + (GetRandomControl() & 0xFF) - 128;
DoBloodSplat(x, y, z, 1, -1, LaraItem->roomNumber);
}
LaraItem->hitPoints = 0;
}
}
AnimateItem(item);
}
}
void InitialiseGenSlot3(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
if (CurrentLevel != 7)
item->meshBits = item->triggerFlags;
}
void InitialiseGenSlot4(short itemNumber)
{
/*ITEM_INFO* item = &Items[itemNumber];
HIWORD(v1) = HIWORD(items);
item = &items[itemNumber];
LOWORD(v1) = item->pos.y_rot;
v3 = item->pos.x_pos;
v4 = 2 * ((v1 >> 3) & 0x1FFE);
v5 = 5 * *(__int16*)((char*)rcossin_tbl + v4);
v6 = item->pos.z_pos;
v7 = v6 + (10240 * *(__int16*)((char*)& rcossin_tbl[1] + v4) >> 14);
item->item_flags[2] = 1;
BYTE1(v4) = v6 >> 9;
LOBYTE(v4) = v3 >> 9;
item->item_flags[0] = v4;
LOBYTE(v6) = (item->pos.xPos + (v5 << 11 >> 14)) >> 9;
BYTE1(v6) = v7 >> 9;
item->itemFlags[1] = item->pos.xPos + 2560 * SIN(item->pos.yRot) >> W2V_SHIFT;
item->itemFlags[3] = 0;
item->triggerFlags = 0;*/
}

View file

@ -26,24 +26,6 @@
#define ANIMATION_ROMAN_STATUE_DEATH 14
#define ANIMATION_ROMAN_STATUE_START_JUMP_DOWN 16
struct ENERGY_ARC
{
PHD_VECTOR pos1; // 0
PHD_VECTOR pos2; // 12
PHD_VECTOR pos3; // 24
PHD_VECTOR pos4; // 36
byte r; // 48
byte g; // 49
byte b; // 50
byte on; // 51
byte byte34; // 52
byte gap35[8]; // 53
byte byte3D; // 61
byte flags; // 62
byte byte3F; // 63
byte byte40; // 64
};
struct ROMAN_STATUE_STRUCT
{
PHD_VECTOR pos;

View file

@ -655,4 +655,489 @@ void InitialiseRomeHammer(short itemNumber)
item->itemFlags[0] = 2;
item->itemFlags[3] = 250;
}
void VentilatorEffect(short* bounds, int intensity, short rot, int speed)
{
int x, y, z;
if (abs(intensity) == 1)
{
x = (bounds[0]+bounds[1]) >> 1;
if (intensity >= 0)
y = bounds[3];
else
y = bounds[2];
z = (bounds[4] + bounds[5]) >> 1;
}
else
{
y = (bounds[2]+bounds[3]) >> 1;
if (rot & 0x7FFF)
{
if (intensity >= 0)
z = bounds[5];
else
z = bounds[4];
x = (bounds[0]+bounds[1]) >> 1;
}
else
{
if (intensity >= 0)
x = bounds[1];
else
x = bounds[0];
z = (bounds[4] + bounds[5]) >> 1;
}
}
if (abs(Camera.pos.x-x) <= 7168)
{
if (abs(Camera.pos.y-y) <= 7168)
{
if (abs(Camera.pos.z-z) <= 7168)
{
SPARKS* spark = &Sparks[GetFreeSpark()];
spark->on = 1;
spark->sR = 0;
spark->sG = 0;
spark->sB = 0;
spark->dR = spark->dG = 48 * speed >> 7;
spark->colFadeSpeed = 4;
spark->fadeToBlack = 8;
spark->dB = speed * ((GetRandomControl() & 8) + 48) >> 7;
spark->transType = COLADD;
spark->life = spark->sLife = (GetRandomControl() & 3) + 20;
if (abs(intensity) == 1)
{
int factor = 3 * (bounds[1]-bounds[0]) >> 3;
short angle = 2 * GetRandomControl();
spark->x = ((bounds[0] + bounds[1]) >> 1) + ((GetRandomControl() % factor) * SIN(angle) >> W2V_SHIFT);
spark->z = ((bounds[4] + bounds[5]) >> 1) + ((GetRandomControl() % factor) * COS(angle) >> W2V_SHIFT);
if (intensity >= 0)
spark->y = bounds[3];
else
spark->y = bounds[2];
spark->zVel = 0;
spark->xVel = 0;
spark->yVel = 32 * intensity * ((GetRandomControl() & 0x1F) + 224);
}
else
{
int factor = 3 * (bounds[3] - bounds[2]) >> 3;
short angle = 2 * GetRandomControl();
spark->y = (bounds[2] + bounds[3]) >> 1;
if (rot & 0x7FFF)
{
if (intensity >= 0)
spark->z = bounds[5];
else
spark->z = bounds[4];
spark->x = ((bounds[0] + bounds[1]) >> 1) + ((GetRandomControl() % factor) * COS(angle) >> W2V_SHIFT);
spark->y += (GetRandomControl() % factor) * SIN(angle) >> W2V_SHIFT;
spark->xVel = 0;
spark->zVel = 16 * intensity * ((GetRandomControl() & 0x1F) + 224);
}
else
{
if (intensity >= 0)
spark->x = bounds[1];
else
spark->x = bounds[0];
spark->y += (GetRandomControl() % factor) * SIN(angle) >> W2V_SHIFT;
spark->z = ((bounds[4] + bounds[5]) >> 1) + ((GetRandomControl() % factor) * COS(angle) >> W2V_SHIFT);
spark->zVel = 0;
spark->xVel = 16 * intensity * ((GetRandomControl() & 0x1F) + 224);
}
spark->yVel = 0;
}
spark->friction = 85;
spark->xVel = speed * spark->xVel >> 7;
spark->yVel = speed * spark->yVel >> 7;
spark->zVel = speed * spark->zVel >> 7;
spark->maxYvel = 0;
spark->gravity = 0;
spark->flags = 0;
}
}
}
}
void InitialiseVentilator(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
item->itemFlags[0] = item->triggerFlags << WALL_SHIFT;
if (item->itemFlags[0] < 2048)
item->itemFlags[0] = 3072;
}
void VentilatorControl(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
AnimateItem(item);
int xChange = 0;
int zChange = 0;
if (TriggerActive(item))
{
xChange = 1;
}
else
{
xChange = 1;
TestTriggersAtXYZ(item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, 1, 0);
if (item->currentAnimState == 1)
{
//result = 5 * item->animNumber;
if (item->frameNumber == Anims[item->animNumber].frameEnd)
return;
}
else
{
item->goalAnimState = 1;
}
}
int speed = 0;
if (item->currentAnimState == 1)
{
speed = Anims[item->animNumber].frameEnd - item->frameNumber;
}
else
{
speed = 128;
}
short* bounds = GetBoundsAccurate(item);
short effectBounds[6];
effectBounds[2] = item->pos.yPos + bounds[2];
effectBounds[3] = item->pos.yPos + bounds[3];
if (item->objectNumber != ID_PROPELLER_V) // TODO: check this ID
{
if (item->pos.yRot != -ANGLE(180))
{
if (item->pos.yRot == -ANGLE(90))
{
effectBounds[0] = item->pos.xPos - bounds[5];
effectBounds[1] = item->pos.xPos - bounds[4];
effectBounds[4] = item->pos.zPos + bounds[0];
effectBounds[5] = item->pos.zPos + bounds[1];
xChange = 0;
zChange = 1;
}
else
{
if (item->pos.yRot != ANGLE(90))
{
effectBounds[0] = item->pos.xPos + bounds[0];
effectBounds[1] = item->pos.xPos + bounds[1];
effectBounds[4] = item->pos.zPos + bounds[4];
effectBounds[5] = item->pos.zPos + bounds[5];
zChange = 0;
}
else
{
effectBounds[0] = item->pos.xPos + bounds[4];
effectBounds[1] = item->pos.xPos + bounds[5];
effectBounds[4] = item->pos.zPos - bounds[1];
effectBounds[5] = item->pos.zPos - bounds[0];
xChange = 0;
zChange = 1;
}
}
}
else
{
effectBounds[0] = item->pos.xPos - bounds[1];
effectBounds[1] = item->pos.xPos - bounds[0];
effectBounds[4] = item->pos.zPos - bounds[5];
effectBounds[5] = item->pos.zPos - bounds[4];
zChange = 0;
}
VentilatorEffect(effectBounds, 2, item->pos.yRot, speed);
VentilatorEffect(effectBounds, -2, item->pos.yRot, speed);
if (LaraItem->pos.yPos >= effectBounds[2] && LaraItem->pos.yPos <= effectBounds[3])
{
if (zChange)
{
if (LaraItem->pos.xPos >= effectBounds[0] && LaraItem->pos.xPos <= effectBounds[1])
{
int z1 = abs(LaraItem->pos.zPos - effectBounds[4]);
int z2 = abs(LaraItem->pos.zPos - effectBounds[5]);
if (z2 >= z1)
zChange = -zChange;
else
z1 = z2;
if (z1 < item->itemFlags[0])
{
int dz = 96 * zChange * (item->itemFlags[0] - z1) / item->itemFlags[0];
if (item->currentAnimState == 1)
dz = speed * dz / 120;
LaraItem->pos.zPos += dz;
}
}
}
else
{
if (LaraItem->pos.zPos >= effectBounds[4] && LaraItem->pos.zPos <= effectBounds[5])
{
int x1 = abs(LaraItem->pos.xPos - effectBounds[0]);
int x2 = abs(LaraItem->pos.xPos - effectBounds[0]);
if (x2 >= x1)
xChange = -xChange;
else
x1 = x2;
if (x1 < item->itemFlags[0])
{
int dx = 96 * xChange * (item->itemFlags[0] - x1) / item->itemFlags[0];
if (item->currentAnimState == 1)
dx = speed * dx / 120;
LaraItem->pos.xPos += dx;
}
}
}
}
}
else
{
phd_PushUnitMatrix();
phd_RotYXZ(item->pos.yRot, item->pos.xRot, item->pos.zRot);
phd_SetTrans(0, 0, 0);
short tbounds[6];
phd_RotBoundingBoxNoPersp(bounds, tbounds);
phd_PopMatrix();
effectBounds[0] = item->pos.xPos + tbounds[0];
effectBounds[1] = item->pos.xPos + tbounds[1];
effectBounds[4] = item->pos.zPos + tbounds[4];
effectBounds[5] = item->pos.zPos + tbounds[5];
VentilatorEffect(effectBounds, 1, 0, speed);
VentilatorEffect(effectBounds, -1, 0, speed);
if (LaraItem->pos.xPos >= effectBounds[0] && LaraItem->pos.xPos <= effectBounds[1])
{
if (LaraItem->pos.zPos >= effectBounds[4] && LaraItem->pos.zPos <= effectBounds[5])
{
int y = effectBounds[3];
if (LaraItem->pos.yPos <= effectBounds[3])
{
if (effectBounds[2] - LaraItem->pos.yPos >= item->itemFlags[0])
return;
y = 96 * (effectBounds[3] - item->itemFlags[0]) / item->itemFlags[0];
}
else
{
if (LaraItem->pos.yPos - effectBounds[3] >= item->itemFlags[0])
return;
y = 96 * (item->itemFlags[0] - (LaraItem->pos.yPos - effectBounds[3])) / item->itemFlags[0];
}
if (item->currentAnimState == 1)
y = speed * y / 120;
LaraItem->pos.yPos += y;
}
}
}
}
void DartControl(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
if (item->touchBits)
{
LaraItem->hitPoints -= 25;
LaraItem->hitStatus = true;
Lara.poisoned += 160;
DoBloodSplat(item->pos.xPos, item->pos.yPos, item->pos.zPos, (GetRandomControl() & 3) + 4, LaraItem->pos.yRot, LaraItem->roomNumber);
KillItem(itemNumber);
}
else
{
item->pos.xPos += item->speed * SIN(item->pos.yRot) >> W2V_SHIFT;
item->pos.yPos -= item->speed * SIN(item->pos.xRot) >> W2V_SHIFT;
item->pos.xPos += item->speed * COS(item->pos.yRot) >> W2V_SHIFT;
short roomNumber = item->roomNumber;
FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
if (item->roomNumber != roomNumber)
ItemNewRoom(itemNumber, roomNumber);
int height = GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
item->floor = height;
if (item->pos.yPos >= height)
{
for (int i = 0; i < 4; i++)
{
TriggerDartSmoke(item->pos.xPos, item->pos.yPos, item->pos.zPos, 0, 0, 1);
}
KillItem(itemNumber);
}
}
}
void DartEmitterControl(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
if (item->active)
{
if (item->timer > 0)
{
item->timer--;
return;
}
else
{
item->timer = 24;
}
}
short dartItemNumber = CreateItem();
if (dartItemNumber != NO_ITEM)
{
ITEM_INFO* dartItem = &Items[dartItemNumber];
dartItem->objectNumber = ID_DARTS;
dartItem->roomNumber = item->roomNumber;
int x = 0;
int z = 0;
if (item->pos.yRot > 0)
{
if (item->pos.yRot == ANGLE(90))
x = 512;
}
else if (item->pos.yRot < 0)
{
if (item->pos.yRot == -ANGLE(180))
{
z = -512;
}
else if (item->pos.yRot == -ANGLE(90))
{
x = -512;
}
}
else
{
z = 512;
}
dartItem->pos.xPos = x + item->pos.xPos;
dartItem->pos.yPos = item->pos.yPos - 512;
dartItem->pos.zPos = z + item->pos.zPos;
InitialiseItem(dartItemNumber);
dartItem->pos.xRot = 0;
dartItem->pos.yRot = item->pos.yRot + -ANGLE(180);
dartItem->speed = 256;
int xf = 0;
int zf = 0;
if (x)
xf = abs(2 * x) - 1;
else
zf = abs(2 * z) - 1;
for (int i = 0; i < 5; i++)
{
int random = -GetRandomControl();
int xv = 0;
int zv = 0;
if (z >= 0)
zv = zf & random;
else
zv = -(zf & random);
if (x >= 0)
xv = xf & random;
else
xv = -(xf & random);
TriggerDartSmoke(dartItem->pos.xPos, dartItem->pos.yPos, dartItem->pos.zPos, xv, zv, 0);
}
AddActiveItem(dartItemNumber);
dartItem->status = ITEM_ACTIVE;
SoundEffect(SFX_LIFT_DOORS, &dartItem->pos, 0);
}
}
void FallingCeilingControl(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
if (item->currentAnimState)
{
if (item->currentAnimState == 1 && item->touchBits)
{
LaraItem->hitPoints -= 300;
LaraItem->hitStatus = true;
}
}
else
{
item->goalAnimState = 1;
item->gravityStatus = true;;
}
AnimateItem(item);
if (item->status == ITEM_DEACTIVATED)
{
RemoveActiveItem(itemNumber);
}
else
{
short roomNumber = item->roomNumber;
FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
item->floor = GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
if (roomNumber != item->roomNumber)
ItemNewRoom(itemNumber, roomNumber);
if (item->currentAnimState == 1)
{
if (item->pos.yPos >= item->floor)
{
item->pos.yPos = item->floor;
item->gravityStatus = false;
item->goalAnimState = 2;
item->fallspeed = 0;
}
}
}
}

View file

@ -105,3 +105,11 @@ void InitialiseTeleporter(short itemNumber);
void ControlTeleporter(short itemNumber);
void InitialiseHighObject1(short itemNumber);
void ControlHighObject1(short itemNumber);
void VentilatorEffect(short* bounds, int intensity, short rot, int speed);
void InitialiseVentilator(short itemNumber);
void VentilatorControl(short itemNumber);
void GenSlot1Control(short itemNumber);
void InitialiseGenSlot3(short itemNumber);
void DartControl(short itemNumber);
void DartEmitterControl(short itemNumber);
void FallingCeilingControl(short itemNumber);

View file

@ -3049,7 +3049,7 @@ void TrapObjects()
obj = &Objects[ID_KILL_ALL_TRIGGERS];
if (obj->loaded)
{
obj->control = KillAllTriggersControl;
obj->control = KillAllCurrentItems;
obj->drawRoutine = NULL;
obj->hitPoints = 0;
obj->saveFlags = true;
@ -3059,7 +3059,7 @@ void TrapObjects()
obj = &Objects[ID_FALLING_CEILING];
if (obj->loaded)
{
obj->collision = FallingCeilingCollision;
obj->collision = TrapCollision;
obj->control = FallingCeilingControl;
obj->saveAnim = true;
obj->saveFlags = true;
@ -3189,7 +3189,7 @@ void TrapObjects()
obj = &Objects[ID_GEN_SLOT4];
if (obj->loaded)
{
obj->initialise = InitialiseGenSlot4;
//obj->initialise = InitialiseGenSlot4;
obj->control = GenSlot4Control;
obj->saveAnim = true;
obj->saveFlags = true;

View file

@ -244,6 +244,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts"</Command>
<ClCompile Include="Objects\TR5\tr5_hydra.cpp" />
<ClCompile Include="Objects\TR5\tr5_imp.cpp" />
<ClCompile Include="Objects\TR5\tr5_larson.cpp" />
<ClCompile Include="Objects\TR5\tr5_laser_head.cpp" />
<ClCompile Include="Objects\TR5\tr5_misc_objects.cpp" />
<ClCompile Include="Objects\TR5\tr5_moving_block.cpp" />
<ClCompile Include="Objects\TR5\tr5_rats.cpp" />

View file

@ -836,6 +836,9 @@
<ClCompile Include="Objects\TR3\tr3_civvy.cpp">
<Filter>File di origine</Filter>
</ClCompile>
<ClCompile Include="Objects\TR5\tr5_laser_head.cpp">
<Filter>File di origine</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="Shaders\Shader.fx" />