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