|
1 | | -using Microsoft.Xna.Framework; |
2 | | -using Monocle; |
| 1 | +using Microsoft.Xna.Framework; |
3 | 2 |
|
4 | 3 | namespace Celeste.Mod.Entities { |
5 | | - [Tracked] |
6 | 4 | [CustomEntity("everest/dialogTrigger", "dialog/dialogtrigger", "cavern/dialogtrigger")] |
7 | 5 | public class DialogCutsceneTrigger : Trigger { |
8 | 6 |
|
9 | 7 | private string dialogEntry; |
10 | 8 | private bool triggered; |
11 | 9 | private EntityID id; |
12 | | - private bool noRespawnAfterUse; |
13 | | - private bool triggerOnlyOnce; |
14 | | - private bool ignoreIntroState; |
| 10 | + private bool onlyOnce; |
15 | 11 | private bool endLevel; |
16 | 12 | private int deathCount; |
17 | 13 |
|
18 | 14 | public DialogCutsceneTrigger(EntityData data, Vector2 offset, EntityID entId) |
19 | 15 | : base(data, offset) { |
20 | 16 | dialogEntry = data.Attr("dialogId"); |
21 | | - noRespawnAfterUse = data.Bool("onlyOnce", true); // don't rename the EntityData name for backwards compat |
22 | | - triggerOnlyOnce = data.Bool("triggerOnlyOnce", true); |
23 | | - ignoreIntroState = data.Bool("ignoreIntroState", false); |
| 17 | + onlyOnce = data.Bool("onlyOnce", true); |
24 | 18 | endLevel = data.Bool("endLevel", false); |
25 | 19 | deathCount = data.Int("deathCount", -1); |
26 | 20 | triggered = false; |
27 | 21 | id = entId; |
28 | 22 | } |
29 | 23 |
|
30 | | - // do not remove OnEnter! doing so will break maps that rely on third-party triggers to start dialog cutscenes. |
31 | | - // vanilla naturally calls OnEnter and OnStay in the same frame when entering the trigger, |
32 | | - // which would mean that we don't need the OnEnter method. |
33 | | - // however, sj's "in filtration" uses a Trigger Trigger (CrystallineHelper) to start a dialog cutscene; |
34 | | - // it only calls OnEnter and not OnStay, so removing OnEnter will make the dialog not appear and cause a tas desync! |
35 | 24 | public override void OnEnter(Player player) { |
36 | | - TriggerCutscene(player); |
37 | | - } |
38 | | - |
39 | | - public override void OnStay(Player player) { |
40 | | - TriggerCutscene(player); |
41 | | - } |
42 | | - |
43 | | - public override void OnLeave(Player player) { |
44 | | - if (!triggerOnlyOnce) |
45 | | - triggered = false; |
46 | | - } |
47 | | - |
48 | | - private void TriggerCutscene(Player player) { |
49 | | - if (Scene is not Level level) |
50 | | - return; |
51 | | - |
52 | | - if (triggered) |
53 | | - return; |
54 | | - |
55 | | - if (deathCount >= 0 && level.Session.DeathsInCurrentLevel != deathCount) |
56 | | - return; |
57 | | - |
58 | | - if (ignoreIntroState && ((patch_Player) player).IsIntroState) |
59 | | - return; |
| 25 | + if (triggered || (Scene as Level).Session.GetFlag("DoNotLoad" + id) || |
| 26 | + (deathCount >= 0 && SceneAs<Level>().Session.DeathsInCurrentLevel != deathCount)) { |
60 | 27 |
|
61 | | - // don't activate if some dialog is already in progress |
62 | | - if (level.Tracker.GetEntity<Textbox>() is not null) |
63 | 28 | return; |
| 29 | + } |
64 | 30 |
|
65 | 31 | triggered = true; |
66 | 32 |
|
67 | 33 | Scene.Add(new DialogCutscene(dialogEntry, player, endLevel)); |
68 | 34 |
|
69 | | - if (noRespawnAfterUse) { |
70 | | - // this flag is unused in vanilla and Everest, but mods may still make use of it, |
71 | | - // so it remains here for backwards compatibility |
72 | | - level.Session.SetFlag("DoNotLoad" + id, true); |
73 | | - level.Session.DoNotLoad.Add(id); |
74 | | - } |
| 35 | + if (onlyOnce) |
| 36 | + (Scene as Level).Session.SetFlag("DoNotLoad" + id, true); // Sets flag to not load |
75 | 37 | } |
| 38 | + |
76 | 39 | } |
77 | 40 | } |
0 commit comments