Sequences Helper
The Sequences helper file in SOMA is script/helpers/helper_sequences.hps.
Sequence helpers divide an event function into ordered steps using a cSequenceStatesData object. Sequence_Begin prepares the state check, Sequence_DoStepAndWait runs one step and schedules the next, and Sequence_End resets a sequence after its steps finish. The source warns that the whole sequence function runs again for each step.
Follow the wake-up sequence
The Tau Escape map stores one cSequenceStatesData object for this sequence and uses the sequence function’s own name in Sequence_Begin. Each if / else if condition selects a step. The delay belongs to the step that just ran: 0.25 before the sound step, then 6 before the fade-in step, then 5 before the timer step. Sequence_End completes the state check.
cSequenceStatesData mSeqWakeUp;
void Seq_WakeUp(const tString &in asX)
{
Sequence_Begin("Seq_WakeUp", mSeqWakeUp);
if (Sequence_DoStepAndWait(0.25))
{
Effect_Fade_Out(0);
Map_SetUnderwater(true);
Sound_SetGlobalVolume(0.0f, eSoundEntryType_WorldAll);
Sound_SetGlobalVolume(0.0f, eSoundEntryType_GuiWorld);
}
else if (Sequence_DoStepAndWait(6.0))
{
Sound_CreateAtEntity("WakeUp", "04_03_tau_escape/SFX/wake_up_sweet", "Player");
}
else if (Sequence_DoStepAndWait(5))
{
Effect_Fade_In(5);
Sound_FadeGlobalVolume(1.0f, 6.0f, eSoundEntryType_WorldAll);
Sound_FadeGlobalVolume(1.0f, 6.0f, eSoundEntryType_GuiWorld);
Emotion_StartBackgroundBreath(eBreathType_Normal, 06,1, 6,3, 5);
Effect_ImageTrail_Start(0.5, 0.1f, 6, 2);
CameraAnimation_Begin("WakeupAnim", "", true);
}
else if (Sequence_DoStepAndWait(5))
{
Map_AddTimer("SetupTravelTowardsTau", 0.3, "TimerSetupTravelTowardsTau");
}
Sequence_End();
}
This is the stock Tau Escape sequence, including its sound, camera-animation and timer dependencies. The whole function is called again for each step, so code outside the step conditions also runs again.
Include and adapt
- Include
helpers/helper_sequences.hpsalongside the helpers needed by the actions in your sequence. - Keep a separate
cSequenceStatesDataobject for the sequence and pass it toSequence_Begin. - Put each action inside a
Sequence_DoStepAndWaitcondition, keeping theif / else ifchain and the finalSequence_End().