TombEngine/TR5Main/Objects/TR5/Object/tr5_teleporter.cpp

223 lines
5.7 KiB
C++
Raw Normal View History

#include "framework.h"
#include "tr5_teleporter.h"
#include "items.h"
#include "level.h"
2021-09-19 23:41:26 +03:00
#include "control/control.h"
2021-09-25 16:00:30 +03:00
#include "Sound/sound.h"
#include "effects/weather.h"
#include "lara.h"
#include "camera.h"
using namespace TEN::Effects::Environment;
void InitialiseTeleporter(short itemNumber)
{
/*ITEM_INFO* item = &g_Level.Items[itemNumber];
if (item->triggerFlags == 512)
{
2021-09-15 14:24:03 +03:00
ITEM_INFO* puzzleHoleItem = FindItem(ID_PUZZLE_HOLE2);
v4 = (signed int)((unsigned __int64)(391146079i64 * ((char*)v3 - (char*)items)) >> 32) >> 9;
result = (unsigned int)((unsigned __int64)(391146079i64 * ((char*)v3 - (char*)items)) >> 32) >> 31;
item->itemFlags[1] = result + v4;
}*/
}
void ControlTeleporter(short itemNumber)
{
ITEM_INFO* item = &g_Level.Items[itemNumber];
if (!TriggerActive(item))
return;
/*if (item->triggerFlags == 512)
{
if (item->itemFlags[2])
{
Lara.Puzzles[1] = 1;
RemoveActiveItem(itemNumber);
item->flags &= 0xC1FF;
}
else
{
item->itemFlags[0] += 2;
if (item->itemFlags[0] <= 255)
{
int flags = item->itemFlags[0] >> 3;
if (flags >= 4)
{
if (flags > 31)
flags = 31;
}
else
{
flags = 4;
}
ITEM_INFO* targetItem = &g_Level.Items[item->itemFlags[1]];
SoundEffect(SFX_RICH_TELEPORT, &targetItem->pos, (flags << 8) | 8);
if (GlobalCounter & 1)
{
PHD_VECTOR src;
pos.x = targetItem->pos.xPos;
pos.y = targetItem->pos.yPos - 496;
pos.z = targetItem->pos.zPos + 472;
int dl = 4 * item->itemFlags[0] + 256;
PHD_VECTOR dest;
dest.x = src.x + GetRandomControl() % dl - (dl >> 1);
dest.y = src.y + GetRandomControl() % dl - (dl >> 1);
dest.z = src.z + GetRandomControl() % dl - (dl >> 1);
int color = (item->itemFlags[0] >> 2) | (((item->itemFlags[0] - (GetRandomControl() % (item->itemFlags[0] >> 1))) | (item->itemFlags[0] << 8)) << 8);
color |= 0x18; // BYTE1
//TriggerEnergyArc(&src, &dest, (GetRandomControl() & 0x1F) + 16, color, 15, 40, 5);
v20 = v16;
v21 = v12 & 0xFFFFFFFE;
LOBYTE(v20) = v16 & 0xFE;
BYTE1(v21) |= 0x80u;
TriggerLightningGlow(src.x, src.y, src.z, (item->itemFlags[0] >> 3) | ((v20 | (v21 << 8)) << 7));
v22 = GetRandomControl();
TriggerDynamicLight(src.x, src.y, src.z, (v22 & 3) + (item->itemFlags[0] >> 5) + 8, v12, v16, v13);
}
LOBYTE(v3) = GetRandomControl();
if (v3 & 1)
{
v23 = item->itemFlags[0];
v24 = item->itemFlags[0];
v25 = GetRandomControl();
auto R = v23;
auto G = v24 - v25 % (v24 >> 1);
auto B = v24 >> 2;
Weather.Flash(R, G, B, 0.03f);
LOBYTE(v3) = SoundEffect(399, 0, 0);
}
if (!(GlobalCounter & 3))
{
v26 = GetRandomControl();
v27 = 0;
v28 = v26 & 3;
v29 = 0;
if (v28)
{
if (v28 == 1)
v29 = 512;
else
v27 = v28 != 2 ? 512 : -512;
}
else
{
v29 = -512;
}
v30 = item->itemFlags[0];
v31 = &g_Level.Items[item->itemFlags[1]];
src.xPos = v29 + v31->pos.xPos;
src.yPos = v31->pos.yPos - 2328;
src.zPos = v27 + v31->pos.zPos;
*(_DWORD*)& src.xRot = v31->pos.xPos;
v32 = item->itemFlags[0];
*(_DWORD*)& src.zRot = v31->pos.yPos - 496;
v45 = v31->pos.zPos + 472;
v33 = (v30 >> 2) | (((v30 - GetRandomControl() % (v30 >> 1)) | ((v32 | 0x2400) << 8)) << 8);
v34 = GetRandomControl();
TriggerEnergyArc((PHD_VECTOR*)& src, (PHD_VECTOR*)& src.xRot, (v34 & 0xF) + 16, v33, 13, 56, 5);
v35 = &spark[GetFreeSpark()];
v35->On = 1;
v36 = item->itemFlags[0];
v35->dR = v36;
v35->sR = v36;
v37 = item->itemFlags[0] >> 1;
v35->dG = v37;
v35->sG = v37;
v38 = item->itemFlags[0];
v35->ColFadeSpeed = 20;
v38 >>= 2;
v35->dB = v38;
v35->sB = v38;
v35->FadeToBlack = 4;
v35->Life = 24;
v35->sLife = 24;
2021-10-27 19:00:30 +03:00
v35->TransType = TransTypeEnum::COLADD;
v35->x = src.xPos;
v35->y = src.yPos;
v35->z = src.zPos;
v35->Zvel = 0;
v35->Yvel = 0;
v35->Xvel = 0;
v35->Flags = 10;
v39 = objects[458].mesh_index;
v35->Scalar = 3;
v35->MaxYvel = 0;
v35->Def = v39 + 11;
v35->Gravity = 0;
v3 = (GetRandomControl() & 3) + 24;
v35->dSize = v3;
v35->sSize = v3;
v35->Size = v3;
}
return v3;
}
FlashFadeR = 255;
FlashFadeG = 255;
FlashFadeB = 64;
FlashFader = 32;
item->itemFlags[2] = 1;
SoundEffect(400, 0, (int)& unk_800004);
}
}*/
2021-09-16 03:56:04 +03:00
Lara.uncontrollable = false;
if (item->triggerFlags == 666)
{
if (item->itemFlags[0] == 15)
{
//PlaySoundTrack("xa12_z_10", SOUND_TRACK_ONESHOT);
}
else if (item->itemFlags[0] == 70)
{
SoundEffect(SFX_TR5_LIFT_HIT_FLOOR1, 0, 0);
SoundEffect(SFX_TR5_LIFT_HIT_FLOOR2, 0, 0);
}
LaraItem->animNumber = LA_ELEVATOR_RECOVER;
LaraItem->frameNumber = g_Level.Anims[LaraItem->animNumber].frameBase;
LaraItem->goalAnimState = LS_MISC_CONTROL;
LaraItem->currentAnimState = LS_MISC_CONTROL;
item->itemFlags[0]++;
if (item->itemFlags[0] >= 150)
KillItem(itemNumber);
}
else
{
Camera.fixedCamera = true;
LaraItem->pos.xPos = item->pos.xPos;
LaraItem->pos.zPos = item->pos.zPos;
LaraItem->pos.yRot = item->pos.yRot - ANGLE(180.0f);
short roomNumber = item->roomNumber;
FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
LaraItem->pos.yPos = GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
if (LaraItem->roomNumber != roomNumber)
ItemNewRoom(Lara.itemNumber, roomNumber);
if (item->flags & ONESHOT)
{
KillItem(itemNumber);
}
else if (item->triggerFlags != 512)
{
RemoveActiveItem(itemNumber);
item->flags &= 0xC1FFu;
}
}
}