1 /*
2  * This file is part of EasyRPG Player.
3  *
4  * EasyRPG Player is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * EasyRPG Player is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with EasyRPG Player. If not, see <http://www.gnu.org/licenses/>.
16  */
17 #include "battle_message.h"
18 #include "player.h"
19 #include "utils.h"
20 #include "algo.h"
21 #include "game_battler.h"
22 #include <lcf/rpg/state.h>
23 #include <lcf/data.h>
24 #include <lcf/reader_util.h>
25 
26 namespace BattleMessage {
27 
GetStateMessage(StringView target_name,StringView message)28 static std::string GetStateMessage(StringView target_name, StringView message) {
29 	if (Player::IsRPG2kE()) {
30 		return Utils::ReplacePlaceholders(
31 			message,
32 			Utils::MakeArray('S'),
33 			Utils::MakeSvArray(target_name)
34 		);
35 	}
36 	else {
37 		return ToString(target_name) + ToString(message);
38 	}
39 }
40 
GetStateInflictMessage(const Game_Battler & target,const lcf::rpg::State & state)41 std::string GetStateInflictMessage(const Game_Battler& target, const lcf::rpg::State& state) {
42 	if (target.GetType() == Game_Battler::Type_Ally) {
43 		return GetStateMessage(target.GetName(), state.message_actor);
44 	}
45 	if (target.GetType() == Game_Battler::Type_Enemy) {
46 		return GetStateMessage(target.GetName(), state.message_enemy);
47 	}
48 	return "";
49 }
50 
GetStateRecoveryMessage(const Game_Battler & target,const lcf::rpg::State & state)51 std::string GetStateRecoveryMessage(const Game_Battler& target, const lcf::rpg::State& state) {
52 	return GetStateMessage(target.GetName(), state.message_recovery);
53 }
54 
GetStateAffectedMessage(const Game_Battler & target,const lcf::rpg::State & state)55 std::string GetStateAffectedMessage(const Game_Battler& target, const lcf::rpg::State& state) {
56 	return GetStateMessage(target.GetName(), state.message_affected);
57 }
58 
GetStateAlreadyMessage(const Game_Battler & target,const lcf::rpg::State & state)59 std::string GetStateAlreadyMessage(const Game_Battler& target, const lcf::rpg::State& state) {
60 	return GetStateMessage(target.GetName(), state.message_already);
61 }
62 
GetDeathMessage(const Game_Battler & target)63 std::string GetDeathMessage(const Game_Battler& target) {
64 	const auto* state = lcf::ReaderUtil::GetElement(lcf::Data::states, 1);
65 	if (state) {
66 		return GetStateInflictMessage(target, *state);
67 	}
68 	return "";
69 }
70 
GetActionFailureMessage(StringView source,StringView target,StringView message)71 static std::string GetActionFailureMessage(StringView source, StringView target, StringView message) {
72 	if (Player::IsRPG2kE()) {
73 		return Utils::ReplacePlaceholders(
74 			message,
75 			Utils::MakeArray('S', 'O'),
76 			Utils::MakeSvArray(source, target)
77 		);
78 	}
79 	else {
80 		return ToString(target) + ToString(message);
81 	}
82 }
83 
GetPhysicalFailureMessage(const Game_Battler & source,const Game_Battler & target)84 std::string GetPhysicalFailureMessage(const Game_Battler& source, const Game_Battler& target) {
85 	return GetActionFailureMessage(source.GetName(), target.GetName(), lcf::Data::terms.dodge);
86 }
87 
GetSkillFailureMessage(const Game_Battler & source,const Game_Battler & target,const lcf::rpg::Skill & skill)88 std::string GetSkillFailureMessage(const Game_Battler& source, const Game_Battler& target, const lcf::rpg::Skill& skill) {
89 	StringView msg;
90 	switch (skill.failure_message) {
91 		case 0:
92 			msg = lcf::Data::terms.skill_failure_a;
93 			break;
94 		case 1:
95 			msg = lcf::Data::terms.skill_failure_b;
96 			break;
97 		case 2:
98 			msg = lcf::Data::terms.skill_failure_c;
99 			break;
100 		case 3:
101 			msg = lcf::Data::terms.dodge;
102 			break;
103 		default:
104 			break;
105 	}
106 	return GetActionFailureMessage(source.GetName(), target.GetName(), msg);
107 }
108 
GetUndamagedMessage(const Game_Battler & target)109 std::string GetUndamagedMessage(const Game_Battler& target) {
110 	StringView name = target.GetName();
111 	StringView message = (target.GetType() == Game_Battler::Type_Ally)
112 		? StringView(lcf::Data::terms.actor_undamaged)
113 		: StringView(lcf::Data::terms.enemy_undamaged);
114 
115 	if (Player::IsRPG2kE()) {
116 		return Utils::ReplacePlaceholders(
117 			message,
118 			Utils::MakeArray('S'),
119 			Utils::MakeSvArray(name)
120 		);
121 	}
122 	else {
123 		return ToString(name) + ToString(message);
124 	}
125 }
126 
GetCriticalHitMessage(const Game_Battler & source,const Game_Battler & target)127 std::string GetCriticalHitMessage(const Game_Battler& source, const Game_Battler& target) {
128 	StringView message = (target.GetType() == Game_Battler::Type_Ally)
129 		? StringView(lcf::Data::terms.actor_critical)
130 		: StringView(lcf::Data::terms.enemy_critical);
131 
132 	if (Player::IsRPG2kE()) {
133 		return Utils::ReplacePlaceholders(
134 			message,
135 			Utils::MakeArray('S', 'O'),
136 			Utils::MakeSvArray(source.GetName(), target.GetName())
137 		);
138 	}
139 	else {
140 		return ToString(message);
141 	}
142 }
143 
GetHpSpRecoveredMessage(const Game_Battler & target,int value,StringView points)144 static std::string GetHpSpRecoveredMessage(const Game_Battler& target, int value, StringView points) {
145 	if (Player::IsRPG2kE()) {
146 		return Utils::ReplacePlaceholders(
147 			lcf::Data::terms.hp_recovery,
148 			Utils::MakeArray('S', 'V', 'U'),
149 			Utils::MakeSvArray(target.GetName(), std::to_string(value), points)
150 		);
151 	}
152 	std::stringstream ss;
153 	std::string particle, particle2, space = "";
154 
155 	ss << target.GetName();
156 	if (Player::IsCP932()) {
157 		particle = "の";
158 		particle2 = "が ";
159 		space += " ";
160 	}
161 	else {
162 		particle = particle2 = " ";
163 	}
164 	ss << particle << points << particle2;
165 	ss << value << space << lcf::Data::terms.hp_recovery;
166 	return ss.str();
167 }
168 
GetHpRecoveredMessage(const Game_Battler & target,int value)169 std::string GetHpRecoveredMessage(const Game_Battler& target, int value) {
170 	return GetHpSpRecoveredMessage(target, value, lcf::Data::terms.health_points);
171 }
172 
GetSpRecoveredMessage(const Game_Battler & target,int value)173 std::string GetSpRecoveredMessage(const Game_Battler& target, int value) {
174 	return GetHpSpRecoveredMessage(target, value, lcf::Data::terms.spirit_points);
175 }
176 
GetParameterAbsorbedMessage(const Game_Battler & source,const Game_Battler & target,int value,StringView points)177 std::string GetParameterAbsorbedMessage(const Game_Battler& source, const Game_Battler& target, int value, StringView points) {
178 	const auto target_is_ally = (target.GetType() == Game_Battler::Type_Ally);
179 	StringView message = target_is_ally
180 		? StringView(lcf::Data::terms.actor_hp_absorbed)
181 		: StringView(lcf::Data::terms.enemy_hp_absorbed);
182 
183 	if (Player::IsRPG2kE()) {
184 		return Utils::ReplacePlaceholders(
185 			message,
186 			Utils::MakeArray('S', 'O', 'V', 'U'),
187 			Utils::MakeSvArray(source.GetName(), target.GetName(), std::to_string(value), points)
188 		);
189 	}
190 	std::stringstream ss;
191 	std::string particle, particle2, space = "";
192 
193 	ss << target.GetName();
194 
195 	if (Player::IsCP932()) {
196 		particle = (target_is_ally ? "は" : "の");
197 		particle2 = "を ";
198 		space += " ";
199 	} else {
200 		particle = particle2 = " ";
201 	}
202 	ss << particle << points << particle2;
203 	ss << value << space << message;
204 
205 	return ss.str();
206 }
207 
GetHpAbsorbedMessage(const Game_Battler & source,const Game_Battler & target,int value)208 std::string GetHpAbsorbedMessage(const Game_Battler& source, const Game_Battler& target, int value) {
209 	return GetParameterAbsorbedMessage(source, target, value, lcf::Data::terms.health_points);
210 }
211 
GetSpAbsorbedMessage(const Game_Battler & source,const Game_Battler & target,int value)212 std::string GetSpAbsorbedMessage(const Game_Battler& source, const Game_Battler& target, int value) {
213 	return GetParameterAbsorbedMessage(source, target, value, lcf::Data::terms.spirit_points);
214 }
215 
GetAtkAbsorbedMessage(const Game_Battler & source,const Game_Battler & target,int value)216 std::string GetAtkAbsorbedMessage(const Game_Battler& source, const Game_Battler& target, int value) {
217 	return GetParameterAbsorbedMessage(source, target, value, lcf::Data::terms.attack);
218 }
219 
GetDefAbsorbedMessage(const Game_Battler & source,const Game_Battler & target,int value)220 std::string GetDefAbsorbedMessage(const Game_Battler& source, const Game_Battler& target, int value) {
221 	return GetParameterAbsorbedMessage(source, target, value, lcf::Data::terms.defense);
222 }
223 
GetSpiAbsorbedMessage(const Game_Battler & source,const Game_Battler & target,int value)224 std::string GetSpiAbsorbedMessage(const Game_Battler& source, const Game_Battler& target, int value) {
225 	return GetParameterAbsorbedMessage(source, target, value, lcf::Data::terms.spirit);
226 }
227 
GetAgiAbsorbedMessage(const Game_Battler & source,const Game_Battler & target,int value)228 std::string GetAgiAbsorbedMessage(const Game_Battler& source, const Game_Battler& target, int value) {
229 	return GetParameterAbsorbedMessage(source, target, value, lcf::Data::terms.agility);
230 }
231 
GetDamagedMessage(const Game_Battler & target,int value)232 std::string GetDamagedMessage(const Game_Battler& target, int value) {
233 	bool target_is_ally = (target.GetType() == Game_Battler::Type_Ally);
234 	StringView message = target_is_ally
235 		? StringView(lcf::Data::terms.actor_damaged)
236 		: StringView(lcf::Data::terms.enemy_damaged);
237 
238 	if (Player::IsRPG2kE()) {
239 		return Utils::ReplacePlaceholders(
240 			message,
241 			Utils::MakeArray('S', 'V', 'U'),
242 			Utils::MakeSvArray(target.GetName(), std::to_string(value), lcf::Data::terms.health_points)
243 		);
244 	}
245 	std::stringstream ss;
246 	std::string particle, space = "";
247 	ss << target.GetName();
248 
249 	if (Player::IsCP932()) {
250 		particle = (target_is_ally ? "は " : "に ");
251 		space += " ";
252 	} else {
253 		particle = " ";
254 	}
255 	ss << particle << value << space << message;
256 	return ss.str();
257 }
258 
GetParameterChangeMessage(const Game_Battler & target,int value,StringView points)259 std::string GetParameterChangeMessage(const Game_Battler& target, int value, StringView points) {
260 	const bool is_positive = (value >= 0);
261 	value = std::abs(value);
262 	if (value == 0) {
263 		return "";
264 	}
265 
266 	StringView message = is_positive
267 		? StringView(lcf::Data::terms.parameter_increase)
268 	   	: StringView(lcf::Data::terms.parameter_decrease);
269 
270 
271 	if (Player::IsRPG2kE()) {
272 		return Utils::ReplacePlaceholders(
273 			message,
274 			Utils::MakeArray('S', 'V', 'U'),
275 			Utils::MakeSvArray(target.GetName(), std::to_string(value), points)
276 		);
277 	}
278 	std::stringstream ss;
279 	std::string particle, particle2, space = "";
280 	ss << target.GetName();
281 
282 	if (Player::IsCP932()) {
283 		particle = "の";
284 		particle2 = "が ";
285 		space += " ";
286 	}
287 	else {
288 		particle = particle2 = " ";
289 	}
290 	ss << particle << points << particle2 << value << space;
291 	ss << message;
292 
293 	return ss.str();
294 }
295 
GetSpReduceMessage(const Game_Battler & target,int value)296 std::string GetSpReduceMessage(const Game_Battler& target, int value) {
297 	return GetParameterChangeMessage(target, -value, lcf::Data::terms.spirit_points);
298 }
299 
GetAtkChangeMessage(const Game_Battler & target,int value)300 std::string GetAtkChangeMessage(const Game_Battler& target, int value) {
301 	return GetParameterChangeMessage(target, value, lcf::Data::terms.attack);
302 }
303 
GetDefChangeMessage(const Game_Battler & target,int value)304 std::string GetDefChangeMessage(const Game_Battler& target, int value) {
305 	return GetParameterChangeMessage(target, value, lcf::Data::terms.defense);
306 }
307 
GetSpiChangeMessage(const Game_Battler & target,int value)308 std::string GetSpiChangeMessage(const Game_Battler& target, int value) {
309 	return GetParameterChangeMessage(target, value, lcf::Data::terms.spirit);
310 }
311 
GetAgiChangeMessage(const Game_Battler & target,int value)312 std::string GetAgiChangeMessage(const Game_Battler& target, int value) {
313 	return GetParameterChangeMessage(target, value, lcf::Data::terms.agility);
314 }
315 
GetAttributeShiftMessage(const Game_Battler & target,int value,const lcf::rpg::Attribute & attribute)316 std::string GetAttributeShiftMessage(const Game_Battler& target, int value, const lcf::rpg::Attribute& attribute) {
317 	const bool is_positive = (value >= 0);
318 	value = std::abs(value);
319 	if (value == 0) {
320 		return "";
321 	}
322 	StringView message = is_positive
323 		? StringView(lcf::Data::terms.resistance_increase)
324 		: StringView(lcf::Data::terms.resistance_decrease);
325 	std::stringstream ss;
326 
327 	if (Player::IsRPG2kE()) {
328 		return Utils::ReplacePlaceholders(
329 			message,
330 			Utils::MakeArray('S', 'O'),
331 			Utils::MakeSvArray(target.GetName(), attribute.name)
332 		);
333 	}
334 	std::string particle, space = "";
335 	ss << target.GetName();
336 
337 	if (Player::IsCP932()) {
338 		particle = "は";
339 		space += " ";
340 	}
341 	else {
342 		particle = " ";
343 	}
344 	ss << particle << attribute.name << space;
345 	ss << message;
346 
347 	return ss.str();
348 }
349 
GetBasicStartMessage2k(const Game_Battler & source,StringView term)350 static std::string GetBasicStartMessage2k(const Game_Battler& source, StringView term) {
351 	if (Player::IsRPG2kE()) {
352 		return Utils::ReplacePlaceholders(
353 			term,
354 			Utils::MakeArray('S'),
355 			Utils::MakeSvArray(source.GetName())
356 		);
357 	}
358 	return ToString(source.GetName()) + ToString(term);
359 }
360 
GetNormalAttackStartMessage2k(const Game_Battler & source)361 std::string GetNormalAttackStartMessage2k(const Game_Battler& source) {
362 	return GetBasicStartMessage2k(source, lcf::Data::terms.attacking);
363 }
364 
GetDefendStartMessage2k(const Game_Battler & source)365 std::string GetDefendStartMessage2k(const Game_Battler& source) {
366 	return GetBasicStartMessage2k(source, lcf::Data::terms.defending);
367 }
368 
GetObserveStartMessage2k(const Game_Battler & source)369 std::string GetObserveStartMessage2k(const Game_Battler& source) {
370 	return GetBasicStartMessage2k(source, lcf::Data::terms.observing);
371 }
372 
GetChargeUpStartMessage2k(const Game_Battler & source)373 std::string GetChargeUpStartMessage2k(const Game_Battler& source) {
374 	return GetBasicStartMessage2k(source, lcf::Data::terms.focus);
375 }
376 
GetSelfDestructStartMessage2k(const Game_Battler & source)377 std::string GetSelfDestructStartMessage2k(const Game_Battler& source) {
378 	return GetBasicStartMessage2k(source, lcf::Data::terms.autodestruction);
379 }
380 
GetEscapeStartMessage2k(const Game_Battler & source)381 std::string GetEscapeStartMessage2k(const Game_Battler& source) {
382 	return GetBasicStartMessage2k(source, lcf::Data::terms.enemy_escape);
383 }
384 
GetTransformStartMessage(const Game_Battler & source,const lcf::rpg::Enemy & new_enemy)385 std::string GetTransformStartMessage(const Game_Battler& source, const lcf::rpg::Enemy& new_enemy) {
386 	if (Player::IsRPG2kE()) {
387 		return Utils::ReplacePlaceholders(
388 			lcf::Data::terms.enemy_transform,
389 			Utils::MakeArray('S', 'O'),
390 			Utils::MakeSvArray(source.GetName(), new_enemy.name)
391 		);
392 	}
393 	return ToString(source.GetName()) + ToString(lcf::Data::terms.enemy_transform);
394 }
395 
GetSkillStartMessageGeneric(const Game_Battler & source,const Game_Battler * target,const lcf::rpg::Skill & skill,StringView usage,bool second_message=false)396 static std::string GetSkillStartMessageGeneric(const Game_Battler& source, const Game_Battler* target, const lcf::rpg::Skill& skill, StringView usage, bool second_message = false) {
397 	StringView target_name = "???";
398 	if (target && Algo::IsNormalOrSubskill(skill) && Algo::SkillTargetsOne(skill)) {
399 		target_name = target->GetName();
400 	}
401 	if (Player::IsRPG2kE()) {
402 		return Utils::ReplacePlaceholders(
403 				usage,
404 				Utils::MakeArray('S', 'O', 'U'),
405 				Utils::MakeSvArray(source.GetName(), target_name, skill.name)
406 				);
407 	}
408 	if (second_message) {
409 		return ToString(usage);
410 	} else {
411 		return ToString(source.GetName()) + ToString(usage);
412 	}
413 }
414 
GetSkillFirstStartMessage2k(const Game_Battler & source,const Game_Battler * target,const lcf::rpg::Skill & skill)415 std::string GetSkillFirstStartMessage2k(const Game_Battler& source, const Game_Battler* target, const lcf::rpg::Skill& skill) {
416 	return GetSkillStartMessageGeneric(source, target, skill, skill.using_message1);
417 }
418 
GetSkillSecondStartMessage2k(const Game_Battler & source,const Game_Battler * target,const lcf::rpg::Skill & skill)419 std::string GetSkillSecondStartMessage2k(const Game_Battler& source, const Game_Battler* target, const lcf::rpg::Skill& skill) {
420 	return GetSkillStartMessageGeneric(source, target, skill, skill.using_message2, true);
421 }
422 
GetItemStartMessage2k(const Game_Battler & source,const lcf::rpg::Item & item)423 std::string GetItemStartMessage2k(const Game_Battler& source, const lcf::rpg::Item& item) {
424 	if (item.easyrpg_using_message != lcf::rpg::Item::kDefaultMessage) {
425 		return Utils::ReplacePlaceholders(
426 			item.easyrpg_using_message,
427 			Utils::MakeArray('S', 'O'),
428 			Utils::MakeSvArray(source.GetName(), item.name)
429 		);
430 	}
431 
432 	if (Player::IsRPG2kE()) {
433 		return Utils::ReplacePlaceholders(
434 			lcf::Data::terms.use_item,
435 			Utils::MakeArray('S', 'O'),
436 			Utils::MakeSvArray(source.GetName(), item.name)
437 		);
438 	}
439 	std::string particle;
440 	if (Player::IsCP932())
441 		particle = "は";
442 	else
443 		particle = " ";
444 	return ToString(source.GetName()) + particle + ToString(item.name) + ToString(lcf::Data::terms.use_item);
445 }
446 
GetDoubleAttackStartMessage2k3(const Game_Battler & source)447 std::string GetDoubleAttackStartMessage2k3(const Game_Battler& source) {
448 	if (lcf::Data::terms.easyrpg_battle2k3_double_attack == lcf::Data::terms.kDefaultTerm) {
449 		return "Double Attack";
450 	}
451 	return Utils::ReplacePlaceholders(
452 		lcf::Data::terms.easyrpg_battle2k3_double_attack,
453 		Utils::MakeArray('S'),
454 		Utils::MakeSvArray(source.GetName())
455 	);
456 }
457 
GetSkillStartMessage2k3(const Game_Battler & source,const Game_Battler * target,const lcf::rpg::Skill & skill)458 std::string GetSkillStartMessage2k3(const Game_Battler& source, const Game_Battler* target, const lcf::rpg::Skill& skill) {
459 	StringView target_name = "???";
460 	if (target && Algo::IsNormalOrSubskill(skill) && Algo::SkillTargetsOne(skill)) {
461 		target_name = target->GetName();
462 	}
463 	if (skill.easyrpg_battle2k3_message == lcf::rpg::Skill::kDefaultMessage) {
464 		if (lcf::Data::terms.easyrpg_battle2k3_skill == lcf::Data::terms.kDefaultTerm) {
465 			return ToString(skill.name);
466 		}
467 		return Utils::ReplacePlaceholders(
468 			lcf::Data::terms.easyrpg_battle2k3_skill,
469 			Utils::MakeArray('S', 'O', 'U'),
470 			Utils::MakeSvArray(source.GetName(), target_name, skill.name)
471 		);
472 	}
473 	return Utils::ReplacePlaceholders(
474 		skill.easyrpg_battle2k3_message,
475 		Utils::MakeArray('S', 'O', 'U'),
476 		Utils::MakeSvArray(source.GetName(), target_name, skill.name)
477 	);
478 }
479 
GetItemStartMessage2k3(const Game_Battler & source,const lcf::rpg::Item & item)480 std::string GetItemStartMessage2k3(const Game_Battler& source, const lcf::rpg::Item& item) {
481 	if (item.easyrpg_using_message == lcf::rpg::Item::kDefaultMessage) {
482 		if (lcf::Data::terms.easyrpg_battle2k3_item == lcf::Data::terms.kDefaultTerm) {
483 			return ToString(item.name);
484 		}
485 		return Utils::ReplacePlaceholders(
486 			lcf::Data::terms.easyrpg_battle2k3_item,
487 			Utils::MakeArray('S', 'O'),
488 			Utils::MakeSvArray(source.GetName(), item.name)
489 		);
490 	}
491 	return Utils::ReplacePlaceholders(
492 		item.easyrpg_using_message,
493 		Utils::MakeArray('S', 'O'),
494 		Utils::MakeSvArray(source.GetName(), item.name)
495 	);
496 }
497 
GetObserveStartMessage2k3(const Game_Battler & source)498 std::string GetObserveStartMessage2k3(const Game_Battler& source) {
499 	if (lcf::Data::terms.easyrpg_battle2k3_observe == lcf::Data::terms.kDefaultTerm) {
500 		return "Observe";
501 	}
502 	return Utils::ReplacePlaceholders(
503 		lcf::Data::terms.easyrpg_battle2k3_observe,
504 		Utils::MakeArray('S'),
505 		Utils::MakeSvArray(source.GetName())
506 	);
507 }
508 
GetDefendStartMessage2k3(const Game_Battler & source)509 std::string GetDefendStartMessage2k3(const Game_Battler& source) {
510 	if (lcf::Data::terms.easyrpg_battle2k3_defend == lcf::Data::terms.kDefaultTerm) {
511 		return "Defend";
512 	}
513 	return Utils::ReplacePlaceholders(
514 		lcf::Data::terms.easyrpg_battle2k3_defend,
515 		Utils::MakeArray('S'),
516 		Utils::MakeSvArray(source.GetName())
517 	);
518 }
519 
GetChargeUpStartMessage2k3(const Game_Battler & source)520 std::string GetChargeUpStartMessage2k3(const Game_Battler& source) {
521 	if (lcf::Data::terms.easyrpg_battle2k3_charge == lcf::Data::terms.kDefaultTerm) {
522 		return "Charge Up";
523 	}
524 	return Utils::ReplacePlaceholders(
525 		lcf::Data::terms.easyrpg_battle2k3_charge,
526 		Utils::MakeArray('S'),
527 		Utils::MakeSvArray(source.GetName())
528 	);
529 }
530 
GetSelfDestructStartMessage2k3(const Game_Battler & source)531 std::string GetSelfDestructStartMessage2k3(const Game_Battler& source) {
532 	if (lcf::Data::terms.easyrpg_battle2k3_selfdestruct == lcf::Data::terms.kDefaultTerm) {
533 		return "Self-Destruct";
534 	}
535 	return Utils::ReplacePlaceholders(
536 		lcf::Data::terms.easyrpg_battle2k3_selfdestruct,
537 		Utils::MakeArray('S'),
538 		Utils::MakeSvArray(source.GetName())
539 	);
540 }
541 
GetEscapeStartMessage2k3(const Game_Battler & source)542 std::string GetEscapeStartMessage2k3(const Game_Battler& source) {
543 	if (lcf::Data::terms.easyrpg_battle2k3_escape == lcf::Data::terms.kDefaultTerm) {
544 		return "Escape";
545 	}
546 	return Utils::ReplacePlaceholders(
547 		lcf::Data::terms.easyrpg_battle2k3_escape,
548 		Utils::MakeArray('S'),
549 		Utils::MakeSvArray(source.GetName())
550 	);
551 }
552 
553 } // namespace BattleMessage
554