Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
GameMenuDialog.cs
浏览该文件的文档.
1using System.Xml.Linq;
2using Engine;
4using Engine.Media;
6
7namespace Game {
8 public class GameMenuDialog : Dialog {
9 public static bool m_increaseDetailDialogShown;
10
11 public static bool m_decreaseDetailDialogShown;
12
14
16
18
19 public static string fName = "GameMenuDialog";
20
21 public GameMenuDialog(ComponentPlayer componentPlayer) {
22 XElement node = ContentManager.Get<XElement>("Dialogs/GameMenuDialog");
23 LoadContents(this, node);
24 m_statsPanel = Children.Find<StackPanelWidget>("StatsPanel");
25 m_componentPlayer = componentPlayer;
29 && PerformanceManager.LongTermAverageFrameTime.Value * 1000f < 25f
35 );
36 }
39 && PerformanceManager.LongTermAverageFrameTime.Value * 1000f > 50f
45 );
46 }
47 m_statsPanel.Children.Clear();
48 Project project = componentPlayer.Project;
49 PlayerData playerData = componentPlayer.PlayerData;
50 PlayerStats playerStats = componentPlayer.PlayerStats;
51 SubsystemGameInfo subsystemGameInfo = project.FindSubsystem<SubsystemGameInfo>(true);
52 SubsystemTimeOfDay subsystemTimeOfDay = project.FindSubsystem<SubsystemTimeOfDay>(true);
53 SubsystemFurnitureBlockBehavior subsystemFurnitureBlockBehavior = project.FindSubsystem<SubsystemFurnitureBlockBehavior>(true);
54 Terrain terrain = project.FindSubsystem<SubsystemTerrain>(true).Terrain;
55 SubsystemMetersBlockBehavior subsystemMetersBlockBehavior = project.FindSubsystem<SubsystemMetersBlockBehavior>(true);
58 Color white = Color.White;
59 StackPanelWidget stackPanelWidget = new() { Direction = LayoutDirection.Vertical, HorizontalAlignment = WidgetAlignment.Center };
60 m_statsPanel.Children.Add(stackPanelWidget);
61 stackPanelWidget.Children.Add(
62 new LabelWidget {
63 Text = LanguageControl.Get(fName, 5),
64 Font = font,
66 Margin = new Vector2(0f, 10f),
67 Color = white
68 }
69 );
70 AddStat(
71 stackPanelWidget,
73 $"{LanguageControl.Get("GameMode", subsystemGameInfo.WorldSettings.GameMode.ToString())}, {LanguageControl.Get("EnvironmentBehaviorMode", subsystemGameInfo.WorldSettings.EnvironmentBehaviorMode.ToString())}"
74 );
75 AddStat(
76 stackPanelWidget,
78 StringsManager.GetString($"TerrainGenerationMode.{subsystemGameInfo.WorldSettings.TerrainGenerationMode}.Name")
79 );
80 string seed = subsystemGameInfo.WorldSettings.Seed;
81 AddStat(stackPanelWidget, LanguageControl.Get(fName, 8), $"{(!string.IsNullOrEmpty(seed) ? seed : LanguageControl.Get(fName, 9))} ({subsystemGameInfo.WorldSeed})");
82 AddStat(
83 stackPanelWidget,
86 );
87 AddStat(
88 stackPanelWidget,
91 );
92 AddStat(
93 stackPanelWidget,
96 );
97 AddStat(stackPanelWidget, LanguageControl.Get(fName, 13), $"{subsystemGameInfo.WorldSettings.BiomeSize}x");
98 if (subsystemGameInfo.WorldSettings.AreSeasonsChanging) {
99 AddStat(
100 stackPanelWidget,
102 subsystemGameInfo.WorldSettings.YearDays + LanguageControl.Get(fName, "23")
103 );
104 }
105 string value0 = subsystemGameInfo.WorldSettings.AreSeasonsChanging ? "" : LanguageControl.Get(fName, 98);
106 AddStat(
107 stackPanelWidget,
110 value0,
112 );
113 int num = 0;
114 for (int i = 0; i < FurnitureDesign.maxDesign; i++) {
115 if (subsystemFurnitureBlockBehavior.GetDesign(i) != null) {
116 num++;
117 }
118 }
119 AddStat(stackPanelWidget, LanguageControl.Get(fName, 14), $"{num}/{FurnitureDesign.maxDesign}");
120 AddStat(
121 stackPanelWidget,
123 string.IsNullOrEmpty(subsystemGameInfo.WorldSettings.OriginalSerializationVersion)
126 );
127 stackPanelWidget.Children.Add(
128 new LabelWidget {
129 Text = LanguageControl.Get(fName, 17),
130 Font = font,
132 Margin = new Vector2(0f, 10f),
133 Color = white
134 }
135 );
136 AddStat(stackPanelWidget, LanguageControl.Get(fName, 18), playerData.Name);
137 AddStat(
138 stackPanelWidget,
140 m_componentPlayer.PlayerData.PlayerClass == PlayerClass.Male ? LanguageControl.Get(fName, 93) : LanguageControl.Get(fName, 94)
141 );
142 string value = playerData.FirstSpawnTime >= 0.0
143 ? ((subsystemGameInfo.TotalElapsedGameTime - playerData.FirstSpawnTime) / subsystemTimeOfDay.DayDuration).ToString("N1")
146 AddStat(stackPanelWidget, LanguageControl.Get(fName, 22), value);
147 string value2 = playerData.LastSpawnTime >= 0.0
148 ? ((subsystemGameInfo.TotalElapsedGameTime - playerData.LastSpawnTime) / subsystemTimeOfDay.DayDuration).ToString("N1")
151 AddStat(stackPanelWidget, LanguageControl.Get(fName, 25), value2);
152 AddStat(
153 stackPanelWidget,
155 MathUtils.Max(playerData.SpawnsCount - 1, 0).ToString("N0") + LanguageControl.Get(fName, 27)
156 );
157 if (subsystemGameInfo.WorldSettings.GameMode == GameMode.Creative) {
158 Vector3 position = playerData.SpawnPosition;
159 AddStat(
160 stackPanelWidget,
161 LanguageControl.Get(fName, "103"),
162 string.Format(LanguageControl.Get(fName, 31), $"{position.X:F1}", $"{position.Z:F1}", $"{position.Y:F1}")
163 );
164 }
165 AddStat(
166 stackPanelWidget,
168 string.Format(LanguageControl.Get(fName, 29), ((int)MathF.Floor(playerStats.HighestLevel)).ToString("N0"))
169 );
170 if (componentPlayer != null) {
171 if (subsystemGameInfo.WorldSettings.GameMode == GameMode.Creative) {
172 Vector3 position = componentPlayer.ComponentBody.Position;
173 AddStat(
174 stackPanelWidget,
176 string.Format(LanguageControl.Get(fName, 31), $"{position.X:F1}", $"{position.Z:F1}", $"{position.Y:F1}")
177 );
178 Point3 point = Terrain.ToCell(position);
179 int shaftValue = terrain.GetShaftValue(point.X, point.Z);
180 int terrainTemperature = Terrain.ExtractTemperature(shaftValue) + SubsystemWeather.GetTemperatureAdjustmentAtHeight(point.Y);
181 int seasonalTemperatureOffset = terrain.SeasonTemperature;
182 subsystemMetersBlockBehavior.CalculateTemperature(
183 point.X,
184 point.Y,
185 point.Z,
186 0f,
187 0f,
188 out _,
189 out _,
190 out float finalTemperature
191 );
192 AddStat(
193 stackPanelWidget,
195 string.Format(
196 LanguageControl.Get(fName, "100"),
197 $"{terrainTemperature:+0;-0;+0}",
198 $"{seasonalTemperatureOffset:+0;-0;+0}",
199 $"{finalTemperature - terrainTemperature - seasonalTemperatureOffset:+0.0;-0.0;+0}",
200 $"{finalTemperature:F1}"
201 )
202 );
203 int terrainHumidity = Terrain.ExtractHumidity(shaftValue);
204 int seasonalHumidityOffset = terrain.SeasonHumidity;
205 AddStat(
206 stackPanelWidget,
207 LanguageControl.Get(fName, "101"),
208 string.Format(
209 LanguageControl.Get(fName, "102"),
210 $"{terrainHumidity:+0;-0;+0}",
211 $"{seasonalHumidityOffset:+0;-0;+0}",
212 $"{terrainHumidity + seasonalHumidityOffset}"
213 )
214 );
215 }
216 else {
217 AddStat(
218 stackPanelWidget,
220 string.Format(
222 LanguageControl.Get("GameMode", subsystemGameInfo.WorldSettings.GameMode.ToString())
223 )
224 );
225 }
226 }
227 if (string.CompareOrdinal(subsystemGameInfo.WorldSettings.OriginalSerializationVersion, "1.29") > 0) {
228 stackPanelWidget.Children.Add(
229 new LabelWidget {
230 Text = LanguageControl.Get(fName, 33),
231 Font = font,
233 Margin = new Vector2(0f, 10f),
234 Color = white
235 }
236 );
237 AddStat(stackPanelWidget, LanguageControl.Get(fName, 34), playerStats.PlayerKills.ToString("N0"));
238 AddStat(stackPanelWidget, LanguageControl.Get(fName, 35), playerStats.LandCreatureKills.ToString("N0"));
239 AddStat(stackPanelWidget, LanguageControl.Get(fName, 36), playerStats.WaterCreatureKills.ToString("N0"));
240 AddStat(stackPanelWidget, LanguageControl.Get(fName, 37), playerStats.AirCreatureKills.ToString("N0"));
241 AddStat(stackPanelWidget, LanguageControl.Get(fName, 38), playerStats.MeleeAttacks.ToString("N0"));
242 AddStat(
243 stackPanelWidget,
245 playerStats.MeleeHits.ToString("N0"),
246 $"({(playerStats.MeleeHits == 0L ? 0.0 : playerStats.MeleeHits / (double)playerStats.MeleeAttacks * 100.0):0}%)"
247 );
248 AddStat(stackPanelWidget, LanguageControl.Get(fName, 40), playerStats.RangedAttacks.ToString("N0"));
249 AddStat(
250 stackPanelWidget,
252 playerStats.RangedHits.ToString("N0"),
253 $"({(playerStats.RangedHits == 0L ? 0.0 : playerStats.RangedHits / (double)playerStats.RangedAttacks * 100.0):0}%)"
254 );
255 AddStat(stackPanelWidget, LanguageControl.Get(fName, 42), playerStats.HitsReceived.ToString("N0"));
256 stackPanelWidget.Children.Add(
257 new LabelWidget {
258 Text = LanguageControl.Get(fName, 43),
259 Font = font,
261 Margin = new Vector2(0f, 10f),
262 Color = white
263 }
264 );
265 AddStat(stackPanelWidget, LanguageControl.Get(fName, 44), playerStats.BlocksDug.ToString("N0"));
266 AddStat(stackPanelWidget, LanguageControl.Get(fName, 45), playerStats.BlocksPlaced.ToString("N0"));
267 AddStat(stackPanelWidget, LanguageControl.Get(fName, 46), playerStats.BlocksInteracted.ToString("N0"));
268 AddStat(stackPanelWidget, LanguageControl.Get(fName, 47), playerStats.ItemsCrafted.ToString("N0"));
269 AddStat(stackPanelWidget, LanguageControl.Get(fName, 48), playerStats.FurnitureItemsMade.ToString("N0"));
270 stackPanelWidget.Children.Add(
271 new LabelWidget {
272 Text = LanguageControl.Get(fName, 49),
273 Font = font,
275 Margin = new Vector2(0f, 10f),
276 Color = white
277 }
278 );
279 AddStat(stackPanelWidget, LanguageControl.Get(fName, 50), FormatDistance(playerStats.DistanceTravelled));
280 AddStat(
281 stackPanelWidget,
283 FormatDistance(playerStats.DistanceWalked),
284 $"({(playerStats.DistanceTravelled > 0.0 ? playerStats.DistanceWalked / playerStats.DistanceTravelled * 100.0 : 0.0):0.0}%)"
285 );
286 AddStat(
287 stackPanelWidget,
289 FormatDistance(playerStats.DistanceFallen),
290 $"({(playerStats.DistanceTravelled > 0.0 ? playerStats.DistanceFallen / playerStats.DistanceTravelled * 100.0 : 0.0):0.0}%)"
291 );
292 AddStat(
293 stackPanelWidget,
295 FormatDistance(playerStats.DistanceClimbed),
296 $"({(playerStats.DistanceTravelled > 0.0 ? playerStats.DistanceClimbed / playerStats.DistanceTravelled * 100.0 : 0.0):0.0}%)"
297 );
298 AddStat(
299 stackPanelWidget,
301 FormatDistance(playerStats.DistanceFlown),
302 $"({(playerStats.DistanceTravelled > 0.0 ? playerStats.DistanceFlown / playerStats.DistanceTravelled * 100.0 : 0.0):0.0}%)"
303 );
304 AddStat(
305 stackPanelWidget,
307 FormatDistance(playerStats.DistanceSwam),
308 $"({(playerStats.DistanceTravelled > 0.0 ? playerStats.DistanceSwam / playerStats.DistanceTravelled * 100.0 : 0.0):0.0}%)"
309 );
310 AddStat(
311 stackPanelWidget,
313 FormatDistance(playerStats.DistanceRidden),
314 $"({(playerStats.DistanceTravelled > 0.0 ? playerStats.DistanceRidden / playerStats.DistanceTravelled * 100.0 : 0.0):0.0}%)"
315 );
316 AddStat(stackPanelWidget, LanguageControl.Get(fName, 57), FormatDistance(playerStats.LowestAltitude));
317 AddStat(stackPanelWidget, LanguageControl.Get(fName, 58), FormatDistance(playerStats.HighestAltitude));
318 AddStat(stackPanelWidget, LanguageControl.Get(fName, 59), $"{playerStats.DeepestDive:N1}m");
319 AddStat(stackPanelWidget, LanguageControl.Get(fName, 60), playerStats.Jumps.ToString("N0"));
320 stackPanelWidget.Children.Add(
321 new LabelWidget {
322 Text = LanguageControl.Get(fName, 61),
323 Font = font,
325 Margin = new Vector2(0f, 10f),
326 Color = white
327 }
328 );
329 AddStat(stackPanelWidget, LanguageControl.Get(fName, 62), $"{(playerStats.TotalHealthLost * 100.0):N0}%");
330 AddStat(stackPanelWidget, LanguageControl.Get(fName, 63), playerStats.FoodItemsEaten.ToString("N0") + LanguageControl.Get(fName, 64));
331 AddStat(
332 stackPanelWidget,
334 playerStats.TimesWentToSleep.ToString("N0") + LanguageControl.Get(fName, 66)
335 );
336 AddStat(
337 stackPanelWidget,
339 (playerStats.TimeSlept / subsystemTimeOfDay.DayDuration).ToString("N1") + LanguageControl.Get(fName, 68)
340 );
341 AddStat(stackPanelWidget, LanguageControl.Get(fName, 69), playerStats.TimesWasSick.ToString("N0") + LanguageControl.Get(fName, 66));
342 AddStat(stackPanelWidget, LanguageControl.Get(fName, 70), playerStats.TimesPuked.ToString("N0") + LanguageControl.Get(fName, 66));
343 AddStat(stackPanelWidget, LanguageControl.Get(fName, 71), playerStats.TimesHadFlu.ToString("N0") + LanguageControl.Get(fName, 66));
344 stackPanelWidget.Children.Add(
345 new LabelWidget {
346 Text = LanguageControl.Get(fName, 72),
347 Font = font,
349 Margin = new Vector2(0f, 10f),
350 Color = white
351 }
352 );
353 AddStat(
354 stackPanelWidget,
356 playerStats.StruckByLightning.ToString("N0") + LanguageControl.Get(fName, 66)
357 );
358 GameMode easiestModeUsed = playerStats.EasiestModeUsed;
359 AddStat(stackPanelWidget, LanguageControl.Get(fName, 74), LanguageControl.Get("GameMode", easiestModeUsed.ToString()));
360 if (playerStats.DeathRecords.Count > 0) {
361 stackPanelWidget.Children.Add(
362 new LabelWidget {
363 Text = LanguageControl.Get(fName, 75),
364 Font = font,
366 Margin = new Vector2(0f, 10f),
367 Color = white
368 }
369 );
370 foreach (PlayerStats.DeathRecord deathRecord in playerStats.DeathRecords) {
371 AddStat(stackPanelWidget, $"Day {Math.Floor(deathRecord.Day) + 1.0:0}", "", deathRecord.Cause);
372 }
373 }
374 }
375 else {
376 stackPanelWidget.Children.Add(
377 new LabelWidget {
378 Text = LanguageControl.Get(fName, 81),
379 WordWrap = true,
380 Font = font2,
382 TextAnchor = TextAnchor.HorizontalCenter,
383 Margin = new Vector2(20f, 10f),
384 Color = white
385 }
386 );
387 }
388 }
389
390 public override void Update() {
391 if (Children.Find<ButtonWidget>("More").IsClicked) {
392 List<Tuple<string, Action>> list = new();
394 list.Add(
395 new Tuple<string, Action>(
397 delegate {
398 DialogsManager.ShowDialog(
399 ParentWidget,
400 new MessageDialog(
401 LanguageControl.Get(fName, 83),
402 LanguageControl.Get(fName, 84),
403 LanguageControl.Yes,
404 LanguageControl.No,
405 delegate(MessageDialogButton result) {
406 if (result == MessageDialogButton.Button1) {
407 ScreensManager.SwitchScreen("GameLoading", GameManager.WorldInfo, "AdventureRestart");
408 }
409 }
410 )
411 );
412 }
413 )
414 );
415 }
416 if (GetRateableItems().FirstOrDefault() != null
417 && UserManager.ActiveUser != null) {
418 list.Add(
419 new Tuple<string, Action>(
421 delegate {
422 DialogsManager.ShowDialog(
423 ParentWidget,
424 new ListSelectionDialog(
425 LanguageControl.Get(fName, 86),
426 GetRateableItems(),
427 60f,
428 o => ((ActiveExternalContentInfo)o).DisplayName,
429 delegate(object o) {
430 ActiveExternalContentInfo activeExternalContentInfo = (ActiveExternalContentInfo)o;
431 DialogsManager.ShowDialog(
432 ParentWidget,
433 new RateCommunityContentDialog(
434 activeExternalContentInfo.Address,
435 activeExternalContentInfo.DisplayName,
436 UserManager.ActiveUser.UniqueId
437 )
438 );
439 }
440 )
441 );
442 }
443 )
444 );
445 }
446 list.Add(
447 new Tuple<string, Action>(
450 )
451 );
452 list.Add(new Tuple<string, Action>(LanguageControl.Get(fName, 88), delegate { ScreensManager.SwitchScreen("Settings"); }));
453 list.Add(new Tuple<string, Action>(LanguageControl.Get(fName, 89), delegate { ScreensManager.SwitchScreen("Help"); }));
454 if ((Input.Devices & (WidgetInputDevice.Keyboard | WidgetInputDevice.Mouse)) != 0) {
455 list.Add(new Tuple<string, Action>(LanguageControl.Get(fName, 90), delegate { ScreensManager.SwitchScreen("KeyboardMapping"); }));
456 }
457 if ((Input.Devices & WidgetInputDevice.Gamepads) != 0) {
458 list.Add(
459 new Tuple<string, Action>(
460 LanguageControl.Get(fName, 91),
461 delegate { ScreensManager.SwitchScreen("GamepadMapping"); }
462 )
463 );
464 }
465#if !BROWSER
466 list.Add(
467 new Tuple<string, Action>(
468 LanguageControl.Get(fName, 95),
469 delegate { DialogsManager.ShowDialog(ParentWidget, new RunJsDialog()); }
470 )
471 );
472#endif
473#if BROWSER
474 list.Add(new Tuple<string, Action>(LanguageControl.Get(fName, "104"), () => Window.WindowMode = Window.WindowMode == WindowMode.Fullscreen ? WindowMode.Fixed : WindowMode.Fullscreen));
475#endif
476 ListSelectionDialog dialog = new(
477 LanguageControl.Get(fName, 92),
478 list,
479 60f,
480 t => ((Tuple<string, Action>)t).Item1,
481 delegate(object t) { ((Tuple<string, Action>)t).Item2(); }
482 );
483 DialogsManager.ShowDialog(ParentWidget, dialog);
484 }
485 if (Input.Back
486 || Input.Cancel
487 || Children.Find<ButtonWidget>("Resume").IsClicked) {
489 }
490 if (Children.Find<ButtonWidget>("Quit").IsClicked) {
492 GameManager.SaveProject(true, true);
494 ScreensManager.SwitchScreen("MainMenu");
495 }
496 }
497
498 public IEnumerable<ActiveExternalContentInfo> GetRateableItems() {
499 if (GameManager.Project != null
500 && UserManager.ActiveUser != null) {
502 foreach (ActiveExternalContentInfo item in subsystemGameInfo.GetActiveExternalContent()) {
504 yield return item;
505 }
506 }
507 }
508 }
509
510 public static string FormatDistance(double value) {
511 if (value < 1000.0) {
512 return $"{value:0}m";
513 }
514 return $"{value / 1000.0:N2}km";
515 }
516
517 public void AddStat(ContainerWidget containerWidget, string title, string value1, string value2 = "") {
518 AddStat(containerWidget, title, value1, value2, Color.White);
519 }
520
521 public void AddStat(ContainerWidget containerWidget, string title, string value1, string value2, Color color) {
523 Color gray = Color.Gray;
524 containerWidget.Children.Add(
526 Direction = LayoutDirection.Horizontal,
528 Children = {
529 new LabelWidget {
530 Text = $"{title}:", HorizontalAlignment = WidgetAlignment.Far, Font = font, Color = gray, Margin = new Vector2(5f, 1f)
531 },
532 new StackPanelWidget {
533 Direction = LayoutDirection.Horizontal,
535 Children = {
536 new LabelWidget { Text = value1, Font = font, Color = color, Margin = new Vector2(5f, 1f) },
537 new LabelWidget { Text = value2, Font = font, Color = gray, Margin = new Vector2(5f, 1f) }
538 }
539 }
540 }
541 }
542 );
543 }
544 }
545}
static int Max(int x1, int x2)
static bool IsContentRated(string address, string userId)
readonly WidgetsList Children
static object Get(Type type, string name)
static void HideDialog(Dialog dialog)
static void ShowDialog(ContainerWidget parentWidget, Dialog dialog)
static void SaveProject(bool waitForCompletion, bool showErrorDialog)
static WorldInfo WorldInfo
static void DisposeProject()
static Project Project
void AddStat(ContainerWidget containerWidget, string title, string value1, string value2, Color color)
void AddStat(ContainerWidget containerWidget, string title, string value1, string value2="")
ComponentPlayer m_componentPlayer
GameMenuDialog(ComponentPlayer componentPlayer)
static string FormatDistance(double value)
IEnumerable< ActiveExternalContentInfo > GetRateableItems()
static bool m_decreaseDetailDialogShown
static bool m_increaseDetailDialogShown
StackPanelWidget m_statsPanel
static BitmapFont BitmapFont
static string Get(string className, int key)
获取在当前语言类名键对应的字符串
ReadOnlyList< DeathRecord > DeathRecords
static void SwitchScreen(string name, params object[] parameters)
static ResolutionMode ResolutionMode
static string GetString(string name)
static string GetTimeOfYearName(float timeOfYear)
static Color GetTimeOfYearColor(float timeOfYear)
static Func< int, int > GetTemperatureAdjustmentAtHeight
static int ExtractTemperature(int value)
static int ToCell(float x)
static int ExtractHumidity(int value)
readonly string UniqueId
static UserInfo ActiveUser
WidgetInput Input
ContainerWidget ParentWidget
virtual Vector2 Margin
virtual WidgetAlignment HorizontalAlignment
virtual void LoadContents(object eventsTarget, XElement node)
void Add(Widget widget)
WorldSettings WorldSettings
static string FormatOffset(float value)
static bool SnapshotExists(string directoryName, string snapshotName)
virtual Subsystem FindSubsystem(Type type, string name, bool throwOnError)
static Color White
static Color Gray