about summary refs log tree commit diff stats
path: root/AnodyneArchipelago/Menu/ConnectionState.cs
diff options
context:
space:
mode:
Diffstat (limited to 'AnodyneArchipelago/Menu/ConnectionState.cs')
-rw-r--r--AnodyneArchipelago/Menu/ConnectionState.cs118
1 files changed, 118 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}