summaryrefslogtreecommitdiff
path: root/src/control/Bridge.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/control/Bridge.cpp')
-rw-r--r--src/control/Bridge.cpp63
1 files changed, 44 insertions, 19 deletions
diff --git a/src/control/Bridge.cpp b/src/control/Bridge.cpp
index 1e63cf30..c1bf0369 100644
--- a/src/control/Bridge.cpp
+++ b/src/control/Bridge.cpp
@@ -6,6 +6,8 @@
#include "PathFind.h"
#include "Stats.h"
+//--LCS: file done except TODO
+
CEntity *CBridge::pLiftRoad;
CEntity *CBridge::pLiftPart;
CEntity *CBridge::pWeight;
@@ -25,14 +27,14 @@ void CBridge::Init()
{
#ifdef GTA_BRIDGE
FindBridgeEntities();
+ State = STATE_BRIDGE_LOCKED;
OldLift = -1.0f;
if (pLiftPart && pWeight)
{
DefaultZLiftPart = pLiftPart->GetPosition().z;
- DefaultZLiftWeight = pWeight->GetPosition().z;
-
if (pLiftRoad)
DefaultZLiftRoad = pLiftRoad->GetPosition().z;
+ DefaultZLiftWeight = pWeight->GetPosition().z;
ThePaths.SetLinksBridgeLights(-330.0, -230.0, -700.0, -588.0, true);
}
@@ -49,36 +51,42 @@ void CBridge::Update()
float liftHeight;
- // Set bridge height and state
- if (CStats::CommercialPassed)
- {
+ if (State == STATE_BRIDGE_LOCKED) {
+ liftHeight = 25.0f;
+ TimeOfBridgeBecomingOperational = 0;
+ }
+ else if (State == STATE_BRIDGE_ALWAYS_UNLOCKED) {
+ liftHeight = 0.0f;
+ TimeOfBridgeBecomingOperational = CTimer::GetTimeInMilliseconds() - 20001;
+ }
+ else {
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;
+ // this time cycle duration is 0x20000, so ~2:11
+ uint32 timeElapsed = (CTimer::GetTimeInMilliseconds() - TimeOfBridgeBecomingOperational) % 0x20000;
// Calculate lift part height and bridge state
- if (timeElapsed < 10000)
+ if (timeElapsed < 20000)
{
State = STATE_LIFT_PART_MOVING_DOWN;
- liftHeight = 25.0f - timeElapsed / 10000.0f * 25.0f;
+ liftHeight = 25.0f - timeElapsed / 20000.0f * 25.0f;
}
- else if (timeElapsed < 40000)
+ else if (timeElapsed < 80000)
{
liftHeight = 0.0f;
State = STATE_LIFT_PART_IS_DOWN;
}
- else if (timeElapsed < 50000)
+ else if (timeElapsed < 90000)
{
liftHeight = 0.0f;
State = STATE_LIFT_PART_ABOUT_TO_MOVE_UP;
}
- else if (timeElapsed < 60000)
+ else if (timeElapsed < 110000)
{
State = STATE_LIFT_PART_MOVING_UP;
- liftHeight = (timeElapsed - 50000) / 10000.0f * 25.0f;
+ liftHeight = (timeElapsed - 90000) / 20000.0f * 25.0f;
}
else
{
@@ -86,12 +94,7 @@ void CBridge::Update()
State = STATE_LIFT_PART_IS_UP;
}
}
- else
- {
- liftHeight = 25.0f;
- TimeOfBridgeBecomingOperational = 0;
- State = STATE_BRIDGE_LOCKED;
- }
+
// Move bridge part
if (liftHeight != OldLift)
@@ -112,6 +115,8 @@ void CBridge::Update()
OldLift = liftHeight;
}
+ // TODO(LCS): cWorldStream
+
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)
@@ -161,3 +166,23 @@ bool CBridge::ThisIsABridgeObjectMovingUp(int index)
return false;
#endif
}
+
+void CBridge::ForceBridgeState(uint8 state)
+{
+#ifdef GTA_BRIDGE
+ State = state;
+ switch (state)
+ {
+ case STATE_BRIDGE_LOCKED:
+ case STATE_LIFT_PART_MOVING_DOWN:
+ case STATE_LIFT_PART_ABOUT_TO_MOVE_UP:
+ ThePaths.SetLinksBridgeLights(-330.0f, -230.0f, -700.0f, -588.0f, true);
+ break;
+ case STATE_BRIDGE_ALWAYS_UNLOCKED:
+ ThePaths.SetLinksBridgeLights(-330.0f, -230.0f, -700.0f, -588.0f, false);
+ break;
+ default:
+ break;
+ }
+#endif
+} \ No newline at end of file