-
Notifications
You must be signed in to change notification settings - Fork 16
/
LoggedInControlSet.cs
125 lines (109 loc) · 4.95 KB
/
LoggedInControlSet.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
using System;
using System.Collections.Generic;
using System.Threading;
using EndlessClient.Controllers;
using EndlessClient.GameExecution;
using EndlessClient.Input;
using EndlessClient.UIControls;
using EOLib.Domain.Login;
using Microsoft.Xna.Framework;
using XNAControls;
namespace EndlessClient.ControlSets
{
public class LoggedInControlSet : IntermediateControlSet
{
private readonly ICharacterInfoPanelFactory _characterInfoPanelFactory;
private readonly ICharacterSelectorProvider _characterSelectorProvider;
private readonly ICharacterManagementController _characterManagementController;
private readonly IAccountController _accountController;
private readonly IEndlessGameProvider _endlessGameProvider;
private readonly IUserInputRepository _userInputRepository;
private readonly List<CharacterInfoPanel> _characterInfoPanels;
private IXNAButton _changePasswordButton;
private int _createRequests, _changePasswordRequests;
public override GameStates GameState => GameStates.LoggedIn;
public LoggedInControlSet(KeyboardDispatcher dispatcher,
IMainButtonController mainButtonController,
ICharacterInfoPanelFactory characterInfoPanelFactory,
ICharacterSelectorProvider characterSelectorProvider,
ICharacterManagementController characterManagementController,
IAccountController accountController,
IEndlessGameProvider endlessGameProvider,
IUserInputRepository userInputRepository)
: base(dispatcher, mainButtonController)
{
_characterInfoPanelFactory = characterInfoPanelFactory;
_characterSelectorProvider = characterSelectorProvider;
_characterManagementController = characterManagementController;
_accountController = accountController;
_endlessGameProvider = endlessGameProvider;
_userInputRepository = userInputRepository;
_characterInfoPanels = new List<CharacterInfoPanel>();
}
protected override void InitializeControlsHelper(IControlSet currentControlSet)
{
base.InitializeControlsHelper(currentControlSet);
_changePasswordButton = GetControl(currentControlSet, GameControlIdentifier.ChangePasswordButton, GetPasswordButton);
_characterInfoPanels.AddRange(_characterInfoPanelFactory.CreatePanels(_characterSelectorProvider.Characters));
_allComponents.Add(new CurrentUserInputTracker(_endlessGameProvider, _userInputRepository));
_allComponents.Add(_changePasswordButton);
_allComponents.AddRange(_characterInfoPanels);
}
public override IGameComponent FindComponentByControlIdentifier(GameControlIdentifier control)
{
switch (control)
{
case GameControlIdentifier.Character1Panel: return _characterInfoPanels[0];
case GameControlIdentifier.Character2Panel: return _characterInfoPanels[1];
case GameControlIdentifier.Character3Panel: return _characterInfoPanels[2];
case GameControlIdentifier.ChangePasswordButton: return _changePasswordButton;
default: return base.FindComponentByControlIdentifier(control);
}
}
private IXNAButton GetPasswordButton()
{
var button = new XNAButton(_secondaryButtonTexture,
new Vector2(454, 417),
new Rectangle(0, 120, 120, 40),
new Rectangle(120, 120, 120, 40));
button.OnClick += DoChangePassword;
return button;
}
protected override IXNAButton GetCreateButton()
{
var button = base.GetCreateButton();
button.OnClick += DoCreateCharacter;
return button;
}
protected override void DoBackButtonClick(object sender, EventArgs e)
{
_mainButtonController.GoToInitialStateAndDisconnect();
}
private async void DoCreateCharacter(object sender, EventArgs e)
{
if (Interlocked.Increment(ref _createRequests) != 1)
return;
try
{
await _characterManagementController.CreateCharacter();
}
finally
{
Interlocked.Exchange(ref _createRequests, 0);
}
}
private async void DoChangePassword(object sender, EventArgs e)
{
if (Interlocked.Increment(ref _changePasswordRequests) != 1)
return;
try
{
await _accountController.ChangePassword();
}
finally
{
Interlocked.Exchange(ref _changePasswordRequests, 0);
}
}
}
}