mirror of
https://gitlab.com/shinovon/re3-symbian.git
synced 2026-05-23 01:57:21 +03:00
Initial commit
This commit is contained in:
commit
77cdaaf97e
827 changed files with 418745 additions and 0 deletions
149
src/control/Bridge.cpp
Normal file
149
src/control/Bridge.cpp
Normal file
|
|
@ -0,0 +1,149 @@
|
|||
#include "common.h"
|
||||
|
||||
#include "Bridge.h"
|
||||
#include "Pools.h"
|
||||
#include "ModelIndices.h"
|
||||
#include "PathFind.h"
|
||||
#include "Stats.h"
|
||||
|
||||
CEntity *CBridge::pLiftRoad;
|
||||
CEntity *CBridge::pLiftPart;
|
||||
CEntity *CBridge::pWeight;
|
||||
|
||||
int CBridge::State;
|
||||
int CBridge::OldState;
|
||||
|
||||
float CBridge::DefaultZLiftPart;
|
||||
float CBridge::DefaultZLiftRoad;
|
||||
float CBridge::DefaultZLiftWeight;
|
||||
|
||||
float CBridge::OldLift;
|
||||
|
||||
uint32 CBridge::TimeOfBridgeBecomingOperational;
|
||||
|
||||
void CBridge::Init()
|
||||
{
|
||||
FindBridgeEntities();
|
||||
OldLift = -1.0f;
|
||||
if (pLiftPart && pWeight)
|
||||
{
|
||||
DefaultZLiftPart = pLiftPart->GetPosition().z;
|
||||
DefaultZLiftWeight = pWeight->GetPosition().z;
|
||||
|
||||
if (pLiftRoad)
|
||||
DefaultZLiftRoad = pLiftRoad->GetPosition().z;
|
||||
|
||||
ThePaths.SetLinksBridgeLights(-330.0, -230.0, -700.0, -588.0, true);
|
||||
}
|
||||
}
|
||||
|
||||
void CBridge::Update()
|
||||
{
|
||||
if (!pLiftPart || !pWeight)
|
||||
return;
|
||||
|
||||
OldState = State;
|
||||
|
||||
float liftHeight;
|
||||
|
||||
// Set bridge height and state
|
||||
if (CStats::CommercialPassed)
|
||||
{
|
||||
if (TimeOfBridgeBecomingOperational == 0)
|
||||
TimeOfBridgeBecomingOperational = CTimer::GetTimeInMilliseconds();
|
||||
|
||||
// Time remaining for bridge to become operational
|
||||
// uint16, so after about a minute it overflows to 0 and the cycle repeats
|
||||
uint16 timeElapsed = CTimer::GetTimeInMilliseconds() - TimeOfBridgeBecomingOperational;
|
||||
|
||||
// Calculate lift part height and bridge state
|
||||
if (timeElapsed < 10000)
|
||||
{
|
||||
State = STATE_LIFT_PART_MOVING_DOWN;
|
||||
liftHeight = 25.0f - timeElapsed / 10000.0f * 25.0f;
|
||||
}
|
||||
else if (timeElapsed < 40000)
|
||||
{
|
||||
liftHeight = 0.0f;
|
||||
State = STATE_LIFT_PART_IS_DOWN;
|
||||
}
|
||||
else if (timeElapsed < 50000)
|
||||
{
|
||||
liftHeight = 0.0f;
|
||||
State = STATE_LIFT_PART_ABOUT_TO_MOVE_UP;
|
||||
}
|
||||
else if (timeElapsed < 60000)
|
||||
{
|
||||
State = STATE_LIFT_PART_MOVING_UP;
|
||||
liftHeight = (timeElapsed - 50000) / 10000.0f * 25.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
liftHeight = 25.0f;
|
||||
State = STATE_LIFT_PART_IS_UP;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
liftHeight = 25.0f;
|
||||
TimeOfBridgeBecomingOperational = 0;
|
||||
State = STATE_BRIDGE_LOCKED;
|
||||
}
|
||||
|
||||
// Move bridge part
|
||||
if (liftHeight != OldLift)
|
||||
{
|
||||
pLiftPart->GetMatrix().GetPosition().z = DefaultZLiftPart + liftHeight;
|
||||
pLiftPart->GetMatrix().UpdateRW();
|
||||
pLiftPart->UpdateRwFrame();
|
||||
if (pLiftRoad)
|
||||
{
|
||||
pLiftRoad->GetMatrix().GetPosition().z = DefaultZLiftRoad + liftHeight;
|
||||
pLiftRoad->GetMatrix().UpdateRW();
|
||||
pLiftRoad->UpdateRwFrame();
|
||||
}
|
||||
pWeight->GetMatrix().GetPosition().z = DefaultZLiftWeight - liftHeight;
|
||||
pWeight->GetMatrix().UpdateRW();
|
||||
pWeight->UpdateRwFrame();
|
||||
|
||||
OldLift = liftHeight;
|
||||
}
|
||||
|
||||
if (State == STATE_LIFT_PART_ABOUT_TO_MOVE_UP && OldState == STATE_LIFT_PART_IS_DOWN)
|
||||
ThePaths.SetLinksBridgeLights(-330.0, -230.0, -700.0, -588.0, true);
|
||||
else if (State == STATE_LIFT_PART_IS_DOWN && OldState == STATE_LIFT_PART_MOVING_DOWN)
|
||||
ThePaths.SetLinksBridgeLights(-330.0, -230.0, -700.0, -588.0, false);
|
||||
}
|
||||
|
||||
bool CBridge::ShouldLightsBeFlashing()
|
||||
{
|
||||
return State != STATE_LIFT_PART_IS_DOWN;
|
||||
}
|
||||
|
||||
void CBridge::FindBridgeEntities()
|
||||
{
|
||||
pWeight = nil;
|
||||
pLiftRoad = nil;
|
||||
pLiftPart = nil;
|
||||
|
||||
for (int i = CPools::GetBuildingPool()->GetSize()-1; i >= 0; i--) {
|
||||
CBuilding* entry = CPools::GetBuildingPool()->GetSlot(i);
|
||||
if (entry)
|
||||
{
|
||||
if (entry->GetModelIndex() == MI_BRIDGELIFT)
|
||||
pLiftPart = entry;
|
||||
else if (entry->GetModelIndex() == MI_BRIDGEROADSEGMENT)
|
||||
pLiftRoad = entry;
|
||||
else if (entry->GetModelIndex() == MI_BRIDGEWEIGHT)
|
||||
pWeight = entry;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CBridge::ThisIsABridgeObjectMovingUp(int index)
|
||||
{
|
||||
if (index != MI_BRIDGEROADSEGMENT && index != MI_BRIDGELIFT)
|
||||
return false;
|
||||
|
||||
return State == STATE_LIFT_PART_ABOUT_TO_MOVE_UP || State == STATE_LIFT_PART_MOVING_UP;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue