TURBULENCE — MVP Build Plan (Crisis + Plane + Systems)
Step-by-step implementation plan for a playable vertical slice
Target: prove the core fun in 2-3 weeks
1) Goal of this Plan
This plan is for one thing:
Build a testable MVP slice where 2-4 players are inside a greyboxed plane, the plane tilts/turbulates, one crisis chain happens, players must fix it, and then land or crash.
If this loop is fun, keep building. If not, pivot early.
2) MVP Success Criteria (Definition of Done)
A build counts as MVP-complete only if all are true:
- Host + 1 client can join and play a full 5-minute flight.
- Plane supports tilt + turbulence with objects sliding.
- One complete crisis chain exists:
- Engine Overheat → Engine Fire → Engine Failure.
- Players can:
- move,
- grab/carry tools,
- perform a repair interaction,
- get ragdolled/unconscious from impacts.
- Landing result screen resolves to one of:
- Safe Landing,
- Rough Landing,
- Crash.
- Flight ends with a simple score summary.
If any point fails, do not add content. Fix foundation first.
3) Scope Guardrails (Hard Rules)
For this MVP:
- One plane only: Budget Liner greybox.
- One route: straight pseudo-route (no world streaming).
- One crisis chain only (engine line).
- No cosmetics, no progression, no NPC passengers yet.
- No custom netcode tricks beyond NGO host-authoritative baseline.
You are validating gameplay, not shipping content.
4) Architecture Snapshot for MVP
4.1 Runtime Ownership
- Host is authoritative for:
- plane state,
- crisis state,
- physics object truth,
- landing outcome.
- Client owns:
- input,
- camera,
- local FX/audio presentation.
4.2 Core Runtime Systems for MVP
PlaneController(host): orientation, turbulence impulses, flight phase.PlaneSubsystems(host): engine temp/health/failure state.CrisisManager(host): spawns and advances engine crisis chain.RepairInteractable(host validated): hold-to-repair.GrabSystem(owner request, host validated): tools + extinguisher.ImpactReceiver/StateController: daze/unconscious from collisions.LandingEvaluator(host): computes final result.FlightOrchestrator: sequence (Boarding → Flight → Landing → Result).
5) ECM2 + Gravity Plan (Important)
You're using ECM2 (Easy Character Movement 2). The critical challenge is airplane tilt + gravity behavior.
5.1 What to do for MVP
Use hybrid gravity approach:
- Keep world gravity at normal
Physics.gravity = (0, -9.81, 0). - Rotate the plane interior root transform to simulate bank/pitch.
- For ECM2 characters:
- drive character movement relative to plane interior orientation,
- apply custom "ground alignment" via floor normal checks,
- preserve simple movement first (don't over-customize ECM2 internals yet).
This avoids rewriting the controller while still getting sliding and tilt.
5.2 ECM2 Integration Steps
- Keep your existing
TurbulenceCharacteras movement owner. - Add
PlaneReferenceProviderto player on spawn:- gives access to current plane interior transform.
- In movement update:
- compute movement input in camera space,
- project onto plane interior's local "walk plane".
- Add
CharacterGravityAdapter:- when inside plane: use down vector =
-planeInterior.upfor grounding checks (visual/orientation logic), - physics remains world gravity for rigidbodies.
- when inside plane: use down vector =
- Validate edge cases:
- steep bank (~25°),
- severe bank (~40°),
- turbulence impulse while airborne.
5.3 Future (not MVP)
Post-MVP, if needed:
- full custom gravity vector support in ECM2,
- local gravity zones (inside vs wing exterior),
- suction/breach directional force fields.
6) Greyboxing the Aircraft (Step-by-step)
6.1 Scene and hierarchy
Create scene: Flight_BudgetLiner_Greybox.unity
Hierarchy:
FlightRoot
PlaneRoot
PlaneVisual_Greybox
CockpitZone
FirstClassZone
EconomyZone
CargoZone
WingAccessZone
PlanePhysicsRoot
LoosePropsRoot
SystemsRoot
FlightOrchestrator
CrisisManager
PlaneSubsystems
LandingEvaluator
SpawnRoot
PlayerSpawn_Host
PlayerSpawn_Client1
PlayerSpawn_Client2
PlayerSpawn_Client3
DebugRoot
DebugFlightUI
6.2 Dimensions (use these numbers first)
- Cabin length: 24m
- Cabin width: 3.6m
- Cabin height: 2.4m
- Aisle width: 0.9m
- Seat block height: 1.1m
- Cargo hold tunnel height: 1.8m
Use primitives only:
- Cubes for walls/floor/seats.
- Capsule blockers for aisle tests.
6.3 Critical colliders
- Continuous floor collider (single mesh collider or tiled boxes).
- Seat colliders (simplified, not high poly).
- Doorway colliders for bottlenecks.
- Cargo hatch opening with trigger for zone switching.
6.4 Greybox interaction anchors
Place empties:
EnginePanel_A_AnchorExtinguisherWallMount_AToolboxAnchor_ARepairStation_ACockpitYokeAnchor
These anchors become prefab references later.
7) Plane and Flight Phase System
7.1 Flight phases (MVP)
Boarding (20s)
-> Cruise (120s)
-> CrisisEscalation (120s)
-> Landing (40s)
-> Results
7.2 FlightOrchestrator implementation
Responsibilities:
- Start phase timers.
- Notify CrisisManager of phase changes.
- Trigger turbulence intensity profile.
- Trigger landing mode at the end.
Pseudo-structure:
public enum FlightPhase { Boarding, Cruise, CrisisEscalation, Landing, Results }
public class FlightOrchestrator : NetworkBehaviour
{
[SerializeField] private PlaneController plane;
[SerializeField] private CrisisManager crises;
[SerializeField] private LandingEvaluator landing;
private NetworkVariable<FlightPhase> currentPhase = new(...);
public override void OnNetworkSpawn()
{
if (!IsServer) return;
StartCoroutine(RunFlightLoop());
}
private IEnumerator RunFlightLoop() { ... }
}
7.3 PlaneController (MVP behavior)
Host updates at FixedUpdate:
- Base cruise attitude target: slight nose up (+2°).
- Apply pilot input (if player is in cockpit seat).
- Apply turbulence offsets from profile.
- Apply damage penalties (engine fail adds roll drift).
- Smooth orientation with damping.
Output:
- synced plane transform,
- current speed scalar,
- stability scalar.
8) Crisis System (MVP Engine Chain)
8.1 Crisis chain definition
Single chain:
-
EngineOverheat
- starts during Cruise/CrisisEscalation.
- if unresolved in 35s -> EngineFire.
-
EngineFire
- active flames + alarm.
- can be resolved by extinguisher interaction (hold spray 6s cumulative).
- if unresolved in 40s -> EngineFailure.
-
EngineFailure
- permanent for this run.
- plane gets roll bias and reduced control authority.
8.2 CrisisDefinitionSO for MVP
Create 3 assets:
CD_EngineOverheatCD_EngineFireCD_EngineFailure
Fields needed now:
iddisplayNamedurationToEscalaterequiredToolTyperesolveDurationnextCrisisId
8.3 CrisisManager host flow
- On phase enter
Cruise, scheduleEngineOverheatafter random 20-40s. - Keep dictionary of active crises.
- Tick each active crisis:
- check resolve progress,
- check escalation timer,
- transition if needed.
- Emit events for audio/UI.
8.4 repair interaction path
Flow:
- Player grabs extinguisher.
- Player targets
EnginePanelRepairInteractable. - Hold interact starts repair stream.
- Progress accumulates only while:
- correct tool equipped,
- in range,
- uninterrupted.
- On completion:
- host resolves
EngineFire.
- host resolves
9) Plane Subsystems (MVP)
Create PlaneSubsystems with only engine for now:
EngineSubsystem
temperature (0-100)
health (0-100)
state: Normal / Overheat / Fire / Failed
Rules:
- Overheat increases temp steadily.
- Fire decreases health steadily.
- Failed sets health = 0 and locks state.
Expose to other systems:
GetEngineState()ApplyEngineExtinguish(delta)IsEngineFailed
10) Tools + Interaction Integration
10.1 MVP tools
Only two tools needed:
- Extinguisher (functional)
- Wrench (dummy placeholder for future)
10.2 Grab system rules
- One held item max for MVP.
- Ownership request must be confirmed before attach joint.
- Drop on unconscious.
- Throw velocity capped.
10.3 Interaction raycast
PlayerInteractor:
- Raycast from camera center.
- Detect
IInteractable. - Show prompt (
Use,Repair,Revive). - Start/stop interaction via input hold.
11) Turbulence and Impact (MVP)
11.1 turbulence profiles
Create 3 ScriptableObjects:
TP_Light: impulse 1-2 m/s, interval 2.5-4.0sTP_Medium: impulse 2-4 m/s, interval 1.4-2.8sTP_Severe: impulse 4-7 m/s, interval 0.8-1.6s
11.2 application
Host each turbulence pulse:
- offset plane orientation a bit,
- apply impulse to loose rigidbodies,
- notify players for camera shake event.
11.3 impact thresholds (starting values)
In PlayerImpactReceiver:
- Daze at impact magnitude >= 6.0
- Unconscious at impact magnitude >= 11.5
- Impact cooldown: 0.35s
Tune after first playtest.
12) Landing System (MVP)
12.1 simplified landing evaluator
Inputs:
- vertical speed at touchdown
- roll angle at touchdown
- engine failed?
- unresolved critical crisis?
Outcome table:
-
Safe Landing:
- vertical speed < 4.5
- roll < 10°
- no unresolved fire
-
Rough Landing:
- vertical speed < 8.0
- roll < 20°
-
Crash:
- everything else
12.2 landing sequence
When entering Landing phase:
- reduce turbulence to medium,
- enable runway trigger collider zone,
- collect touchdown metrics for 5s,
- finalize result.
13) Multiplayer Test Matrix (for this MVP)
13.1 mandatory tests
- Host + 1 client join flight.
- Client can grab extinguisher and repair fire.
- Host can grab extinguisher and repair fire.
- Ownership handoff on dropped item works both ways.
- Turbulence causes both players to desync-check visually acceptable.
- One player goes unconscious; revives and recovers.
- Flight completes and both see same landing result.
13.2 known acceptable imperfections in MVP
- Minor ragdoll mismatch between client and host.
- Occasional item micro-jitter while carried.
- UI prompts slightly delayed under high ping.
Not acceptable:
- duplicate item ownership,
- crisis resolved on one client but not host,
- player stuck unconscious forever,
- mismatch in final landing result.
14) Step-by-step Build Order (Do this exactly)
Phase A — Greybox + Plane Core (2-3 days)
- Build
Flight_BudgetLiner_Greyboxscene. - Add PlaneRoot and interior primitives.
- Add spawn points.
- Add PlaneController that can tilt with debug keys.
- Validate sliding props behavior.
Checkpoint A:
- You can walk in cabin and see objects slide when plane banks.
Phase B — Flight Loop (2 days)
- Add
FlightOrchestratorwith phase timers. - Add debug UI showing current phase and timer.
- Add transition to landing and result screen.
Checkpoint B:
- Full timed loop runs with no crises yet.
Phase C — Crisis Chain (3 days)
- Implement
PlaneSubsystemsengine state. - Implement
CrisisManagerminimal runtime. - Add Overheat->Fire->Failure chain.
- Add alarm/audio hooks.
Checkpoint C:
- Crisis escalates automatically if ignored.
Phase D — Tool + Repair (2 days)
- Place extinguisher prefab.
- Integrate grab + ownership-confirm attach.
- Add engine repair interactable.
- Complete fire suppression flow.
Checkpoint D:
- Player can prevent engine failure by correct interaction.
Phase E — Turbulence + Impact + States (2 days)
- Add turbulence profiles and pulses.
- Wire impact receiver thresholds.
- Ensure dazed/unconscious transitions work.
- Drop held item on unconscious.
Checkpoint E:
- Turbulence materially disrupts repairs.
Phase F — Multiplayer Validation (2-3 days)
- Run full host/client tests matrix.
- Fix authority/race bugs.
- Add debug logs for ownership/crisis transitions.
Checkpoint F:
- Stable 5-minute host+client run.
15) Debugging Tools You Should Add Immediately
- Plane Debug Panel
- phase, tilt, turbulence profile, speed
- Crisis Debug Panel
- active crises, timers, escalate ETA
- Network Debug Panel
- object owner IDs, ping, packet loss
- Player State Panel
- state type, impact magnitude, held item
These should be toggled with F1/F2/F3 for rapid iteration.
16) Risks and Mitigations
Risk 1: ECM2 + tilted floor weirdness
Mitigation:
- Start with moderate max bank (<= 25°) in MVP.
- Keep severe roll only for short pulses.
- Tune grounding and step offsets against slopes.
Risk 2: grab ownership race bugs
Mitigation:
- enforce ownership-confirm callback before joint attach.
- add timeout fallback (cancel pending grab).
Risk 3: crisis feels like UI task, not physical chaos
Mitigation:
- ensure repair station is not trivial to stand at.
- place it where turbulence causes movement disruption.
- require repositioning during interaction.
Risk 4: MVP too broad
Mitigation:
- if behind schedule, cut:
- wrench,
- revive interaction,
- client-side fancy effects.
- Keep core loop only.
17) Deliverables Checklist (what to commit)
By end of MVP slice:
-
Flight_BudgetLiner_Greybox.unity -
PlaneController.cs -
FlightOrchestrator.cs -
PlaneSubsystems.cs -
CrisisManager.cs -
CrisisDefinitionSOassets x3 -
TurbulenceProfileSOassets x3 -
EngineRepairInteractable.cs - Working extinguisher prefab + item data
- Landing result panel
- Debug overlays (phase/crisis/network/player)
- Test report markdown with pass/fail for matrix
18) First Playtest Script (30 minutes)
- Run host + client.
- Start flight.
- Do nothing for first crisis and observe escalation.
- Restart and attempt repair with extinguisher.
- Introduce turbulence severe mode mid-repair.
- Test unconscious via thrown object impact.
- Complete landing.
- Review:
- Was it chaotic?
- Was it readable?
- Did both players feel useful?
If answer to any is no, tune before adding any new features.
19) Next Step after MVP slice passes
Only then move to:
- second crisis chain (electrical/blackout),
- second tool (wire cutters),
- basic passenger NPCs,
- better cockpit interactions.
Do not expand before this MVP is fun.
Final Note
This plan is deliberately strict. It gets you to proof-of-fun fast.
You are not building the full game yet. You are proving this sentence:
"Two players inside a tilting plane trying to stop an engine fire is chaotic and fun enough to carry the game."