private void NextOp() { if (cutsceneOps[opIndex].killWhenDone) { cutsceneOps[opIndex].Stop(); } opIndex++; CutsceneOp op = cutsceneOps[opIndex]; op.Run(myTag + opIndex.ToString()); }
private bool CheckIfCurrentOpDone() { CutsceneOp op = cutsceneOps[opIndex]; bool result = false; if (!op.isFX || op.isDone) { result = true; // never _not_ done if it's not an FX op } return(result); }
private CutsceneOp GetOp(string[] lineSplit) { CutsceneOp op; Action <object[]> EVTCall = null; // immediately-executable things Func <object[], IEnumerator <float> > FXCall = null; // coroutines object[] args; switch (lineSplit[0]) { case "EVT_PlayMFX": EVTCall = cutsceneEVT_PlayMFX; args = new object[] { Resources.Load <AudioClip>(mfxPath + lineSplit[1]) }; break; case "EVT_PlaySFX": EVTCall = cutsceneEVT_PlaySFX; args = new object[] { Resources.Load <AudioClip>(sfxPath + lineSplit[1]) }; break; case "EVT_SetBGM": EVTCall = cutsceneEVT_SetBGM; args = new object[] { Resources.Load <AudioClip>(musicPath + lineSplit[1]) }; break; case "EVT_SetBackground": EVTCall = cutsceneEVT_SetBackground; args = new object[] { Resources.Load <Sprite>(gfxPath + lineSplit[1]) }; break; case "EVT_SetForeground": EVTCall = cutsceneEVT_SetForeground; args = new object[] { Resources.Load <Sprite>(gfxPath + lineSplit[1]) }; break; case "EVT_RefreshTextboxWith": EVTCall = cutsceneEVT_RefreshTextboxWith; args = new object[] { strings[int.Parse(lineSplit[1])] }; break; case "EVT_End": case "End": case "end": EVTCall = cutsceneEVT_End; args = new object[0]; break; case "EVT_LoadLevel": EVTCall = cutsceneEVT_LoadLevel; args = new object[] { TermToSceneID(lineSplit[1]) }; break; case "EVT_MakeSlave": EVTCall = cutsceneEVT_MakeSlave; args = new object[] { lineSplit[1], float.Parse(lineSplit[2]), Resources.Load <Sprite>(gfxPath + lineSplit[3]), new Vector3(float.Parse(lineSplit[4]), float.Parse(lineSplit[5]), float.Parse(lineSplit[6])) }; break; case "EVT_RetireSlave": EVTCall = cutsceneEVT_RetireSlave; args = new object[] { lineSplit[1] }; break; case "EVT_MoveSlave": EVTCall = cutsceneEVT_MoveSlave; args = new object[] { lineSplit[1], new Vector3(float.Parse(lineSplit[2]), float.Parse(lineSplit[3]), float.Parse(lineSplit[4])), new Vector3(float.Parse(lineSplit[5]), float.Parse(lineSplit[6]), float.Parse(lineSplit[7])), float.Parse(lineSplit[8]) }; break; case "EVT_ScaleSlave": EVTCall = cutsceneEVT_ScaleSlave; args = new object[] { lineSplit[1], new Vector3(float.Parse(lineSplit[2]), float.Parse(lineSplit[3]), float.Parse(lineSplit[4])), float.Parse(lineSplit[5]) }; break; case "EVT_ChangeSlaveGraphic": EVTCall = cutsceneEVT_ChangeSlaveGraphic; args = new object[] { lineSplit[1], Resources.Load <Sprite>(gfxPath + lineSplit[3]) }; break; case "EVT_ResetSlavePos": EVTCall = cutsceneEVT_ResetSlavePos; args = new object[] { lineSplit[1] }; break; case "EVT_SetSlavePos": EVTCall = cutsceneEVT_SetSlavePos; args = new object[] { lineSplit[1], new Vector3(float.Parse(lineSplit[2]), float.Parse(lineSplit[3]), float.Parse(lineSplit[4])) }; break; case "FX_Wait": FXCall = cutsceneFX_Wait; args = new object[] { float.Parse(lineSplit[1]) }; break; case "FX_ScrollBackground": FXCall = cutsceneFX_ScrollBackground; args = new object[] { TermToDirection(lineSplit[1]), float.Parse(lineSplit[2]), float.Parse(lineSplit[3]) }; break; case "FX_ScrollForeground": FXCall = cutsceneFX_ScrollForeground; args = new object[] { TermToDirection(lineSplit[1]), float.Parse(lineSplit[2]), float.Parse(lineSplit[3]) }; break; case "FX_FadeOutBackground": FXCall = cutsceneFX_FadeOutBackground; args = new object[] { float.Parse(lineSplit[1]) }; break; case "FX_FadeOutForeground": FXCall = cutsceneFX_FadeOutForeground; args = new object[] { float.Parse(lineSplit[1]) }; break; case "FX_WaitForClick": FXCall = cutsceneFX_WaitForClick; args = new object[0]; break; default: throw new Exception("Bad op: " + lineSplit[0]); } if (EVTCall != null) { op = new CutsceneOp(EVTCall, args); } else if (FXCall != null) { op = new CutsceneOp(FXCall, args); } else { throw new Exception("Tried to parse invalid cutscene op: " + lineSplit[0]); } return(op); }
private CutsceneOp[] ParseCutsceneScript(TextAsset _script) { List <CutsceneOp> ops = new List <CutsceneOp>(); string[] scriptLines = _script.text.Split(new string[] { "\r\n", "\n" }, System.StringSplitOptions.None); bool nextLineIsEndFX = false; CutsceneOp op = default(CutsceneOp); for (int i = 0; i < scriptLines.Length; i++) { string[] terms = scriptLines[i].Split(' '); if (terms[0] == "skip" || terms[0] == "Skip") { continue; } else if (!nextLineIsEndFX) { op = GetOp(terms); if (op.isFX) { nextLineIsEndFX = true; } ops.Add(op); } else if (i > 0) { if (terms[0] != "endFX" && terms[0] != "EndFX") { throw new Exception("Cutscene " + _script.name + " contains an FX statement with no following endFX statement!"); } else { float f; bool b; if (terms[1] == "waitSeconds") { f = float.Parse(terms[2]); b = f >= 0; if (f < 0) { f = Mathf.Abs(f); } } else if (terms[1] == "waitUntilDone") { f = float.MinValue; b = bool.Parse(terms[2]); } else { throw new Exception("Malformed endFX statement on line " + i.ToString() + " of cutscene " + _script.name); } op.ConfigEndTime(f, b); nextLineIsEndFX = false; } } else { throw new Exception("The cutscene parser is seriously f****d, and it's looking for endFX on line 0."); } } return(ops.ToArray()); }