Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
PlayerScreen.cs
浏览该文件的文档.
1using System.Xml.Linq;
2using Engine;
4using Engine.Input;
7
8namespace Game {
9 public class PlayerScreen : Screen {
10 public enum Mode {
14 }
15
18
23
24 public override void Update() {
26 }
27 }
28
30 public Mode m_mode;
32 public bool m_nameWasInvalid;
33 public const string fName = "PlayerScreen";
34
47
51 WidgetInputDevice.GamePad1,
52 WidgetInputDevice.GamePad2,
53 WidgetInputDevice.GamePad3,
55 ];
56
57 public static ReadOnlyList<WidgetInputDevice> AllInputDevices => new(m_allInputDevices);
58
59 public PlayerScreen() {
60 XElement node = ContentManager.Get<XElement>("Screens/PlayerScreen");
61 LoadContents(this, node);
63 m_playerClassButton = Children.Find<ButtonWidget>("PlayerClassButton");
64 m_nameTextBox = Children.Find<TextBoxWidget>("Name");
65 m_characterSkinLabel = Children.Find<LabelWidget>("CharacterSkinLabel");
66 m_characterSkinButton = Children.Find<ButtonWidget>("CharacterSkinButton");
67 m_controlsLabel = Children.Find<LabelWidget>("ControlsLabel");
68 m_controlsButton = Children.Find<ButtonWidget>("ControlsButton");
69 m_descriptionLabel = Children.Find<LabelWidget>("DescriptionLabel");
70 m_addButton = Children.Find<ButtonWidget>("AddButton");
71 m_addAnotherButton = Children.Find<ButtonWidget>("AddAnotherButton");
72 m_deleteButton = Children.Find<ButtonWidget>("DeleteButton");
73 m_playButton = Children.Find<ButtonWidget>("PlayButton");
75 m_playerModel.CharacterSkinsCache = m_characterSkinsCache;
76 m_nameTextBox.FocusLost += delegate {
77 if (VerifyName()) {
78 m_playerData.Name = m_nameTextBox.Text.Trim();
79 }
80 else {
81 m_nameWasInvalid = true;
82 }
83 };
84 }
85
86 public override void Enter(object[] parameters) {
87 m_mode = (Mode)parameters[0];
88 if (m_mode == Mode.Edit) {
89 m_playerData = (PlayerData)parameters[1];
90 }
91 else {
92 m_playerData = new PlayerData((Project)parameters[1]);
93 }
94 if (m_mode == Mode.Initial) {
95 m_playerClassButton.IsEnabled = true;
96 m_addButton.IsVisible = false;
97 m_deleteButton.IsVisible = false;
98 m_playButton.IsVisible = true;
99 m_addAnotherButton.IsVisible = m_playerData.SubsystemPlayers.PlayersData.Count < 3;
100 }
101 else if (m_mode == Mode.Add) {
102 m_playerClassButton.IsEnabled = true;
103 m_addButton.IsVisible = true;
104 m_deleteButton.IsVisible = false;
105 m_playButton.IsVisible = false;
106 m_addAnotherButton.IsVisible = false;
107 }
108 else if (m_mode == Mode.Edit) {
109 m_playerClassButton.IsEnabled = false;
110 m_addButton.IsVisible = false;
111 m_deleteButton.IsVisible = m_playerData.SubsystemPlayers.PlayersData.Count > 1;
112 m_playButton.IsVisible = false;
113 m_addAnotherButton.IsVisible = false;
114 }
115 }
116
117 public override void Leave() {
118 m_characterSkinsCache.Clear();
119 m_playerData = null;
120 }
121
122 public override void Update() {
123 m_characterSkinsCache.GetTexture(m_playerData.CharacterSkinName);
124 m_playerModel.PlayerClass = m_playerData.PlayerClass;
125 m_playerModel.CharacterSkinName = m_playerData.CharacterSkinName;
126 m_playerModel.PlayerData = m_playerData;
127 m_playerClassButton.Text = m_playerData.PlayerClass.ToString();
128 if (!m_nameTextBox.HasFocus) {
129 m_nameTextBox.Text = m_playerData.Name;
130 }
131 m_characterSkinLabel.Text = CharacterSkinsManager.GetDisplayName(m_playerData.CharacterSkinName);
132 m_controlsLabel.Text = GetDeviceDisplayName(m_allInputDevices.FirstOrDefault(id => (id & m_playerData.InputDevice) != 0));
134 DatabaseManager.FindEntityValuesDictionary(m_playerData.GetEntityTemplateName(), true),
135 typeof(ComponentCreature)
136 );
137 string description = valuesDictionary.GetValue<string>("Description");
138 if (description.StartsWith('[')
139 && description.EndsWith(']')) {
140 string[] lp = description.Substring(1, description.Length - 2).Split([":"], StringSplitOptions.RemoveEmptyEntries);
141 description = LanguageControl.GetDatabase("Description", lp[1]);
142 }
143 m_descriptionLabel.Text = description;
144 if (m_playerClassButton.IsClicked) {
145 m_playerData.PlayerClass = m_playerData.PlayerClass == PlayerClass.Male ? PlayerClass.Female : PlayerClass.Male;
146 m_playerData.RandomizeCharacterSkin();
147 if (m_playerData.IsDefaultName) {
148 m_playerData.ResetName();
149 }
150 }
151 if (m_characterSkinButton.IsClicked) {
153 IEnumerable<string> items = CharacterSkinsManager.CharacterSkinsNames.Where(n =>
155 );
156 ListSelectionDialog dialog = new(
158 items,
159 64f,
160 delegate(object item) {
161 XElement node = ContentManager.Get<XElement>("Widgets/CharacterSkinItem");
162 ContainerWidget containerWidget = (ContainerWidget)LoadWidget(this, node, null);
163 Texture2D texture = m_characterSkinsCache.GetTexture((string)item);
164 containerWidget.Children.Find<LabelWidget>("CharacterSkinItem.Text").Text =
166 containerWidget.Children.Find<LabelWidget>("CharacterSkinItem.Details").Text = $"{texture.Width}x{texture.Height}";
167 PlayerModelWidget playerModelWidget = containerWidget.Children.Find<PlayerModelWidget>("CharacterSkinItem.Model");
168 playerModelWidget.PlayerClass = m_playerData.PlayerClass;
169 playerModelWidget.CharacterSkinTexture = texture;
170 return containerWidget;
171 },
172 delegate(object item) {
173 m_playerData.CharacterSkinName = (string)item;
174 if (m_playerData.IsDefaultName) {
175 m_playerData.ResetName();
176 }
177 }
178 );
179 DialogsManager.ShowDialog(null, dialog);
180 }
181 if (m_controlsButton.IsClicked) {
183 null,
187 56f,
188 d => new InputDeviceWidget { Device = (WidgetInputDevice)d },
189 delegate(object d) {
190 WidgetInputDevice widgetInputDevice = (WidgetInputDevice)d;
191 m_playerData.InputDevice = widgetInputDevice;
192 foreach (PlayerData playersDatum in m_playerData.SubsystemPlayers.PlayersData) {
193 if (playersDatum != m_playerData
194 && (playersDatum.InputDevice & widgetInputDevice) != 0) {
195 playersDatum.InputDevice &= ~widgetInputDevice;
196 }
197 }
198 }
199 )
200 );
201 }
202 if (m_addButton.IsClicked
203 && VerifyName()) {
204 m_playerData.SubsystemPlayers.AddPlayerData(m_playerData);
205 ScreensManager.SwitchScreen("Players", m_playerData.SubsystemPlayers);
206 }
207 if (m_deleteButton.IsClicked) {
209 null,
210 new MessageDialog(
215 delegate(MessageDialogButton b) {
216 if (b == MessageDialogButton.Button1) {
217 m_playerData.SubsystemPlayers.RemovePlayerData(m_playerData);
218 ScreensManager.SwitchScreen("Players", m_playerData.SubsystemPlayers);
219 }
220 }
221 )
222 );
223 }
224 if (m_playButton.IsClicked
225 && VerifyName()) {
226 m_playerData.SubsystemPlayers.AddPlayerData(m_playerData);
228 }
229 if (m_addAnotherButton.IsClicked
230 && VerifyName()) {
231 m_playerData.SubsystemPlayers.AddPlayerData(m_playerData);
232 Project project = m_playerData.SubsystemPlayers.Project;
233 Leave();
234 Enter([Mode.Initial, project]);
235 }
236 if ((Input.Back || Input.Cancel || Children.Find<ButtonWidget>("TopBar.Back").IsClicked)
237 && VerifyName()) {
238 if (m_mode == Mode.Initial) {
239 GameManager.SaveProject(true, true);
241 ScreensManager.SwitchScreen("MainMenu");
242 }
243 else if (m_mode == Mode.Add
244 || m_mode == Mode.Edit) {
245 ScreensManager.SwitchScreen("Players", m_playerData.SubsystemPlayers);
246 }
247 }
248 m_nameWasInvalid = false;
249 }
250
251 public static string GetDeviceDisplayName(WidgetInputDevice device) {
252 switch (device) {
254 case WidgetInputDevice.GamePad1:
255 return LanguageControl.Get(fName, 5)
256 + (GamePad.IsConnected(0) ? "" : LanguageControl.Get(fName, 9));
257 case WidgetInputDevice.GamePad2:
258 return LanguageControl.Get(fName, 6)
259 + (GamePad.IsConnected(1) ? "" : LanguageControl.Get(fName, 9));
260 case WidgetInputDevice.GamePad3:
261 return LanguageControl.Get(fName, 7)
262 + (GamePad.IsConnected(2) ? "" : LanguageControl.Get(fName, 9));
263 case WidgetInputDevice.GamePad4:
264 return LanguageControl.Get(fName, 8)
265 + (GamePad.IsConnected(3) ? "" : LanguageControl.Get(fName, 9));
266 default: return LanguageControl.Get(fName, 10);
267 }
268 }
269
270 public bool VerifyName() {
271 if (m_nameWasInvalid) {
272 return false;
273 }
274 if (PlayerData.VerifyName(m_nameTextBox.Text.Trim())) {
275 return true;
276 }
278 null,
279 new MessageDialog(
283 null,
284 null
285 )
286 );
287 return false;
288 }
289 }
290}
static bool IsConnected(int gamePadIndex)
static ReadOnlyList< string > CharacterSkinsNames
static ? PlayerClass GetPlayerClass(string name)
static string GetDisplayName(string name)
readonly WidgetsList Children
static object Get(Type type, string name)
static ValuesDictionary FindValuesDictionaryForComponent(ValuesDictionary entityVd, Type componentType)
static ValuesDictionary FindEntityValuesDictionary(string entityTemplateName, bool throwIfNotFound)
static void ShowDialog(ContainerWidget parentWidget, Dialog dialog)
static void SaveProject(bool waitForCompletion, bool showErrorDialog)
static void DisposeProject()
override string Text
static string GetDatabase(string name, string prop)
static string Get(string className, int key)
获取在当前语言类名键对应的字符串
WidgetInputDevice InputDevice
static bool VerifyName(string name)
static WidgetInputDevice[] m_allInputDevices
CharacterSkinsCache m_characterSkinsCache
ButtonWidget m_playerClassButton
ButtonWidget m_characterSkinButton
override void Update()
static ReadOnlyList< WidgetInputDevice > AllInputDevices
LabelWidget m_controlsLabel
override void Enter(object[] parameters)
ButtonWidget m_addAnotherButton
ButtonWidget m_deleteButton
ButtonWidget m_controlsButton
override void Leave()
ButtonWidget m_playButton
TextBoxWidget m_nameTextBox
static string GetDeviceDisplayName(WidgetInputDevice device)
LabelWidget m_descriptionLabel
PlayerModelWidget m_playerModel
LabelWidget m_characterSkinLabel
static void SwitchScreen(string name, params object[] parameters)
static Widget LoadWidget(object eventsTarget, XElement node, ContainerWidget parentWidget)
virtual WidgetAlignment VerticalAlignment
virtual WidgetAlignment HorizontalAlignment
virtual void LoadContents(object eventsTarget, XElement node)
Widget Find(string name, Type type, bool throwIfNotFound=true)