mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-04-28 15:57:59 +03:00
Merge branch 'develop' into renderer_refactor
This commit is contained in:
commit
bd413d00b2
5 changed files with 59 additions and 48 deletions
|
@ -796,8 +796,10 @@ namespace TEN::Entities::Player
|
|||
|
||||
bool CanLand(const ItemInfo& item, const CollisionInfo& coll)
|
||||
{
|
||||
float projVerticalVel = item.Animation.Velocity.y + GetEffectiveGravity(item.Animation.Velocity.y);
|
||||
|
||||
// 1) Check airborne status and vertical velocity.
|
||||
if (!item.Animation.IsAirborne || item.Animation.Velocity.y < 0.0f)
|
||||
if (!item.Animation.IsAirborne || projVerticalVel < 0.0f)
|
||||
return false;
|
||||
|
||||
// 2) Check for swamp.
|
||||
|
@ -809,7 +811,7 @@ namespace TEN::Entities::Player
|
|||
int vPos = item.Pose.Position.y;
|
||||
|
||||
// 3) Assess point collision.
|
||||
if ((pointColl.Position.Floor - vPos) <= item.Animation.Velocity.y) // Floor height is above projected vertical position.
|
||||
if ((pointColl.Position.Floor - vPos) <= projVerticalVel) // Floor height is above projected vertical position.
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
|
|
@ -19,6 +19,8 @@ using namespace TEN::Entities::Generic;
|
|||
using namespace TEN::Math;
|
||||
using TEN::Renderer::g_Renderer;
|
||||
|
||||
constexpr auto VERTICAL_VELOCITY_GRAVITY_THRESHOLD = CLICK(0.5f);
|
||||
|
||||
// NOTE: 0 frames counts as 1.
|
||||
static unsigned int GetNonZeroFrameCount(const AnimData& anim)
|
||||
{
|
||||
|
@ -250,7 +252,7 @@ void AnimateItem(ItemInfo* item)
|
|||
item->Animation.Velocity.z = 0.0f;
|
||||
}
|
||||
|
||||
if (item->Animation.Velocity.y > 128.0f)
|
||||
if (item->Animation.Velocity.y > VERTICAL_VELOCITY_GRAVITY_THRESHOLD)
|
||||
item->Animation.Velocity.y /= 2;
|
||||
item->Animation.Velocity.y -= item->Animation.Velocity.y / 4;
|
||||
|
||||
|
@ -260,7 +262,7 @@ void AnimateItem(ItemInfo* item)
|
|||
}
|
||||
else
|
||||
{
|
||||
item->Animation.Velocity.y += (item->Animation.Velocity.y >= 128.0f) ? 1.0f : GRAVITY;
|
||||
item->Animation.Velocity.y += GetEffectiveGravity(item->Animation.Velocity.y);
|
||||
item->Animation.Velocity.z += animAccel.z;
|
||||
|
||||
item->Pose.Position.y += item->Animation.Velocity.y;
|
||||
|
@ -268,7 +270,7 @@ void AnimateItem(ItemInfo* item)
|
|||
}
|
||||
else
|
||||
{
|
||||
item->Animation.Velocity.y += (item->Animation.Velocity.y >= 128.0f) ? 1.0f : GRAVITY;
|
||||
item->Animation.Velocity.y += GetEffectiveGravity(item->Animation.Velocity.y);
|
||||
item->Pose.Position.y += item->Animation.Velocity.y;
|
||||
}
|
||||
}
|
||||
|
@ -535,6 +537,11 @@ const AnimFrame& GetBestFrame(const ItemInfo& item)
|
|||
return ((frameData.Alpha <= 0.5f) ? *frameData.FramePtr0 : *frameData.FramePtr1);
|
||||
}
|
||||
|
||||
float GetEffectiveGravity(float verticalVel)
|
||||
{
|
||||
return ((verticalVel >= VERTICAL_VELOCITY_GRAVITY_THRESHOLD) ? 1.0f : GRAVITY);
|
||||
}
|
||||
|
||||
int GetAnimNumber(const ItemInfo& item)
|
||||
{
|
||||
const auto& object = Objects[item.Animation.AnimObjectID];
|
||||
|
|
|
@ -128,6 +128,8 @@ const AnimFrame* GetFirstFrame(GAME_OBJECT_ID objectID, int animNumber);
|
|||
const AnimFrame* GetLastFrame(GAME_OBJECT_ID objectID, int animNumber);
|
||||
const AnimFrame& GetBestFrame(const ItemInfo& item);
|
||||
|
||||
float GetEffectiveGravity(float verticalVel);
|
||||
|
||||
int GetAnimNumber(const ItemInfo& item);
|
||||
int GetAnimIndex(const ItemInfo& item, int animNumber);
|
||||
|
||||
|
|
|
@ -34,6 +34,43 @@ bool ROOM_INFO::Active() const
|
|||
( FlipStats[flipNumber] && flippedRoom == index);
|
||||
}
|
||||
|
||||
static void AddRoomFlipItems(const ROOM_INFO& room)
|
||||
{
|
||||
// Run through linked items.
|
||||
for (int itemNumber = room.itemNumber; itemNumber != NO_ITEM; itemNumber = g_Level.Items[itemNumber].NextItem)
|
||||
{
|
||||
const auto& item = g_Level.Items[itemNumber];
|
||||
const auto& object = Objects[item.ObjectNumber];
|
||||
|
||||
// Add bridges.
|
||||
if (object.GetFloorHeight != nullptr)
|
||||
UpdateBridgeItem(item);
|
||||
}
|
||||
}
|
||||
|
||||
static void RemoveRoomFlipItems(const ROOM_INFO& room)
|
||||
{
|
||||
// Run through linked items.
|
||||
for (int itemNumber = room.itemNumber; itemNumber != NO_ITEM; itemNumber = g_Level.Items[itemNumber].NextItem)
|
||||
{
|
||||
const auto& item = g_Level.Items[itemNumber];
|
||||
const auto& object = Objects[item.ObjectNumber];
|
||||
|
||||
// Kill item.
|
||||
if (item.Flags & ONESHOT &&
|
||||
item.HitPoints != NOT_TARGETABLE &&
|
||||
item.HitPoints <= 0 &&
|
||||
object.intelligent)
|
||||
{
|
||||
KillItem(itemNumber);
|
||||
}
|
||||
|
||||
// Clear bridge.
|
||||
if (Objects[item.ObjectNumber].GetFloorHeight != nullptr)
|
||||
UpdateBridgeItem(item, true);
|
||||
}
|
||||
}
|
||||
|
||||
void DoFlipMap(int group)
|
||||
{
|
||||
// Run through rooms.
|
||||
|
@ -44,25 +81,26 @@ void DoFlipMap(int group)
|
|||
// Handle flipmap.
|
||||
if (room.flippedRoom >= 0 && room.flipNumber == group)
|
||||
{
|
||||
RemoveRoomFlipItems(&room);
|
||||
|
||||
auto& flippedRoom = g_Level.Rooms[room.flippedRoom];
|
||||
|
||||
std::swap(room, flippedRoom);
|
||||
RemoveRoomFlipItems(room);
|
||||
|
||||
// Swap rooms.
|
||||
std::swap(room, flippedRoom);
|
||||
room.flippedRoom = flippedRoom.flippedRoom;
|
||||
flippedRoom.flippedRoom = NO_ROOM;
|
||||
|
||||
room.itemNumber = flippedRoom.itemNumber;
|
||||
room.fxNumber = flippedRoom.fxNumber;
|
||||
|
||||
AddRoomFlipItems(&room);
|
||||
AddRoomFlipItems(room);
|
||||
|
||||
g_Renderer.FlipRooms(roomNumber, room.flippedRoom);
|
||||
|
||||
// Update active room sectors.
|
||||
for (auto& sector : room.floor)
|
||||
sector.RoomNumber = roomNumber;
|
||||
|
||||
// Update flipped room sectors.
|
||||
for (auto& sector : flippedRoom.floor)
|
||||
sector.RoomNumber = room.flippedRoom;
|
||||
}
|
||||
|
@ -75,42 +113,6 @@ void DoFlipMap(int group)
|
|||
creature->LOT.TargetBox = NO_BOX;
|
||||
}
|
||||
|
||||
void AddRoomFlipItems(ROOM_INFO* room)
|
||||
{
|
||||
// Run through linked items.
|
||||
for (int itemNumber = room->itemNumber; itemNumber != NO_ITEM; itemNumber = g_Level.Items[itemNumber].NextItem)
|
||||
{
|
||||
const auto& item = g_Level.Items[itemNumber];
|
||||
const auto& object = Objects[item.ObjectNumber];
|
||||
|
||||
// Item is bridge; update relevant sectors.
|
||||
if (object.GetFloorHeight != nullptr)
|
||||
UpdateBridgeItem(item);
|
||||
}
|
||||
}
|
||||
|
||||
void RemoveRoomFlipItems(ROOM_INFO* room)
|
||||
{
|
||||
// Run through linked items.
|
||||
for (int itemNumber = room->itemNumber; itemNumber != NO_ITEM; itemNumber = g_Level.Items[itemNumber].NextItem)
|
||||
{
|
||||
const auto& item = g_Level.Items[itemNumber];
|
||||
const auto& object = Objects[item.ObjectNumber];
|
||||
|
||||
if (item.Flags & ONESHOT &&
|
||||
item.HitPoints != NOT_TARGETABLE &&
|
||||
item.HitPoints <= 0 &&
|
||||
object.intelligent)
|
||||
{
|
||||
KillItem(itemNumber);
|
||||
}
|
||||
|
||||
// Item is bridge; update relevant sectors.
|
||||
if (Objects[item.ObjectNumber].GetFloorHeight != nullptr)
|
||||
UpdateBridgeItem(item, true);
|
||||
}
|
||||
}
|
||||
|
||||
bool IsObjectInRoom(int roomNumber, GAME_OBJECT_ID objectID)
|
||||
{
|
||||
int itemNumber = g_Level.Rooms[roomNumber].itemNumber;
|
||||
|
|
|
@ -147,8 +147,6 @@ struct ROOM_INFO
|
|||
};
|
||||
|
||||
void DoFlipMap(int group);
|
||||
void AddRoomFlipItems(ROOM_INFO* room);
|
||||
void RemoveRoomFlipItems(ROOM_INFO* room);
|
||||
bool IsObjectInRoom(int roomNumber, GAME_OBJECT_ID objectID);
|
||||
bool IsPointInRoom(const Vector3i& pos, int roomNumber);
|
||||
int FindRoomNumber(const Vector3i& pos, int startRoomNumber = NO_ROOM);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue