about summary refs log tree commit diff stats
path: root/AnodyneArchipelago/Menu
diff options
context:
space:
mode:
Diffstat (limited to 'AnodyneArchipelago/Menu')
-rw-r--r--AnodyneArchipelago/Menu/ConnectionState.cs118
-rw-r--r--AnodyneArchipelago/Menu/MenuState.cs38
2 files changed, 156 insertions, 0 deletions
diff --git a/AnodyneArchipelago/Menu/ConnectionState.cs b/AnodyneArchipelago/Menu/ConnectionState.cs new file mode 100644 index 0000000..877213f --- /dev/null +++ b/AnodyneArchipelago/Menu/ConnectionState.cs
@@ -0,0 +1,118 @@
1using AnodyneSharp.Input;
2using AnodyneSharp.Resources;
3using AnodyneSharp.Sounds;
4using AnodyneSharp.States;
5using AnodyneSharp.UI;
6using AnodyneSharp.UI.Font;
7using AnodyneSharp.UI.Text;
8using Archipelago.MultiClient.Net;
9using Archipelago.MultiClient.Net.Enums;
10using Microsoft.Xna.Framework;
11using System.Reflection;
12using System.Threading.Tasks;
13
14namespace AnodyneArchipelago.Menu
15{
16 internal class ConnectionState : State
17 {
18 public delegate void SuccessEvent(ArchipelagoManager archipelagoManager);
19
20 private readonly SuccessEvent _successFunc;
21
22 private Task<LoginResult> _connectionTask;
23 private ArchipelagoManager _archipelago = new();
24
25 private TextWriter _textWriter;
26 private UIEntity _bgBox;
27 private readonly SpriteFont _font;
28
29 private string _text = "Connecting...";
30
31 public ConnectionState(string apServer, string apSlot, string apPassword, SuccessEvent successFunc)
32 {
33 _successFunc = successFunc;
34
35 _connectionTask = Task.Run(() => _archipelago.Connect(apServer, apSlot, apPassword));
36
37 _font = FontManager.InitFont(new Color(226, 226, 226), true);
38
39 _textWriter = new(20, 44, 128, 100)
40 {
41 drawLayer = AnodyneSharp.Drawing.DrawOrder.TEXT
42 };
43 _textWriter.SetSpriteFont(_font, ResourceManager.GetTexture("consoleButtons"));
44
45 _bgBox = new UIEntity(new Vector2(16f, 40f), "pop_menu", 16, 16, AnodyneSharp.Drawing.DrawOrder.TEXTBOX);
46 UpdateDisplay();
47 }
48
49 public override void Update()
50 {
51 if (_connectionTask != null && _connectionTask.IsCompleted)
52 {
53 LoginResult result = _connectionTask.Result;
54
55 if (result.Successful)
56 {
57 Exit = true;
58 _successFunc(_archipelago);
59 return;
60 }
61 else
62 {
63 LoginFailure failure = result as LoginFailure;
64 string errorMessage = "";
65 foreach (string error in failure.Errors)
66 {
67 errorMessage += error;
68 errorMessage += "\n";
69 }
70 foreach (ConnectionRefusedError error in failure.ErrorCodes)
71 {
72 errorMessage += error.ToString();
73 errorMessage += "\n";
74 }
75
76 if (errorMessage.Length > 0)
77 {
78 errorMessage = errorMessage.Substring(0, errorMessage.Length - 1);
79 }
80 else
81 {
82 errorMessage = "Unknown error during connection.";
83 }
84
85 _text = errorMessage;
86 _connectionTask = null;
87
88 UpdateDisplay();
89 }
90 }
91
92 if (KeyInput.JustPressedRebindableKey(KeyFunctions.Accept) || KeyInput.JustPressedRebindableKey(KeyFunctions.Cancel))
93 {
94 Exit = true;
95 SoundManager.PlaySoundEffect("menu_select");
96 }
97 }
98
99 public override void DrawUI()
100 {
101 _bgBox.Draw();
102 _textWriter.Draw();
103 }
104
105 private void UpdateDisplay()
106 {
107 _textWriter.Text = _text;
108 _textWriter.ProgressTextToEnd();
109
110 FieldInfo linesField = typeof(TextWriter).GetField("_line", BindingFlags.NonPublic | BindingFlags.Instance);
111 int lineValue = (int)linesField.GetValue(_textWriter);
112
113 int innerHeight = (lineValue + 1) * _font.lineSeparation;
114
115 _bgBox = new UIEntity(new Vector2(16f, 40f), "pop_menu", 136, innerHeight + 8, AnodyneSharp.Drawing.DrawOrder.TEXTBOX);
116 }
117 }
118}
diff --git a/AnodyneArchipelago/Menu/MenuState.cs b/AnodyneArchipelago/Menu/MenuState.cs index b9ee0dd..cabb94b 100644 --- a/AnodyneArchipelago/Menu/MenuState.cs +++ b/AnodyneArchipelago/Menu/MenuState.cs
@@ -33,6 +33,9 @@ namespace AnodyneArchipelago.Menu
33 33
34 private int _selectorIndex = 0; 34 private int _selectorIndex = 0;
35 35
36 private bool _fadingOut = false;
37 private bool _isNewGame;
38
36 public override void Create() 39 public override void Create()
37 { 40 {
38 _selector = new(); 41 _selector = new();
@@ -65,6 +68,18 @@ namespace AnodyneArchipelago.Menu
65 68
66 public override void Update() 69 public override void Update()
67 { 70 {
71 if (_fadingOut)
72 {
73 GlobalState.black_overlay.ChangeAlpha(0.72f);
74
75 if (GlobalState.black_overlay.alpha == 1.0)
76 {
77 ChangeStateEvent(_isNewGame ? AnodyneSharp.AnodyneGame.GameState.Intro : AnodyneSharp.AnodyneGame.GameState.Game);
78 }
79
80 return;
81 }
82
68 if (_substate != null) 83 if (_substate != null)
69 { 84 {
70 _substate.Update(); 85 _substate.Update();
@@ -217,6 +232,9 @@ namespace AnodyneArchipelago.Menu
217 case 2: 232 case 2:
218 _substate = new TextEntry("Password:", _apPassword, (string value) => { _apPassword = value; UpdateLabels(); }); 233 _substate = new TextEntry("Password:", _apPassword, (string value) => { _apPassword = value; UpdateLabels(); });
219 break; 234 break;
235 case 4:
236 _substate = new ConnectionState(_apServer, _apSlot, _apPassword, OnConnected);
237 break;
220 case 6: 238 case 6:
221 GlobalState.ClosingGame = true; 239 GlobalState.ClosingGame = true;
222 break; 240 break;
@@ -231,5 +249,25 @@ namespace AnodyneArchipelago.Menu
231 { 249 {
232 250
233 } 251 }
252
253 private void OnConnected(ArchipelagoManager archipelagoManager)
254 {
255 Plugin.ArchipelagoManager = archipelagoManager;
256
257 GlobalState.Save saveFile = GlobalState.Save.GetSave(string.Format("{0}Saves/Save_zzAP{1}_{2}.dat", GameConstants.SavePath, Plugin.ArchipelagoManager.GetSeed(), Plugin.ArchipelagoManager.GetPlayer()));
258
259 GlobalState.ResetValues();
260 if (saveFile != null)
261 {
262 GlobalState.LoadSave(saveFile);
263 _isNewGame = false;
264 }
265 else
266 {
267 _isNewGame = true;
268 }
269
270 _fadingOut = true;
271 }
234 } 272 }
235} 273}