Etterna 0.74.4
Loading...
Searching...
No Matches
ScreenSelectMaster.h
1#ifndef ScreenSelectMaster_H
2#define ScreenSelectMaster_H
3
4#include "Etterna/Actor/Base/ActorScroller.h"
5#include "RageUtil/Sound/RageSound.h"
6#include "Etterna/Models/Misc/RandomSample.h"
7#include "ScreenSelect.h"
8
9enum MenuDir
10{
11 MenuDir_Up,
12 MenuDir_Down,
13 MenuDir_Left,
14 MenuDir_Right,
15 MenuDir_Auto, // when players join and the selection becomes invalid
16 NUM_MenuDir,
17};
19#define FOREACH_MenuDir(md) FOREACH_ENUM(MenuDir, md)
20const std::string&
21MenuDirToString(MenuDir md);
22
25{
26 public:
28 //~ScreenSelectMaster();
29 void Init() override;
30 virtual std::string GetDefaultChoice();
31 void BeginScreen() override;
32
33 bool MenuLeft(const InputEventPlus& input) override;
34 bool MenuRight(const InputEventPlus& input) override;
35 bool MenuUp(const InputEventPlus& input) override;
36 bool MenuDown(const InputEventPlus& input) override;
37 bool MenuStart(const InputEventPlus& input) override;
38 void TweenOnScreen() override;
39 void TweenOffScreen() override;
40
41 void HandleScreenMessage(const ScreenMessage& SM) override;
42 void HandleMessage(const Message& msg) override;
43 bool AllowLateJoin() const override { return true; }
44
45 // sm-ssc additions:
46 int GetPlayerSelectionIndex(PlayerNumber pn)
47 {
48 return GetSelectionIndex(pn);
49 }
50 bool ChangeSelection(PlayerNumber pn, MenuDir dir, int iNewChoice);
51 int GetChoiceCount() { return m_aGameCommands.size(); }
52 void PlayChangeSound() { m_soundChange.PlayCopy(true); }
53 void PlaySelectSound() { m_soundStart.PlayCopy(true); }
54
55 // Lua
56 void PushSelf(lua_State* L) override;
57
58 protected:
59 enum Page
60 {
61 PAGE_1,
62 PAGE_2,
63 NUM_Page
64 }; // on PAGE_2, cursors are locked together
65 static PlayerNumber GetSharedPlayer();
66 Page GetPage(int iChoiceIndex) const;
67 Page GetCurrentPage() const;
68
69 ThemeMetric<bool> DO_SWITCH_ANYWAYS;
70 ThemeMetric<bool> DOUBLE_PRESS_TO_SELECT;
71 ThemeMetric<bool> SHOW_ICON;
72 ThemeMetric<bool> SHOW_SCROLLER;
73 ThemeMetric<bool> SHOW_CURSOR;
74 ThemeMetric<bool> SHARED_SELECTION;
75 ThemeMetric<bool> USE_ICON_METRICS;
76 ThemeMetric<int> NUM_CHOICES_ON_PAGE_1;
77 ThemeMetric1D<float> CURSOR_OFFSET_X_FROM_ICON;
78 ThemeMetric1D<float> CURSOR_OFFSET_Y_FROM_ICON;
79 ThemeMetric<bool> PER_CHOICE_ICON_ELEMENT;
80 ThemeMetric<float> PRE_SWITCH_PAGE_SECONDS;
81 ThemeMetric<float> POST_SWITCH_PAGE_SECONDS;
82 ThemeMetric1D<std::string> OPTION_ORDER;
83 ThemeMetric<bool> WRAP_CURSOR;
84 ThemeMetric<bool> WRAP_SCROLLER;
85 ThemeMetric<bool> LOOP_SCROLLER;
86 ThemeMetric<bool> PER_CHOICE_SCROLL_ELEMENT;
87 ThemeMetric<bool> ALLOW_REPEATING_INPUT;
88 ThemeMetric<float> SCROLLER_SECONDS_PER_ITEM;
89 ThemeMetric<float> SCROLLER_NUM_ITEMS_TO_DRAW;
90 ThemeMetric<LuaReference> SCROLLER_TRANSFORM;
91 // ThemeMetric<LuaReference> SCROLLER_TWEEN;
92 ThemeMetric<int> SCROLLER_SUBDIVISIONS;
93 ThemeMetric<std::string> DEFAULT_CHOICE;
94
95 std::map<int, int> m_mapCurrentChoiceToNextChoice[NUM_MenuDir];
96
97 int GetSelectionIndex(PlayerNumber pn) override;
98 void UpdateSelectableChoices() override;
99 bool AnyOptionsArePlayable() const;
100
101 bool Move(PlayerNumber pn, MenuDir dir);
102 bool ChangePage(int iNewChoice);
103 float DoMenuStart(PlayerNumber pn);
104 virtual bool ProcessMenuStart(PlayerNumber pn) { return true; }
105
106 float GetCursorX(PlayerNumber pn);
107 float GetCursorY(PlayerNumber pn);
108
109 AutoActor m_sprExplanation[NUM_Page];
110 AutoActor m_sprMore[NUM_Page];
111 // icon is the shared, per-choice piece
112 std::vector<AutoActor> m_vsprIcon;
113
114 // preview is per-player, per-choice piece
115 std::vector<AutoActor> m_vsprScroll;
116
117 ActorScroller m_Scroller;
118
119 // cursor is the per-player, shared by all choices
120 AutoActor m_sprCursor;
121
122 RageSound m_soundChange;
123 RandomSample m_soundDifficult;
124 RageSound m_soundStart;
125
126 int m_iChoice;
127 bool m_bChosen;
128 bool m_bDoubleChoice;
129 bool m_bDoubleChoiceNoSound;
130
131 GameButton m_TrackingRepeatingInput;
132};
133
134#endif
ActorFrame that moves its children.
Definition ActorScroller.h:10
A smart pointer for Actor.
Definition AutoActor.h:13
Holds a device input plus Game/Menu translations.
Definition InputEventPlus.h:9
Definition RageSound.h:130
Definition RandomSample.h:10
The master Screen for many children Screens.
Definition ScreenSelectMaster.h:25
void Init() override
This is called immediately after construction, to allow initializing after all derived classes exist.
Definition ScreenSelectMaster.cpp:61
bool AllowLateJoin() const override
Determine if we allow extra players to join in on this screen.
Definition ScreenSelectMaster.h:43
void BeginScreen() override
This is called immediately before the screen is used.
Definition ScreenSelectMaster.cpp:335
Base class for Style, Difficulty, and Mode selection screens.
Definition ScreenSelect.h:9
std::vector< GameCommand > m_aGameCommands
The game commands available.
Definition ScreenSelect.h:31
Definition ThemeMetric.h:192
The theme specific data.
Definition ThemeMetric.h:52
Definition MessageManager.h:96