TURBULENCE — Immediate Next Steps (Concrete, Non-Abstract)
Exact implementation checklist for the next 3-5 sessions
This is intentionally tactical. Each step has:
- exact file(s) to create/edit
- what to paste/build
- test to run before moving on
Session 1 (2-3 hours): Plane Tilt Greybox + Sliding Props
Step 1. Create scene and hierarchy
Create scene: Assets/Scenes/Flight_BudgetLiner_Greybox.unity
Hierarchy:
FlightRootPlaneRootPlaneInterior(cube floor + wall cubes)PlaneLooseProps(empty)
SystemsSpawnPoints
Step 2. Add 12 loose rigidbodies
Create 12 cubes/capsules as props under PlaneLooseProps.
For each prop:
- Rigidbody: Mass 2
- Drag 0
- Angular Drag 0.05
- Collision Detection: Continuous Dynamic
Step 3. Create PlaneTiltDebugController.cs
Path: Assets/Scripts/StormScape/Turbulence/Plane/PlaneTiltDebugController.cs
Implement:
- Q/E controls roll target
- R/F controls pitch target
- smooth damp current rotation to target
- apply to
PlaneRoottransform
Pseudo core:
[SerializeField] Transform planeRoot;
[SerializeField] float maxRoll = 25f;
[SerializeField] float maxPitch = 10f;
[SerializeField] float tiltSpeed = 4f;
void Update()
{
float rollInput = (Input.GetKey(KeyCode.E) ? 1 : 0) - (Input.GetKey(KeyCode.Q) ? 1 : 0);
float pitchInput = (Input.GetKey(KeyCode.R) ? 1 : 0) - (Input.GetKey(KeyCode.F) ? 1 : 0);
targetRoll = Mathf.Clamp(targetRoll + rollInput * 25f * Time.deltaTime, -maxRoll, maxRoll);
targetPitch = Mathf.Clamp(targetPitch + pitchInput * 15f * Time.deltaTime, -maxPitch, maxPitch);
var target = Quaternion.Euler(targetPitch, 0f, -targetRoll);
planeRoot.rotation = Quaternion.Slerp(planeRoot.rotation, target, 1f - Mathf.Exp(-tiltSpeed * Time.deltaTime));
}
Step 4. Test gate
PASS only if:
- props slide naturally when banking > 10°
- no explosive physics jitter
- returning to level stabilizes props
Do not move on if this fails.
Session 2 (2-3 hours): Turbulence pulses + player impact into dazed
Step 1. Add TurbulencePulseController.cs
Path: Assets/Scripts/StormScape/Turbulence/Plane/TurbulencePulseController.cs
Fields:
float minInterval = 1.5ffloat maxInterval = 3.5ffloat linearImpulseMin = 1.5ffloat linearImpulseMax = 4.0fRigidbody[] affectedBodies
Behavior:
- coroutine loops forever
- waits random interval
- picks random impulse direction biased by plane right/forward
- applies
AddForce(impulse, ForceMode.Impulse)to props
Step 2. Wire into existing PlayerImpactReceiver
No architecture changes yet. Just confirm impact thresholds hit from turbulence-object collisions. Set start thresholds:
- dazeThreshold = 6
- unconsciousThreshold = 11.5
Step 3. Add quick debug overlay
Create tiny OnGUI in scene showing:
- last impulse magnitude
- current player state
- last impact magnitude
Step 4. Test gate
PASS if:
- turbulence causes occasional daze state in < 90 seconds
- unconscious can still happen from heavy object impact
- no permanent lock in dazed/unconscious
Session 3 (3-4 hours): Engine crisis chain skeleton (host-only local for now)
Step 1. Create enums + runtime classes
Create:
Assets/Scripts/StormScape/Turbulence/Crisis/CrisisType.csAssets/Scripts/StormScape/Turbulence/Crisis/CrisisState.csAssets/Scripts/StormScape/Turbulence/Crisis/CrisisRuntime.cs
Enums:
EngineOverheatEngineFireEngineFailure
States:
InactiveActiveResolvedEscalated
Step 2. Create SimpleCrisisManager.cs
Path: Assets/Scripts/StormScape/Turbulence/Crisis/SimpleCrisisManager.cs
MVP logic only:
- Start in Overheat after 20s
- If unresolved 35s -> Fire
- If unresolved 40s -> Failure
- If Fire resolved -> end chain
Step 3. Add world marker objects
In scene, create:
EnginePanel_OverheatMarker(yellow emissive cube)EnginePanel_FireMarker(red emissive + particle)
Manager toggles markers by crisis state.
Step 4. Test gate
PASS if:
- chain progresses by timer automatically
- resolving fire prevents failure
- failure state locks and persists
Session 4 (4-5 hours): Grab extinguisher + repair interaction
Step 1. Create extinguisher prefab
Use current grabbable system.
Prefab path: Assets/Prefabs/Items/Extinguisher.prefab
Set ItemData:
- carryMode: OneHanded
- throw multiplier: 0.8
- mass: 3
Step 2. Create EngineRepairInteractable.cs
Path: Assets/Scripts/StormScape/Turbulence/Crisis/EngineRepairInteractable.cs
Implements IInteractable.
Rules:
- CanInteract only if active crisis == EngineFire
- Requires player currently holding Extinguisher item
- Hold interact accumulates progress
- 6 seconds total resolve time
- interrupt resets 50% progress decay/sec (not full instant reset)
Step 3. Hook to SimpleCrisisManager
ResolveEngineFire(float amount)API- called every interact tick while valid
Step 4. Test gate
PASS if:
- player can grab extinguisher
- hold interaction visibly progresses
- releasing interact slows/loses progress
- full progress resolves fire
Session 5 (3-4 hours): Convert these systems to host-authoritative NGO
Step 1. Make SimpleCrisisManager a NetworkBehaviour
- host writes crisis state NetworkVariable
- clients read-only
Step 2. Interaction requests via ServerRpc
In interactor:
- client sends StartInteractServerRpc(targetNetId)
- host validates target + tool + range
- host ticks progress
Step 3. Grabbable authority fix
Do not attach carry joint until ownership confirmed. Implement pending state:
- request ownership
- wait callback
OnOwnershipChanged - then attach joint
Step 4. Sync minimal UI
Client UI reads network crisis state and progress.
Step 5. Test gate (host+1 client)
PASS if:
- both see same crisis phase/timers
- client can repair and host state updates
- no duplicate ownership on extinguisher
- landing result (even placeholder) matches both clients
Fast Fallback Plan (if blocked)
If networking blocks progress, do this for 1 day:
- Finish all logic single-player host-side
- add extensive debug logs
- then wrap with NGO
Never debug networking + game logic unknowns at same time.
Minimal Script List You Should Have After This
PlaneTiltDebugController.csTurbulencePulseController.csSimpleCrisisManager.csEngineRepairInteractable.csCrisisRuntime.csCrisisType.csCrisisState.cs
If these are in and passing gates, you have a real MVP slice.
What to send me after Session 5
Send:
- screenshot of hierarchy
- screenshot of inspector values for thresholds
- 30-60s clip of host+client crisis repair
- any console errors
Then I’ll give you a focused tuning pass and next exact steps (electrical chain + blackout).