Repository navigation
Expand file tree
/
Copy pathConsoleProgram.h
More file actions
145 lines (110 loc) · 3.9 KB
/
Copy pathConsoleProgram.h
File metadata and controls
145 lines (110 loc) · 3.9 KB
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/* Console Program
*
* From: https://github.com/PokemonAutomation/
*
* ConsolePanel is a panel with:
* - Has options.
* - Has a console.
* - Can be run.
*
* This is the main header for game console programs.
* This file is intentionally thin and has only the bare minimum dependencies
* for programs.
*
*/
#ifndef PokemonAutomation_GameConsole_ConsoleProgram_H
#define PokemonAutomation_GameConsole_ConsoleProgram_H
#include <memory>
#include "CommonFramework/Globals.h"
#include "CommonFramework/Panels/ProgramDescriptor.h"
#include "CommonFramework/Tools/ProgramEnvironment.h"
#include "ConsoleHandle.h"
namespace PokemonAutomation{
namespace GameConsole{
class ConsoleSystemSession;
class ConsoleProgramInstance;
class ConsoleProgramEnvironment : public ProgramEnvironment{
public:
ConsoleProgramEnvironment(
const ProgramInfo& program_info,
CancellableScope& scope,
ProgramSession& session,
StatsTracker* current_stats,
const StatsTracker* historical_stats,
ConsoleSystemSession& system
);
ConsoleProgramEnvironment(
const ProgramInfo& program_info,
CancellableScope& scope,
ProgramSession& session,
StatsTracker* current_stats,
const StatsTracker* historical_stats,
std::unique_ptr<ConsoleHandle> console
);
public:
ConsoleHandle& console(){ return *m_console; }
virtual void log_to_ui(const std::string& msg, Color color = Color()) override;
private:
std::unique_ptr<ConsoleHandle> m_console;
};
class ConsoleProgramDescriptor : public ProgramDescriptor{
public:
ConsoleProgramDescriptor(
std::string identifier,
std::string category, std::string display_name,
std::string doc_link,
std::string description,
ProgramControllerClass controller_class,
Color color,
FeedbackType feedback,
AllowCommandsWhenRunning allow_commands_while_running,
PanelDeprecation deprecation = PanelDeprecation::NOT_DEPRECATED,
std::vector<std::string> required_resources = {}
);
ProgramControllerClass controller_class() const{ return m_controller_class; }
FeedbackType feedback() const{ return m_feedback; }
bool allow_commands_while_running() const{ return m_allow_commands_while_running; }
virtual std::unique_ptr<PanelSession> make_panel() const override;
virtual std::unique_ptr<ConsoleProgramInstance> make_instance(
ConsoleSystemSession& system
) const = 0;
private:
const ProgramControllerClass m_controller_class;
const FeedbackType m_feedback;
const bool m_allow_commands_while_running;
};
class ConsoleProgramInstance : public ProgramInstance{
public:
using ProgramInstance::ProgramInstance;
virtual void program(ConsoleProgramEnvironment& env, CancellableScope& scope) = 0;
public:
// Startup Checks: Feel free to override to change behavior.
virtual void run_start_program_checks(
const ProgramDescriptor& descriptor,
ProgramEnvironment& env
) override;
virtual void start_program_feedback_check(
const ConsoleProgramDescriptor& descriptor,
VideoStream& stream
);
};
template <typename Instance>
class ConsoleProgramWrapper : public Instance::Descriptor{
public:
virtual std::unique_ptr<ConsoleProgramInstance> make_instance(
ConsoleSystemSession& system
) const override{
if constexpr (std::is_constructible_v<Instance, ConsoleSystemSession&>){
return std::make_unique<Instance>(system);
}else{
return std::make_unique<Instance>();
}
}
};
template <typename Instance>
std::unique_ptr<PanelDescriptor> make_ConsoleProgram(){
return std::make_unique<ConsoleProgramWrapper<Instance>>();
}
}
}
#endif