ending.lua 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. -- Authored post-escape cinematic regions; exact native completion/skip incidents advance once.
  2. return function(m)
  3. local movies = {
  4. {state = m.states.STATE_80B3C09E_0000_0001_80B3C091, slot = m.Slot.PF_CINEMATIC_BOOKEND_STM_CINEMATIC},
  5. {state = m.states.STATE_80B3C09E_0000_0002_80B3C093, slot = m.Slot.PF_CINEMATIC_BOOKEND_CNN_CINEMATIC},
  6. }
  7. local E = {}
  8. local staging = assert(m.states.STATE_80B3C09E_0006_0001_80B3C09A)
  9. local function transit(c)
  10. c:set_variable("ember.ending.transit", true)
  11. c:select_state(staging)
  12. end
  13. local music = require("mission_ember.music")(m)
  14. function E.start(c, s)
  15. if s:variable("ember.ending") then return end
  16. c:set_variable("ember.ending", 1)
  17. music.update(c, s)
  18. transit(c)
  19. end
  20. function E.client(c, s, e)
  21. local index = s:variable("ember.ending")
  22. local row = index and movies[index]
  23. if not row or s:variable("ember.ending.playing") == index then return end
  24. local held = e.held_region_index or e.current_region_index
  25. if s:variable("ember.ending.transit") then
  26. if held == staging.region_index then
  27. c:clear_variable("ember.ending.transit")
  28. c:select_state(row.state)
  29. end
  30. return
  31. end
  32. if held == row.state.region_index then
  33. c:set_variable("ember.ending.playing", index)
  34. c:slot(assert(row.slot)):set_cinematic_active{active = true}
  35. end
  36. end
  37. function E.terminated(c, s, e)
  38. local index = s:variable("ember.ending")
  39. local row = index and movies[index]
  40. if not row or s:variable("ember.ending.playing") ~= index then return end
  41. local slot = c:slot(row.slot)
  42. if e.registry_key ~= slot.registry_key or e.slot_type ~= slot.slot_type or e.slot_index ~= slot.slot_index then return end
  43. c:set_variable("ember.ending", index + 1)
  44. slot:set_cinematic_active{active = false}
  45. if movies[index + 1] then transit(c)
  46. else
  47. c:set_variable("ember.complete", true)
  48. -- Native lifetime 6 enters the completion/reward branch (BEA9D0/B37100).
  49. c.lifetime:set{state = c.sdk.lifetime_states:at(6)}
  50. c:set_phase(100)
  51. end
  52. end
  53. return E
  54. end