forked from EasyRPG/Player
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgame_message.h
190 lines (164 loc) · 7.16 KB
/
game_message.h
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/*
* This file is part of EasyRPG Player.
*
* EasyRPG Player is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EasyRPG Player is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EasyRPG Player. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef EP_GAME_MESSAGE_H
#define EP_GAME_MESSAGE_H
#include <cstdint>
#include <vector>
#include <bitset>
#include <string>
#include <functional>
#include "string_view.h"
#include "pending_message.h"
#include "memory_management.h"
class Window_Message;
class AsyncOp;
namespace Game_Message {
static const int MAX_LINE = 4;
/** Set the window used to display the text */
void SetWindow(Window_Message* window);
Window_Message* GetWindow();
AsyncOp Update();
/** Contains the different lines of text. */
extern std::vector<std::string> texts;
/**
* Determines the position of the message box respecting the player's map
* position and if obstructing is allowed.
*
* @return Best message box position
*/
int GetRealPosition();
/**
* Sets pending message text for the messaging system to display.
*
* @param pm - the pending message text
*/
void SetPendingMessage(PendingMessage&& pm);
/** Callback type for WordWrap function */
using WordWrapCallback = const std::function<void(StringView line)>;
/**
* Breaks the line into lines, each of which is equal
* or less than a specified limit in pixels in the
* given font (except in cases when breaking by spaces
* can't produce a short line), and calls the callback
* for each resulting line.
*
* Font::Default() will be used to determine the word breaking.
* The caller is responsible for ensuring that Font::Default()
* either does not change between calling this function and
* displaying the results, or at least that the changed font
* has same metrics as the font used to calculate the line sizes.
*
* @param[in] line The line that will be broken into lines
* and added into the lines vector.
* @param[in] limit maximum size of each line after word-breaking.
* @param callback a function to be called for each word-wrapped line
*/
int WordWrap(StringView line, int limit, const WordWrapCallback& callback);
int WordWrap(StringView line, int limit, const WordWrapCallback& callback, const Font& font);
/**
* Return if it's legal to show a new message box.
*
* @param foreground true if this is in the foreground context, otherwise parallel context.
* @return true if we can show a message box.
*/
bool CanShowMessage(bool foreground);
/** @return true if there is message text pending */
bool IsMessagePending();
/** @return true if message window is running */
bool IsMessageActive();
/** The command code parser for the message box */
std::optional<std::string> CommandCodeInserter(char ch, const char** iter, const char* end, uint32_t escape_char);
// EasyRPG extension allowing more recursive variables \v[\v[...]]
static constexpr int easyrpg_default_max_recursion = 8;
// RPG_RT only allows 1 level of recursion.
static constexpr int rpg_rt_default_max_recursion = 1;
// Which one we'll use by default.
static constexpr int default_max_recursion = easyrpg_default_max_recursion;
/** Struct returned by parameter parsing methods */
struct ParseParamResult {
/** iterator to the next character after parsed content */
const char* next = nullptr;
/** value that was parsed */
int value = 0;
};
/** Struct returned by parameter parsing methods */
struct ParseParamStringResult {
/** iterator to the next character after parsed content */
const char* next = nullptr;
/** value that was parsed */
std::string value;
};
/** Parse a \v[] variable string
*
* @param iter start of utf8 string
* @param end end of utf8 string
* @param escape_char the escape character to use
* @param skip_prefix if true, assume prefix was already parsed and iter starts at the first left bracket.
* @param max_recursion How many times to allow recursive variable lookups.
*
* @return \refer ParseParamResult
*/
ParseParamResult ParseVariable(const char* iter, const char* end, uint32_t escape_char, bool skip_prefix = false, int max_recursion = default_max_recursion);
/** Parse a \t[] variable string
*
* @param iter start of utf8 string
* @param end end of utf8 string
* @param escape_char the escape character to use
* @param skip_prefix if true, assume prefix was already parsed and iter starts at the first left bracket.
* @param max_recursion How many times to allow recursive variable lookups.
*
* @return \refer ParseParamResult
*/
ParseParamResult ParseString(const char* iter, const char* end, uint32_t escape_char, bool skip_prefix = false, int max_recursion = default_max_recursion);
/** Parse a \c[] color string
*
* @param iter start of utf8 string
* @param end end of utf8 string
* @param escape_char the escape character to use
* @param skip_prefix if true, assume prefix was already parsed and iter starts at the first left bracket.
* @param max_recursion How many times to allow recursive variable lookups.
*
* @return \refer ParseParamResult
*/
ParseParamResult ParseColor(const char* iter, const char* end, uint32_t escape_char, bool skip_prefix = false, int max_recursion = default_max_recursion);
/** Parse a \s[] speed string
*
* @param iter start of utf8 string
* @param end end of utf8 string
* @param escape_char the escape character to use
* @param skip_prefix if true, assume prefix was already parsed and iter starts at the first left bracket.
* @param max_recursion How many times to allow recursive variable lookups.
*
* @return \refer ParseParamResult
*/
ParseParamResult ParseSpeed(const char* iter, const char* end, uint32_t escape_char, bool skip_prefix = false, int max_recursion = default_max_recursion);
/** Parse a \n[] actor name string
*
* @param iter start of utf8 string
* @param end end of utf8 string
* @param escape_char the escape character to use
* @param skip_prefix if true, assume prefix was already parsed and iter starts at the first left bracket.
* @param max_recursion How many times to allow recursive variable lookups.
*
* @return \refer ParseParamResult
*/
ParseParamResult ParseActor(const char* iter, const char* end, uint32_t escape_char, bool skip_prefix = false, int max_recursion = default_max_recursion);
Game_Message::ParseParamResult ParseParam(char upper, char lower, const char* iter, const char* end, uint32_t escape_char, bool skip_prefix = false, int max_recursion = default_max_recursion);
// same as ParseParam but the parameter is of structure \x[some_word] instead of \x[1]
Game_Message::ParseParamStringResult ParseStringParam(char upper, char lower, const char* iter, const char* end, uint32_t escape_char, bool skip_prefix = false, int max_recursion = default_max_recursion);
}
#endif