Description:
Actually render dialog from Ink.
Commit status:
[Not Reviewed]
References:
Diff options:
Comments:
0 Commit comments
0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
@@ -0,0 +1,62 | |||||
|
|
1 | |||
|
|
2 | |||
|
|
3 | using System; | ||
|
|
4 | using System.Collections.Generic; | ||
|
|
5 | using System.Text.RegularExpressions; | ||
|
|
6 | using System.Linq; | ||
|
|
7 | |||
|
|
8 | using Microsoft.Xna.Framework; | ||
|
|
9 | |||
|
|
10 | using isometricparkfna.Messages; | ||
|
|
11 | using isometricparkfna.Components; | ||
|
|
12 | using static isometricparkfna.CellMap; | ||
|
|
13 | using isometricparkfna.UI; | ||
|
|
14 | |||
|
|
15 | using Encompass; | ||
|
|
16 | using TraceryNet; | ||
|
|
17 | using Ink.Runtime; | ||
|
|
18 | |||
|
|
19 | |||
|
|
20 | namespace isometricparkfna.Spawners { | ||
|
|
21 | |||
|
|
22 | [Receives(typeof(SpawnDialogMessage))] | ||
|
|
23 | class DialogSpawner : Spawner<SpawnDialogMessage> | ||
|
|
24 | |||
|
|
25 | { | ||
|
|
26 | Story Story; | ||
|
|
27 | Grammar Grammar; | ||
|
|
28 | |||
|
|
29 | public DialogSpawner(Story story, Grammar grammar) | ||
|
|
30 | { | ||
|
|
31 | this.Story = story; | ||
|
|
32 | this.Grammar = grammar; | ||
|
|
33 | } | ||
|
|
34 | |||
|
|
35 | protected override void Spawn(in SpawnDialogMessage message) | ||
|
|
36 | { | ||
|
|
37 | //Jump to the specified part of the story: | ||
|
|
38 | Story.ChoosePathString(message.Path); | ||
|
|
39 | |||
|
|
40 | var newDialog = CreateEntity(); | ||
|
|
41 | var continuation = this.Story.ContinueMaximally(); | ||
|
|
42 | |||
|
|
43 | var parts = Regex.Split(continuation, ":", 0); | ||
|
|
44 | var speaker = (parts.Length == 2) ? parts[0] : ""; | ||
|
|
45 | var dialog = (parts.Length == 2) ? parts[1] : continuation; | ||
|
|
46 | |||
|
|
47 | AddComponent(newDialog, new DialogComponent { | ||
|
|
48 | CurrentDialog = dialog, | ||
|
|
49 | CurrentSpeaker = speaker, | ||
|
|
50 | Options = this.Story.currentChoices | ||
|
|
51 | .Select(option => option.text) | ||
|
|
52 | .ToList()}); | ||
|
|
53 | |||
|
|
54 | AddComponent(newDialog, new WindowTypeComponent { | ||
|
|
55 | type = Window.Dialog}); | ||
|
|
56 | AddComponent(newDialog, | ||
|
|
57 | new VisibilityComponent{ visible = true}); | ||
|
|
58 | |||
|
|
59 | Logging.Success("Spawned new dialog."); | ||
|
|
60 | } | ||
|
|
61 | } | ||
|
|
62 | } |
@@ -0,0 +1,17 | |||||
|
|
1 | |||
|
|
2 | using Encompass; | ||
|
|
3 | |||
|
|
4 | using isometricparkfna.Utils; | ||
|
|
5 | using isometricparkfna.UI; | ||
|
|
6 | |||
|
|
7 | namespace isometricparkfna.Messages | ||
|
|
8 | { | ||
|
|
9 | |||
|
|
10 | //You must specify both or you get 0 for a window, which is the default window :( | ||
|
|
11 | public struct DialogChoiceMessage : IMessage, IHasEntity | ||
|
|
12 | { | ||
|
|
13 | |||
|
|
14 | public Entity Entity { set; get; } | ||
|
|
15 | public int Choice; | ||
|
|
16 | } | ||
|
|
17 | } |
@@ -0,0 +1,15 | |||||
|
|
1 | |||
|
|
2 | |||
|
|
3 | using Microsoft.Xna.Framework; | ||
|
|
4 | using Encompass; | ||
|
|
5 | |||
|
|
6 | using isometricparkfna.Spawners; | ||
|
|
7 | |||
|
|
8 | #nullable enable | ||
|
|
9 | |||
|
|
10 | namespace isometricparkfna.Messages { | ||
|
|
11 | public struct SpawnDialogMessage : IMessage | ||
|
|
12 | { | ||
|
|
13 | public string Path; | ||
|
|
14 | } | ||
|
|
15 | } |
@@ -33,4 +33,8 | |||||
|
33 | <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'"> |
|
33 | <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'"> |
|
34 | <PackageReference Include="LinqFaster" Version="1.0.0" /> |
|
34 | <PackageReference Include="LinqFaster" Version="1.0.0" /> |
|
35 | </ItemGroup> |
|
35 | </ItemGroup> |
|
|
36 | |||
|
|
37 | <ItemGroup> | ||
|
|
38 | <PackageReference Include="Ink.Engine.Runtime-Unofficial" Version="1.0.0-nightly-21061600" /> | ||
|
|
39 | </ItemGroup> | ||
|
36 | </Project> |
|
40 | </Project> |
@@ -1,4 +1,4 | |||||
|
1 |
|
1 | using System.Collections.Generic; | |
|
2 |
|
2 | ||
|
3 | using Microsoft.Xna.Framework; |
|
3 | using Microsoft.Xna.Framework; |
|
4 |
|
4 | ||
@@ -9,7 +9,11 | |||||
|
9 |
|
9 | ||
|
10 | namespace isometricparkfna.Components { |
|
10 | namespace isometricparkfna.Components { |
|
11 |
|
11 | ||
|
12 | public struct DialogComponent : IComponent { |
|
12 | public struct DialogComponent : IComponent/*, IHasEntity*/ { |
|
13 | public Node<DialogOption> Dialog; |
|
13 | public Node<DialogOption> Dialog; |
|
|
14 | public string CurrentDialog; | ||
|
|
15 | // public Entity Entity {get; set;} | ||
|
|
16 | public string CurrentSpeaker; | ||
|
|
17 | public List<string> Options; | ||
|
14 | } |
|
18 | } |
|
15 | } |
|
19 | } |
@@ -1,1 +1,1 | |||||
|
1 | {"inkVersion":20,"root":[[{"->":"IntroGovernor"},["done",{"#f":5,"#n":"g-0"}],null],"done",{"Once":[["^Once upon a time...","\n",["ev",{"^->":"Once.0.2.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-0","flg":18},{"s":["^There were two choices.",{"->":"$r","var":true},null]}],["ev",{"^->":"Once.0.3.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-1","flg":18},{"s":["^There were four lines of content.",{"->":"$r","var":true},null]}],{"c-0":["ev",{"^->":"Once.0.c-0.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.2.s"},[{"#n":"$r2"}],"\n",{"->":".^.^.g-0"},{"#f":5}],"c-1":["ev",{"^->":"Once.0.c-1.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.3.s"},[{"#n":"$r2"}],"\n",{"->":".^.^.g-0"},{"#f":5}],"g-0":["^They lived happily ever after.","\n","end",{"#f":5}]}],{"#f":1}],"IntroGovernor":[["^Governor: Welcome to your new park, director! You can use the mouse or arrow keys to move around, and the plus and minus keys to zoom in and out. B opens the budget and F lets you adjust Forest Policy.","\n","ev","str","^Okay","/str","/ev",{"*":".^.c-0","flg":20},{"c-0":["\n","^Governor: Make sure that you keep visitors happy and the budget in the black! You're currently getting an annual grant out of my budgetβit'd sure be nice if you park were self-sufficient so we could drop that expense!","\n",["ev","str","^And I need to keep the forest healthy, too, right?","/str","/ev",{"*":".^.c-0","flg":20},"ev","str","^Sounds good!","/str","/ev",{"*":".^.c-1","flg":20},{"c-0":["^ ","\n","ev",{"VAR?":"GovernorOpinion"},1,"-","/ev",{"VAR=":"GovernorOpinion","re":true},"^Governor: Ummm, yeah","\n",[["ev",{"^->":"IntroGovernor.0.c-0.3.c-0.10.0.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-0","flg":18},{"s":["^...",{"->":"$r","var":true},null]}],{"c-0":["ev",{"^->":"IntroGovernor.0.c-0.3.c-0.10.c-0.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.0.s"},[{"#n":"$r2"}],"\n","end",{"#f":5}]}],{"#f":5}],"c-1":["\n","^Governor: I'll check in soon.","\n","end",{"#f":5}]}],{"#f":5}]}],{"#f":1}],"global decl":["ev",0,{"VAR=":"GovernorOpinion"},"/ev","end",null],"#f":1}],"listDefs":{}} No newline at end of file |
|
1 | {"inkVersion":20,"root":[[{"->":"IntroGovernor"},["done",{"#f":5,"#n":"g-0"}],null],"done",{"Once":[["^Once upon a time...","\n",["ev",{"^->":"Once.0.2.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-0","flg":18},{"s":["^There were two choices.",{"->":"$r","var":true},null]}],["ev",{"^->":"Once.0.3.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-1","flg":18},{"s":["^There were four lines of content.",{"->":"$r","var":true},null]}],{"c-0":["ev",{"^->":"Once.0.c-0.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.2.s"},[{"#n":"$r2"}],"\n",{"->":".^.^.g-0"},{"#f":5}],"c-1":["ev",{"^->":"Once.0.c-1.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.3.s"},[{"#n":"$r2"}],"\n",{"->":".^.^.g-0"},{"#f":5}],"g-0":["^They lived happily ever after.","\n","end",{"#f":5}]}],{"#f":1}],"IntroGovernor":[["^Governor: Welcome to your new park, director! You can use the mouse or arrow keys to move around, and the plus and minus keys to zoom in and out. B opens the budget and F lets you adjust Forest Policy.","\n","ev","str","^Okay","/str","/ev",{"*":".^.c-0","flg":20},{"c-0":["\n","^Governor: Make sure that you keep visitors happy and the budget in the black! You're currently getting an annual grant out of my budgetβit'd sure be nice if you park were self-sufficient so we could drop that expense!","\n",["ev","str","^And I need to keep the forest healthy, too, right?","/str","/ev",{"*":".^.c-0","flg":20},"ev","str","^Sounds good!","/str","/ev",{"*":".^.c-1","flg":20},{"c-0":["^ ","\n","ev",{"VAR?":"GovernorOpinion"},1,"-","/ev",{"VAR=":"GovernorOpinion","re":true},"^Governor: Ummm, yeah","\n",[["ev",{"^->":"IntroGovernor.0.c-0.3.c-0.10.0.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-0","flg":18},{"s":["^...",{"->":"$r","var":true},null]}],{"c-0":["ev",{"^->":"IntroGovernor.0.c-0.3.c-0.10.c-0.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.0.s"},[{"#n":"$r2"}],"\n","end",{"#f":5}]}],{"#f":5}],"c-1":["\n","ev",{"VAR?":"GovernorOpinion"},1,"+","/ev",{"VAR=":"GovernorOpinion","re":true},"^Governor: I'll check in soon.","\n","end",{"#f":5}]}],{"#f":5}]}],{"#f":1}],"global decl":["ev",0,{"VAR=":"GovernorOpinion"},"/ev","end",null],"#f":1}],"listDefs":{}} No newline at end of file |
@@ -22,7 +22,8 | |||||
|
22 | typeof(SetTrespassingPolicyMessage), |
|
22 | typeof(SetTrespassingPolicyMessage), |
|
23 | typeof(SpawnGameMessage), |
|
23 | typeof(SpawnGameMessage), |
|
24 | typeof(SetTextVariableMessage), |
|
24 | typeof(SetTextVariableMessage), |
|
25 |
typeof(SetDialogMessage) |
|
25 | typeof(SetDialogMessage), |
|
|
26 | typeof(DialogChoiceMessage))] | ||
|
26 | [Reads(typeof(VisibilityComponent), |
|
27 | [Reads(typeof(VisibilityComponent), |
|
27 | typeof(WindowTypeComponent), |
|
28 | typeof(WindowTypeComponent), |
|
28 | typeof(TrespassingPolicyComponent) |
|
29 | typeof(TrespassingPolicyComponent) |
@@ -44,6 +45,7 | |||||
|
44 | public List<SpawnGameMessage> spawnGameMessages; |
|
45 | public List<SpawnGameMessage> spawnGameMessages; |
|
45 | public List<SetTextVariableMessage> setTextVariableMessages; |
|
46 | public List<SetTextVariableMessage> setTextVariableMessages; |
|
46 | public List<SetDialogMessage> setDialogMessages; |
|
47 | public List<SetDialogMessage> setDialogMessages; |
|
|
48 | public List<DialogChoiceMessage> dialogChoiceMessages; | ||
|
47 |
|
49 | ||
|
48 | bool showBudget {get;} |
|
50 | bool showBudget {get;} |
|
49 | bool showForest {get;} |
|
51 | bool showForest {get;} |
@@ -73,6 +75,7 | |||||
|
73 | this.spawnGameMessages = new List<SpawnGameMessage>(); |
|
75 | this.spawnGameMessages = new List<SpawnGameMessage>(); |
|
74 | this.setTextVariableMessages = new List<SetTextVariableMessage>(); |
|
76 | this.setTextVariableMessages = new List<SetTextVariableMessage>(); |
|
75 | this.setDialogMessages = new List<SetDialogMessage>(); |
|
77 | this.setDialogMessages = new List<SetDialogMessage>(); |
|
|
78 | this.dialogChoiceMessages = new List<DialogChoiceMessage>(); | ||
|
76 | this.windowStatuses = new Dictionary<Window, bool>(); |
|
79 | this.windowStatuses = new Dictionary<Window, bool>(); |
|
77 |
|
80 | ||
|
78 |
|
81 | ||
@@ -157,6 +160,10 | |||||
|
157 | { |
|
160 | { |
|
158 | SendMessage(message); |
|
161 | SendMessage(message); |
|
159 | } |
|
162 | } |
|
|
163 | foreach (var message in this.dialogChoiceMessages) | ||
|
|
164 | { | ||
|
|
165 | SendMessage(message); | ||
|
|
166 | } | ||
|
160 |
|
167 | ||
|
161 |
|
168 | ||
|
162 |
|
169 | ||
@@ -183,6 +190,7 | |||||
|
183 | this.spawnGameMessages.Clear(); |
|
190 | this.spawnGameMessages.Clear(); |
|
184 | this.setTextVariableMessages.Clear(); |
|
191 | this.setTextVariableMessages.Clear(); |
|
185 | this.setDialogMessages.Clear(); |
|
192 | this.setDialogMessages.Clear(); |
|
|
193 | this.dialogChoiceMessages.Clear(); | ||
|
186 | } |
|
194 | } |
|
187 | } |
|
195 | } |
|
188 | } |
|
196 | } |
@@ -17,10 +17,9 | |||||
|
17 | [Receives(typeof(SpawnGameMessage))] |
|
17 | [Receives(typeof(SpawnGameMessage))] |
|
18 | [Sends(typeof(SpawnContractMessage), |
|
18 | [Sends(typeof(SpawnContractMessage), |
|
19 | typeof(SpawnOrganizationtMessage), |
|
19 | typeof(SpawnOrganizationtMessage), |
|
20 |
typeof(ToggleWindowMessage) |
|
20 | typeof(ToggleWindowMessage), |
|
21 | [Writes(typeof(WindowTypeComponent) |
|
21 | typeof(SpawnDialogMessage))] |
|
22 | //, typeof(DialogComponent) |
|
22 | [Writes(typeof(WindowTypeComponent))] |
|
23 | )] |
|
||
|
24 | class GameSpawner : Spawner<SpawnGameMessage> |
|
23 | class GameSpawner : Spawner<SpawnGameMessage> |
|
25 |
|
24 | ||
|
26 | { |
|
25 | { |
@@ -110,6 +109,7 | |||||
|
110 | type = OrganizationType.Cooperative }); |
|
109 | type = OrganizationType.Cooperative }); |
|
111 | #endregion |
|
110 | #endregion |
|
112 | #region dialog |
|
111 | #region dialog |
|
|
112 | /* | ||
|
113 |
|
|
113 | |
|
114 | // this.game.enqueueDialog(DialogTrees.flatten(DialogTrees.testTree, this.grammar)); |
|
114 | // this.game.enqueueDialog(DialogTrees.flatten(DialogTrees.testTree, this.grammar)); |
|
115 | // |
|
115 | // |
@@ -139,6 +139,9 | |||||
|
139 | new VisibilityComponent{ visible = true}); |
|
139 | new VisibilityComponent{ visible = true}); |
|
140 |
|
|
140 | |
|
141 |
|
|
141 | |
|
|
142 | */ | ||
|
|
143 | SendMessage(new SpawnDialogMessage { Path = "IntroGovernor"}); | ||
|
|
144 | // SendMessage(new SpawnDialogMessage { Path = "Once"}); | ||
|
142 | #endregion |
|
145 | #endregion |
|
143 | this.simulation.Subsidy = message.Difficulty switch { |
|
146 | this.simulation.Subsidy = message.Difficulty switch { |
|
144 | DifficultyLevel.Hard => 0M, |
|
147 | DifficultyLevel.Hard => 0M, |
@@ -1,6 +1,10 | |||||
|
|
1 | using System.Text.RegularExpressions; | ||
|
|
2 | using System.Linq; | ||
|
|
3 | |||
|
1 | using Microsoft.Xna.Framework.Input; |
|
4 | using Microsoft.Xna.Framework.Input; |
|
2 |
|
5 | ||
|
3 | using Encompass; |
|
6 | using Encompass; |
|
|
7 | using Ink.Runtime; | ||
|
4 |
|
8 | ||
|
5 | using isometricparkfna.Messages; |
|
9 | using isometricparkfna.Messages; |
|
6 | using isometricparkfna.Components; |
|
10 | using isometricparkfna.Components; |
@@ -13,7 +17,8 | |||||
|
13 | typeof(ToggleVisibilityMessage), |
|
17 | typeof(ToggleVisibilityMessage), |
|
14 | typeof(SetWindowVisibilityMessage), |
|
18 | typeof(SetWindowVisibilityMessage), |
|
15 | typeof(SelectMessage), |
|
19 | typeof(SelectMessage), |
|
16 |
typeof(SetDialogMessage) |
|
20 | typeof(SetDialogMessage), |
|
|
21 | typeof(DialogChoiceMessage))] | ||
|
17 | [Reads(typeof(WindowTypeComponent), |
|
22 | [Reads(typeof(WindowTypeComponent), |
|
18 | typeof(VisibilityComponent), |
|
23 | typeof(VisibilityComponent), |
|
19 | typeof(SelectedComponent))] |
|
24 | typeof(SelectedComponent))] |
@@ -22,6 +27,12 | |||||
|
22 | typeof(DialogComponent))] |
|
27 | typeof(DialogComponent))] |
|
23 | class UIEngine : Engine |
|
28 | class UIEngine : Engine |
|
24 | { |
|
29 | { |
|
|
30 | public Story Story; | ||
|
|
31 | |||
|
|
32 | public UIEngine(Story story) | ||
|
|
33 | { | ||
|
|
34 | this.Story = story; | ||
|
|
35 | } | ||
|
25 |
|
36 | ||
|
26 | public override void Update(double dt) |
|
37 | public override void Update(double dt) |
|
27 | { |
|
38 | { |
@@ -99,6 +110,34 | |||||
|
99 |
|
110 | ||
|
100 | } |
|
111 | } |
|
101 | } |
|
112 | } |
|
|
113 | |||
|
|
114 | foreach (ref readonly var choiceMessage in ReadMessages<DialogChoiceMessage>()) | ||
|
|
115 | { | ||
|
|
116 | |||
|
|
117 | if (Story.currentChoices.Count > 0) | ||
|
|
118 | { | ||
|
|
119 | //Advance the story | ||
|
|
120 | Story.ChooseChoiceIndex(choiceMessage.Choice); | ||
|
|
121 | |||
|
|
122 | //Update the dialog component with the new speaker, dialog, and options: | ||
|
|
123 | var continuation = this.Story.ContinueMaximally(); | ||
|
|
124 | var parts = Regex.Split(continuation, ":", 0); | ||
|
|
125 | var speaker = (parts.Length == 2) ? parts[0] : ""; | ||
|
|
126 | var dialog = (parts.Length == 2) ? parts[1] : continuation; | ||
|
|
127 | |||
|
|
128 | SetComponent(choiceMessage.Entity, new DialogComponent { | ||
|
|
129 | CurrentDialog = dialog, | ||
|
|
130 | CurrentSpeaker = speaker, | ||
|
|
131 | Options = this.Story.currentChoices | ||
|
|
132 | .Select(option => option.text) | ||
|
|
133 | .ToList()}); | ||
|
|
134 | } | ||
|
|
135 | else | ||
|
|
136 | { | ||
|
|
137 | Destroy(choiceMessage.Entity); | ||
|
|
138 | } | ||
|
|
139 | |||
|
|
140 | } | ||
|
102 | } |
|
141 | } |
|
103 | } |
|
142 | } |
|
104 | } |
|
143 | } |
@@ -87,6 +87,8 | |||||
|
87 | private bool showInitial; |
|
87 | private bool showInitial; |
|
88 | int messageIndex; |
|
88 | int messageIndex; |
|
89 |
|
89 | ||
|
|
90 | public Story Story; | ||
|
|
91 | |||
|
90 | //buggy |
|
92 | //buggy |
|
91 | private static bool enableCulling = false; |
|
93 | private static bool enableCulling = false; |
|
92 |
|
94 | ||
@@ -242,12 +244,12 | |||||
|
242 | //Has to happen after Grammar initialization. |
|
244 | //Has to happen after Grammar initialization. |
|
243 | NewGameWindow.Initialize(this.grammar); |
|
245 | NewGameWindow.Initialize(this.grammar); |
|
244 |
|
246 | ||
|
245 |
|
|
247 | this.Story = new Story(File.ReadAllText(@"Content/dialog.json")); |
|
246 |
|
248 | ||
|
247 |
Logging.Debug( |
|
249 | // Logging.Debug(this.Story.ContinueMaximally()); |
|
248 |
|
250 | ||
|
249 | WorldBuilder.AddEngine(new InputEngine(Menu.MENU_BAR_HEIGHT, this.camera, gdm)); |
|
251 | WorldBuilder.AddEngine(new InputEngine(Menu.MENU_BAR_HEIGHT, this.camera, gdm)); |
|
250 | WorldBuilder.AddEngine(new UIEngine()); |
|
252 | WorldBuilder.AddEngine(new UIEngine(this.Story)); |
|
251 |
|
253 | ||
|
252 | var gameBridgeEngine = new GameBridgeEngine(this); |
|
254 | var gameBridgeEngine = new GameBridgeEngine(this); |
|
253 |
|
255 | ||
@@ -262,6 +264,7 | |||||
|
262 | WorldBuilder.AddEngine(new ContractSpawner(simulation.map.MapWidth, simulation.map.MapHeight, this.simulation, this.grammar)); |
|
264 | WorldBuilder.AddEngine(new ContractSpawner(simulation.map.MapWidth, simulation.map.MapHeight, this.simulation, this.grammar)); |
|
263 | WorldBuilder.AddEngine(new GameSpawner(this.simulation, this, this.grammar)); |
|
265 | WorldBuilder.AddEngine(new GameSpawner(this.simulation, this, this.grammar)); |
|
264 | WorldBuilder.AddEngine(new OrganizationSpawner(this.simulation, this.grammar)); |
|
266 | WorldBuilder.AddEngine(new OrganizationSpawner(this.simulation, this.grammar)); |
|
|
267 | WorldBuilder.AddEngine(new DialogSpawner(this.Story, this.grammar)); | ||
|
265 | WorldBuilder.AddEngine(new PolicyEngine()); |
|
268 | WorldBuilder.AddEngine(new PolicyEngine()); |
|
266 | WorldBuilder.AddEngine(new TraceryBridgeEngine(this.grammar)); |
|
269 | WorldBuilder.AddEngine(new TraceryBridgeEngine(this.grammar)); |
|
267 |
|
270 |
@@ -69,7 +69,7 | |||||
|
69 | var width = gdm.PreferredBackBufferWidth; |
|
69 | var width = gdm.PreferredBackBufferWidth; |
|
70 |
|
70 | ||
|
71 | Entity dialogEntity = default; |
|
71 | Entity dialogEntity = default; |
|
72 |
|
|
72 | DialogComponent dialogNode = default; |
|
73 |
|
73 | ||
|
74 |
|
74 | ||
|
75 |
|
75 | ||
@@ -119,7 +119,7 | |||||
|
119 | break; |
|
119 | break; |
|
120 | case Window.Dialog: |
|
120 | case Window.Dialog: |
|
121 |
|
121 | ||
|
122 |
var dialog = GetComponent<DialogComponent>(entity) |
|
122 | var dialog = GetComponent<DialogComponent>(entity); |
|
123 |
|
123 | ||
|
124 | if ((dialogEntity == null) |
|
124 | if ((dialogEntity == null) |
|
125 | || (dialogEntity.ID == 0) |
|
125 | || (dialogEntity.ID == 0) |
@@ -136,7 +136,7 | |||||
|
136 |
|
136 | ||
|
137 | } |
|
137 | } |
|
138 | } |
|
138 | } |
|
139 | if (dialogNode != null) |
|
139 | if (dialogNode.CurrentDialog != null) |
|
140 | { |
|
140 | { |
|
141 | var show = true; |
|
141 | var show = true; |
|
142 | var paused = true; |
|
142 | var paused = true; |
@@ -8,6 +8,7 | |||||
|
8 | using Encompass; |
|
8 | using Encompass; |
|
9 |
|
9 | ||
|
10 | using isometricparkfna.Engines; |
|
10 | using isometricparkfna.Engines; |
|
|
11 | using isometricparkfna.Components; | ||
|
11 | using isometricparkfna.Messages; |
|
12 | using isometricparkfna.Messages; |
|
12 |
|
13 | ||
|
13 | #nullable enable |
|
14 | #nullable enable |
@@ -112,9 +113,9 | |||||
|
112 |
|
113 | ||
|
113 | public static bool hadFocus = false; |
|
114 | public static bool hadFocus = false; |
|
114 | public static Node<DialogOption> RenderDialog(Entity entity, |
|
115 | public static Node<DialogOption> RenderDialog(Entity entity, |
|
115 |
ImGuiWindowBridgeEngine bridgeEngine, ref bool show, ref bool paused, ImFontPtr font, |
|
116 | ImGuiWindowBridgeEngine bridgeEngine, ref bool show, ref bool paused, ImFontPtr font, DialogComponent dialogComponent) |
|
116 | { |
|
117 | { |
|
117 |
Node<DialogOption> new_child = |
|
118 | Node<DialogOption> new_child = default; |
|
118 | if (show) |
|
119 | if (show) |
|
119 | { |
|
120 | { |
|
120 | ImGui.PushFont(font); |
|
121 | ImGui.PushFont(font); |
@@ -127,7 +128,8 | |||||
|
127 | { |
|
128 | { |
|
128 | ImGui.PushStyleColor(ImGuiCol.Text, StyleSets.white); |
|
129 | ImGui.PushStyleColor(ImGuiCol.Text, StyleSets.white); |
|
129 | } |
|
130 | } |
|
130 | ImGui.Begin(currentNode.data.speaker, ref show, ImGuiWindowFlags.NoResize | ImGuiWindowFlags.NoCollapse | ImGuiWindowFlags.AlwaysAutoResize | ImGuiWindowFlags.NoSavedSettings); |
|
131 | |
|
|
132 | ImGui.Begin(dialogComponent.CurrentSpeaker, ref show, ImGuiWindowFlags.NoResize | ImGuiWindowFlags.NoCollapse | ImGuiWindowFlags.AlwaysAutoResize | ImGuiWindowFlags.NoSavedSettings); | ||
|
131 | if (DialogInterface.hadFocus) |
|
133 | if (DialogInterface.hadFocus) |
|
132 | { |
|
134 | { |
|
133 | ImGui.PopStyleColor(); |
|
135 | ImGui.PopStyleColor(); |
@@ -135,21 +137,25 | |||||
|
135 | DialogInterface.hadFocus = ImGui.IsWindowFocused(); |
|
137 | DialogInterface.hadFocus = ImGui.IsWindowFocused(); |
|
136 |
|
138 | ||
|
137 |
|
139 | ||
|
138 | if (currentNode.data.response != null) |
|
140 | if (dialogComponent.CurrentDialog != null) |
|
139 | { |
|
141 | { |
|
140 |
string messageText = |
|
142 | string messageText = dialogComponent.CurrentDialog; |
|
141 | ImGui.TextWrapped(messageText); |
|
143 | ImGui.TextWrapped(messageText); |
|
142 | } |
|
144 | } |
|
143 |
|
145 | ||
|
144 | if ((currentNode.children != null) && currentNode.children.Length > 0) |
|
146 | if ((dialogComponent.Options != null) && dialogComponent.Options.Count > 0) |
|
145 | { |
|
147 | { |
|
146 | //Filter out nulls |
|
148 | // foreach (var choice in dialogComponent.Options) |
|
147 | foreach ((Node<DialogOption> child, string choice) in currentNode.children.Select((child) => (child, child.data.choice)).Where( (pair, choice) => pair.choice != null)) |
|
149 | for(int i = 0; i < dialogComponent.Options.Count; i++) |
|
148 | { |
|
150 | { |
|
149 |
string buttonText = |
|
151 | string buttonText = dialogComponent.Options[i]; |
|
150 | if (ImGui.Button(buttonText)) |
|
152 | if (ImGui.Button(buttonText)) |
|
151 | { |
|
153 | { |
|
152 | new_child = child; |
|
154 | bridgeEngine.dialogChoiceMessages.Add(new DialogChoiceMessage { |
|
|
155 | |||
|
|
156 | Entity = entity, | ||
|
|
157 | Choice = i }); | ||
|
|
158 | |||
|
153 | } |
|
159 | } |
|
154 | } |
|
160 | } |
|
155 | } |
|
161 | } |
@@ -159,14 +165,14 | |||||
|
159 | { |
|
165 | { |
|
160 | show = false; |
|
166 | show = false; |
|
161 | paused = false; |
|
167 | paused = false; |
|
162 |
bridgeEngine. |
|
168 | bridgeEngine.dialogChoiceMessages.Add(new DialogChoiceMessage { |
|
163 |
|
169 | ||
|
164 | Entity = entity, |
|
170 | Entity = entity, |
|
165 |
|
|
171 | Choice = -1 }); |
|
166 | } |
|
172 | } |
|
167 | } |
|
173 | } |
|
168 |
|
174 | ||
|
169 | if (currentNode.data.response == null) |
|
175 | if (dialogComponent.CurrentDialog == null) |
|
170 | { |
|
176 | { |
|
171 | show = false; |
|
177 | show = false; |
|
172 | paused = false; |
|
178 | paused = false; |
@@ -177,10 +183,11 | |||||
|
177 | StyleSets.defaultSet.pop(); |
|
183 | StyleSets.defaultSet.pop(); |
|
178 | ImGui.PopFont(); |
|
184 | ImGui.PopFont(); |
|
179 | } |
|
185 | } |
|
180 | bridgeEngine.setDialogMessages.Add(new SetDialogMessage { |
|
186 | // bridgeEngine.setDialogMessages.Add(new SetDialogMessage { |
|
181 |
|
187 | // | |
|
182 | Entity = entity, |
|
188 | // Entity = entity, |
|
183 | newOption = new_child }); |
|
189 | // newOption = new_child }); |
|
|
190 | |||
|
184 | return new_child; |
|
191 | return new_child; |
|
185 | } |
|
192 | } |
|
186 | } |
|
193 | } |
You need to be logged in to leave comments.
Login now