Unreal Snake Game 1.0.0
SG_GameUserSettings.h
1// Snake Game, Copyright LifeEXE. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "GameFramework/GameUserSettings.h"
7#include "SnakeGame/Core/Types.h"
8#include "SG_GameUserSettings.generated.h"
9
10UENUM()
11enum class EGameSpeed : uint8
12{
13 Worm = 0,
14 Snake,
15 Python
16};
17
18UENUM()
19enum class EGridSize : uint8
20{
21 Size_30x10 = 0,
22 Size_50x15,
23 Size_80x20
24};
25
26UCLASS()
27class SNAKEGAME_API USG_GameUserSettings : public UGameUserSettings
28{
29 GENERATED_BODY()
30
31public:
33
34 static USG_GameUserSettings* Get();
35
36 TArray<FString> GameSpeedOptions() const { return OptionNames(GameSpeeds); }
37 FString CurrentGameSpeedOption() const { return CurrentSpeed.Name; }
38
39 TArray<FString> GridSizeOptions() const { return OptionNames(GridSizes); }
40 FString CurrentGridSizeOption() const { return CurrentGridSize.Name; }
41
42 void SaveSnakeSettings(EGameSpeed GameSpeed, EGridSize GridSize);
43
44 EGameSpeed GameSpeedByName(const FString& Name) const { return FindOptionByNameOrDefault(GameSpeeds, Name, EGameSpeed::Snake); }
45 EGridSize GridSizeByName(const FString& Name) const { return FindOptionByNameOrDefault(GridSizes, Name, EGridSize::Size_50x15); }
46
47 float GameSpeed() const { return CurrentSpeed.Value; }
48 SnakeGame::Dim GridSize() const { return CurrentGridSize.Value; }
49
50private:
52 {
53 FString Name;
54 float Value;
55 };
56 const TMap<EGameSpeed, FSpeedData> GameSpeeds //
57 {
58 {EGameSpeed::Worm, {"Worm", 0.3f}}, //
59 {EGameSpeed::Snake, {"Snake", 0.1f}}, //
60 {EGameSpeed::Python, {"Python", 0.05f}}, //
61 };
62
63 struct FGridData
64 {
65 FString Name;
66 SnakeGame::Dim Value;
67 };
68 const TMap<EGridSize, FGridData> GridSizes //
69 {
70 {EGridSize::Size_30x10, {"30x10", SnakeGame::Dim{30, 10}}}, //
71 {EGridSize::Size_50x15, {"50x15", SnakeGame::Dim{50, 15}}}, //
72 {EGridSize::Size_80x20, {"80x20", SnakeGame::Dim{80, 20}}}, //
73 };
74
75 FSpeedData CurrentSpeed{GameSpeeds[EGameSpeed::Snake]};
76 FGridData CurrentGridSize{GridSizes[EGridSize::Size_50x15]};
77
78 template <typename MapType, typename EnumType>
79 EnumType FindOptionByNameOrDefault(const MapType& Map, const FString& Name, EnumType Default) const
80 {
81 const auto* Founded = Algo::FindByPredicate(Map, [Name](const auto& Pair) { return Pair.Value.Name.Equals(Name); });
82 return Founded ? Founded->Key : Default;
83 }
84
85 template <typename MapType>
86 TArray<FString> OptionNames(const MapType& Map) const
87 {
88 TArray<FString> Names;
89 Algo::Transform(Map, Names, [](const auto& Pair) { return Pair.Value.Name; });
90 return Names;
91 }
92};
Definition: SG_GameUserSettings.h:28
Definition: Types.h:12
Definition: SG_GameUserSettings.h:64
Definition: SG_GameUserSettings.h:52