# Atlantis A/V Sequence Map

This map is the implementation bridge between the dialing state machine and the two v2 controllers:

- stargate_lights_controller_v2.lsl
- stargate_sound_controller_v2.lsl

Use these events from your gate sequencer to keep visuals and audio synchronized.

## Event To Command Map

| Sequencer Event | Light Command | Sound Command | Notes |
|---|---|---|---|
| gate_boot | SG_LIGHT num=0 payload=OFF | none | Reset all chevrons to dark state |
| dial_begin | SG_LIGHT num=0 payload=OFF | SG_SOUND payload=INTERFERENCE\|0.35 | Optional low startup ambience |
| symbol_charge(i) | SG_LIGHT num=i payload=CHARGE | none | Called before symbol lock |
| symbol_lock(i) | SG_LIGHT num=i payload=LOCK | SG_SOUND payload=CHEV_LOCK\|0.95 | Main Atlantis chevron snap |
| incoming_lock(i) | SG_LIGHT num=i payload=LOCK | SG_SOUND payload=CHEV_INCOMING\|0.9 | Distinct incoming effect |
| route_authorizing | SG_LIGHT num=0 payload=CHARGE | none | Brief hold before final open |
| route_authorized | SG_LIGHT num=0 payload=ACTIVE | SG_SOUND payload=GATE_ACTIVE\|0.8 | Open/event-horizon stage |
| wormhole_active_loop | SG_LIGHT num=0 payload=ACTIVE | SG_SOUND payload=GATE_ACTIVE\|LOOP\|0.55 | Optional sustained hum loop |
| manual_abort | SG_LIGHT num=0 payload=OFF | SG_SOUND payload=GATE_CLOSE\|0.9 | User canceled dial |
| timeout_close | SG_LIGHT num=0 payload=OFF | SG_SOUND payload=GATE_CLOSE\|0.9 | Normal close at session end |
| dial_denied | SG_LIGHT num=0 payload=FAIL | SG_SOUND payload=DIAL_FAILED\|1.0 | Authorization failure |
| power_denied | SG_LIGHT num=0 payload=FAIL | SG_SOUND payload=DIAL_FAILED\|1.0 | Missing/empty ZPM path |
| close_cleanup | SG_LIGHT num=0 payload=OFF | SG_SOUND payload=STOP | Stop looped hum and reset |

## Suggested Timing Defaults

Use these as start values and tune in OpenSimulator testing:

- startup_delay_seconds: 0.6
- symbol_step_seconds: 1.0
- lock_flash_seconds: 0.35
- route_auth_timeout_seconds: 3.0
- open_effect_seconds: 1.8
- active_session_seconds: 60
- failure_hold_seconds: 2.5
- shutdown_seconds: 1.2

## Sequencer Pseudocode

```lsl
// Reset
llMessageLinked(LINK_SET, 0, "SG_LIGHT", "OFF");

// Start dialing
integer i = 1;
for (; i <= symbolCount; ++i)
{
    llMessageLinked(LINK_SET, i, "SG_LIGHT", "CHARGE");
    llSleep(0.35);

    llMessageLinked(LINK_SET, i, "SG_LIGHT", "LOCK");
    llMessageLinked(LINK_SET, 0, "SG_SOUND", "CHEV_LOCK|0.95");
    llSleep(1.0);
}

// Authorize route against backend
if (authorized)
{
    llMessageLinked(LINK_SET, 0, "SG_LIGHT", "ACTIVE");
    llMessageLinked(LINK_SET, 0, "SG_SOUND", "GATE_ACTIVE|0.8");
    llMessageLinked(LINK_SET, 0, "SG_SOUND", "GATE_ACTIVE|LOOP|0.55");
}
else
{
    llMessageLinked(LINK_SET, 0, "SG_LIGHT", "FAIL");
    llMessageLinked(LINK_SET, 0, "SG_SOUND", "DIAL_FAILED|1.0");
}
```

## Integration Notes

- Use one source of truth for state in the gate controller. Lights and sounds should react to state changes, not decide them.
- Keep looped sounds explicit. Always issue SG_SOUND STOP during shutdown.
- For incoming wormholes, skip local symbol stepping and only play incoming lock and open states.
- If API authorization times out, force fail state then cooldown before returning to OFF.
