Fixed lightning draw; Improved darts emitter;

This commit is contained in:
MontyTRC89 2021-09-22 10:55:48 +02:00
parent 8428a0ae0e
commit 14d4ad67ec
12 changed files with 288 additions and 254 deletions

View file

@ -1199,81 +1199,6 @@ void TriggerWaterfallMist(int x, int y, int z, int angle)
spark->dSize = spark->size * 2;
}
void TriggerDartSmoke(int x, int y, int z, int xv, int zv, int hit)
{
int dx = LaraItem->pos.xPos - x;
int dz = LaraItem->pos.zPos - z;
if (dx < -16384 || dx > 16384 || dz < -16384 || dz > 16384)
return;
SPARKS* spark = &Sparks[GetFreeSpark()];
spark->on = 1;
spark->sR = 16;
spark->sG = 8;
spark->sB = 4;
spark->dR = 64;
spark->dG = 48;
spark->dB = 32;
spark->colFadeSpeed = 8;
spark->fadeToBlack = 4;
spark->transType = COLADD;
spark->life = spark->sLife = (GetRandomControl() & 3) + 32;
spark->x = (GetRandomControl() & 0x1F) + x - 16;
spark->y = (GetRandomControl() & 0x1F) + y - 16;
spark->z = (GetRandomControl() & 0x1F) + z - 16;
if (hit)
{
spark->xVel = GetRandomControl() - xv - 128;
spark->yVel = -4 - (GetRandomControl() & 3);
spark->zVel = GetRandomControl() - zv - 128;
}
else
{
if (xv)
spark->xVel = -xv;
else
spark->xVel = GetRandomControl() - 128;
spark->yVel = -4 - (GetRandomControl() & 3);
if (!zv)
{
spark->zVel = GetRandomControl();
}
else
spark->zVel = -zv;
}
spark->friction = 3;
if (GetRandomControl() & 1)
{
spark->flags = 538;
spark->rotAng = GetRandomControl() & 0xFFF;
if (GetRandomControl() & 1)
spark->rotAdd = -16 - (GetRandomControl() & 0xF);
else
spark->rotAdd = (GetRandomControl() & 0xF) + 16;
}
else
{
spark->flags = 522;
}
spark->scalar = 1;
int size = (GetRandomControl() & 0x3F) + 72;
if (hit)
{
spark->maxYvel = 0;
spark->sSize = spark->size = spark->dSize = size >> 3;
spark->gravity = 0;
}
else
{
spark->sSize = spark->size = size >> 4;
spark->gravity = -4 - (GetRandomControl() & 3);
spark->dSize = size;
spark->maxYvel = -4 - (GetRandomControl() & 3);
}
}
void KillAllCurrentItems(short itemNumber)
{
// TODO: Reimplement this functionality

View file

@ -217,7 +217,6 @@ void DoLotsOfBlood(int x, int y, int z, int speed, short direction, short roomNu
void TriggerUnderwaterBlood(int x, int y, int z, int sizeme);
void ControlWaterfallMist(short itemNumber);
void TriggerWaterfallMist(int x, int y, int z, int angle);
void TriggerDartSmoke(int x, int y, int z, int xv, int zv, int hit);
void KillAllCurrentItems(short itemNumber);
void TriggerDynamicLight(int x, int y, int z, short falloff, byte r, byte g, byte b);
void TriggerRocketFlame(int x, int y, int z, int xv, int yv, int zv, int itemNumber);

View file

@ -0,0 +1,234 @@
#include "framework.h"
#include "Objects/Generic/Traps/dart_emitter.h"
#include "level.h"
#include "lara.h"
#include "effects\effects.h"
#include "items.h"
#include "Sound\sound.h"
namespace TEN::Entities::Traps
{
void DartControl(short itemNumber)
{
ITEM_INFO* item = &g_Level.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
{
int oldX = item->pos.xPos;
int oldZ = item->pos.zPos-1000;
int speed = item->speed * phd_cos(item->pos.xRot);
item->pos.xPos += speed * phd_sin(item->pos.yRot);
item->pos.yPos -= item->speed * phd_sin(item->pos.xRot);
item->pos.zPos += speed * phd_cos(item->pos.yRot);
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(oldX, item->pos.yPos, oldZ, 0, 0, true);
}
KillItem(itemNumber);
}
}
}
void DartEmitterControl(short itemNumber)
{
ITEM_INFO* item = &g_Level.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 = &g_Level.Items[dartItemNumber];
dartItem->objectNumber = ID_DARTS;
dartItem->roomNumber = item->roomNumber;
int x = 0;
int z = 0;
switch (item->pos.yRot)
{
case 0:
z = WALL_SIZE / 2;
break;
case 0x4000:
x = WALL_SIZE / 2;
break;
case -0x8000:
z = -WALL_SIZE / 2;
break;
case -0x4000:
x = -WALL_SIZE / 2;
break;
}
dartItem->pos.xPos = x + item->pos.xPos;
dartItem->pos.yPos = item->pos.yPos - WALL_SIZE / 2;
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, false);
}
AddActiveItem(dartItemNumber);
dartItem->status = ITEM_ACTIVE;
SoundEffect(SFX_TR4_DART_SPITT, &dartItem->pos, 0);
}
}
void TriggerDartSmoke(int x, int y, int z, int xv, int zv, bool hit)
{
int dx = LaraItem->pos.xPos - x;
int dz = LaraItem->pos.zPos - z;
if (dx < -16384 || dx > 16384 || dz < -16384 || dz > 16384)
return;
SPARKS* spark = &Sparks[GetFreeSpark()];
spark->on = true;
spark->sR = 16;
spark->sG = 8;
spark->sB = 4;
spark->dR = 64;
spark->dG = 48;
spark->dB = 32;
spark->colFadeSpeed = 8;
spark->fadeToBlack = 4;
spark->transType = COLADD;
spark->life = spark->sLife = (GetRandomControl() & 3) + 32;
spark->x = x + ((GetRandomControl() & 31) - 16);
spark->y = y + ((GetRandomControl() & 31) - 16);
spark->z = z + ((GetRandomControl() & 31) - 16);
if (hit)
{
spark->xVel = -xv + ((GetRandomControl() & 255) - 128);
spark->yVel = -(GetRandomControl() & 3) - 4;
spark->zVel = -zv + ((GetRandomControl() & 255) - 128);
spark->friction = 3;
}
else
{
if (xv)
spark->xVel = -xv;
else
spark->xVel = ((GetRandomControl() & 255) - 128);
spark->yVel = -(GetRandomControl() & 3) - 4;
if (zv)
spark->zVel = -zv;
else
spark->zVel = ((GetRandomControl() & 255) - 128);
spark->friction = 3;
}
spark->friction = 3;
if (GetRandomControl() & 1)
{
spark->flags = SP_EXPDEF | SP_ROTATE | SP_DEF | SP_SCALE;
spark->rotAng = GetRandomControl() & 0xFFF;
if (GetRandomControl() & 1)
spark->rotAdd = -16 - (GetRandomControl() & 0xF);
else
spark->rotAdd = (GetRandomControl() & 0xF) + 16;
}
else
{
spark->flags = SP_EXPDEF | SP_DEF | SP_SCALE;
}
spark->scalar = 1;
int size = (GetRandomControl() & 63) + 72;
if (hit)
{
size >>= 1;
spark->size = spark->sSize = size >> 2;
spark->gravity = spark->maxYvel = 0;
}
else
{
spark->size = spark->sSize = size >> 4;
spark->gravity = -(GetRandomControl() & 3) - 4;
spark->maxYvel = -(GetRandomControl() & 3) - 4;
}
spark->dSize = size;
}
}

View file

@ -0,0 +1,8 @@
#pragma once
namespace TEN::Entities::Traps
{
void DartControl(short itemNumber);
void DartEmitterControl(short itemNumber);
void TriggerDartSmoke(int x, int y, int z, int xv, int zv, bool hit);
}

View file

@ -24,11 +24,15 @@
#include "steel_door.h"
#include "underwater_door.h"
// Traps
#include "Objects/Generic/Traps/dart_emitter.h"
/// necessary import
#include "setup.h"
using namespace TEN::Entities::Switches;
using namespace TEN::Entities::Doors;
using namespace TEN::Entities::Traps;
static void StartObject()
{
@ -396,8 +400,42 @@ void StartDoors()
}
}
void StartTraps()
{
OBJECT_INFO* obj;
obj = &Objects[ID_DARTS];
if (obj->loaded)
{
obj->shadowSize = UNIT_SHADOW / 2;
//obj->drawRoutine = DrawDart;
obj->collision = ObjectCollision;
obj->control = DartControl;
obj->usingDrawAnimatingItem = false;
}
obj = &Objects[ID_DART_EMITTER];
if (obj->loaded)
{
obj->control = DartEmitterControl;
obj->drawRoutine = nullptr;
obj->saveFlags = true;
obj->usingDrawAnimatingItem = false;
}
obj = &Objects[ID_HOMING_DART_EMITTER];
if (obj->loaded)
{
obj->control = DartEmitterControl;
obj->drawRoutine = nullptr;
obj->saveFlags = true;
obj->usingDrawAnimatingItem = false;
}
}
void InitialiseGenericObjects()
{
StartTraps();
StartObject();
StartSwitches();
StartDoors();

View file

@ -11,6 +11,9 @@
#include "setup.h"
#include "level.h"
#include "itemdata/creature_info.h"
#include <Objects/Generic/Traps/dart_emitter.h>
using namespace TEN::Entities::Traps;
BITE_INFO tribesmanAxeBite = { 0, 16, 265, 13 };
BITE_INFO tribesmanDartsBite1 = { 0, 0, -200, 13 };

View file

@ -1,140 +0,0 @@
#include "framework.h"
#include "tr5_dart_emitter.h"
#include "level.h"
#include "lara.h"
#include "effects\effects.h"
#include "items.h"
#include "Sound\sound.h"
void DartControl(short itemNumber)
{
ITEM_INFO* item = &g_Level.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 * phd_sin(item->pos.yRot);
item->pos.yPos -= item->speed * phd_sin(item->pos.xRot);
item->pos.xPos += item->speed * phd_cos(item->pos.yRot);
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 = &g_Level.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 = &g_Level.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.0f))
x = 512;
}
else if (item->pos.yRot < 0)
{
if (item->pos.yRot == -ANGLE(180.0f))
{
z = -512;
}
else if (item->pos.yRot == -ANGLE(90.0f))
{
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_TR4_DART_SPITT, &dartItem->pos, 0);
}
}

View file

@ -1,4 +0,0 @@
#pragma once
void DartControl(short itemNumber);
void DartEmitterControl(short itemNumber);

View file

@ -25,7 +25,6 @@
#include "tr5_rats_emitter.h"
#include "tr5_bats_emitter.h"
#include "tr5_spider_emitter.h"
#include "tr5_dart_emitter.h"
#include "tr5_smoke_emitter.h"
/// objects
#include "tr5_pushableblock.h"
@ -1145,34 +1144,6 @@ static void StartTrap(OBJECT_INFO *obj)
obj->saveAnim = true;
}
obj = &Objects[ID_DARTS];
if (obj->loaded)
{
obj->shadowSize = UNIT_SHADOW / 2;
//obj->drawRoutine = DrawDart;
obj->collision = ObjectCollision;
obj->control = DartControl;
obj->usingDrawAnimatingItem = false;
}
obj = &Objects[ID_DART_EMITTER];
if (obj->loaded)
{
obj->control = DartEmitterControl;
obj->drawRoutine = nullptr;
obj->saveFlags = true;
obj->usingDrawAnimatingItem = false;
}
obj = &Objects[ID_HOMING_DART_EMITTER];
if (obj->loaded)
{
obj->control = DartEmitterControl;
obj->drawRoutine = nullptr;
obj->saveFlags = true;
obj->usingDrawAnimatingItem = false;
}
obj = &Objects[ID_GEN_SLOT3];
if (obj->loaded)
{

View file

@ -53,7 +53,7 @@ namespace TEN::Renderer
using std::vector;
void Renderer11::drawEnergyArcs(RenderView& view) {
for (int i = 0; i < 16; i++)
for (int i = 0; Lightning.size(); i++)
{
LIGHTNING_INFO* arc = &Lightning[i];

View file

@ -154,6 +154,7 @@ xcopy /Y "$(ProjectDir)Shaders\HUD\*.hlsl" "$(TargetDir)\Shaders\HUD\"</Command>
<ClInclude Include="Objects\Effects\effect_objects.h" />
<ClInclude Include="Objects\Effects\flame_emitters.h" />
<ClInclude Include="Game\effects\lara_burn.h" />
<ClInclude Include="Objects\Generic\Traps\dart_emitter.h" />
<ClInclude Include="Objects\TR2\Vehicles\boat_info.h" />
<ClInclude Include="Game\itemdata\creature_info.h" />
<ClInclude Include="Game\itemdata\itemdata.h" />
@ -278,7 +279,6 @@ xcopy /Y "$(ProjectDir)Shaders\HUD\*.hlsl" "$(TargetDir)\Shaders\HUD\"</Command>
<ClInclude Include="Objects\TR5\Object\tr5_raisingblock.h" />
<ClInclude Include="Objects\TR5\Object\tr5_teleporter.h" />
<ClInclude Include="Objects\TR5\Switch\tr5_raisingcog.h" />
<ClInclude Include="Objects\TR5\Emitter\tr5_dart_emitter.h" />
<ClInclude Include="Objects\TR5\Object\tr5_missile.h" />
<ClInclude Include="Objects\TR5\Object\tr5_pushableblock.h" />
<ClInclude Include="Objects\TR5\Object\tr5_twoblockplatform.h" />
@ -565,6 +565,7 @@ xcopy /Y "$(ProjectDir)Shaders\HUD\*.hlsl" "$(TargetDir)\Shaders\HUD\"</Command>
<ClCompile Include="Objects\Effects\effect_objects.cpp" />
<ClCompile Include="Objects\Effects\flame_emitters.cpp" />
<ClCompile Include="Game\effects\lara_burn.cpp" />
<ClCompile Include="Objects\Generic\Traps\dart_emitter.cpp" />
<ClCompile Include="Specific\prng.cpp" />
<ClCompile Include="Game\puzzles_keys.cpp" />
<ClCompile Include="Objects\Generic\Doors\double_doors.cpp" />
@ -628,7 +629,6 @@ xcopy /Y "$(ProjectDir)Shaders\HUD\*.hlsl" "$(TargetDir)\Shaders\HUD\"</Command>
<ClCompile Include="Objects\TR5\Object\tr5_raisingblock.cpp" />
<ClCompile Include="Objects\TR5\Object\tr5_teleporter.cpp" />
<ClCompile Include="Objects\TR5\Switch\tr5_raisingcog.cpp" />
<ClCompile Include="Objects\TR5\Emitter\tr5_dart_emitter.cpp" />
<ClCompile Include="Objects\TR5\Object\tr5_twoblockplatform.cpp" />
<ClCompile Include="Objects\TR5\Trap\tr5_deathslide.cpp" />
<ClCompile Include="Objects\TR5\Trap\tr5_romehammer.cpp" />

View file

@ -94,7 +94,6 @@
<ClCompile Include="Objects\TR5\Object\tr5_raisingblock.cpp" />
<ClCompile Include="Objects\TR5\Object\tr5_teleporter.cpp" />
<ClCompile Include="Objects\TR5\Switch\tr5_raisingcog.cpp" />
<ClCompile Include="Objects\TR5\Emitter\tr5_dart_emitter.cpp" />
<ClCompile Include="Objects\TR5\Object\tr5_twoblockplatform.cpp" />
<ClCompile Include="Objects\TR5\Trap\tr5_deathslide.cpp" />
<ClCompile Include="Objects\TR5\Trap\tr5_romehammer.cpp" />
@ -316,6 +315,7 @@
<ClCompile Include="Objects\Effects\flame_emitters.cpp" />
<ClCompile Include="Objects\Effects\effect_objects.cpp" />
<ClCompile Include="Game\effects\lara_burn.cpp" />
<ClCompile Include="Objects\Generic\Traps\dart_emitter.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="framework.h" />
@ -458,7 +458,6 @@
<ClInclude Include="Objects\TR5\Object\tr5_raisingblock.h" />
<ClInclude Include="Objects\TR5\Object\tr5_teleporter.h" />
<ClInclude Include="Objects\TR5\Switch\tr5_raisingcog.h" />
<ClInclude Include="Objects\TR5\Emitter\tr5_dart_emitter.h" />
<ClInclude Include="Objects\TR5\Object\tr5_missile.h" />
<ClInclude Include="Objects\TR5\Object\tr5_pushableblock.h" />
<ClInclude Include="Objects\TR5\Object\tr5_twoblockplatform.h" />
@ -708,6 +707,7 @@
<ClInclude Include="Game\effects\lightning.h" />
<ClInclude Include="Objects\Effects\effect_objects.h" />
<ClInclude Include="Game\effects\lara_burn.h" />
<ClInclude Include="Objects\Generic\Traps\dart_emitter.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="Resources.rc" />