summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/script_commands.txt100
-rw-r--r--npc/cities/splendide.txt2
-rw-r--r--npc/custom/etc/airplane.txt6
-rw-r--r--npc/custom/etc/quest_warper.txt2
-rw-r--r--npc/custom/events/uneasy_cemetery.txt6
-rw-r--r--npc/custom/quests/berzebub.txt2
-rw-r--r--npc/dev/test.txt18
-rw-r--r--npc/events/halloween_2006.txt2
-rw-r--r--npc/jobs/2-2/alchemist.txt1557
-rw-r--r--npc/quests/bard_quest.txt4
-rw-r--r--npc/quests/newgears/2010_headgears.txt12
-rw-r--r--npc/quests/skills/assassin_skills.txt10
-rw-r--r--npc/re/cities/dicastes.txt258
-rw-r--r--npc/re/events/halloween_2013.txt2
-rw-r--r--npc/re/events/halloween_2014.txt8
-rw-r--r--npc/re/instances/WolfchevLaboratory.txt17
-rw-r--r--npc/re/jobs/novice/academy.txt8
-rw-r--r--npc/re/merchants/ninja_craftsman.txt131
-rw-r--r--npc/re/quests/eden/100-110.txt2
-rw-r--r--npc/re/quests/eden/111-120.txt2
-rw-r--r--npc/re/quests/quests_dicastes.txt183
-rw-r--r--npc/re/quests/quests_eclage.txt2
-rw-r--r--npc/re/quests/quests_malangdo.txt7
-rw-r--r--npc/re/quests/quests_mora.txt3
-rw-r--r--npc/re/warps/cities/dicastes.txt2
-rw-r--r--src/common/HPMDataCheck.h2
-rw-r--r--src/common/db.h10
-rw-r--r--src/common/strlib.c1
-rw-r--r--src/config/core.h11
-rw-r--r--src/map/atcommand.c16
-rw-r--r--src/map/clif.c14
-rw-r--r--src/map/map.c17
-rw-r--r--src/map/npc.c8
-rw-r--r--src/map/script.c1213
-rw-r--r--src/map/script.h61
-rw-r--r--src/plugins/HPMHooking/HPMHooking.Defs.inc22
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc20
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc5
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.Hooks.inc163
-rw-r--r--src/plugins/generate-translations.c256
-rwxr-xr-xtravis.sh2
41 files changed, 2473 insertions, 1694 deletions
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index 05d075ac1..f0758de71 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -1188,7 +1188,7 @@ From here on, we will have the commands sorted as followed:
//=====================================
---------------------------------------
-*mes "<string>"{,"<string>"..."<string>"};
+*mes "<string>";
This command will displays a box on the screen for the invoking character,
if no such box is displayed already, and will print the string specified
@@ -1220,14 +1220,6 @@ non-English characters, the color codes might get screwed if they stick to
letters with no intervening space. Separating them with spaces from the
letters on either side solves the problem.
-To display multiple lines of message while only using a single mes;
-command, use the script command in the following format:
-
- mes "Line 1", "Line 2", "Line 3";
-
-This will display 3 different lines while only consuming a single line in
-the relevant script file.
-
If you're using a client from 2011-10-10aRagexe.exe onwards, you can also
use automatic navigation and open URLs in browser by using some HTML-like
labels. For example:
@@ -1243,6 +1235,23 @@ Clicking Google will open the browser and point to Google website.
---------------------------------------
+*mesf("<format>"{,<param>{, <param>{, ...}}})
+
+This command will display a box on the screen for the invoking character,
+if no such box is displayed already, and will print the string specified
+into that box, after applying the same format-string replacements as sprintf().
+
+Example:
+
+ mesf("Hello, I'm %s, a level %d %s", strcharinfo(PC_NAME), BaseLevel, jobname(Class));
+ // is equivalent to:
+ mes(sprintf("Hello, I'm %s, a level %d %s", strcharinfo(PC_NAME), BaseLevel, jobname(Class)));
+
+This command is a combination of mes() and sprintf(). See their documentation
+for more details.
+
+---------------------------------------
+
*next;
This command will display a 'next' button in the message window for the
@@ -8067,10 +8076,75 @@ Example:
*sprintf(<format>{,param{,param{,...}}})
-C style sprintf. The resulting string is returned same as in PHP. All C
-format specifiers are supported except %n. For more info check sprintf
-function at www.cplusplus.com
-Number of params is only limited by Hercules' script engine.
+C style sprintf. The resulting string is returned.
+
+The format string can contain placeholders (format specifiers) using the
+following structure:
+
+ %[parameter][flags][width]type
+
+The following format specifier types are supported:
+
+%%: Prints a literal '%' (special case, doesn't support parameter, flag, width)
+%d, %i: Formats the specified value as a decimal signed number
+%u: Formats the specified value as a decimal unsigned number
+%x: Formats the specified value as a hexadecimal (lowercase) unsigned number
+%X: Formats the specified value as a hexadecimal (uppercase) unsigned number
+%o: Formats the specified value as an octal unsigned number
+%s: Formats the specified value as a string
+%c: Formats the specified value as a character (only uses the first character
+ of strings)
+
+The following format specifier types are not supported:
+
+%n (not implemented due to safety concerns)
+%f, %F, %e, %E, %g, %G (the script engine doesn't use floating point values)
+%p (the script engine doesn't use pointers)
+%a, %A (not supported, use 0x%x and 0x%X respectively instead)
+
+An ordinal parameter can be specified in the form 'x$' (where x is a number),
+to reorder the output (this may be useful in translated strings, where the
+sentence order may be different from the original order). Example:
+
+ // Name, level, job name
+ mes(sprintf("Hello, I'm %s, a level %d %s", strcharinfo(PC_NAME), BaseLevel, jobname(Class)));
+
+When translating the sentence to other languages (for example Italian),
+swapping some arguments may be appropriate, and it may be desirable to keep the
+actual arguments in the same order (i.e. when translating through the HULD):
+
+ // Job name is printed before the level, although they're specified in the opposite order.
+ // Name, job name, level
+ mes(sprintf("Ciao, io sono %1$s, un %3$s di livello %2$d", strcharinfo(PC_NAME), BaseLevel, jobname(Class)));
+
+The supported format specifier flags are:
+
+- (minus): Left-align the output of this format specifier. (the default is to
+ right-align the output).
++ (plus): Prepends a plus for positive signed-numeric types. positive = '+',
+ negative = '-'.
+(space): Prepends a space for positive signed-numeric types. positive = ' ',
+ negative = '-'. This flag is ignored if the '+' flag exists.
+0 (zero): When a field width option is specified, prepends zeros for numeric
+ types. (the default prepends spaces).
+A field width can be specified.
+
+ mes(sprintf("The temperature is %+d degrees Celsius", .@temperature)); // Keeps the '+' sign in front of positive values
+ .@map_name$ = sprintf("quiz_%02d", .@i); // Keeps the leading 0 in "quiz_00", etc
+
+A field width may be specified, to ensure that 'at least' that many characters
+are printed. If a star ('*') is specified as width, then the width is read as
+argument to the sprintf() function. This also supports positional arguments.
+
+ sprintf("%04d", 10) // Returns "0010"
+ sprintf("%0*d", 5, 10) // Returns "00010"
+ sprintf("%5d", 10) // Returns " 10"
+ sprintf("%-5d", 10) // Returns "10 "
+ sprintf("%10s", "Hello") // Returns " Hello";
+ sprintf("%-10s", "Hello") // Returns "Hello ";
+
+Precision ('.X') and length ('hh', 'h', 'l', 'll', 'L', 'z', 'j', 't')
+specifiers are not implemented (not necessary for the script engine purposes)
Example:
.@format$ = "The %s contains %d monkeys";
diff --git a/npc/cities/splendide.txt b/npc/cities/splendide.txt
index c7ff5a365..d49f50ada 100644
--- a/npc/cities/splendide.txt
+++ b/npc/cities/splendide.txt
@@ -436,7 +436,7 @@ spl_in01,281,329,3 script Splendide Guard#tre 4_M_FAIRYSOLDIER,{
}
else {
mes "[Splendide Guard]";
- mes "AnduVeldRe Ko VeldReFulo So LomaurDu So So ";
+ mes "AnduVeldRe Ko VeldReFulo So LomaurDu So So";
close;
}
}
diff --git a/npc/custom/etc/airplane.txt b/npc/custom/etc/airplane.txt
index 99260f455..6fd500a41 100644
--- a/npc/custom/etc/airplane.txt
+++ b/npc/custom/etc/airplane.txt
@@ -293,10 +293,10 @@ glast_01,196,326,1 script Porter#07 4_M_TWBOY,{
umbala,188,98,3 script Porter#08 4_M_TWBOY,{
callfunc "F_Porter",8;
}
-comodo,203,75,8 script Porter#09 4_M_TWBOY,{
+comodo,203,75,0 script Porter#09 4_M_TWBOY,{
callfunc "F_Porter",9;
}
-amatsu,115,78,8 script Porter#10 4_M_TWBOY,{
+amatsu,115,78,0 script Porter#10 4_M_TWBOY,{
callfunc "F_Porter",10;
}
niflheim,132,242,5 script Porter#11 4_M_TWBOY,{
@@ -305,7 +305,7 @@ niflheim,132,242,5 script Porter#11 4_M_TWBOY,{
xmas,232,309,5 script Porter#12 4_M_TWBOY,{
callfunc "F_Porter",12;
}
-louyang,35,279,8 script Porter#13 4_M_TWBOY,{
+louyang,35,279,0 script Porter#13 4_M_TWBOY,{
callfunc "F_Porter",13;
}
gonryun,82,95,7 script Porter#14 4_M_TWBOY,{
diff --git a/npc/custom/etc/quest_warper.txt b/npc/custom/etc/quest_warper.txt
index c00559c8f..35b863e9d 100644
--- a/npc/custom/etc/quest_warper.txt
+++ b/npc/custom/etc/quest_warper.txt
@@ -1621,7 +1621,7 @@ niflheim,197,192,3 duplicate(Warpra#0) Warpra#9 4_F_KAFRA5
pay_arche,39,135,4 duplicate(Warpra#0) Warpra#10 4_F_KAFRA5
prt_fild05,273,215,4 duplicate(Warpra#0) Warpra#11 4_F_KAFRA5
tur_dun01,148,239,4 duplicate(Warpra#0) Warpra#12 4_F_KAFRA5
-valkyrie,48,35,8 duplicate(Warpra#0) Warpra#13 4_F_KAFRA5
+valkyrie,48,35,0 duplicate(Warpra#0) Warpra#13 4_F_KAFRA5
yuno_fild03,37,135,4 duplicate(Warpra#0) Warpra#14 4_F_KAFRA5
alberta,32,240,4 script Warpra#15 4_F_KAFRA5,{ callfunc "QWS_Town_Warpra",1,"Alberta Town"; close; }
diff --git a/npc/custom/events/uneasy_cemetery.txt b/npc/custom/events/uneasy_cemetery.txt
index 99c1f21cb..7027dacbf 100644
--- a/npc/custom/events/uneasy_cemetery.txt
+++ b/npc/custom/events/uneasy_cemetery.txt
@@ -33,7 +33,7 @@ OnInit:
end;
OnHour06:
- killmonster "Uneasy_Check::OnZombieDead"; //The Sun kills undead in the morning
+ killmonster "prontera", "Uneasy_Check::OnZombieDead"; //The Sun kills undead in the morning
end;
OnHour01:
@@ -54,7 +54,7 @@ OnZombieDead:
end;
L_Start_Undead:
- killmonster "Uneasy_Check::OnZombieDead"; //kills any left monsters
+ killmonster "prontera", "Uneasy_Check::OnZombieDead"; //kills any left monsters
enablenpc "Mother Mathana";
//call some monsters in the city
set $@UNEASY_MOB, 65;
@@ -98,7 +98,7 @@ L_Undead_Walk:
mes "[Mother Mathana]";
mes "Upon pouring the cemetery with that water we'll get " + $UNEASY_DL + " safe nights!";
next;
- killmonster "Uneasy_Check::OnZombieDead"; //kills any left monsters
+ killmonster "prontera", "Uneasy_Check::OnZombieDead"; //kills any left monsters
mes "[Mother Mathana]";
mes "See, "+ $UNEASY_H$ +"? They all are gone now!";
next;
diff --git a/npc/custom/quests/berzebub.txt b/npc/custom/quests/berzebub.txt
index 7dec41f79..5590a1911 100644
--- a/npc/custom/quests/berzebub.txt
+++ b/npc/custom/quests/berzebub.txt
@@ -11,7 +11,7 @@
//= 1.2 Optimized. [Euphy]
//============================================================
-prontera,165,178,8 script Old Woman 8_F_GRANDMOTHER,{
+prontera,165,178,0 script Old Woman 8_F_GRANDMOTHER,{
setarray .@items[0],714,25,1061,100,1095,200,618,10,1551,2,1614,1,727,20;
set .@n$,"[Old Woman]";
diff --git a/npc/dev/test.txt b/npc/dev/test.txt
index 72cf86616..ee2bda259 100644
--- a/npc/dev/test.txt
+++ b/npc/dev/test.txt
@@ -711,6 +711,24 @@ function script HerculesSelfTestHelper {
callsub(OnCheck, "Callfunc (return NPC variables from another NPC)", callfunc("F_TestVarOfAnotherNPC", "TestVarOfAnotherNPC"), 1);
callsub(OnCheck, "Callfunc (return NPC variables from another NPC - local variable overwrite check)", .x, 2);
+ callsub(OnCheckStr, "sprintf (%%)", sprintf("'%%'"), "'%'");
+ callsub(OnCheckStr, "sprintf (%d)", sprintf("'%d'", 5), "'5'");
+ callsub(OnCheckStr, "sprintf (neg. %d)", sprintf("'%d'", -5), "'-5'");
+ callsub(OnCheckStr, "sprintf (%u)", sprintf("'%u'", 5), "'5'");
+ callsub(OnCheckStr, "sprintf (%x)", sprintf("'%x'", 10), "'a'");
+ callsub(OnCheckStr, "sprintf (%X)", sprintf("'%X'", 31), "'1F'");
+ callsub(OnCheckStr, "sprintf (%s)", sprintf("'%s'", "Hello World!"), "'Hello World!'");
+ callsub(OnCheckStr, "sprintf (%c)", sprintf("'%c'", "Hello World!"), "'H'");
+ callsub(OnCheckStr, "sprintf (%+d)", sprintf("'%+d'", 5), "'+5'");
+ callsub(OnCheckStr, "sprintf (%{n}d)", sprintf("'%5d'", 5), "' 5'");
+ callsub(OnCheckStr, "sprintf (%-{n}d)", sprintf("'%-5d'", 5), "'5 '");
+ callsub(OnCheckStr, "sprintf (%-+{n}d)", sprintf("'%-+5d'", 5), "'+5 '");
+ callsub(OnCheckStr, "sprintf (%+0{n}d)", sprintf("'%+05d'", 5), "'+0005'");
+ callsub(OnCheckStr, "sprintf (%0*d)", sprintf("'%0*d'", 5, 10), "'00010'");
+ callsub(OnCheckStr, "sprintf (Two args)", sprintf("'%+05d' '%x'", 5, 0x7f), "'+0005' '7f'");
+ callsub(OnCheckStr, "sprintf (positional)", sprintf("'%2$+05d'", 5, 6), "'+0006'");
+ callsub(OnCheckStr, "sprintf (positional)", sprintf("'%2$s' '%1$c'", "First", "Second"), "'Second' 'F'");
+
if (.errors) {
debugmes "Script engine self-test [ \033[0;31mFAILED\033[0m ]";
debugmes "**** The test was completed with " + .errors + " errors. ****";
diff --git a/npc/events/halloween_2006.txt b/npc/events/halloween_2006.txt
index 8a89214ec..8b34ab824 100644
--- a/npc/events/halloween_2006.txt
+++ b/npc/events/halloween_2006.txt
@@ -735,7 +735,7 @@ nif_fild01,219,267,4 duplicate(HwChicken) Masta's chicken#06_hw03 4_NFCOCK
nif_fild01,199,240,5 duplicate(HwChicken) Masta's chicken#06_hw04 4_NFCOCK
nif_fild01,316,97,6 duplicate(HwChicken) Masta's chicken#06_hw05 4_NFCOCK
nif_fild01,147,343,7 duplicate(HwChicken) Masta's chicken#06_hw06 4_NFCOCK
-nif_fild01,185,325,8 duplicate(HwChicken) Masta's chicken#06_hw07 4_NFCOCK
+nif_fild01,185,325,0 duplicate(HwChicken) Masta's chicken#06_hw07 4_NFCOCK
nif_fild01,133,105,1 duplicate(HwChicken) Masta's chicken#06_hw08 4_NFCOCK
nif_fild01,331,329,2 duplicate(HwChicken) Masta's chicken#06_hw09 4_NFCOCK
diff --git a/npc/jobs/2-2/alchemist.txt b/npc/jobs/2-2/alchemist.txt
index c3d1f9479..c211c6b60 100644
--- a/npc/jobs/2-2/alchemist.txt
+++ b/npc/jobs/2-2/alchemist.txt
@@ -41,218 +41,239 @@
alde_alche,27,185,5 script Alchemist Guildsman#am 4_F_ALCHE,{
mes "[Parmy Gianino]";
if (Upper == 1) {
- mes "Welcome to the";
- mes "Alchemist Unio--";
- mes "I-Impossible! How c-can";
- mes "something like this happen?";
+ mes "Welcome to the\r"
+ "Alchemist Unio--";
+ mes "I-Impossible! How c-can\r"
+ "something like this happen?";
next;
mes "[Parmy Gianino]";
mes "Wait, wait...";
- mes "I'm sorry. I was confused,";
- mes "that's all. You look just like";
- mes "someone I used to know. ";
- mes "Still, I get this weird";
- mes "feeling about you...";
+ mes "I'm sorry. I was confused,\r"
+ "that's all. You look just like\r"
+ "someone I used to know.";
+ mes "Still, I get this weird\r"
+ "feeling about you...";
close;
}
if (BaseJob != Job_Merchant) {
if (BaseJob == Job_Alchemist) {
- mes "Welcome, " + strcharinfo(0) + ".";
- mes "The Alchemist Union";
- mes "is busy today, like always.";
+ mesf("Welcome, %s.", strcharinfo(0));
+ mes "The Alchemist Union\r"
+ "is busy today, like always.";
next;
mes "[Parmy Gianino]";
- mes "Everyone is busy with their";
- mes "own research, but recently, some headway has been made in the field of biotechnology.";
+ mes "Everyone is busy with their\r"
+ "own research, but recently, some headway has been made in the field of biotechnology.";
next;
mes "[Parmy Gianino]";
- mes "Everyone is hoping that the biotechnological studies will yield positive results. Speaking of which, I wonder how the Alchemists working on artificial life are doing...";
+ mes "Everyone is hoping that the biotechnological studies will yield positive results. "
+ "Speaking of which, I wonder how the Alchemists working on artificial life are "
+ "doing...";
close;
}
else if (BaseClass == Job_Novice) {
- mes "Welcome to the";
- mes "Alchemist Union.";
- mes "We are recruiting";
- mes "talented people";
- mes "with novel ideas.";
+ mes "Welcome to the\r"
+ "Alchemist Union.";
+ mes "We are recruiting\r"
+ "talented people\r"
+ "with novel ideas.";
next;
mes "[Parmy Gianino]";
- mes "If you're interested in working with chemistry, visit us later when you become more knowledgable.";
+ mes "If you're interested in working with chemistry, visit us later when you become more "
+ "knowledgable.";
next;
mes "[Parmy Gianino]";
- mes "Just one thing:";
- mes "You've got to have";
- mes "knowledge of items";
- mes "as a Merchant first.";
+ mes "Just one thing:\r"
+ "You've got to have\r"
+ "knowledge of items\r"
+ "as a Merchant first.";
close;
}
- mes "Welcome to the";
- mes "Alchemist Union.";
- mes "We are recruiting";
- mes "talented people";
- mes "with novel ideas.";
+ mes "Welcome to the\r"
+ "Alchemist Union.";
+ mes "We are recruiting\r"
+ "talented people\r"
+ "with novel ideas.";
next;
mes "[Parmy Gianino]";
- mes "If you know any exceptional Merchants, by all means, please refer them to us. Those types of people tend to have a talent for Alchemy and experimentation~";
+ mes "If you know any exceptional Merchants, by all means, please refer them to us. Those types of "
+ "people tend to have a talent for Alchemy and experimentation~";
close;
}
if (ALCH_Q == 0) {
- mes "Welcome to the";
- mes "Alchemist Union.";
+ mes "Welcome to the\r"
+ "Alchemist Union.";
mes "How may I help you?";
next;
- switch(select("I would like to learn about Alchemists.", "I want to become an Alchemist.", "Nothing.")) {
+ switch (select("I would like to learn about Alchemists.",
+ "I want to become an Alchemist.",
+ "Nothing.")) {
case 1:
mes "[Parmy Gianino]";
- mes "Alchemists study and create new substances and items out of existing materials. Our knowledge allows us to change the properties of chemicals at the atomic level.";
+ mes "Alchemists study and create new substances and items out of existing materials. Our "
+ "knowledge allows us to change the properties of chemicals at the atomic level.";
next;
mes "[Parmy Gianino]";
- mes "Most people think our final goal";
- mes "is to create gold, but that's not the entire truth. We also want to create things like medicines";
- mes "and new materials.";
+ mes "Most people think our final goal\r"
+ "is to create gold, but that's not the entire truth. We also want to create things "
+ "like medicines\r"
+ "and new materials.";
next;
mes "[Parmy Gianino]";
- mes "A few of us research the";
- mes "creation of life, although many of us consider that god's territory. That field is so complex, most of us deal with slightly less complicated projects anyway.";
+ mes "A few of us research the\r"
+ "creation of life, although many of us consider that god's territory. That field is so "
+ "complex, most of us deal with slightly less complicated projects anyway.";
next;
mes "[Parmy Gianino]";
- mes "If you are interested in becoming an Alchemist, I recommend that you first get a lot of experience as a Merchant. Being a Merchant is a great opportunity to learn about materials as you deal with them.";
+ mes "If you are interested in becoming an Alchemist, I recommend that you first get a lot of "
+ "experience as a Merchant. Being a Merchant is a great opportunity to learn about "
+ "materials as you deal with them.";
next;
mes "[Parmy Gianino]";
- mes "Whether or not you try to become";
- mes "an Alchemist is your decision. The road to becoming an Alchemist is very challenging, and you'll need to focus on experimentation and research, instead of commerce.";
+ mes "Whether or not you try to become an Alchemist is your decision. The road to becoming an "
+ "Alchemist is very challenging, and you'll need to focus on experimentation and"
+ "research, instead of commerce.";
close;
case 2:
mes "[Parmy Gianino]";
mes "Is that so?";
mes "Nice to meet you.";
- mes "My name is Parmy Gianino";
- mes "of the Alchemist Union.";
+ mes "My name is Parmy Gianino\r"
+ "of the Alchemist Union.";
next;
mes "[Parmy Gianino]";
- mes "If you join our Union and";
- mes "complete the training, you";
- mes "will be officially recognized";
- mes "as an Alchemist and be able";
- mes "to contribute to our research.";
+ mes "If you join our Union and\r"
+ "complete the training, you\r"
+ "will be officially recognized\r"
+ "as an Alchemist and be able\r"
+ "to contribute to our research.";
next;
mes "[Parmy Gianino]";
mes "But we don't accept everyone.";
- mes "You must have a lot of tenacity";
- mes "and sincere devotion in exploring";
- mes "the various fields of science.";
+ mes "You must have a lot of tenacity\r"
+ "and sincere devotion in exploring\r"
+ "the various fields of science.";
next;
mes "[Parmy Gianino]";
- mes "There are a couple";
- mes "of requirements to join";
- mes "the Alchemist Union, but";
- mes "we'll discuss that";
- mes "after you apply.";
+ mes "There are a couple\r"
+ "of requirements to join\r"
+ "the Alchemist Union, but\r"
+ "we'll discuss that\r"
+ "after you apply.";
next;
mes "[Parmy Gianino]";
- mes "Well then, would";
- mes "you like to apply";
- mes "for registration?";
+ mes "Well then, would\r"
+ "you like to apply\r"
+ "for registration?";
next;
if (select("I would like to apply.", "I'll do it later.") == 1) {
if (JobLevel < 40) {
mes "[Parmy Gianino]";
mes "Hmmm...";
mes "Just a moment.";
- mes "I'm sorry to say that";
- mes "you're not experienced";
- mes "enough as a Merchant to";
- mes "join us right now.";
+ mes "I'm sorry to say that\r"
+ "you're not experienced\r"
+ "enough as a Merchant to\r"
+ "join us right now.";
next;
mes "[Parmy Gianino]";
- mes "You must be at least";
- mes "^551A8BJob Level 40^000000 to become";
- mes "an Alchemist. Come back";
- mes "later when you meet the";
- mes "Job Level requirement, okay?";
+ mes "You must be at least\r"
+ "^551A8BJob Level 40^000000 to become\r"
+ "an Alchemist. Come back\r"
+ "later when you meet the\r"
+ "Job Level requirement, okay?";
close;
}
mes "[Parmy Gianino]";
- mes "Alright, your application has been accepted. Now, you must pay the 50,000 Zeny application fee and bring some items before you can begin your formal training.";
+ mes "Alright, your application has been accepted. Now, you must pay the 50,000 Zeny "
+ "application fee and bring some items before you can begin your formal "
+ "training.";
next;
mes "[Parmy Gianino]";
- mes "But if you bring an ^551A8BOld Magic Book^000000 and ^551A8BHammer of Blacksmith^000000,";
- mes "we will accept that as a substitute for the item requirement.";
+ mesf("But if you bring an ^551A8B%s^000000 and ^551A8B%s^000000,\r"
+ "we will accept that as a substitute for the item requirement.",
+ getitemname(Old_Magic_Book), getitemname(Hammer_Of_Blacksmith));
next;
mes "[Parmy Gianino]";
mes "Now...";
- mes "Please sign";
- mes "the application.";
+ mes "Please sign\r"
+ "the application.";
next;
select(strcharinfo(0));
mes "[Parmy Gianino]";
- mes "Good, good. Now, if you have";
- mes "the Zeny for your application fee ready, I will tell you which items you will need to bring. Now, pay attention.";
+ mes "Good, good. Now, if you have\r"
+ "the Zeny for your application fee ready, I will tell you which items you will "
+ "need to bring. Now, pay attention.";
next;
if (Zeny < 50000) {
mes "[Parmy Gianino]";
- mes "Uh oh. You don't";
- mes "seem to have enough Zeny.";
- mes "Come back to me when you have 50,000 Zeny, otherwise we can't process your application.";
+ mes "Uh oh. You don't\r"
+ "seem to have enough Zeny.\r"
+ "Come back to me when you have 50,000 Zeny, otherwise we can't process "
+ "your application.";
close;
}
Zeny -= 50000;
mes "[Parmy Gianino]";
mes "Let's see.";
- mes "" + strcharinfo(0);
- mes "needs to bring...";
+ mesf("%s\r"
+ "needs to bring...",
+ strcharinfo(0));
switch(rand(1,3)) {
case 1:
ALCH_Q = 1;
setquest 2028;
- mes "^551A8B7 Berserk Potions^000000.";
+ mesf("^551A8B7 %s^000000.", getitemname(Berserk_Potion));
break;
case 2:
ALCH_Q = 2;
setquest 2029;
- mes "^551A8B100 Mini Furnaces^000000.";
+ mesf("^551A8B100 %s^000000.", getitemname(Portable_Furnace));
break;
case 3:
ALCH_Q = 3;
setquest 2030;
- mes "^551A8B7,500 Fire Arrows^000000.";
+ mesf("^551A8B7,500 %s^000000.", getitemname(Fire_Arrow));
}
next;
mes "[Parmy Gianino]";
- mes "Once you've gathered";
- mes "those items, come back";
- mes "to me and your training";
- mes "as an Alchemist will begin.";
+ mes "Once you've gathered\r"
+ "those items, come back\r"
+ "to me and your training\r"
+ "as an Alchemist will begin.";
mes "See you soon~";
close;
}
mes "[Parmy Gianino]";
- mes "Talented Merchants";
- mes "are always welcome here.";
+ mes "Talented Merchants\r"
+ "are always welcome here.";
mes "Please come back soon.";
close;
case 3:
mes "[Parmy Gianino]";
mes "Umm...";
- mes "Please let me know";
- mes "if you need anything.";
+ mes "Please let me know\r"
+ "if you need anything.";
close;
}
}
else if (ALCH_Q >= 1 && ALCH_Q <= 3) {
if (countitem(Old_Magic_Book) > 0 && countitem(Hammer_Of_Blacksmith) > 0) {
mes "Well now~!";
- mes "You've brought an";
- mes "Old Magic Book and";
- mes "a Hammer of Blacksmith.";
- mes "We'll put these items";
- mes "to good use.";
+ mesf("You've brought an\r"
+ "%s and\r"
+ "a %s.",
+ getitemname(Old_Magic_Book),
+ getitemname(Hammer_Of_Blacksmith));
+ mes "We'll put these items\r"
+ "to good use.";
next;
delitem Old_Magic_Book,1;
delitem Hammer_Of_Blacksmith,1;
mes "[Parmy Gianino]";
- mes "Okay, now you need to learn";
- mes "the basics to being an Alchemist and learn the procedures for mixing chemicals and medicines.";
+ mes "Okay, now you need to learn\r"
+ "the basics to being an Alchemist and learn the procedures for mixing chemicals and "
+ "medicines.";
ALCH_Q = 4;
if (questprogress(2028)) {
changequest 2028,2031;
@@ -265,10 +286,12 @@ alde_alche,27,185,5 script Alchemist Guildsman#am 4_F_ALCHE,{
}
next;
mes "[Parmy Gianino]";
- mes "But before all of that, you need to speak to Raspuchin. I'm not really sure what you'll be talking about with him...";
+ mes "But before all of that, you need to speak to Raspuchin. I'm not really sure what you'll "
+ "be talking about with him...";
next;
mes "[Parmy Gianino]";
- mes "It shouldn't be anything extraordinary, but you're still required to speak to Raspuchin, since apparently he's a part of the Alchemist selection process.";
+ mes "It shouldn't be anything extraordinary, but you're still required to speak to Raspuchin, "
+ "since apparently he's a part of the Alchemist selection process.";
close;
}
switch(ALCH_Q) {
@@ -277,15 +300,16 @@ alde_alche,27,185,5 script Alchemist Guildsman#am 4_F_ALCHE,{
case 3: setarray .@items[0],1752,7500; break;
}
if (countitem(.@items[0]) >= .@items[1]) {
- mes "Seems like";
- mes "you're all ready.";
- mes "The Union will put";
- mes "these items to good use.";
+ mes "Seems like\r"
+ "you're all ready.";
+ mes "The Union will put\r"
+ "these items to good use.";
next;
delitem .@items[0],.@items[1];
mes "[Parmy Gianino]";
- mes "Okay, now you need to learn";
- mes "the basics to being an Alchemist and learn the procedures for mixing chemicals and medicines.";
+ mes "Okay, now you need to learn\r"
+ "the basics to being an Alchemist and learn the procedures for mixing chemicals and "
+ "medicines.";
ALCH_Q = 4;
if (questprogress(2028)) {
changequest 2028,2031;
@@ -298,45 +322,49 @@ alde_alche,27,185,5 script Alchemist Guildsman#am 4_F_ALCHE,{
}
next;
mes "[Parmy Gianino]";
- mes "But before all of that, you need to speak to Raspuchin. I'm not really sure what you'll be talking about with him...";
+ mes "But before all of that, you need to speak to Raspuchin. I'm not really sure what you'll "
+ "be talking about with him...";
next;
mes "[Parmy Gianino]";
- mes "It shouldn't be anything extraordinary, but you're still required to speak to Raspuchin, since apparently he's a part of the Alchemist selection process.";
+ mes "It shouldn't be anything extraordinary, but you're still required to speak to Raspuchin, "
+ "since apparently he's a part of the Alchemist selection process.";
close;
}
mes "Aren't you ready?";
- mes "Like I said before,";
- mes "you must bring";
- mes "^551A8B"+.@items[1]+" "+getitemname(.@items[0])+"s^000000.";
+ mesf("Like I said before,\r"
+ "you must bring\r"
+ "^551A8B%d %s^000000.",
+ .@items[1],
+ getitemname(.@items[0]));
next;
mes "[Parmy Gianino]";
- mes "Come back when you";
- mes "have prepared the";
- mes "required items.";
+ mes "Come back when you\r"
+ "have prepared the\r"
+ "required items.";
close;
}
else if (ALCH_Q == 4) {
- mes "Go and talk to";
- mes "Mr. Raspuchin.";
- mes "He's involved in the";
- mes "Alchemist selection process, whatever that might mean.";
+ mes "Go and talk to\r"
+ "Mr. Raspuchin.";
+ mes "He's involved in the\r"
+ "Alchemist selection process, whatever that might mean.";
next;
mes "[Parmy Gianino]";
- mes "Hopefully, it";
- mes "won't be too much of";
- mes "a problem. I guess he'll just interview you, and ask you";
- mes "some simple questions.";
+ mes "Hopefully, it\r"
+ "won't be too much of\r"
+ "a problem. I guess he'll just interview you, and ask you\r"
+ "some simple questions.";
close;
}
else {
- mes "Ah, I'm sorry, but";
- mes "I'm busy right now~";
+ mes "Ah, I'm sorry, but\r"
+ "I'm busy right now~";
next;
mes "[Parmy Gianino]";
- mes "Why don't you ask";
- mes "someone else if you're";
- mes "not sure who to visit";
- mes "next? Good luck~";
+ mes "Why don't you ask\r"
+ "someone else if you're\r"
+ "not sure who to visit\r"
+ "next? Good luck~";
close;
}
}
@@ -345,67 +373,68 @@ alde_alche,175,107,3 script Fastidious Alchemist#am 4_M_ALCHE_B,{
mes "[Raspuchin Gregory]";
if (BaseJob != Job_Merchant) {
if (BaseJob == Job_Alchemist) {
- mes "Heeheehee";
- mes "keheheh~!";
+ mes "Heeheehee\r"
+ "keheheh~!";
mes "Eh? What do you want?!";
next;
mes "[Raspuchin Gregory]";
- mes "You're not here to steal my experimental results or plagiarize my work, are you? How dare you consider intellectual theft!";
+ mes "You're not here to steal my experimental results or plagiarize my work, are you? How dare "
+ "you consider intellectual theft!";
next;
mes "[Raspuchin Gregory]";
mes "You're not, are you?";
- mes "Well, as a colleague,";
- mes "let me just warn you";
- mes "that such tricks aren't";
- mes "tolerated here in the";
- mes "Alchemist Union!";
+ mes "Well, as a colleague,\r"
+ "let me just warn you\r"
+ "that such tricks aren't\r"
+ "tolerated here in the\r"
+ "Alchemist Union!";
close;
}
else if (BaseClass == Job_Novice) {
- mes "Heeheehee";
- mes "keheheh~!";
- mes "How cute, you've come";
- mes "all this way just to play...";
+ mes "Heeheehee\r"
+ "keheheh~!";
+ mes "How cute, you've come\r"
+ "all this way just to play...";
next;
mes "[Raspuchin Gregory]";
- mes "I'll let you";
- mes "go this time...";
- mes "But next time, don't";
- mes "expect to leave so easily...";
+ mes "I'll let you\r"
+ "go this time...";
+ mes "But next time, don't\r"
+ "expect to leave so easily...";
close;
}
else {
mes "What is it?!";
- mes "You're curious as";
- mes "to what I'm doing?";
+ mes "You're curious as\r"
+ "to what I'm doing?";
next;
mes "[Raspuchin Gregory]";
- mes "Heehee";
- mes "keheheh~!";
- mes "Why, I'm busy";
- mes "researching,";
- mes "of course!";
+ mes "Heehee\r"
+ "keheheh~!";
+ mes "Why, I'm busy\r"
+ "researching,\r"
+ "of course!";
next;
mes "[Raspuchin Gregory]";
- mes "Once this";
- mes "potion is complete...";
- mes "You can use it to take";
- mes "over an entire nation!";
+ mes "Once this\r"
+ "potion is complete...";
+ mes "You can use it to take\r"
+ "over an entire nation!";
next;
mes "[Raspuchin Gregory]";
mes "Hee hee hee!";
- mes "Something this";
- mes "dangerous has to";
- mes "be kept a secret!";
+ mes "Something this\r"
+ "dangerous has to\r"
+ "be kept a secret!";
mes "Understand?";
close;
}
}
if (ALCH_Q == 0) {
- mes "Heeheehee";
- mes "keheheh~!";
- mes "What do you";
- mes "want, kid?";
+ mes "Heeheehee\r"
+ "keheheh~!";
+ mes "What do you\r"
+ "want, kid?";
next;
mes "[Raspuchin Gregory]";
mes "A Merchant should go and set up shop and vend items. Why are you wandering in a place like this?";
@@ -413,32 +442,32 @@ alde_alche,175,107,3 script Fastidious Alchemist#am 4_M_ALCHE_B,{
mes "[Raspuchin Gregory]";
mes "Heheheh~!";
mes "Go vend somwhere else!";
- mes "And leave me to my";
- mes "dark enterprise!";
+ mes "And leave me to my\r"
+ "dark enterprise!";
close;
- }
- else if (ALCH_Q >= 1 && ALCH_Q <= 3) {
- mes "Heeheehee";
- mes "keheheh~!";
- mes "What do you";
- mes "want, kid?";
+ } else if (ALCH_Q >= 1 && ALCH_Q <= 3) {
+ mes "Heeheehee\r"
+ "keheheh~!";
+ mes "What do you\r"
+ "want, kid?";
next;
mes "[Raspuchin Gregory]";
mes "What...?";
mes "Learn Alchemy?!";
- mes "Don't even speak";
- mes "such nonsense!";
+ mes "Don't even speak\r"
+ "such nonsense!";
next;
mes "[Raspuchin Gregory]";
- mes "Even if you tried studying for a thousand years, maybe even more, it'd be useless to you! Forget about it and just worry about your store!";
+ mes "Even if you tried studying for a thousand years, maybe even more, it'd be useless to you! Forget "
+ "about it and just worry about your store!";
close;
}
else if ((ALCH_Q == 4) || (ALCH_Q == 5)) {
if (ALCH_Q == 4) {
mes "Heeheehee";
mes "keheheh~!";
- mes "What do you";
- mes "want, kid?";
+ mes "What do you\r"
+ "want, kid?";
next;
mes "[Raspuchin Gregory]";
mes "What...?";
@@ -447,44 +476,48 @@ alde_alche,175,107,3 script Fastidious Alchemist#am 4_M_ALCHE_B,{
mes "I just don't...!";
next;
mes "[Raspuchin Gregory]";
- mes "Nowadays, anyone thinks they can";
- mes "be Alchemists just by knowing how to mix a few herbs. That's why my interview is necessary.";
+ mes "Nowadays, anyone thinks they can\r"
+ "be Alchemists just by knowing how to mix a few herbs. That's why my interview is "
+ "necessary.";
next;
mes "[Raspuchin Gregory]";
- mes "Heeheehee";
- mes "keheheh~!";
- mes "I plan on weeding out all the dumb and incompetent, and chase them";
- mes "all away! We don't need morons!";
+ mes "Heeheehee\r"
+ "keheheh~!";
+ mes "I plan on weeding out all the dumb and incompetent, and chase them\r"
+ "all away! We don't need morons!";
next;
if (JobLevel == 50) {
mes "[Raspuchin Gregory]";
mes "Wait...";
- mes "Maybe I've";
- mes "misjudged you.";
+ mes "Maybe I've\r"
+ "misjudged you.";
if (Sex == SEX_MALE) {
- mes "You might be a pretty boy,";
- mes "but I can tell you're smart";
- mes "from your eyes.";
+ mes "You might be a pretty boy,\r"
+ "but I can tell you're smart\r"
+ "from your eyes.";
}
else {
- mes "Huh. You're a cutie alright,";
- mes "but I can tell you've got brains.";
+ mes "Huh. You're a cutie alright,\r"
+ "but I can tell you've got brains.";
}
next;
mes "[Raspuchin Gregory]";
mes "You're not just some stupid kid.";
- mes "I can tell youve gone through some rough times as a Merchant. Excellent. Keh heh heh~";
+ mes "I can tell youve gone through some rough times as a Merchant. Excellent. Keh heh "
+ "heh~";
next;
mes "[Raspuchin Gregory]";
- mes "Fine, just so we don't insult each other's intelligence, I'll just let you pass the interview.";
+ mes "Fine, just so we don't insult each other's intelligence, I'll just let you pass "
+ "the interview.";
next;
mes "[Raspuchin Gregory]";
- mes "So hurry up, become an Alchemist, do some good research, and you might turn out to be of some help to me. Hahahahahaha~!";
+ mes "So hurry up, become an Alchemist, do some good research, and you might turn out "
+ "to be of some help to me. Hahahahahaha~!";
next;
mes "[Raspuchin Gregory]";
mes "Now go to Darwin!";
- mes "He'll teach you how to do the experiments. Just tell him that";
- mes "I sent you.";
+ mes "He'll teach you how to do the experiments. Just tell him that\r"
+ "I sent you.";
ALCH_Q = 6;
changequest 2031,2032;
close;
@@ -492,25 +525,25 @@ alde_alche,175,107,3 script Fastidious Alchemist#am 4_M_ALCHE_B,{
else {
mes "[Raspuchin Gregory]";
mes "Surprised, are you?";
- mes "Keheheh~ If you thought";
- mes "becoming an Alchemist was";
- mes "just a matter of changing";
- mes "your clothes, then you're";
- mes "sadly mistaken.";
+ mes "Keheheh~ If you thought\r"
+ "becoming an Alchemist was\r"
+ "just a matter of changing\r"
+ "your clothes, then you're\r"
+ "sadly mistaken.";
next;
mes "[Raspuchin Gregory]";
- mes "Now, try solving";
- mes "all these problems.";
- mes "Let's see how smart";
- mes "really are.";
+ mes "Now, try solving\r"
+ "all these problems.";
+ mes "Let's see how smart\r"
+ "really are.";
}
}
else if (ALCH_Q == 5) {
mes "What...?!";
- mes "You want to take";
- mes "the test again?!";
- mes "I thought I told";
- mes "you to leave!";
+ mes "You want to take\r"
+ "the test again?!";
+ mes "I thought I told\r"
+ "you to leave!";
next;
mes "[Raspuchin Gregory]";
mes "I don't like it...";
@@ -518,15 +551,15 @@ alde_alche,175,107,3 script Fastidious Alchemist#am 4_M_ALCHE_B,{
next;
mes "[Raspuchin Gregory]";
mes "Fine...";
- mes "I'll try to overlook your pitiful performance last time and give";
- mes "you another chance. Don't screw";
- mes "up again, got it?";
+ mes "I'll try to overlook your pitiful performance last time and give\r"
+ "you another chance. Don't screw\r"
+ "up again, got it?";
next;
mes "[Raspuchin Gregory]";
- mes "Now then,";
- mes "give me all the";
- mes "^551A8Bright^000000 answers";
- mes "this time.";
+ mes "Now then,\r"
+ "give me all the\r"
+ "^551A8Bright^000000 answers\r"
+ "this time.";
}
next;
switch(rand(1,3)) {
@@ -562,38 +595,52 @@ alde_alche,175,107,3 script Fastidious Alchemist#am 4_M_ALCHE_B,{
input .@input;
if (.@input != 742) .@w_point += 1;
mes "[Raspuchin Gregory]";
- mes "How much do";
- mes "12 Red Potions,";
- mes "1 Butterfly Wing";
- mes "and 5 Fly Wings cost";
- mes "after a 24 % discount?";
+ mesf("How much do\r"
+ "12 %s,\r"
+ "1 %s\r"
+ "and 5 %s cost\r"
+ "after a 24%% discount?",
+ getitemname(Red_Potion),
+ getitemname(Wing_Of_Butterfly),
+ getitemname(Wing_Of_Fly));
next;
input .@input;
if (.@input != 909) .@w_point += 1;
mes "[Raspuchin Gregory]";
- mes "What is the";
- mes "total weight of";
- mes "3 Scimiters, 2 Helms";
- mes "and 1 Long Coat?";
+ mesf("What is the\r"
+ "total weight of\r"
+ "3 %s, 2 %s\r"
+ "and 1 %s?",
+ getitemname(Scimiter),
+ getitemname(Helm),
+ getitemname(Coat));
next;
input .@input;
if (.@input != 450) .@w_point += 1;
mes "[Raspuchin Gregory]";
- mes "What is the";
- mes "total defense of";
- mes "a Biretta, Mantle,";
- mes "Opera Mask, Ribbon,";
- mes "Muffler, Boots, and";
- mes "Ear Muffs?";
+ mesf("What is the\r"
+ "total defense of\r"
+ "a %s, %s,\r"
+ "%s, %s,\r"
+ "%s, %s, and\r"
+ "%s?",
+ getitemname(Biretta),
+ getitemname(Mantle),
+ getitemname(Phantom_Of_Opera),
+ getitemname(Ribbon),
+ getitemname(Muffler),
+ getitemname(Boots),
+ getitemname(Ear_Mufs));
next;
input .@input;
if (.@input != 20) .@w_point += 1;
mes "[Raspuchin Gregory]";
- mes "If you buy 5 Helms";
- mes "with a 24 % discount";
- mes "and sell it at 20";
- mes "how much profit";
- mes "do you earn?";
+ mesf("If you buy 5 %s\r"
+ "with a 24%% discount\r"
+ "and sell it at 20\r"
+ "how much profit\r"
+ "do you earn?",
+ getitemname(Helm));
next;
input .@input;
if (.@input != 8800) .@w_point += 1;
@@ -635,39 +682,53 @@ alde_alche,175,107,3 script Fastidious Alchemist#am 4_M_ALCHE_B,{
input .@input;
if (.@input != 742) .@w_point += 1;
mes "[Raspuchin Gregory]";
- mes "What is the";
- mes "total price of";
- mes "15 Green Potions,";
- mes "6 Magnifiers and";
- mes "4 Traps after";
- mes "a 24 % discount?";
+ mesf("What is the\r"
+ "total price of\r"
+ "15 %s,\r"
+ "6 %s and\r"
+ "4 %s after\r"
+ "a 24%% discount?",
+ getitemname(Green_Potion),
+ getitemname(Spectacles),
+ getitemname(Booby_Trap));
next;
input .@input;
if (.@input != 934) .@w_point += 1;
mes "[Raspuchin Gregory]";
- mes "What is the";
- mes "total weight of";
- mes "3 Ring Pommel Sabers,";
- mes "4 Caps, and 2 Boots?";
+ mesf("What is the\r"
+ "total weight of\r"
+ "3 %s,\r"
+ "4 %s, and 2 %s?",
+ getitemname(Ring_Pommel_Saber),
+ getitemname(Cap),
+ getitemname(Boots));
next;
input .@input;
if (.@input != 550) .@w_point += 1;
mes "[Raspuchin Gregory]";
- mes "What is the";
- mes "total defense of";
- mes "a Buckler, Long Coat,";
- mes "Gas Mask, Big Ribbon,";
- mes "Cute Ribbon, Sakkat,";
- mes "and Glasses?";
+ mesf("What is the\r"
+ "total defense of\r"
+ "a %s, %s,\r"
+ "%s, %s.\r"
+ "%s, %s,\r"
+ "and %s?",
+ getitemname(Buckler),
+ getitemname(Coat),
+ getitemname(Gas_Mask),
+ getitemname(Big_Sis'_Ribbon),
+ getitemname(Fillet),
+ getitemname(Sahkkat),
+ getitemname(Glasses));
next;
input .@input;
if (.@input != 16) .@w_point += 1;
mes "[Raspuchin Gregory]";
- mes "How much profit do you";
- mes "make if you buy Tights";
- mes "at a 24 % discount and";
- mes "sell it at 20 % of";
- mes "the normal price?";
+ mesf("How much profit do you\r"
+ "make if you buy %s\r"
+ "at a 24%% discount and\r"
+ "sell it at 20%% of\r"
+ "the normal price?",
+ getitemname(Tights));
next;
input .@input;
if (.@input != 8520) .@w_point += 1;
@@ -704,36 +765,50 @@ alde_alche,175,107,3 script Fastidious Alchemist#am 4_M_ALCHE_B,{
input .@input;
if (.@input != 742) .@w_point += 1;
mes "[Raspuchin Gregory]";
- mes "What is the";
- mes "total cost of";
- mes "6 Red Potions,";
- mes "7 Green Potions,";
- mes "and 8 Fly Wings";
- mes "after a 24 % discount?";
+ mesf("What is the\r"
+ "total cost of\r"
+ "6 %s,\r"
+ "7 %s,\r"
+ "and 8 %s\r"
+ "after a 24%% discount?",
+ getitemname(Red_Potion),
+ getitemname(Green_Potion),
+ getitemname(Wing_Of_Fly));
next;
input .@input;
if (.@input != 798) .@w_point += 1;
mes "[Raspuchin Gregory]";
- mes "What is the";
- mes "total weight of";
- mes "2 Ring Pommel Sabers,";
- mes "3 Caps, and 3 boots?";
+ mesf("What is the\r"
+ "total weight of\r"
+ "2 %s,\r"
+ "3 %s, and 3 %s?",
+ getitemname(Ring_Pommel_Saber),
+ getitemname(Cap),
+ getitemname(Boots));
next;
input .@input;
if (.@input != 480) .@w_point += 1;
mes "[Raspuchin Gregory]";
- mes "What is the";
- mes "total defense of";
- mes "a Mirror Shield, Mr. Smile, Leather Jacket, Silk Robe, Wedding Veil, Muffler, and Eye Patch?";
+ mesf("What is the\r"
+ "total defense of\r"
+ "a %s, %s, %s, %s, %s, %s, and %s?",
+ getitemname(Mirror_Shield),
+ getitemname(Mr_Smile),
+ getitemname(Leather_Jacket),
+ getitemname(Silk_Robe),
+ getitemname(Wedding_Veil),
+ getitemname(Muffler),
+ getitemname(Eye_Bandage));
next;
input .@input;
if (.@input != 12) .@w_point += 1;
mes "[Raspuchin Gregory]";
- mes "If you buy 4 Padded Armors";
- mes "at a 24% discount and sell";
- mes "them at 20% of the original";
- mes "price, how much profit would";
- mes "you make from this sale?";
+ mesf("If you buy 4 Padded Armors\r"
+ "at a 24%% discount and sell\r"
+ "them at 20%% of the original\r"
+ "price, how much profit would\r"
+ "you make from this sale?",
+ getitemname(Padded_Armor));
next;
input .@input;
if (.@input != 7680) .@w_point += 1;
@@ -755,44 +830,45 @@ alde_alche,175,107,3 script Fastidious Alchemist#am 4_M_ALCHE_B,{
}
else if (.@w_point == 2 && ALCH_Q == 5) {
mes "[Raspuchin Gregory]";
- mes "You've got serious";
- mes "weaknesses in math,";
- mes "but I'll let you go this time...";
+ mes "You've got serious\r"
+ "weaknesses in math,\r"
+ "but I'll let you go this time...";
next;
}
else {
ALCH_Q = 5;
mes "[Raspuchin Gregory]";
mes "Keheheh! Idiot!";
- mes "Just listening to your";
- mes "answers is making me feel";
- mes "stupider! You might as well";
- mes "have got them all wrong!";
+ mes "Just listening to your\r"
+ "answers is making me feel\r"
+ "stupider! You might as well\r"
+ "have got them all wrong!";
next;
mes "[Raspuchin Gregory]";
- mes "How can a person that";
- mes "can't even answer all of";
- mes "these simple questions think";
- mes "of becoming an Alchemist?!";
+ mes "How can a person that\r"
+ "can't even answer all of\r"
+ "these simple questions think\r"
+ "of becoming an Alchemist?!";
next;
mes "[Raspuchin Gregory]";
mes "Hm...?";
- mes "Did you get";
- mes "any right?";
+ mes "Did you get\r"
+ "any right?";
next;
mes "[Raspuchin Gregory]";
- mes "Fool! Even if you make one little mistake, everything goes wrong";
- mes "in Alchemy! Now get out of here!";
+ mes "Fool! Even if you make one little mistake, everything goes wrong\r"
+ "in Alchemy! Now get out of here!";
mes "You make me sick!";
close;
}
mes "[Raspuchin Gregory]";
- mes "So hurry up, become an Alchemist, do some good research, and you might turn out to be of some help to me. Hahahahahaha~!";
+ mes "So hurry up, become an Alchemist, do some good research, and you might turn out to be of some "
+ "help to me. Hahahahahaha~!";
next;
mes "[Raspuchin Gregory]";
mes "Now go to Darwin!";
- mes "He'll teach you how to do the experiments. Just tell him that";
- mes "I sent you.";
+ mes "He'll teach you how to do the experiments. Just tell him that\r"
+ "I sent you.";
ALCH_Q = 6;
changequest 2031,2032;
close;
@@ -825,16 +901,16 @@ alde_alche,13,15,7 script Studying Man#am 4_M_ALCHE_C,{
if (BaseJob == Job_Alchemist) {
mes "Ah...";
mes "You...";
- mes "You've become";
- mes "an Alchemist.";
+ mes "You've become\r"
+ "an Alchemist.";
next;
mes "[Darwin]";
mes "Remember...";
- mes "In your quest";
- mes "to make your";
- mes "dreams come true,";
- mes "do not lose what";
- mes "you cherish.";
+ mes "In your quest\r"
+ "to make your\r"
+ "dreams come true,\r"
+ "do not lose what\r"
+ "you cherish.";
next;
mes "[Darwin]";
mes "Ah...";
@@ -843,23 +919,23 @@ alde_alche,13,15,7 script Studying Man#am 4_M_ALCHE_C,{
close;
}
else {
- mes "When you have";
- mes "your dreams, you";
- mes "have everything.";
- mes "Without them, you have";
- mes "nothing more to lose.";
+ mes "When you have\r"
+ "your dreams, you\r"
+ "have everything.";
+ mes "Without them, you have\r"
+ "nothing more to lose.";
next;
mes "[Darwin]";
mes "These cursed eyes...";
- mes "They've lost sight of";
- mes "my dreams a long time ago.";
+ mes "They've lost sight of\r"
+ "my dreams a long time ago.";
mes "Ha ha ha ha...";
next;
mes "[Darwin]";
- mes "Does paradise";
- mes "really exist...?";
- mes "Not without my love...";
- mes "Not without Harmona...";
+ mes "Does paradise\r"
+ "really exist...?";
+ mes "Not without my love...\r"
+ "Not without Harmona...";
close;
}
}
@@ -880,94 +956,94 @@ alde_alche,13,15,7 script Studying Man#am 4_M_ALCHE_C,{
mes "[Darwin]";
mes "A wolf?";
mes "Or a human?";
- mes "You must be seeking";
- mes "something, are you not?";
+ mes "You must be seeking\r"
+ "something, are you not?";
next;
mes "[Darwin]";
mes "After all...";
- mes "Everyone has desires";
- mes "to fulfill. Be be careful.";
- mes "Do not be like the wild";
- mes "wolf drawn to the flowers.";
+ mes "Everyone has desires\r"
+ "to fulfill. Be be careful.";
+ mes "Do not be like the wild\r"
+ "wolf drawn to the flowers.";
next;
mes "[Darwin]";
mes "In your efforts to gain something else, you may end up sacrificing something precious to you.";
next;
mes "[Darwin]";
- mes "Cultivating joy and happiness";
- mes "is much like cultivating flowers.";
- mes "If something is missing, the";
- mes "flower will wilt away...";
+ mes "Cultivating joy and happiness\r"
+ "is much like cultivating flowers.";
+ mes "If something is missing, the\r"
+ "flower will wilt away...";
next;
mes "[Darwin]";
- mes "What brings you";
- mes "to this kind of place?";
+ mes "What brings you\r"
+ "to this kind of place?";
next;
- switch(select("I want to learn how to experiment.", "Tell me more about flowers.", "Nothing.")) {
+ switch (select("I want to learn how to experiment.", "Tell me more about flowers.", "Nothing.")) {
case 1:
mes "[Darwin]";
- mes "You wish to";
- mes "learn Alchemy?";
- mes "Everything I know,";
- mes "I've learned for the";
- mes "sake of making my";
- mes "dream come true...";
+ mes "You wish to\r"
+ "learn Alchemy?";
+ mes "Everything I know,\r"
+ "I've learned for the\r"
+ "sake of making my\r"
+ "dream come true...";
next;
mes "[Darwin]";
- mes "I'll teach";
- mes "you the basics...";
- mes "But everything you";
- mes "learn afterwards must";
- mes "be directed through";
- mes "your own motivations.";
+ mes "I'll teach\r"
+ "you the basics...";
+ mes "But everything you\r"
+ "learn afterwards must\r"
+ "be directed through\r"
+ "your own motivations.";
next;
mes "[Darwin]";
- mes "I will teach you";
- mes "how to make simple";
- mes "medicine. So please";
- mes "bring the following";
- mes "materials right away.";
+ mes "I will teach you\r"
+ "how to make simple\r"
+ "medicine. So please\r"
+ "bring the following\r"
+ "materials right away.";
next;
mes "[Darwin]";
- mes "^551A8B3 Medicine Bowls^000000,";
- mes "^551A8B3 Empty Bottles^000000,";
- mes "^551A8B1 Red Herb^000000,";
- mes "^551A8B1 Yellow Herb^000000 and";
- mes "^551A8B1 White Herb^000000.";
+ mesf("^551A8B3 %s^000000,", getitemname(Medicine_Bowl));
+ mesf("^551A8B3 %s^000000,", getitemname(Empty_Bottle));
+ mesf("^551A8B1 %s^000000,", getitemname(Red_Herb));
+ mesf("^551A8B1 %s^000000 and", getitemname(Yellow_Herb));
+ mesf("^551A8B1 %s^000000.", getitemname(White_Herb));
ALCH_Q = 7;
changequest 2032,2033;
next;
mes "[Darwin]";
- mes "Once you have";
- mes "prepared everything,";
- mes "return to me.";
+ mes "Once you have\r"
+ "prepared everything,\r"
+ "return to me.";
close;
case 2:
mes "[Darwin]";
mes "Flowers...?";
- mes "In the darkest";
- mes "recesses of my mind,";
- mes "there is a blossum";
- mes "that I faintly remember...";
+ mes "In the darkest\r"
+ "recesses of my mind,\r"
+ "there is a blossum\r"
+ "that I faintly remember...";
next;
mes "[Darwin]";
- mes "For the one that";
- mes "I love, I put all";
- mes "of my efforts into";
- mes "researching that one thing.";
+ mes "For the one that\r"
+ "I love, I put all\r"
+ "of my efforts into\r"
+ "researching that one thing.";
next;
mes "[Darwin]";
- mes "I won't tell you the details,";
- mes "but I was basically researching";
- mes "the relationship between";
- mes "wolves and flowers.";
+ mes "I won't tell you the details,\r"
+ "but I was basically researching\r"
+ "the relationship between\r"
+ "wolves and flowers.";
next;
mes "[Darwin]";
mes "But yes...";
mes "It was a flower.";
- mes "With its shine, it was said";
- mes "to let you see paradise.";
- mes "The ^551A8BIllusion Flower^000000...";
+ mes "With its shine, it was said\r"
+ "to let you see paradise.";
+ mesf("The ^551A8B%s^000000...", getitemname(Illusion_Flower));
next;
mes "[Darwin]";
mes "I even made";
@@ -1006,54 +1082,55 @@ alde_alche,13,15,7 script Studying Man#am 4_M_ALCHE_C,{
next;
mes "[Darwin]";
mes "Ah...";
- mes "You are the one who";
- mes "wishes to learn Alchemy.";
+ mes "You are the one who\r"
+ "wishes to learn Alchemy.";
mes "Have you prepared everything?";
next;
if (countitem(Illusion_Flower) > 0) {
mes "[Darwin]";
mes "Wait.";
- mes "That Illusion Flower.";
+ mesf("That %s.", getitemname(Illusion_Flower));
mes "How did you get that?";
next;
mes "[Darwin]";
mes "Where did you find it?!";
- mes "The flower that slowly";
- mes "blooms under the";
- mes "moonlight?";
+ mes "The flower that slowly\r"
+ "blooms under the\r"
+ "moonlight?";
mes "It's beautiful...!";
next;
mes "[Darwin]";
mes "Th-That flower...";
mes "Please let me see it.";
- mes "The Illusion Flower!";
+ mesf("The %s!", getitemname(Illusion_Flower));
mes "Uwaaaaaaah!!";
next;
mes "[Darwin]";
- mes "Would you be so kind";
- mes "as to let me have this flower?";
+ mes "Would you be so kind\r"
+ "as to let me have this flower?";
mes "I'm sure that this is the Moonlight Flower that I've been seeking!";
next;
if (select("Sorry, I can't give it to you.", "I brought it to give to you.") == 1) {
mes "[Darwin]";
mes "I understand.";
- mes "You can't give";
- mes "such a precious";
- mes "flower to just anyone.";
+ mes "You can't give\r"
+ "such a precious\r"
+ "flower to just anyone.";
mes "Well... It's okay.";
next;
mes "[Darwin]";
- mes "It just brought back old memories. I shouldn't have asked in the first place. In any case, please bring what is needed for the experiment.";
+ mes "It just brought back old memories. I shouldn't have asked in the first place. In "
+ "any case, please bring what is needed for the experiment.";
next;
mes "[Darwin]";
- mes "Please leave that flower";
- mes "somewhere else. It brings";
- mes "back too many memories...";
+ mes "Please leave that flower\r"
+ "somewhere else. It brings\r"
+ "back too many memories...";
close;
}
mes "[Darwin]";
- mes "Are you";
- mes "serious?!";
+ mes "Are you\r"
+ "serious?!";
mes "Thank you!";
mes "Such a precious flower.";
mes "Ah, Harmona, my love...";
@@ -1064,72 +1141,76 @@ alde_alche,13,15,7 script Studying Man#am 4_M_ALCHE_C,{
mes "I shall plant all of my knowledge of Alchemy directly into your mind...";
next;
mes "[Darwin]";
- mes "Open your eyes wide,";
- mes "and look into my eyes!!";
+ mes "Open your eyes wide,\r"
+ "and look into my eyes!!";
mes "Don't stop until the end!!";
next;
mes "Lorem ipsum dolor sit amet,";
next;
- mes "Lorem ipsum dolor sit amet,";
- mes "consectetuer adipiscing elit.";
+ mes "Lorem ipsum dolor sit amet,\r"
+ "consectetuer adipiscing elit.";
next;
- mes "Lorem ipsum dolor sit amet,";
- mes "consectetuer adipiscing elit.";
+ mes "Lorem ipsum dolor sit amet,\r"
+ "consectetuer adipiscing elit.";
mes "Aenean fermentum ullamcorper.";
next;
- mes "Lorem ipsum dolor sit amet,";
- mes "consectetuer adipiscing elit.";
+ mes "Lorem ipsum dolor sit amet,\r"
+ "consectetuer adipiscing elit.";
mes "Aenean fermentum ullamcorper.";
mes "Vestibulum ante ipsum primis in";
next;
- mes "Lorem ipsum dolor sit amet,";
- mes "consectetuer adipiscing elit.";
+ mes "Lorem ipsum dolor sit amet,\r"
+ "consectetuer adipiscing elit.";
mes "Aenean fermentum ullamcorper.";
- mes "Vestibulum ante ipsum primis in";
- mes "faucibus orci luctus et ultrices";
+ mes "Vestibulum ante ipsum primis in\r"
+ "faucibus orci luctus et ultrices";
next;
- mes "Lorem ipsum dolor sit amet,";
- mes "consectetuer adipiscing elit.";
+ mes "Lorem ipsum dolor sit amet,\r"
+ "consectetuer adipiscing elit.";
mes "Aenean fermentum ullamcorper.";
- mes "Vestibulum ante ipsum primis in";
- mes "faucibus orci luctus et ultrices";
- mes "posuere cubilia Curae; Morbi";
+ mes "Vestibulum ante ipsum primis in\r"
+ "faucibus orci luctus et ultrices\r"
+ "posuere cubilia Curae; Morbi";
next;
- mes "Lorem ipsum dolor sit amet,";
- mes "consectetuer adipiscing elit.";
+ mes "Lorem ipsum dolor sit amet,\r"
+ "consectetuer adipiscing elit.";
mes "Aenean fermentum ullamcorper.";
- mes "Vestibulum ante ipsum primis in";
- mes "faucibus orci luctus et ultrices";
- mes "posuere cubilia Curae; Morbi";
- mes "massa, fermentum vitae...";
+ mes "Vestibulum ante ipsum primis in\r"
+ "faucibus orci luctus et ultrices\r"
+ "posuere cubilia Curae; Morbi\r"
+ "massa, fermentum vitae...";
next;
delitem Illusion_Flower,1;
mes "[Darwin]";
mes "^666666*Gasp...*^000000";
- mes "You are now";
- mes "an Alchemist!!";
- mes "Go to the Union";
- mes "and cast away the last";
- mes "vestiges of Merchant life!!";
+ mes "You are now\r"
+ "an Alchemist!!";
+ mes "Go to the Union\r"
+ "and cast away the last\r"
+ "vestiges of Merchant life!!";
ALCH_Q = 40;
changequest 2033,2034;
close;
}
else if (countitem(Medicine_Bowl) > 2 && countitem(Empty_Bottle) > 2 && countitem(Red_Herb) > 0 && countitem(Yellow_Herb) > 0 && countitem(White_Herb) > 0) {
mes "[Darwin]";
- mes "Seems like you have everything ready. As promised, I will teach you how to make simple medicine.";
+ mes "Seems like you have everything ready. As promised, I will teach you how to make simple "
+ "medicine.";
next;
mes "[Darwin]";
- mes "First, prepare the Medicine Bowl. Then, you put the Herbs inside, like this, and slowly crush them.";
+ mesf("First, prepare the %s. Then, you put the Herbs inside, like this, and slowly "
+ "crush them.",
+ getitemname(Medicine_Bowl));
next;
mes "[Darwin]";
- mes "Pour small amounts";
- mes "of clean water and stir";
- mes "the mixture until it thickens.";
+ mes "Pour small amounts\r"
+ "of clean water and stir\r"
+ "the mixture until it thickens.";
mes "Afterwards, add some more Herbs.";
next;
mes "[Darwin]";
- mes "That's how you make it. If you think you have enough, gently pour the mixture into an empty bottle.";
+ mes "That's how you make it. If you think you have enough, gently pour the mixture into an "
+ "empty bottle.";
delitem Medicine_Bowl,3;
delitem Empty_Bottle,3;
delitem Red_Herb,1;
@@ -1137,14 +1218,16 @@ alde_alche,13,15,7 script Studying Man#am 4_M_ALCHE_C,{
delitem White_Herb,1;
next;
mes "[Darwin]";
- mes "There you go,";
- mes "it's complete.";
- mes "Now, make some medicine";
- mes "using the simple procedure";
- mes "I just explained to you.";
+ mes "There you go,\r"
+ "it's complete.";
+ mes "Now, make some medicine\r"
+ "using the simple procedure\r"
+ "I just explained to you.";
.@w_point = 0;
next;
- switch(select("Prepare the Medicine Bowl.", "Put the Medicine Bowl on your head.", "Kick the Medicine Bowl.")) {
+ switch (select(sprintf(_$("Prepare the %s."), getitemname(Medicine_Bowl)),
+ sprintf(_$("Put the %s on your head."), getitemname(Medicine_Bowl)),
+ sprintf(_$("Kick the %s."), getitemname(Medicine_Bowl)))) {
case 1:
break;
case 2:
@@ -1160,13 +1243,15 @@ alde_alche,13,15,7 script Studying Man#am 4_M_ALCHE_C,{
next;
break;
}
- switch(select("Put some dirt in the Medicine Bowl.", "Put some Herbs in the Medicine Bowl.", "Put a Harp in the Medicine Bowl.")) {
+ switch (select(sprintf(_$("Put some dirt in the %s."), getitemname(Medicine_Bowl)),
+ sprintf(_$("Put some Herbs in the %s."), getitemname(Medicine_Bowl)),
+ sprintf(_$("Put a Harp in the %s."), getitemname(Medicine_Bowl)))) {
case 1:
++.@w_point;
mes "[Darwin]";
mes "...Eh!?";
- mes "That's not";
- mes "medicine!";
+ mes "That's not\r"
+ "medicine!";
next;
break;
case 2:
@@ -1175,32 +1260,36 @@ alde_alche,13,15,7 script Studying Man#am 4_M_ALCHE_C,{
++.@w_point;
mes "[Darwin]";
mes "A Harp?";
- mes "And how would";
- mes "you do that?";
+ mes "And how would\r"
+ "you do that?";
next;
break;
}
- switch(select("Crush the Herbs.", "Crush the Medicine Bowl.", "Crush Darwin's foot.")) {
+ switch (select("Crush the Herbs.",
+ sprintf(_$("Crush the %s."), getitemname(Medicine_Bowl)),
+ "Crush Darwin's foot.")) {
case 1:
break;
case 2:
++.@w_point;
mes "[Darwin]";
- mes "Wh-What are";
- mes "you doing!?";
+ mes "Wh-What are\r"
+ "you doing!?";
next;
break;
case 3:
++.@w_point;
mes "[Darwin]";
mes "Agh...!";
- mes "What do you";
- mes "think you're";
- mes "doing?!";
+ mes "What do you\r"
+ "think you're\r"
+ "doing?!";
next;
break;
}
- switch(select("Spray clean water.", "Drink clean water.", "Pour clean water.")) {
+ switch (select("Spray clean water.",
+ "Drink clean water.",
+ "Pour clean water.")) {
case 1:
++.@w_point;
mes "[Darwin]";
@@ -1212,41 +1301,45 @@ alde_alche,13,15,7 script Studying Man#am 4_M_ALCHE_C,{
++.@w_point;
mes "[Darwin]";
mes "W-wait...";
- mes "Are you";
- mes "taking a break?";
+ mes "Are you\r"
+ "taking a break?";
next;
break;
case 3:
break;
}
- switch(select("Continue crushing the Herbs.", "Continue eating the Herbs.", "Continue dancing and singing.")) {
+ switch (select("Continue crushing the Herbs.",
+ "Continue eating the Herbs.",
+ "Continue dancing and singing.")) {
case 1:
break;
case 2:
++.@w_point;
mes "[Darwin]";
mes "Eat the Herbs?";
- mes "I think you need";
- mes "to focus on the";
- mes "task at hand...";
+ mes "I think you need\r"
+ "to focus on the\r"
+ "task at hand...";
next;
break;
case 3:
++.@w_point;
mes "[Darwin]";
- mes "Singing and";
- mes "dancing? Alchemists";
- mes "don't do that, have";
- mes "you gone crazy?";
+ mes "Singing and\r"
+ "dancing? Alchemists\r"
+ "don't do that, have\r"
+ "you gone crazy?";
next;
break;
}
- switch(select("Put noodles in and fry it.", "Pour it in an empty bottle.", "Hold the Medicine Bowl and drink it.")) {
+ switch (select("Put noodles in and fry it.",
+ "Pour it in an empty bottle.",
+ sprintf(_$("Hold the %s and drink it."), getitemname(Medicine_Bowl)))) {
case 1:
++.@w_point;
mes "[Darwin]";
- mes "We're Alchemists,";
- mes "not restaurant chefs.";
+ mes "We're Alchemists,\r"
+ "not restaurant chefs.";
next;
break;
case 2:
@@ -1265,9 +1358,9 @@ alde_alche,13,15,7 script Studying Man#am 4_M_ALCHE_C,{
mes "......";
next;
mes "[Darwin]";
- mes "You messed up the mixture";
- mes "since you didn't follow the procedure! Get some more ingredients so you can try it";
- mes "again until you get it right.";
+ mes "You messed up the mixture\r"
+ "since you didn't follow the procedure! Get some more ingredients so you can "
+ "try it again until you get it right.";
close;
}
getitem Red_Potion,1;
@@ -1275,81 +1368,82 @@ alde_alche,13,15,7 script Studying Man#am 4_M_ALCHE_C,{
getitem White_Potion,1;
mes "[Darwin]";
mes "Good job.";
- mes "It came out pretty well considering it's your first time. Go ahead and keep the medicines that you've just made.";
+ mes "It came out pretty well considering it's your first time. Go ahead and keep the medicines "
+ "that you've just made.";
ALCH_Q = 8;
changequest 2033,2035;
next;
mes "[Darwin]";
- mes "Now, go into the next room";
- mes "and speak to Van Helmont to";
- mes "continue your training.";
+ mes "Now, go into the next room\r"
+ "and speak to Van Helmont to\r"
+ "continue your training.";
next;
mes "[Darwin]";
mes "Never forget...";
- mes "You must always protect";
- mes "what is most precious to you.";
+ mes "You must always protect\r"
+ "what is most precious to you.";
close;
}
else {
mes "[Darwin]";
- mes "Have you forgotten";
- mes "what you need to bring?";
- mes "Let me remind you once";
- mes "again. You must come";
- mes "back with...";
+ mes "Have you forgotten\r"
+ "what you need to bring?";
+ mes "Let me remind you once\r"
+ "again. You must come\r"
+ "back with...";
next;
mes "[Darwin]";
- mes "^551A8B3 Medicine Bowls^000000,";
- mes "^551A8B3 Empty Bottle^000000,";
- mes "^551A8B1 Red Herb^000000,";
- mes "^551A8B1 Yellow Herb^000000 and";
- mes "^551A8B1 White Herb^000000.";
+ mesf("^551A8B3 %s^000000,", getitemname(Medicine_Bowl));
+ mesf("^551A8B3 %s^000000,", getitemname(Empty_Bottle));
+ mesf("^551A8B1 %s^000000,", getitemname(Red_Herb));
+ mesf("^551A8B1 %s^000000 and", getitemname(Yellow_Herb));
+ mesf("^551A8B1 %s^000000.", getitemname(White_Herb));
next;
mes "[Darwin]";
- mes "Come back";
- mes "when you are";
- mes "ready...";
+ mes "Come back\r"
+ "when you are\r"
+ "ready...";
close;
}
}
else if (ALCH_Q == 8) {
- mes "I said to go";
- mes "to Van Helmont.";
- mes "I'd like to teach you";
- mes "more, but I can't.";
+ mes "I said to go\r"
+ "to Van Helmont.";
+ mes "I'd like to teach you\r"
+ "more, but I can't.";
next;
mes "[Darwin]";
mes "Aah...";
mes "Harmona, my love.";
- mes "I can't even see the flower anymore. My soul quietly";
- mes "withers as well..";
+ mes "I can't even see the flower anymore. My soul quietly\r"
+ "withers as well..";
close;
}
else if (ALCH_Q == 40) {
- mes "I have already given you all of my knowledge and have nothing more";
- mes "to teach you.";
+ mes "I have already given you all of my knowledge and have nothing more\r"
+ "to teach you.";
next;
mes "[Darwin]";
- mes "Go to the second floor and talk to speak to our Union Leader. Once";
- mes "you do that, your life as an Alchemist will begin.";
+ mes "Go to the second floor and talk to speak to our Union Leader. Once\r"
+ "you do that, your life as an Alchemist will begin.";
close;
}
else {
mes "When you have";
- mes "your dreams, you";
- mes "have everything.";
- mes "Without them, you have";
- mes "nothing more to lose.";
+ mes "your dreams, you\r"
+ "have everything.";
+ mes "Without them, you have\r"
+ "nothing more to lose.";
next;
mes "[Darwin]";
mes "These cursed eyes...";
- mes "They've lost sight of";
- mes "my dreams a long time ago.";
+ mes "They've lost sight of\r"
+ "my dreams a long time ago.";
mes "Ha ha ha ha...";
next;
mes "[Darwin]";
- mes "Does paradise";
- mes "really exist...?";
+ mes "Does paradise\r"
+ "really exist...?";
mes "Not without my love...";
mes "Not without Harmona...";
close;
@@ -1361,51 +1455,54 @@ alde_alche,79,19,5 script Experiment Expert#am 4_M_ALCHE_A,{
if (BaseJob != Job_Merchant) {
if (BaseJob == Job_Alchemist) {
mes "What do you want?";
- mes "I'm busy!! Don't";
- mes "bother me and get";
- mes "on your way.";
+ mes "I'm busy!! Don't\r"
+ "bother me and get\r"
+ "on your way.";
next;
mes "[Van Helmont]";
mes "Now, come on...";
- mes "You'll never get";
- mes "any research completed if you just slack off. Go out and learn all that you can.";
+ mes "You'll never get\r"
+ "any research completed if you just slack off. Go out and learn all that you can.";
next;
mes "[Van Helmont]";
- mes "Reading science journals and performing experiments. That's what Alchemy is all about. Now, let me get back to work!";
+ mes "Reading science journals and performing experiments. That's what Alchemy is all about. "
+ "Now, let me get back to work!";
close;
}
else {
mes "Just a little...";
mes "A little bit more...";
- mes "Nooo! Just a little";
- mes "bit more and it";
- mes "would've been done!";
+ mes "Nooo! Just a little\r"
+ "bit more and it\r"
+ "would've been done!";
next;
mes "[Van Helmont]";
mes "Why...?!";
mes "Why, another failure?!";
- mes "My calculations were";
- mes "all correct! W-Wait...!";
+ mes "My calculations were\r"
+ "all correct! W-Wait...!";
next;
mes "[Van Helmont]";
- mes "Perhaps, if I capacitated the thermal flux by using the neutronic gradient, it just might work...!";
+ mes "Perhaps, if I capacitated the thermal flux by using the neutronic gradient, it just might "
+ "work...!";
close;
}
}
if (ALCH_Q == 8) {
mes "Arrrrgh...!";
- mes "Why isn't this formula working? What's wrong? In theory, it's all correct, but there must be an error in the formula somewhere...";
+ mes "Why isn't this formula working? What's wrong? In theory, it's all correct, but there must be an "
+ "error in the formula somewhere...";
next;
mes "[Van Helmont]";
- mes "I pour it in here, and it should stop. Wait, this is the wrong solution! How could I make such";
- mes "a dumb mistake?! When did these";
- mes "get switched?!";
+ mes "I pour it in here, and it should stop. Wait, this is the wrong solution! How could I make such\r"
+ "a dumb mistake?! When did these\r"
+ "get switched?!";
next;
mes "[Van Helmont]";
mes "Okay, okay...";
mes "I just need to fix this part.";
- mes "No need to start over. I just";
- mes "need to fix it... But wait. Wait...";
+ mes "No need to start over. I just\r"
+ "need to fix it... But wait. Wait...";
next;
mes "[Van Helmont]";
mes ".................";
@@ -1417,10 +1514,12 @@ alde_alche,79,19,5 script Experiment Expert#am 4_M_ALCHE_A,{
if (select("I want to become an Alchemist.", ".......") == 2) {
mes "[Van Helmont]";
mes "Hmm...?";
- mes "What, did you just want to watch? Fine, fine, but do it quietly and leave right when you're done.";
+ mes "What, did you just want to watch? Fine, fine, but do it quietly and leave right when "
+ "you're done.";
next;
mes "[Van Helmont]";
- mes "Stay out of my way and don't go around touching stuff. There might be some volatile materials, so it'd be dangerous to have any accidents.";
+ mes "Stay out of my way and don't go around touching stuff. There might be some volatile "
+ "materials, so it'd be dangerous to have any accidents.";
close;
}
mes "[Van Helmont]";
@@ -1429,9 +1528,9 @@ alde_alche,79,19,5 script Experiment Expert#am 4_M_ALCHE_A,{
mes "What a funny Merchant.";
next;
mes "[Van Helmont]";
- mes "Well, that's nice, but I have very urgent experiments that require";
- mes "my attention, so don't get";
- mes "in the way.";
+ mes "Well, that's nice, but I have very urgent experiments that require\r"
+ "my attention, so don't get\r"
+ "in the way.";
next;
if (select("Teach me something.", "...") == 1) {
mes "[Van Helmont]";
@@ -1439,25 +1538,28 @@ alde_alche,79,19,5 script Experiment Expert#am 4_M_ALCHE_A,{
mes "Didn't I just tell you not to bother me? What's so hard to understand about that?";
next;
mes "[Van Helmont]";
- mes "Fine, fine. I'll give you an assignment. Learn something";
- mes "new and come back. Let's see.";
+ mes "Fine, fine. I'll give you an assignment. Learn something\r"
+ "new and come back. Let's see.";
mes "What would be good...";
next;
mes "[Van Helmont]";
mes "Okay, I got it.";
- mes "Go learn how to make";
- mes "a Counteragent and Mixture";
- mes "from Molgenstein.";
+ mesf("Go learn how to make\r"
+ "a %s and %s\r"
+ "from Molgenstein.",
+ getitemname(Counteragent),
+ getitemname(Mixture));
next;
mes "[Van Helmont]";
- mes "You don't need to bring anything. Just go watch him at work and have him tell you how he makes those solutions. Got it?";
+ mes "You don't need to bring anything. Just go watch him at work and have him tell you how he "
+ "makes those solutions. Got it?";
next;
mes "[Van Helmont]";
ALCH_Q = 9;
changequest 2035,2036;
mes "Well then, see you later.";
- mes "You'd better get going as";
- mes "soon as you can.";
+ mes "You'd better get going as\r"
+ "soon as you can.";
close;
}
mes "[Van Helmont]";
@@ -1472,24 +1574,32 @@ alde_alche,79,19,5 script Experiment Expert#am 4_M_ALCHE_A,{
mes "......";
next;
mes "[Van Helmont]";
- mes "So if I recalibrate the combustion rate of this compound, that should negate any cohesive tendencies in this particle flux...";
+ mes "So if I recalibrate the combustion rate of this compound, that should negate any cohesive "
+ "tendencies in this particle flux...";
next;
mes "[Van Helmont]";
- mes "But what am I going to do";
- mes "about all of this spontaneous";
- mes "crystallization?! I can't very well remove this matrix, I need it for the catalyst to reach the triple point.";
+ mes "But what am I going to do\r"
+ "about all of this spontaneous\r"
+ "crystallization?! I can't very well remove this matrix, I need it for the catalyst to reach "
+ "the triple point.";
next;
mes "[Van Helmont]";
mes "Damn!";
- mes "What am";
- mes "I going to do?!";
+ mes "What am\r"
+ "I going to do?!";
close;
}
else if (ALCH_Q == 9) {
- mes "Alright, if I make an incision here in the Tentacle, and add a Jellopy and Sticky Mucus solution into the... Where the hell did my Medicine Bowl go?";
+ mesf("Alright, if I make an incision here in the %s, and add a %s and %s solution into the... "
+ "Where the hell did my %s go?",
+ getitemname(Tentacle),
+ getitemname(Jellopy),
+ getitemname(Sticky_Mucus),
+ getitemname(Medicine_Bowl));
next;
mes "[Van Helmont]";
- mes "Did I use them all at a time like this?! I wonder if Nicholas has any left. Ugh, what a pain. Wait. Wait a minute...";
+ mes "Did I use them all at a time like this?! I wonder if Nicholas has any left. Ugh, what a pain. "
+ "Wait. Wait a minute...";
next;
mes "[Van Helmont]";
mes "...";
@@ -1502,108 +1612,123 @@ alde_alche,79,19,5 script Experiment Expert#am 4_M_ALCHE_A,{
if (select("I want to become an Alchemist?", ".......") == 2) {
mes "[Van Helmont]";
mes "Hmm...?";
- mes "What, did you just want to watch? Fine, fine, but do it quietly and leave right when you're done.";
+ mes "What, did you just want to watch? Fine, fine, but do it quietly and leave right when "
+ "you're done.";
next;
mes "[Van Helmont]";
- mes "Stay out of my way and don't go around touching stuff. There might be some volatile materials, so it'd be dangerous to have any accidents.";
+ mes "Stay out of my way and don't go around touching stuff. There might be some volatile "
+ "materials, so it'd be dangerous to have any accidents.";
close;
}
mes "[Van Helmont]";
- mes "Ah, of course. The Merchant from before. So what did you learn from Molgenstein? I didn't just send you there for fun, you know.";
+ mes "Ah, of course. The Merchant from before. So what did you learn from Molgenstein? I didn't just "
+ "send you there for fun, you know.";
next;
mes "[Van Helmont]";
- mes "Let me ask you";
- mes "some questions to";
- mes "check what you've";
- mes "learned.";
+ mes "Let me ask you\r"
+ "some questions to\r"
+ "check what you've\r"
+ "learned.";
next;
if(MISC_QUEST & 4) {
mes "[Van Helmont]";
- mes "Which item is not";
- mes "necessary to make";
- mes "a Counteragent?";
+ mesf("Which item is not\r"
+ "necessary to make\r"
+ "a %s?",
+ getitemname(Counteragent));
next;
- if (select("Karvodailnirol", "Detrimindexta", "Alcohol") != 1) .@w_point += 1;
+ if (select(getitemname(Karvodailnirol), getitemname(Detrimindexta), getitemname(Alchol)) != 1)
+ .@w_point += 1;
mes "[Van Helmont]";
- mes "What item is not";
- mes "necessary to make";
- mes "a Mixture?";
+ mesf("What item is not\r"
+ "necessary to make\r"
+ "a %s?",
+ getitemname(Mixture));
next;
- if (select("Karvodailnirol", "Detrimindexta", "Alcohol") != 2) .@w_point += 1;
+ if (select(getitemname(Karvodailnirol), getitemname(Detrimindexta), getitemname(Alchol)) != 2)
+ .@w_point += 1;
if (.@w_point > 0) {
mes "[Van Helmont]";
- mes "Weren't you listening to Molgenstein at all? Maybe you";
- mes "have to watch him make it again.";
+ mes "Weren't you listening to Molgenstein at all? Maybe you\r"
+ "have to watch him make it again.";
next;
mes "[Van Helmont]";
- mes "If you can't tell the exact items that you need in an experiment,";
- mes "you might end up hurting yourself!";
+ mes "If you can't tell the exact items that you need in an experiment,\r"
+ "you might end up hurting yourself!";
close;
}
mes "[Van Helmont]";
mes "Good, you've learned well.";
- mes "Okay, now you know something about experimentation. You're done here, so now I can continue with my experiments.";
+ mes "Okay, now you know something about experimentation. You're done here, so now I can "
+ "continue with my experiments.";
next;
mes "[Van Helmont]";
- mes "Go out and find the room next";
- mes "to this one and talk to Nicholas. He'll continue your training.";
+ mes "Go out and find the room next\r"
+ "to this one and talk to Nicholas. He'll continue your training.";
next;
ALCH_Q = 20;
changequest 2036,2037;
mes "[Van Helmont]";
- mes "What are you";
- mes "still doing here?";
- mes "Go! We both have";
- mes "more important";
- mes "things to do!";
+ mes "What are you\r"
+ "still doing here?";
+ mes "Go! We both have\r"
+ "more important\r"
+ "things to do!";
close;
}
else {
mes "[Van Helmont]";
- mes "What item do";
- mes "you need to make";
- mes "a Counteragent?";
+ mesf("What item do\r"
+ "you need to make\r"
+ "a %s?",
+ getitemname(Counteragent));
next;
- select("Feather", "Sticky Mucus", "Animal Gore");
+ select(getitemname(Feather), getitemname(Sticky_Mucus), getitemname(Animal_Blood));
mes "[Van Helmont]";
- mes "What item do";
- mes "you need to make";
- mes "a Mixture?";
- next;
- select("Monster Feed", "Ancient Lips", "Rotten Bandage");
+ mesf("What item do\r"
+ "you need to make\r"
+ "a %s?",
+ getitemname(Mixture));
+ next;
+ select(getitemname(Monster's_Feed),
+ getitemname(Lip_Of_Ancient_Fish),
+ getitemname(Rotten_Bandage));
mes "[Van Helmont]";
- mes "Be honest. You don't know, do you?! Didn't I say to go to Molgenstein and have him teach you?!";
+ mes "Be honest. You don't know, do you?! Didn't I say to go to Molgenstein and have him teach "
+ "you?!";
next;
mes "[Van Helmont]";
- mes "Don't even think about coming back until you talk to him! Now stop bothering me and get out of here!";
+ mes "Don't even think about coming back until you talk to him! Now stop bothering me and get "
+ "out of here!";
close;
}
}
else if (ALCH_Q == 20) {
mes "What...?";
- mes "I thought I told you to";
- mes "talk to Nicholas next door?";
+ mes "I thought I told you to\r"
+ "talk to Nicholas next door?";
next;
mes "[Van Helmont]";
- mes "I need to continue my research,";
- mes "and you need to finish becoming an Alchemist. Come on, get moving!";
+ mes "I need to continue my research,\r"
+ "and you need to finish becoming an Alchemist. Come on, get moving!";
close;
}
else {
mes "Just a little...";
mes "A little bit more...";
- mes "Nooo! Just a little";
- mes "bit more and it";
- mes "would've been done!";
+ mes "Nooo! Just a little\r"
+ "bit more and it\r"
+ "would've been done!";
next;
mes "[Van Helmont]";
mes "Why...?!";
mes "Why, another failure?!";
- mes "My calculations were";
- mes "all correct! Wait...";
+ mes "My calculations were\r"
+ "all correct! Wait...";
next;
mes "[Van Helmont]";
- mes "Perhaps, if I capacitated the thermal flux by using the neutronic gradient, it just might work...";
+ mes "Perhaps, if I capacitated the thermal flux by using the neutronic gradient, it just might "
+ "work...";
close;
}
}
@@ -1625,38 +1750,40 @@ alde_alche,101,184,4 script Master Alchemist#am 2_M_DYEINGER,{
if (BaseJob != Job_Merchant) {
if (BaseJob == Job_Alchemist) {
mes "Welcome!";
- mes "So how is your";
- mes "research coming along?";
+ mes "So how is your\r"
+ "research coming along?";
next;
mes "[Vincent Carsciallo]";
- mes "At times you get results that are unexpected from an experiment. Although these may be setbacks in your research, such results can also lead to new discoveries.";
+ mes "At times you get results that are unexpected from an experiment. Although these may be "
+ "setbacks in your research, such results can also lead to new discoveries.";
next;
mes "[Vincent Carsciallo]";
- mes "If you discover something new,";
- mes "come and tell us. Don't forget that we are all working together to unlock the mysteries of science!";
+ mes "If you discover something new,\r"
+ "come and tell us. Don't forget that we are all working together to unlock the "
+ "mysteries of science!";
}
else if (BaseClass == Job_Novice) {
mes "Hm...";
mes "A Novice?";
- mes "You shouldn't be";
- mes "playing in a place";
- mes "like this.";
+ mes "You shouldn't be\r"
+ "playing in a place\r"
+ "like this.";
next;
mes "[Vincent Carsciallo]";
- mes "There are a lot of volatile chemicals and dangerous";
- mes "materials in this building. It'd be a lot better if you just played outside.";
+ mes "There are a lot of volatile chemicals and dangerous\r"
+ "materials in this building. It'd be a lot better if you just played outside.";
}
else {
mes "Hmm...?";
- mes "What's an adventurer";
- mes "doing here in the";
- mes "Alchemist Union?";
+ mes "What's an adventurer\r"
+ "doing here in the\r"
+ "Alchemist Union?";
next;
mes "[Vincent Carsciallo]";
- mes "I'm afraid there's";
- mes "not much we can offer";
- mes "you here if you're not";
- mes "a member of our Union.";
+ mes "I'm afraid there's\r"
+ "not much we can offer\r"
+ "you here if you're not\r"
+ "a member of our Union.";
}
close2;
cutin "",255;
@@ -1665,19 +1792,21 @@ alde_alche,101,184,4 script Master Alchemist#am 2_M_DYEINGER,{
if (ALCH_Q == 0) {
mes "Hmm...?";
mes "A Merchant?";
- mes "Are you interested";
- mes "in learning Alchemy?";
+ mes "Are you interested\r"
+ "in learning Alchemy?";
next;
mes "[Vincent Carsciallo]";
mes "This is the Alchemist Union.";
- mes "We research and experiment with many different substances in order to create new materials without using magic.";
+ mes "We research and experiment with many different substances in order to create new materials "
+ "without using magic.";
next;
mes "[Vincent Carsciallo]";
- mes "Someday, we hope to unlock";
- mes "the secret of life, as well as the other mysteries of science.";
+ mes "Someday, we hope to unlock\r"
+ "the secret of life, as well as the other mysteries of science.";
next;
mes "[Vincent Carsciallo]";
- mes "After being traveling as a Merchant for a long time, you must have developed some scientific curiosity. If you'd like to learn Alchemy, why don't you try joining the Alchemist Union?";
+ mes "After being traveling as a Merchant for a long time, you must have developed some scientific "
+ "curiosity. If you'd like to learn Alchemy, why don't you try joining the Alchemist Union?";
close2;
cutin "",255;
end;
@@ -1692,17 +1821,17 @@ alde_alche,101,184,4 script Master Alchemist#am 2_M_DYEINGER,{
end;
}
if (SkillPoint) {
- mes "Ah, you're almost";
- mes "ready to become an";
- mes "Alchemist, but you must";
- mes "first allocate your unused";
- mes "Skill Points.";
+ mes "Ah, you're almost\r"
+ "ready to become an\r"
+ "Alchemist, but you must\r"
+ "first allocate your unused\r"
+ "Skill Points.";
next;
mes "[Vincent Carsciallo]";
- mes "Talk to me again";
- mes "once you have spent";
- mes "all of your extra";
- mes "Skill Points.";
+ mes "Talk to me again\r"
+ "once you have spent\r"
+ "all of your extra\r"
+ "Skill Points.";
close2;
cutin "",255;
end;
@@ -1714,9 +1843,9 @@ alde_alche,101,184,4 script Master Alchemist#am 2_M_DYEINGER,{
changequest 2034,2040;
}
mes "Ah, well done.";
- mes "I can see that you";
- mes "have learned all of";
- mes "the basics of Alchemy.";
+ mes "I can see that you\r"
+ "have learned all of"
+ "the basics of Alchemy.";
next;
ALCH_Q = 0;
completequest 2040;
@@ -1724,19 +1853,19 @@ alde_alche,101,184,4 script Master Alchemist#am 2_M_DYEINGER,{
callfunc "Job_Change",Job_Alchemist;
callfunc "F_ClearJobVar";
mes "[Vincent Carsciallo]";
- mes "Henceforth, you are";
- mes "now a member of our";
- mes "illustrious Union.";
+ mes "Henceforth, you are\r"
+ "now a member of our\r"
+ "illustrious Union.";
mes "I hope you learn a lot...";
next;
if (.@jlevel == 50) {
getitem Slim_Potion_Create_Book,1;
mes "[Vincent Carsciallo]";
- mes "Let me give you";
- mes "something special.";
- mes "You can use this to";
- mes "begin your life";
- mes "of research.";
+ mes "Let me give you\r"
+ "something special.";
+ mes "You can use this to"
+ "begin your life"
+ "of research.";
}
else {
switch(rand(1,6)) {
@@ -1760,32 +1889,32 @@ alde_alche,101,184,4 script Master Alchemist#am 2_M_DYEINGER,{
}
mes "[Vincent Carsciallo]";
mes "And...";
- mes "Here's a little";
- mes "something to help";
- mes "you begin your";
- mes "research.";
+ mes "Here's a little\r"
+ "something to help\r"
+ "you begin your\r"
+ "research.";
}
next;
mes "[Vincent Carsciallo]";
- mes "I'll see";
- mes "you later then...";
- mes "Remember to carry";
- mes "yourself with pride";
- mes "as an Alchemist!";
+ mes "I'll see\r"
+ "you later then...";
+ mes "Remember to carry\r"
+ "yourself with pride\r"
+ "as an Alchemist!";
close2;
cutin "",255;
end;
}
else {
mes "Ah...";
- mes "I believe you've";
- mes "already registered";
- mes "for training to become";
- mes "an Alchemist.";
+ mes "I believe you've\r"
+ "already registered\r"
+ "for training to become\r"
+ "an Alchemist.";
next;
mes "[Vincent Carsciallo]";
- mes "Please listen to the";
- mes "other Alchemists and follow their instructions carefully. You will learn much from them.";
+ mes "Please listen to the\r"
+ "other Alchemists and follow their instructions carefully. You will learn much from them.";
close2;
cutin "",255;
end;
@@ -1805,72 +1934,95 @@ alde_alche,145,19,1 script Chief Researcher#am 1_M_LIBRARYMASTER,{
if (ALCH_Q == 20) {
mes "[Nicholas Flamel]";
mes "Ooh...";
- mes "You're the upstart";
- mes "Merchant that wants";
- mes "to become an Alchemist?";
+ mes "You're the upstart\r"
+ "Merchant that wants\r"
+ "to become an Alchemist?";
next;
mes "[Nicholas Flamel]";
- mes "Not just anyone can become an Alchemist, you know. You've got to have motivation and clear goals and a strong sense of focus.";
+ mes "Not just anyone can become an Alchemist, you know. You've got to have motivation and "
+ "clear goals and a strong sense of focus.";
next;
mes "[Nicholas Flamel]";
- mes "Alchemists must memorize many chemical equations, scientific laws and a lot of other information. It's actually pretty tough.";
+ mes "Alchemists must memorize many chemical equations, scientific laws and a lot of other "
+ "information. It's actually pretty tough.";
next;
mes "[Nicholas Flamel]";
- mes "If you can't focus, you'll be confused later when you look at Alchemy charts. My test will judge your ability to do just that.";
+ mes "If you can't focus, you'll be confused later when you look at Alchemy charts. My test "
+ "will judge your ability to do just that.";
next;
}
mes "[Nicholas Flamel]";
- mes "Find the words scrambled";
- mes "in the group of letters I give you. They can be made by using some";
- mes "or all of the letters.";
+ mes "Find the words scrambled\r"
+ "in the group of letters I give you. They can be made by using some\r"
+ "or all of the letters.";
next;
mes "[Nicholas Flamel]";
- mes "You pass if you";
- mes "choose the word";
- mes "that is ^551A8BIN^000000 the puzzle.";
+ mes "You pass if you\r"
+ "choose the word\r"
+ "that is ^551A8BIN^000000 the puzzle.";
next;
switch(rand(1,3)) {
case 1:
mes "t m y a n y e o b n e g p r i";
next;
- if (select("Brake", "Brass", "Bug", "Broken", "Brigan?") == 5) .@alch_t += 10;
+ if (select("Brake", "Brass" "Bug", "Broken", "Brigan?") == 5)
+ .@alch_t += 10;
mes "o n c u t a p j l e r s v m u";
next;
- if (select("vendor", "storage", "weapon", "simple", "streetshop") == 1) .@alch_t += 10;
+ if (select("vendor", "storage", "weapon", "simple", "streetshop") == 1)
+ .@alch_t += 10;
mes "t v a r m e g p h e u b o y l";
next;
- if (select("molasses", "party", "leader", "sweets", "treacle") == 2) .@alch_t += 10;
+ if (select("molasses", "party", "leader", "sweets", "treacle") == 2)
+ .@alch_t += 10;
mes "q z a h n a i n b r d p t n c";
next;
- if (select("partisan", "partizan", "pato", "paros", "pack") == 2) .@alch_t += 10;
+ if (select("partisan", "partizan", "pato", "paros", "pack") == 2)
+ .@alch_t += 10;
break;
case 2:
mes "m p d i c f a r o g n k w a s";
next;
- if (select("packman", "sunshine", "ragnarok", "wonderland", "frost") == 1) .@alch_t += 10;
+ if (select("packman", "sunshine", "ragnarok", "wonderland", "frost") == 1)
+ .@alch_t += 10;
mes "g b n o p r e f a r e t a s k";
next;
- if (select("purple", "smoker", "ragnarok", "bolt", "burnt wood") == 3) .@alch_t += 10;
+ if (select("purple", "smoker", "ragnarok", "bolt", "burnt wood") == 3)
+ .@alch_t += 10;
mes "u g n i s j e k c e o g n d p";
next;
- if (select("scab", "kinship", "donate", "source", "opening") == 5) .@alch_t += 10;
+ if (select("scab", "kinship", "donate", "source", "opening") == 5)
+ .@alch_t += 10;
mes "r o e h n r o m c a i n p t t";
next;
- if (select("forgemerchant", "potionmerchant", "dcmerchant", "vendingmerchant", "battlemerchant") == 2) .@alch_t += 10;
+ if (select("forgemerchant",
+ "potionmerchant",
+ "dcmerchant",
+ "vendingmerchant",
+ "battlemerchant") == 2)
+ .@alch_t += 10;
break;
case 3:
mes "s m i e x b w u n e t a g l r";
next;
- if (select("tiger", "wolf", "pumpkin", "tripped", "tore") == 1) .@alch_t += 10;
+ if (select("tiger", "wolf", "pumpkin", "tripped", "tore") == 1)
+ .@alch_t += 10;
mes "n i e g b o p d s o a u w r v";
next;
- if (select("bash", "provoke", "endure", "stun", "abracadabra") == 3) .@alch_t += 10;
+ if (select("bash", "provoke", "endure", "stun", "abracadabra") == 3)
+ .@alch_t += 10;
mes "l r m g r e x t a v i n e d e";
next;
- if (select("alberta", "latifoliate", "crimson", "maple", "evergreen") == 5) .@alch_t += 10;
+ if (select("alberta", "latifoliate", "crimson", "maple", "evergreen") == 5)
+ .@alch_t += 10;
mes "r o e h n r o m c a i n p t t";
next;
- if (select("forgemerchant", "potionmerchant", "dcmerchant", "vendingmerchant", "battlemerchant") == 2) .@alch_t += 10;
+ if (select("forgemerchant",
+ "potionmerchant",
+ "dcmerchant",
+ "vendingmerchant",
+ "battlemerchant") == 2)
+ .@alch_t += 10;
break;
}
mes "[Nicholas Flamel]";
@@ -1881,17 +2033,18 @@ alde_alche,145,19,1 script Chief Researcher#am 1_M_LIBRARYMASTER,{
mes "Excellent job!";
next;
mes "[Nicholas Flamel]";
- mes "Great, you found all of those hidden words. With that kind of concentration, you should have no problem memorizing information.";
+ mes "Great, you found all of those hidden words. With that kind of concentration, you should "
+ "have no problem memorizing information.";
next;
mes "[Nicholas Flamel]";
- mes "Come back in a little bit while";
- mes "I prepare the next assignment";
- mes "for your training.";
+ mes "Come back in a little bit while\r"
+ "I prepare the next assignment\r"
+ "for your training.";
next;
mes "[Nicholas Flamel]";
- mes "Oh, and before you talk to";
- mes "me again, make sure you have";
- mes "^551A8Bplenty of room in your inventory^000000.";
+ mes "Oh, and before you talk to\r"
+ "me again, make sure you have\r"
+ "^551A8Bplenty of room in your inventory^000000.";
close;
}
else {
@@ -1902,12 +2055,13 @@ alde_alche,145,19,1 script Chief Researcher#am 1_M_LIBRARYMASTER,{
mes "Judging from these results, you obviously have a problem with concentrating.";
next;
mes "[Nicholas Flamel]";
- mes "If you can't even solve these easy word puzzles, how can you keep track of your experiments and research?";
+ mes "If you can't even solve these easy word puzzles, how can you keep track of your "
+ "experiments and research?";
next;
mes "[Nicholas Flamel]";
- mes "Why don't you relax";
- mes "and rest a bit before";
- mes "you take the test again?";
+ mes "Why don't you relax\r"
+ "and rest a bit before\r"
+ "you take the test again?";
close;
}
@@ -1921,26 +2075,27 @@ alde_alche,145,19,1 script Chief Researcher#am 1_M_LIBRARYMASTER,{
}
mes "[Nicholas Flamel]";
mes "Alright...";
- mes "For your next";
- mes "assignment, you'll";
- mes "need to travel to ^551A8BJuno^000000.";
+ mes "For your next\r"
+ "assignment, you'll\r"
+ "need to travel to ^551A8BJuno^000000.";
next;
mes "[Nicholas Flamel]";
- mes "There, you'll need to talk to ^551A8BBain^000000 and ^551A8BBajin^000000. Those two are doing Alchemy research with the Sages";
- mes "in Juno. You'll learn something by assisting them with their project.";
+ mes "There, you'll need to talk to ^551A8BBain^000000 and ^551A8BBajin^000000. Those two are doing "
+ "Alchemy research with the Sages\r"
+ "in Juno. You'll learn something by assisting them with their project.";
next;
mes "[Nicholas Flamel]";
- mes "Come back here to me after you";
- mes "help them out. They'll need all of these items to continue their experiments.";
+ mes "Come back here to me after you\r"
+ "help them out. They'll need all of these items to continue their experiments.";
next;
ALCH_Q = 23;
changequest 2037,2038;
mes "[Nicholas Flamel]";
- mes "1 Mixture,";
- mes "5 Burnt Tree,";
- mes "5 Fine Sand,";
- mes "3 Rough Oridecon";
- mes "and 3 Rough Elunium.";
+ mesf("1 %s,", getitemname(Mixture));
+ mesf("5 %s,", getitemname(Burn_Tree));
+ mesf("5 %s,", getitemname(Fine_Sand));
+ mesf("3 %s", getitemname(Oridecon_Stone));
+ mesf("and 3 %s.", getitemname(Elunium_Stone));
getitem Mixture,1;
getitem Burn_Tree,5;
getitem Fine_Sand,5;
@@ -1949,17 +2104,17 @@ alde_alche,145,19,1 script Chief Researcher#am 1_M_LIBRARYMASTER,{
next;
mes "[Nicholas Flamel]";
mes "Alright.";
- mes "Have a safe trip";
- mes "and come back in";
- mes "one piece.";
+ mes "Have a safe trip\r"
+ "and come back in\r"
+ "one piece.";
close;
}
else if (ALCH_Q == 23) {
mes "[Nicholas Flamel]";
- mes "Didn't I say to";
- mes "go to Juno and help";
- mes "Bain and Bajin with";
- mes "their Alchemy research?";
+ mes "Didn't I say to\r"
+ "go to Juno and help\r"
+ "Bain and Bajin with\r"
+ "their Alchemy research?";
close;
}
else if (ALCH_Q == 24) {
@@ -1967,36 +2122,38 @@ alde_alche,145,19,1 script Chief Researcher#am 1_M_LIBRARYMASTER,{
changequest 2038,2039;
mes "[Nicholas Flamel]";
mes "Ah, you're back!";
- mes "I just got a message from Bain";
- mes "and Bajin. They let me know that they were very happy with your assistance.";
+ mes "I just got a message from Bain\r"
+ "and Bajin. They let me know that they were very happy with your assistance.";
next;
mes "[Nicholas Flamel]";
- mes "If you were good enough";
- mes "to help out those brothers,";
- mes "you definitely qualify to be";
- mes "an Alchemist.";
+ mes "If you were good enough\r"
+ "to help out those brothers,\r"
+ "you definitely qualify to be\r"
+ "an Alchemist.";
next;
mes "[Nicholas Flamel]";
mes "Good work!";
- mes "All you have to do now is speak to the Union Leader on the 2nd floor! Congratulations, you'll become an Alchemist very soon!";
+ mes "All you have to do now is speak to the Union Leader on the 2nd floor! Congratulations, you'll "
+ "become an Alchemist very soon!";
close;
}
else if (ALCH_Q == 40 && BaseJob == Job_Merchant) {
mes "[Nicholas Flamel]";
- mes "All you have to do now is speak to the Union Leader on the 2nd floor! Congratulations, you'll become an Alchemist very soon!";
+ mes "All you have to do now is speak to the Union Leader on the 2nd floor! Congratulations, you'll "
+ "become an Alchemist very soon!";
close;
}
else {
mes "[Nicholas Flamel]";
- mes "Lorem ipsum dolor sit amet,";
- mes "consectetuer adipiscing elit.";
- mes "Vivamus sem. Sed metus";
- mes "lacus, viverra id, rutrum eget,";
- mes "rhoncus sit amet, lectus.";
+ mes "Lorem ipsum dolor sit amet,\r"
+ "consectetuer adipiscing elit.\r"
+ "Vivamus sem. Sed metus\r"
+ "lacus, viverra id, rutrum eget,\r"
+ "rhoncus sit amet, lectus.";
next;
mes "[Nicholas Flamel]";
- mes "Suspendisse sit amet urna in";
- mes "nisl fringilla faucibus. Nulla scelerisque eros...";
+ mes "Suspendisse sit amet urna in\r"
+ "nisl fringilla faucibus. Nulla scelerisque eros...";
mes "^666666*Mumble Mumble*^000000";
close;
}
diff --git a/npc/quests/bard_quest.txt b/npc/quests/bard_quest.txt
index 7a2166836..7545d24e7 100644
--- a/npc/quests/bard_quest.txt
+++ b/npc/quests/bard_quest.txt
@@ -1458,8 +1458,8 @@ morocc,134,111,3 script Bard#3 2_M_BARD_ORIENT,{
next;
mes "^3355FFKino Kitty coughed a few times, wiping his mouth with his sleeve. As he adjusts the guitar strings, you notice small stains of blood on his sleeve. Then, he began to sing.^000000";
next;
- mes "^D43D1ABrave hero Siegfried ";
- mes "Vanquished a mighty dragon ";
+ mes "^D43D1ABrave hero Siegfried";
+ mes "Vanquished a mighty dragon";
mes "Its blood coated his skin";
mes "Making it impenetrable";
mes "Save for one tender spot";
diff --git a/npc/quests/newgears/2010_headgears.txt b/npc/quests/newgears/2010_headgears.txt
index 660c82a87..bfdea103a 100644
--- a/npc/quests/newgears/2010_headgears.txt
+++ b/npc/quests/newgears/2010_headgears.txt
@@ -195,8 +195,8 @@ lhz_in02,276,281,1 script Drunken Man#Necktie 4_M_ALCHE_A,{
mes "[Drunken Man]";
mes "Once I wear the Necktie on my head,";
mes "I will be no match for you!";
- mes "You must be nervous¡¦";
- mes "Hmm¡¦ where is the Necktie?";
+ mes "You must be nervous...";
+ mes "Hmm... where is the Necktie?";
next;
// If having the materials
if ((countitem(Cobaltblue_Dyestuffs) > 0) && (countitem(Oil_Paper) > 29) && (countitem(Transparent_Cloth) > 99) && (countitem(Spool) > 19)) {
@@ -310,7 +310,7 @@ comodo,236,164,0 script Hat Girl#Hair_Brush 1_F_04,{
mes "[Hat Girl]";
mes "Okay, I'll do it right away!";
next;
- mes "Ch ch ch... combining...ch ch¡¦";
+ mes "Ch ch ch... combining...ch ch...";
emotion e_swt2,1;
next;
mes "[Hat Girl]";
@@ -454,7 +454,7 @@ alberta,151,78,0 script Bebete#Baby_Angel_Status 4W_KID,{
mes "... ...";
next;
mes "[" + strcharinfo(0) + "]";
- mes "Hmm... I guess I was fooled by that little kid.";
+ mes "Hmm... I guess I was fooled by that little kid.";
close;
}
mes "[Bebete]";
@@ -943,7 +943,7 @@ alberta,120,206,3 script Alonie#Solo_Play_Box 4_M_UMKID,{
mes "For make it";
mes "the fruitful training,";
mes "Get around and kill";
- mes "^FF000020 Chung E and 50 Civil Servant^000000!";
+ mes "^FF000020 Chung E and 50 Civil Servant^000000!";
next;
if (select("What a bullshit!", "Let's go!") == 1) {
mes "[Alonie]";
@@ -1033,7 +1033,7 @@ alberta,120,206,3 script Alonie#Solo_Play_Box 4_M_UMKID,{
mes "Hmm, It's not enough.";
mes "Playing alone is not that easy!";
mes "Go and kill";
- mes "^FF000020 Chung E and 50 Civil Servant^000000!";
+ mes "^FF000020 Chung E and 50 Civil Servant^000000!";
if (questprogress(1104,HUNTING) == 1) {
erasequest 1104;
setquest 1108;
diff --git a/npc/quests/skills/assassin_skills.txt b/npc/quests/skills/assassin_skills.txt
index 6f6a93488..c09660ed2 100644
--- a/npc/quests/skills/assassin_skills.txt
+++ b/npc/quests/skills/assassin_skills.txt
@@ -29,12 +29,6 @@
//= along with this program. If not, see <http://www.gnu.org/licenses/>.
//=========================================================================
//= Assassin Skills Quests
-//================= File Encoding =========================================
-//= CP-949 (EUC-KR compatible). Do NOT read/save it as UTF-8.
-//= -If the encoding is correct, the next three lines have the same length-
-//= ============ ¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä ============
-//= ============ ============================================= ============
-//= ============ ¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á ============
//================= Description ===========================================
//= Quests for skills: Venom Knife, Sonic Acceleration
//================= Current Version =======================================
@@ -979,9 +973,7 @@ OnTouch:
}
}
-// FIXME[Haru]: Why do we have a Korean name here? Can anyone translate it?
-// Google translate says ¡¡ (jingjing) = Whining, but it doesn't make much sense to me.
-moc_pryd04,85,96,0 script ¡¡#crypt FAKE_NPC,3,3,{
+moc_pryd04,85,96,0 script Glimmer#crypt FAKE_NPC,3,3,{
OnTouch:
if (ASSN_SK == 4) {
specialeffect EF_CONE;
diff --git a/npc/re/cities/dicastes.txt b/npc/re/cities/dicastes.txt
index f05d494f7..43571facb 100644
--- a/npc/re/cities/dicastes.txt
+++ b/npc/re/cities/dicastes.txt
@@ -53,11 +53,11 @@ dicastes01,194,159,5 script Excited Galten#a 4_MAN_GALTUN1,{
mes "will rule this land.";
close;
}
- mes "¡ø¢²¢£ ¡Ð ¡ò¡ð¡ð";
- mes "¡÷¡ø¡ñ ¡ü ¡ü";
- mes "¡ù¢²¢³ ¢²";
- mes "¡ó¡õ¡ô ¢£ ¡Ð¡û¡ü ¡ò ¡ð¡ö¢£";
- mes "¢¤¡õ¡þ ¡÷ ¡ñ";
+ mes sprintf("¡ø¢²¢£ ¡Ð ¡ò¡ð¡ð");
+ mes sprintf("¡÷¡ø¡ñ ¡ü ¡ü");
+ mes sprintf("¡ù¢²¢³ ¢²");
+ mes sprintf("¡ó¡õ¡ô ¢£ ¡Ð¡û¡ü ¡ò ¡ð¡ö¢£");
+ mes sprintf("¢¤¡õ¡þ ¡÷ ¡ñ");
close;
}
@@ -76,15 +76,15 @@ dicastes01,202,86,3 script Sentinel#a 4_MAN_GALTUN1,{
mes "Hey, you are an outsider!";
close;
}
- mes "¡ô¢±¢± ¡û ¡ó¡Ð¡ñ ¢£ ¢¤¡ú";
- mes "¡ø¡ó¢² ¢¤ ";
- mes "¡õ¡ó¡Ð ¢³ ¡Ð¡õ¢£ ¡û ¡ú¡ï";
+ mes sprintf("¡ô¢±¢± ¡û ¡ó¡Ð¡ñ ¢£ ¢¤¡ú");
+ mes sprintf("¡ø¡ó¢² ¢¤ ");
+ mes sprintf("¡õ¡ó¡Ð ¢³ ¡Ð¡õ¢£ ¡û ¡ú¡ï");
next;
mes "[Sentinel]";
- mes "¡ù";
+ mes sprintf("¡ù");
next;
mes "[Sentinel]";
- mes "¡ñ¡ö¡ï ¡ú ¡ó¢³¡ô";
+ mes sprintf("¡ñ¡ö¡ï ¡ú ¡ó¢³¡ô");
close;
}
@@ -96,9 +96,9 @@ dicastes01,194,95,5 script Sentinel#b 4_MAN_GALTUN,{
mes "you won't know what hit you. Beware!";
close;
}
- mes "¡ø¡ô¡ü ¡ø ¡ó";
- mes "¡ø¡ï¡û ¡ó ¡û¢¤¢² ¡÷ ¢£";
- mes "¢¤¡ô¡ø ¢³ ¡÷¡û¡ö ¡õ ¡ø";
+ mes sprintf("¡ø¡ô¡ü ¡ø ¡ó");
+ mes sprintf("¡ø¡ï¡û ¡ó ¡û¢¤¢² ¡÷ ¢£");
+ mes sprintf("¢¤¡ô¡ø ¢³ ¡÷¡û¡ö ¡õ ¡ø");
close;
}
@@ -109,8 +109,8 @@ dicastes01,234,158,0 script Training Galten#a 4_MAN_GALTUN,{
mes "if I keep up with my training every day.";
close;
}
- mes "¡ø¡ô¡ü ¡ø ¡ø¡ô¡ü ¡ø";
- mes "¡ô ¡ø";
+ mes sprintf("¡ø¡ô¡ü ¡ø ¡ø¡ô¡ü ¡ø");
+ mes sprintf("¡ô ¡ø");
next;
mes "Don't know what it means.";
close;
@@ -123,8 +123,8 @@ dicastes01,244,166,0 script Training Galten#b 4_MAN_GALTUN,{
mes "hard I am training.";
close;
}
- mes "¡ø¡ô¡ü ¡ø";
- mes "¡ø¡ô¡ü ¡ø ¡ø¡ô¡ü ¡ø ¡ø¡ô¡ü ¡ø";
+ mes sprintf("¡ø¡ô¡ü ¡ø");
+ mes sprintf("¡ø¡ô¡ü ¡ø ¡ø¡ô¡ü ¡ø ¡ø¡ô¡ü ¡ø");
next;
mes "Don't know what it means.";
close;
@@ -138,8 +138,8 @@ dicastes01,272,166,0 script Training Galten#c 4_MAN_GALTUN,{
mes "I am never lazy with my training.";
close;
}
- mes "¡ø¡ô¡ü ¡ø ¡ø¡ô¡ü ¡ø";
- mes "¡ø¡ô¡ü ¡ø";
+ mes sprintf("¡ø¡ô¡ü ¡ø ¡ø¡ô¡ü ¡ø");
+ mes sprintf("¡ø¡ô¡ü ¡ø");
next;
mes "Don't know what it means.";
close;
@@ -154,8 +154,8 @@ dicastes01,248,129,0 script Training Galten#d 4_MAN_GALTUN,{
mes "for trainees like me.";
close;
}
- mes "¡ø¡ô¡ü ¡ø ¡ø¡ô¡ü";
- mes "¡ø¡ô¡ü ¡ø ¡ø¡ô¡ü ¡ø";
+ mes sprintf("¡ø¡ô¡ü ¡ø ¡ø¡ô¡ü");
+ mes sprintf("¡ø¡ô¡ü ¡ø ¡ø¡ô¡ü ¡ø");
next;
mes "Don't know what it means.";
close;
@@ -169,8 +169,8 @@ dicastes01,271,152,0 script Training Galten#e 4_MAN_GALTUN,{
mes "if I do my best, right?";
close;
}
- mes "¡ø¢²¡û ¡ô ¢£¢³¡ô";
- mes "¡ü¡ô";
+ mes sprintf("¡ø¢²¡û ¡ô ¢£¢³¡ô");
+ mes sprintf("¡ü¡ô");
close;
}
*/
@@ -182,9 +182,9 @@ dic_in01,349,282,4 script Waiting Galten#in_1 4_MAN_GALTUN1,{
mes "We are all tensed up to be ready for action.";
close;
}
- mes "[¢²¡Ð¡û ¡ù ¡Ð]";
- mes "¡ñ¡õ¡ü ¢£ ¡ó";
- mes "¢¤¡ó¡õ ¢£ ¢£¡ò¡ô ¡ö ¡ú¢¤¡ú ¢¤ ¡ò¡ö¡õ ¢¤ ";
+ mes sprintf("[¢²¡Ð¡û ¡ù ¡Ð]");
+ mes sprintf("¡ñ¡õ¡ü ¢£ ¡ó");
+ mes sprintf("¢¤¡ó¡õ ¢£ ¢£¡ò¡ô ¡ö ¡ú¢¤¡ú ¢¤ ¡ò¡ö¡õ ¢¤ ");
close;
}
@@ -194,8 +194,8 @@ dic_in01,370,261,1 script Waiting Galten#in_2 4_MAN_GALTUN1,{
mes "Boring.";
close;
}
- mes "[¢²¡Ð¡û ¡ù ¡Ð]";
- mes "¡ù¢¤¢±";
+ mes sprintf("[¢²¡Ð¡û ¡ù ¡Ð]");
+ mes sprintf("¡ù¢¤¢±");
close;
}
@@ -205,8 +205,8 @@ dic_in01,381,261,1 script Waiting Galten#in_3 4_MAN_GALTUN1,{
mes "Zzzzz...";
close;
}
- mes "[¢²¡Ð¡û ¡ù ¡Ð]";
- mes "¡ú¡ô";
+ mes sprintf("[¢²¡Ð¡û ¡ù ¡Ð]");
+ mes sprintf("¡ú¡ô");
close;
}
@@ -216,8 +216,8 @@ dic_in01,370,282,4 script Waiting Galten#in_4 4_MAN_GALTUN1,{
mes "El Dicastes is the most peaceful place in this world as long as I am here.";
close;
}
- mes "[¢²¡Ð¡û ¡ù ¡Ð]";
- mes "¡ï¡ï¢³ ¡þ ¡ö¢³¢£ ¢± ¢³¡û¡õ ¡ø ¡þ¡ï¡ï ¡ø ¡û";
+ mes sprintf("[¢²¡Ð¡û ¡ù ¡Ð]");
+ mes sprintf("¡ï¡ï¢³ ¡þ ¡ö¢³¢£ ¢± ¢³¡û¡õ ¡ø ¡þ¡ï¡ï ¡ø ¡û");
close;
}
@@ -227,8 +227,8 @@ dic_in01,354,219,4 script Resting Galten#in_5 4_MAN_GALTUN1,{
mes "Resting is always so sweet.";
close;
}
- mes "[¡õ¡ø¡ò ¡ü ¢¤]";
- mes "¡ï¡õ¡ù ¡ö ¡ò¡ð¢² ¢³ ¡ö";
+ mes sprintf("[¡õ¡ø¡ò ¡ü ¢¤]");
+ mes sprintf("¡ï¡õ¡ù ¡ö ¡ò¡ð¢² ¢³ ¡ö");
close;
}
@@ -241,9 +241,9 @@ dic_in01,365,197,1 script Resting Galten#in_6 4_MAN_GALTUN1,{
mes "You say I don't look like I'm resting? But I'm already used to this.";
close;
}
- mes "[¡õ¡ø¡ò ¡ü ¢¤]";
- mes "¡ô¡ï¢¤ ¡ö ¡ù¡ð¡ñ ¡ü ¡ó¡û¡û";
- mes "¡ï¢£¡ó ¡ù ¢³¡ô¡ð ¢£ ¡Ð¡û¡ô ¡ô ¡Ð¡ú¡ù ¡ô ¡ó";
+ mes sprintf("[¡õ¡ø¡ò ¡ü ¢¤]");
+ mes sprintf("¡ô¡ï¢¤ ¡ö ¡ù¡ð¡ñ ¡ü ¡ó¡û¡û");
+ mes sprintf("¡ï¢£¡ó ¡ù ¢³¡ô¡ð ¢£ ¡Ð¡û¡ô ¡ô ¡Ð¡ú¡ù ¡ô ¡ó");
close;
}
@@ -257,8 +257,8 @@ dic_in01,29,119,4 script Resting Piom#04 4_MAN_PIOM6,{
mes "Why is it so noisy when I'm trying to get rest?";
close;
}
- mes "[¢£¡ù¡ò ¢¤ ¡ù]";
- mes "¡ü¢²¡ð ¡Ð ¡ò¡ø¢² ¡ô ¢²¡õ";
+ mes sprintf("[¢£¡ù¡ò ¢¤ ¡ù]");
+ mes sprintf("¡ü¢²¡ð ¡Ð ¡ò¡ø¢² ¡ô ¢²¡õ");
close;
}
@@ -289,8 +289,8 @@ dic_in01,91,113,5 script Suspicious Piom#a 4_MAN_PIOM6,{
mes "I am not going to say anything, either!";
close;
}
- mes "¡ó¢³¡ó ¡ó ¡ó¡þ¡ö";
- mes "¡õ ¢³¢²¡÷ ¡ó¡ó";
+ mes sprintf("¡ó¢³¡ó ¡ó ¡ó¡þ¡ö");
+ mes sprintf("¡õ ¢³¢²¡÷ ¡ó¡ó");
next;
if(select("Can't tell what it means", "Is it a curse??") == 2) {
mes "[Suspicious Piom]";
@@ -312,10 +312,10 @@ dic_in01,168,116,5 script Tired Piom#c 4_MAN_PIOM5,{
mes "But of course you'll have to pay the price.";
close;
}
- mes "¡þ¡õ¡ð ¢³ ¢³¡þ";
- mes "¡þ¡ø¡ð ¡ö ¡ñ¡ú¡ð ¡ò";
- mes "¡ï¡ñ¡ú ¡ô ¡ö¡ö¡ò ¡û ¡ó¢¤¡ø ¡ø ¢² ¡ø";
- mes "¢¤¢²¡ø ¡ò ¡ú¡ó¢±";
+ mes sprintf("¡þ¡õ¡ð ¢³ ¢³¡þ");
+ mes sprintf("¡þ¡ø¡ð ¡ö ¡ñ¡ú¡ð ¡ò");
+ mes sprintf("¡ï¡ñ¡ú ¡ô ¡ö¡ö¡ò ¡û ¡ó¢¤¡ø ¡ø ¢² ¡ø");
+ mes sprintf("¢¤¢²¡ø ¡ò ¡ú¡ó¢±");
close;
}
@@ -329,10 +329,10 @@ dic_in01,149,104,5 script Tired Piom#b 4_MAN_PIOM2,{
emotion e_what;
close;
}
- mes "¡ð¡Ð¡ú ¡ø ¢²";
- mes "¡ö¡õ¡ó ¢¤ ¡ò¡ò¢³ ¡ô ¡ô¡ó¡ñ";
- mes "¢£¡ñ¡þ ¡ü ¢²¡û¡ó ¡ò ¡ð¡þ";
- mes "¡ö¡ú¡ñ ¢³";
+ mes sprintf("¡ð¡Ð¡ú ¡ø ¢²");
+ mes sprintf("¡ö¡õ¡ó ¢¤ ¡ò¡ò¢³ ¡ô ¡ô¡ó¡ñ");
+ mes sprintf("¢£¡ñ¡þ ¡ü ¢²¡û¡ó ¡ò ¡ð¡þ");
+ mes sprintf("¡ö¡ú¡ñ ¢³");
emotion e_what;
close;
}
@@ -354,17 +354,17 @@ dic_in01,341,113,3 script Tired Piom#a 4_MAN_PIOM5,{
mes "I'll be rejected again, right?";
close;
}
- mes "¡÷¡ò¡û ¡ó ¡ó¡Ð¢±";
- mes "¡ó¡õ¡ù ¡þ ¡ò¢±¡ñ ¡õ ¢£";
- mes "¡ü¡ð¢¤ ¡ù ¡ò¡ô¡õ ¡ò ¡ñ";
- mes "¢³¡ú¢³ ¡Ð ¡ñ¡õ¡ù ¡÷ ¡÷¢±";
+ mes sprintf("¡÷¡ò¡û ¡ó ¡ó¡Ð¢±");
+ mes sprintf("¡ó¡õ¡ù ¡þ ¡ò¢±¡ñ ¡õ ¢£");
+ mes sprintf("¡ü¡ð¢¤ ¡ù ¡ò¡ô¡õ ¡ò ¡ñ");
+ mes sprintf("¢³¡ú¢³ ¡Ð ¡ñ¡õ¡ù ¡÷ ¡÷¢±");
next;
mes "[Tired Piom]";
- mes "¡þ";
+ mes sprintf("¡þ");
next;
emotion e_swt;
mes "[Tired Piom]";
- mes "¡ø¡ú¡ø ¢± ¡ö¡ò";
+ mes sprintf("¡ø¡ú¡ø ¢± ¡ö¡ò");
close;
}
@@ -391,9 +391,9 @@ dic_in01,32,54,5 script Venknick#el_01 4_MAN_BENKUNI,{
mes "The refined Bradium was the best ever. Do you want to try some?";
close;
}
- mes "[¡ó¡ò¡ð]";
- mes "¡ù¡ó¢¤ ¢± ¢£";
- mes "¡õ¡þ¡ï ¢£ ¡÷¡÷¢¤ ¡ú ¡ó¡ñ¡ö ¢² ¡þ¢²¢¤ ¢² ¢£?";
+ mes sprintf("[¡ó¡ò¡ð]");
+ mes sprintf("¡ù¡ó¢¤ ¢± ¢£");
+ mes sprintf("¡õ¡þ¡ï ¢£ ¡÷¡÷¢¤ ¡ú ¡ó¡ñ¡ö ¢² ¡þ¢²¢¤ ¢² ¢£?");
close;
}
@@ -413,17 +413,17 @@ dic_in01,372,116,3 script Thrilled Piom#a 4_MAN_PIOM4,{
mes "blessing?";
close;
}
- mes "¡ò¡õ¢³ ¡õ ¡ô";
- mes "¢£¡ó¡ø ¢² ¡ô¡÷";
- mes "¡ò¡ô¢³ ¡ù ¢±¡ó¢± ¡õ";
- mes "¡ó¡ü¡Ð ¡ø ¢²¡ü¡Ð ¡õ ¡ï";
+ mes sprintf("¡ò¡õ¢³ ¡õ ¡ô");
+ mes sprintf("¢£¡ó¡ø ¢² ¡ô¡÷");
+ mes sprintf("¡ò¡ô¢³ ¡ù ¢±¡ó¢± ¡õ");
+ mes sprintf("¡ó¡ü¡Ð ¡ø ¢²¡ü¡Ð ¡õ ¡ï");
next;
mes "[Thrilled Piom]";
- mes "¢£";
+ mes sprintf("¢£");
next;
mes "[Thrilled Piom]";
- mes "¡Ð¢¤¡ù ¢£ ¡ó¡ó";
- mes "¡ù¡ó¡÷ ¡û ¡þ¡ô";
+ mes sprintf("¡Ð¢¤¡ù ¢£ ¡ó¡ó");
+ mes sprintf("¡ù¡ó¡÷ ¡û ¡þ¡ô");
close;
}
@@ -435,9 +435,9 @@ dic_in01,360,125,5 script Serious Venknicka 4_MAN_BENKUNI,{
mes "I will have to get more factory lines running.";
close;
}
- mes "¡û¡õ¡ñ ¢² ¢²¢¤¡Ð ¢² ¡ü¡ñ¡õ";
- mes "¡þ¡ó¡ö ¢²";
- mes "¡ö¡÷¡û ¡ú ¡÷¡Ð¢³ ¢³";
+ mes sprintf("¡û¡õ¡ñ ¢² ¢²¢¤¡Ð ¢² ¡ü¡ñ¡õ");
+ mes sprintf("¡þ¡ó¡ö ¢²");
+ mes sprintf("¡ö¡÷¡û ¡ú ¡÷¡Ð¢³ ¢³");
close;
}
@@ -467,24 +467,24 @@ dic_in01,42,250,5 script Guide#diel_1 4_MAN_PIOM6,{
mes "- The guide looks at you with an alert expression. -";
close;
}
- mes "[¢³¡ñ]";
- mes "¡õ¢£¡ó ¡Ð ¡õ¡ñ¡ò ¢¤ ¡ø¡ø¢£ ¢± ¢²¢³¡÷ ¢±";
- mes "¡ö¡ò¡ð ¡ó ¡ô¡ô?";
+ mes sprintf("[¢³¡ñ]");
+ mes sprintf("¡õ¢£¡ó ¡Ð ¡õ¡ñ¡ò ¢¤ ¡ø¡ø¢£ ¢± ¢²¢³¡÷ ¢±");
+ mes sprintf("¡ö¡ò¡ð ¡ó ¡ô¡ô?");
next;
- mes "[¢³¡ñ]";
- mes "¡Ð¡ù¡ó ¡ù ¡ü¢²¡Ð ¢± ¡÷¡ö¡þ";
- mes "¡ñ¡þ¢² ¡ø ¡ó¡ï¡ï ¡ù ¡ð¡ñ¡Ð ¡ù ¢³¡ò¡þ ¡ù ¡ø¡ð¡õ ¡õ ¢¤";
+ mes sprintf("[¢³¡ñ]");
+ mes sprintf("¡Ð¡ù¡ó ¡ù ¡ü¢²¡Ð ¢± ¡÷¡ö¡þ");
+ mes sprintf("¡ñ¡þ¢² ¡ø ¡ó¡ï¡ï ¡ù ¡ð¡ñ¡Ð ¡ù ¢³¡ò¡þ ¡ù ¡ø¡ð¡õ ¡õ ¢¤");
next;
- mes "[¢³¡ñ]";
- mes "¡û¡ù¡ô ¡ø ¡ð¡þ¡÷ ¢³ ¡þ¡ù¡ñ ¡ú ¡ü¢¤¡ò ¡ú ¡ô¢£";
- mes "¡÷¡ò¢¤ ¡ø ¡û¢³";
+ mes sprintf("[¢³¡ñ]");
+ mes sprintf("¡û¡ù¡ô ¡ø ¡ð¡þ¡÷ ¢³ ¡þ¡ù¡ñ ¡ú ¡ü¢¤¡ò ¡ú ¡ô¢£");
+ mes sprintf("¡÷¡ò¢¤ ¡ø ¡û¢³");
next;
- mes "[¢³¡ñ]";
- mes "¡ô¡ð¡ñ ¢¤ ¡ó¡÷¢³ ¡þ ¡ó¡õ¡÷ ¡ö ¡ó ¡ö";
+ mes sprintf("[¢³¡ñ]");
+ mes sprintf("¡ô¡ð¡ñ ¢¤ ¡ó¡÷¢³ ¡þ ¡ó¡õ¡÷ ¡ö ¡ó ¡ö");
next;
- mes "[¢³¡ñ]";
- mes "¡ò¡ô¡ø ¡÷ ¡õ¡ø¡ð ¡ó ¢¤¡Ð¡ô ¡ø ¡ñ¡ñ¡ñ ¡ø ¡ú¡ö¡ø ¡ü";
- mes "¡ï¢³¡ð ¢¤ ¡ð¡ö¢£ ¢± ¡ô¡ø";
+ mes sprintf("[¢³¡ñ]");
+ mes sprintf("¡ò¡ô¡ø ¡÷ ¡õ¡ø¡ð ¡ó ¢¤¡Ð¡ô ¡ø ¡ñ¡ñ¡ñ ¡ø ¡ú¡ö¡ø ¡ü");
+ mes sprintf("¡ï¢³¡ð ¢¤ ¡ð¡ö¢£ ¢± ¡ô¡ø");
close;
}
@@ -499,12 +499,12 @@ dic_in01,335,34,5 script Talkative Piom#a 4_MAN_PIOM4,{
mes "here too.";
close;
}
- mes "¡ü¡ù¢± ¢³";
- mes "¡÷¡ø¡ï ¡þ ¡ó¡ó";
- mes "¡ñ¡õ¡ò ¡ó ¡÷¡ü¡ù ¡ö";
- mes "¡ñ¡ø¡ü ¡ú ¡ô";
- mes "¡þ¡ú¡ò ¢± ¡û¡ò¡ò ¡ù ¡÷";
- mes "¢³¡ò¡ò ¡ù ¢±¢£¡ò";
+ mes sprintf("¡ü¡ù¢± ¢³");
+ mes sprintf("¡÷¡ø¡ï ¡þ ¡ó¡ó");
+ mes sprintf("¡ñ¡õ¡ò ¡ó ¡÷¡ü¡ù ¡ö");
+ mes sprintf("¡ñ¡ø¡ü ¡ú ¡ô");
+ mes sprintf("¡þ¡ú¡ò ¢± ¡û¡ò¡ò ¡ù ¡÷");
+ mes sprintf("¢³¡ò¡ò ¡ù ¢±¢£¡ò");
close;
}
@@ -515,8 +515,8 @@ dic_in01,387,30,1 script Manuk Piom#a 4_MAN_PIOM,{
mes "I've come to pick up the weapon I ordered.";
close;
}
- mes "¡ü¡ó¡þ ¡ó ¡ï¡ð¢¤ ¡ü ¡ð¢±";
- mes "¡ù¡ô¡ï ¡ú ¡ñ¡ù¢³ ¡ó ¡ò¡ö¡ó ¡ô¡ô";
+ mes sprintf("¡ü¡ó¡þ ¡ó ¡ï¡ð¢¤ ¡ü ¡ð¢±");
+ mes sprintf("¡ù¡ô¡ï ¡ú ¡ñ¡ù¢³ ¡ó ¡ò¡ö¡ó ¡ô¡ô");
close;
}
@@ -530,11 +530,11 @@ dicastes01,282,210,4 script Free Knit#a 4_MAN_NITT,{
mes "which is short.";
close;
}
- mes "¡ñ¡þ¡ð ¡ó ¡ü¡ò¡ö ¡÷";
- mes "¢³¡ð¡ï ¢£ ¡ù¡ô¡ò ¡ô ¡ó¡þ¡ñ ¢² ¡ñ¡û¢£ ¢²";
- mes "¡ô¡ó¡ð ¡þ ¢£¡ð¢¤ ¡õ ¡û¢³¡ü";
- mes "¡ó¢³¡ò ¢± ¡ô¢£¢² ¡÷ ¡÷¡ñ";
- mes "¡ò¢²¡ï ¢£ ¡ö¡ö";
+ mes sprintf("¡ñ¡þ¡ð ¡ó ¡ü¡ò¡ö ¡÷");
+ mes sprintf("¢³¡ð¡ï ¢£ ¡ù¡ô¡ò ¡ô ¡ó¡þ¡ñ ¢² ¡ñ¡û¢£ ¢²");
+ mes sprintf("¡ô¡ó¡ð ¡þ ¢£¡ð¢¤ ¡õ ¡û¢³¡ü");
+ mes sprintf("¡ó¢³¡ò ¢± ¡ô¢£¢² ¡÷ ¡÷¡ñ");
+ mes sprintf("¡ò¢²¡ï ¢£ ¡ö¡ö");
close;
}
@@ -554,17 +554,17 @@ dicastes01,246,210,3 script Free Venknick#a 4_MAN_BENKUNI,{
mes "but why are you interested in it?";
close;
}
- mes "¡ô¡ï¢£ ¢¤ ¡÷¡õ¢± ¡ü ¡ñ¡õ";
- mes "¡ü¢³";
- mes "¡ö¡ù¢¤ ¢² ¡ù¡ó¡ô";
- mes "¡ü¢£¢³ ¡ø ¡û¡ð¡ü ¡õ";
+ mes sprintf("¡ô¡ï¢£ ¢¤ ¡÷¡õ¢± ¡ü ¡ñ¡õ");
+ mes sprintf("¡ü¢³");
+ mes sprintf("¡ö¡ù¢¤ ¢² ¡ù¡ó¡ô");
+ mes sprintf("¡ü¢£¢³ ¡ø ¡û¡ð¡ü ¡õ");
next;
mes "[Free Venknick]";
- mes "¡ù";
+ mes sprintf("¡ù");
next;
mes "[Free Venknick]";
- mes "¡þ¢¤¢£ ¢± ¡ó¡ò¢³ ¡ü ¡ñ¡ð";
- mes "¢±¡û¢£ ¡ö ¡ü¡ò¡÷ ¡û ¡õ¡ò¡÷ ¢²¢²";
+ mes sprintf("¡þ¢¤¢£ ¢± ¡ó¡ò¢³ ¡ü ¡ñ¡ð");
+ mes sprintf("¢±¡û¢£ ¡ö ¡ü¡ò¡÷ ¡û ¡õ¡ò¡÷ ¢²¢²");
close;
}
@@ -577,9 +577,9 @@ dicastes01,235,245,4 script Excited Piom#a 4_MAN_PIOM4,{
close;
}
mes "[Excited Piom]";
- mes "¡ú¡þ¡ó ¢³ ¡ü¢²¡ñ ¢±";
+ mes sprintf("¡ú¡þ¡ó ¢³ ¡ü¢²¡ñ ¢±");
emotion e_ho;
- mes "¢³¡ó¡ñ ¡õ ¡ð¡ô¡þ ¡÷ ¡ú¡ò¡õ ¡ø ¢² ¡ø";
+ mes sprintf("¢³¡ó¡ñ ¡õ ¡ð¡ô¡þ ¡÷ ¡ú¡ò¡õ ¡ø ¢² ¡ø");
close;
}
@@ -593,11 +593,11 @@ dicastes01,284,262,3 script Favorable Knit#a 4_MAN_NITT,{
mes "We never have any quarrels between classes.";
close;
}
- mes "¡ô¢±¡ó ¡õ ¡ú¡÷¡Ð ¡õ";
- mes "¡ü¡ï¡Ð ¡õ ¡ô¡ó¡ü ¡ó ¢³";
- mes "¡ñ¡ô¡ü ¡þ ¢¤¡ñ¢¤ ¡ô ¡û¡ï¡ù";
- mes "¡ú¡ö¡ô ¡ó ¢£¡ú¡þ ¡ø ¡ø¡ò";
- mes "¢²¢³¡û ¢¤ ¡ú¡ñ¡ù ¡û ¢³¡ò¡ø ¡õ¡õ";
+ mes sprintf("¡ô¢±¡ó ¡õ ¡ú¡÷¡Ð ¡õ");
+ mes sprintf("¡ü¡ï¡Ð ¡õ ¡ô¡ó¡ü ¡ó ¢³");
+ mes sprintf("¡ñ¡ô¡ü ¡þ ¢¤¡ñ¢¤ ¡ô ¡û¡ï¡ù");
+ mes sprintf("¡ú¡ö¡ô ¡ó ¢£¡ú¡þ ¡ø ¡ø¡ò");
+ mes sprintf("¢²¢³¡û ¢¤ ¡ú¡ñ¡ù ¡û ¢³¡ò¡ø ¡õ¡õ");
close;
}
@@ -612,11 +612,11 @@ dicastes01,164,180,4 script Limpy Piom#a 4_MAN_PIOM6,{
emotion e_dots;
close;
}
- mes "¢²¡ô¡þ ¡ù ¡õ¡Ð";
- mes "¢³¡ô¡û ¡ú ¡ø";
- mes "¢³¡þ¢¤ ¡ó ¡õ¡÷¡Ð";
- mes "¡ñ¡ò¡ü ¡ü ¡ù¡þ¢±";
- mes "¢¤¡ò¡þ ¢¤ ¢£¡ñ ¢¤ ¢£¡ñ";
+ mes sprintf("¢²¡ô¡þ ¡ù ¡õ¡Ð");
+ mes sprintf("¢³¡ô¡û ¡ú ¡ø");
+ mes sprintf("¢³¡þ¢¤ ¡ó ¡õ¡÷¡Ð");
+ mes sprintf("¡ñ¡ò¡ü ¡ü ¡ù¡þ¢±");
+ mes sprintf("¢¤¡ò¡þ ¢¤ ¢£¡ñ ¢¤ ¢£¡ñ");
emotion e_dots;
close;
}
@@ -649,13 +649,13 @@ dicastes01,191,202,4 script Complaining Galten#fihs 4_MAN_GALTUN,{
mes "Just forget about it quickly for your own good.";
close;
}
- mes "[¡õ¢£¡ö ¡ú ]";
- mes "¡õ¡ò¡û ¡ò ¢£¡û¡÷ ¡÷ ";
- mes "¡û¡ù¡û ¡÷ ¡ü¡þ¡û ¢³ ¡ó";
+ mes sprintf("[¡õ¢£¡ö ¡ú ]");
+ mes sprintf("¡õ¡ò¡û ¡ò ¢£¡û¡÷ ¡÷ ");
+ mes sprintf("¡û¡ù¡û ¡÷ ¡ü¡þ¡û ¢³ ¡ó");
next;
- mes "[¡õ¢£¡ö ¡ú ]";
- mes "¡ð¢±¡ü ¡û ¡õ¡÷¢¤";
- mes "¢¤¡þ¡ø ¢² ¡÷";
+ mes sprintf("[¡õ¢£¡ö ¡ú ]");
+ mes sprintf("¡ð¢±¡ü ¡û ¡õ¡÷¢¤");
+ mes sprintf("¢¤¡þ¡ø ¢² ¡÷");
next;
mes "Don't know what it means.";
close;
@@ -702,9 +702,9 @@ dicastes01,202,197,4 script Crazy Venknick#fihsing1 4_MAN_BENKUNI,{
mes "You feel outraged at being tricked.";
close;
}
- mes "[¡ö¡ú¡ù ¢³ ]";
- mes "¢²¡û¡ó ¡ó ¡ù¢¤¡ø";
- mes "¢¤¡ð¢² ¢± ¡ñ¡ö¢² ¡ø ¡ï¡ö¡ü";
+ mes sprintf("[¡ö¡ú¡ù ¢³ ]");
+ mes sprintf("¢²¡û¡ó ¡ó ¡ù¢¤¡ø");
+ mes sprintf("¢¤¡ð¢² ¢± ¡ñ¡ö¢² ¡ø ¡ï¡ö¡ü");
next;
mes "Don't know what it means.";
close;
@@ -719,9 +719,9 @@ dic_in01,98,110,5 script Worried Piom#a 4_MAN_PIOM6,{
close;
}
mes "[Worried Piom]";
- mes "¡û¢±¡÷ ¢² ¡ï¡þ¡ò ¡ü ¡ï¡û¢²";
- mes "¡ï¡÷¢¤ ¡Ð ¡ï¡ï¡Ð ¢¤ ¢£";
- mes "¡÷¡þ¡ð ¡ó ¡ñ";
+ mes sprintf("¡û¢±¡÷ ¢² ¡ï¡þ¡ò ¡ü ¡ï¡û¢²");
+ mes sprintf("¡ï¡÷¢¤ ¡Ð ¡ï¡ï¡Ð ¢¤ ¢£");
+ mes sprintf("¡÷¡þ¡ð ¡ó ¡ñ");
close;
}
@@ -734,8 +734,8 @@ dic_in01,98,96,3 script Lost Galten#a 4_MAN_GALTUN1,{
close;
}
mes "[Lost Galten]";
- mes "¡ó¡ô¡ï ¡û ¢³¡ú";
- mes "¡ü¡ø¡ñ ¢£ ";
- mes "¡ö¡ï¢² ¡û ¡ö¡ó";
+ mes sprintf("¡ó¡ô¡ï ¡û ¢³¡ú");
+ mes sprintf("¡ü¡ø¡ñ ¢£ ");
+ mes sprintf("¡ö¡ï¢² ¡û ¡ö¡ó");
close;
}
diff --git a/npc/re/events/halloween_2013.txt b/npc/re/events/halloween_2013.txt
index 3d72fc6b0..92050128a 100644
--- a/npc/re/events/halloween_2013.txt
+++ b/npc/re/events/halloween_2013.txt
@@ -472,7 +472,7 @@ niflheim,179,168,5 script Kentucky#2013HE 4_NFCOCK,{
close;
}
-niflheim,177,166,8 script Chicken#2013HE 4_NFCOCK,{
+niflheim,177,166,0 script Chicken#2013HE 4_NFCOCK,{
mes "[Chicken]";
mes "Hey Kentucky!!";
mes "You are eating alone too much!";
diff --git a/npc/re/events/halloween_2014.txt b/npc/re/events/halloween_2014.txt
index 65afecedc..c0677b2ef 100644
--- a/npc/re/events/halloween_2014.txt
+++ b/npc/re/events/halloween_2014.txt
@@ -29,12 +29,6 @@
//= along with this program. If not, see <http://www.gnu.org/licenses/>.
//=========================================================================
//= Halloween Event (2014)
-//================= File Encoding =========================================
-//= CP-949 (EUC-KR compatible). Do NOT read/save it as UTF-8.
-//= -If the encoding is correct, the next three lines have the same length-
-//= ============ ¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä ============
-//= ============ ============================================= ============
-//= ============ ¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á ============
//================= Description ===========================================
//= The Official 2014 Halloween Event
//=
@@ -692,7 +686,7 @@ niflheim,196,185,3 script Bolak#14hal 4_M_DRAKE,{
mes "You could be a 'fake'!";
next;
mes "[Nathan]";
- mes "Da...d¡¦?";
+ mes "Da...d...?";
next;
mes "[Bolak]";
mes "Nathan!! Even you doubt your own father?";
diff --git a/npc/re/instances/WolfchevLaboratory.txt b/npc/re/instances/WolfchevLaboratory.txt
index 3b0b1c510..3860b35a3 100644
--- a/npc/re/instances/WolfchevLaboratory.txt
+++ b/npc/re/instances/WolfchevLaboratory.txt
@@ -27,12 +27,6 @@
//= along with this program. If not, see <http://www.gnu.org/licenses/>.
//=========================================================================
//= Wolfchev's Laboratory
-//================= File Encoding =========================================
-//= CP-949 (EUC-KR compatible). Do NOT read/save it as UTF-8.
-//= -If the encoding is correct, the next three lines have the same length-
-//= ============ ¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä¡Ä ============
-//= ============ ============================================= ============
-//= ============ ¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á¡Á ============
//================= Description ===========================================
//= Defeat Wolfchev's human experimentations.
//================= Current Version =======================================
@@ -592,8 +586,7 @@ lighthalzen,342,291,4 script Weird old man#Bio4Reward 4_M_EINOLD,{
break;
case 4:
mes "<<Ygnus Stale[1]>>";
- // FIXME[Haru]: Anyone knows what ¹ßÈ­ means?
- mes "When doing short distance attack, cast ¹ßÈ­ to the player and to the enemy with a certain chance.";
+ mes "When doing short distance attack, Chance of inflicting o rreceiving Burn status when dealing physical damage.";
mes "Two-Handed Axe / ATK 250 / Weight 190 / Fire Property / Weapon Lv 4 / Required Lv 95 / Socket 1 / for High Swordman/Merchant Classes";
callsub L_Reward, Ygnus_Stale, 50, 100, 35;
break;
@@ -2803,7 +2796,7 @@ lhz_dun04,147,279,0 script Laboratory Entrance#memo CLEAR_NPC,{
//== The Lab No.3 >> Boss's Room Warp portal ===============
1@lhz,83,62,0 script #potal_03 WARPNPC,2,2,{
- end;
+ end;
OnInstanceInit:
disablenpc instance_npcname("#potal_03");
@@ -2990,9 +2983,9 @@ lhz_dun04,147,279,0 script Laboratory Entrance#memo CLEAR_NPC,{
//== Bosses ================================================
- script bio4FBoss FAKE_NPC,{
- end;
+ end;
- OnEnable:
+OnEnable:
.@map$ = instance_mapname("1@lhz");
.@label$ = instance_npcname(strnpcinfo(0))+"::OnMyMobDead";
specialeffect EF_SUI_EXPLOSION;
@@ -3038,7 +3031,7 @@ lhz_dun04,147,279,0 script Laboratory Entrance#memo CLEAR_NPC,{
disablenpc instance_npcname(strnpcinfo(0));
end;
- OnDisable:
+OnDisable:
killmonster instance_mapname("1@lhz"),instance_npcname(strnpcinfo(0))+"::OnMyMobDead";
disablenpc instance_npcname(strnpcinfo(0));
end;
diff --git a/npc/re/jobs/novice/academy.txt b/npc/re/jobs/novice/academy.txt
index 949e6973d..4b970a86c 100644
--- a/npc/re/jobs/novice/academy.txt
+++ b/npc/re/jobs/novice/academy.txt
@@ -2839,7 +2839,7 @@ iz_ac01,134,47,5 script Trainer Mainz#ac 4_M_KY_KNT,4,4,{
mes "Please keep in mind that I really wanted to have it but since you look exhausted I offered it to you first!";
emotion e_no1;
next;
- mes "- You open the lunchbox and there is some type of food inside ¡©";
+ mes "- You open the lunchbox and there is some type of food inside -";
next;
mes "[Mainz]";
mes "Wahahahat! Don't hesitate and just take it!";
@@ -10875,7 +10875,7 @@ iz_ac02,49,134,5 script Vicente#ac 4_M_HUMAN_02,{
case 2:
mes "[Vicente]";
mes "Correct!";
- mes "You have a good memory£¡";
+ mes "You have a good memory!";
cutin "sc_vicente03.bmp", 2;
next;
break;
@@ -10941,7 +10941,7 @@ iz_ac02,49,134,5 script Vicente#ac 4_M_HUMAN_02,{
case 2:
mes "[Vicente]";
mes "Correct!";
- mes "You have a good memory£¡";
+ mes "You have a good memory!";
cutin "sc_vicente03.bmp", 2;
next;
break;
@@ -13297,7 +13297,7 @@ izlude,155,132,3 script Locas#iz 4_M_02,{
switch(select("refining price", "refining effect", "Finish the explanation.")) {
case 1:
mes "[Locas]";
- mes "©öFrom the word itself, refining price is ^3E86C3 the price for refining once^000000.";
+ mes "From the word itself, refining price is ^3E86C3 the price for refining once^000000.";
next;
mes "[Locas]";
mes "But, there are differences in the essential material according the (zeny) and weapon level.";
diff --git a/npc/re/merchants/ninja_craftsman.txt b/npc/re/merchants/ninja_craftsman.txt
index a78491f65..4a3744269 100644
--- a/npc/re/merchants/ninja_craftsman.txt
+++ b/npc/re/merchants/ninja_craftsman.txt
@@ -87,7 +87,7 @@ L_Menu:
mes "[Gyo]";
mes "To make a ^ff0000"+getitemname(.@item_make)+", "+callsub(L_Ingredients,.@item_make)+".^000000";
if (.@item_make==Wolf_Armguard)
- mes "Can you feel it? The throbbing of the wolf blood¡¦";
+ mes "Can you feel it? The throbbing of the wolf blood...";
else if (.@item_make==Crescent_Armguard)
mes "A crescent as beautiful and clear as a crystal will be engraved on it.";
else if (.@item_make==Ninja_Scale_Armor)
@@ -104,38 +104,38 @@ L_Menu:
}
else if (.@item_make == Crescent_Armguard){
mes "Decreases post skill delay for 2% for every enhancement.";
- mes "Shield Type, Defense 70, Slot 1";
- mes "Required Level 100, Ninja Type Only";
+ mes "Shield Type, Defense 70, Slot 1";
+ mes "Required Level 100, Ninja Type Only";
}
else if (.@item_make == Ninja_Scale_Armor){
- mes "MHP+15%, MSP-30%.";
- mes "Armor Type, Defense 90, Slot 1";
- mes "Required Level 100, Ninja Type Only";
+ mes "MHP+15%, MSP-30%.";
+ mes "Armor Type, Defense 90, Slot 1";
+ mes "Required Level 100, Ninja Type Only";
}
else if (.@item_make == Tenebris_Latitantes){
mes "Chance to activate Lvl. 1 Illusion - Shadow when attacked by melee attacks.";
- mes "Armor Type, Defense 60, Slot 1";
- mes "Required Level 100, Ninja Type Only";
+ mes "Armor Type, Defense 60, Slot 1";
+ mes "Required Level 100, Ninja Type Only";
}
break;
case 3:
mes "[Gyo]";
- mes "Make sure that ^ff0000you have the correct ingredients and equipment at hand.^000000";
- mes "No use crying over it later.";
- next;
- if (select("Combine.", "Quit.") == 2) {
+ mes "Make sure that ^ff0000you have the correct ingredients and equipment at hand.^000000";
+ mes "No use crying over it later.";
+ next;
+ if (select("Combine.", "Quit.") == 2) {
mes "[Gyo]";
mes "Looks like you need more time to decide.";
close;
}
- if (checkweight(Knife,1) == 0 || (MaxWeight - Weight) < 2000) {
+ if (checkweight(Knife,1) == 0 || (MaxWeight - Weight) < 2000) {
mes "- Hold on!! -";
mes "- You cannot receive items -";
mes "- because you carry too much. -";
mes "- Please try again -";
mes "- after lightening your burden. -";
close;
- }
+ }
mes "[Gyo]";
switch(.@item_make){
case 2172: //Wolf_Armguard
@@ -144,7 +144,7 @@ L_Menu:
delitem Wolf_Blood,10; //Wolf_Blood
getitem Wolf_Armguard,1; //Wolf_Armguard
mes "Can you feel the wolfish instinct?";
- mes "Wild, but beautiful¡¦";
+ mes "Wild, but beautiful...";
}
else {
mes "You don't have enough ingredients.";
@@ -272,82 +272,81 @@ L_Menu:
mes "["+ getitemname(getarg(0)) +"]";
if (.@item_make == Raksasa_Dagger){
mes "INT+3 MATK+100.";
- mes "Dagger Type, ATK 120, Slot 1";
- mes "Required Level 110, Ninja Type Only";
+ mes "Dagger Type, ATK 120, Slot 1";
+ mes "Required Level 110, Ninja Type Only";
}
else if (.@item_make == Mikatsuki){
mes "MATK + 120, Fluctuated Casting and SP use decreased by 5% upon skill use.";
- mes "Dagger Type, ATK 50, Weapon Lvl. 4";
- mes "Slot 1";
- mes "Required Level 100, Ninja Type Only";
+ mes "Dagger Type, ATK 50, Weapon Lvl. 4";
+ mes "Slot 1";
+ mes "Required Level 100, Ninja Type Only";
}
else if (.@item_make == Huuma_Swirling_Petal){
- mes "MATK + 50, Petal Shuriken skill damage increased by 20%.";
- mes "Shuriken Type, ATK 150";
- mes "Weapon Lvl. 3, Slot 2";
- mes "Required Level 110, Ninja Type Only";
+ mes "MATK + 50, Petal Shuriken skill damage increased by 20%.";
+ mes "Shuriken Type, ATK 150";
+ mes "Weapon Lvl. 3, Slot 2";
+ mes "Required Level 110, Ninja Type Only";
}
break;
case 3:
mes "[Ki]";
- mes "Make sure that ^ff0000you have the correct ingredients and equipment at hand.^000000";
- mes "No use crying over it later.";
- next;
- if (select("Combine.", "Quit.") == 2) {
+ mes "Make sure that ^ff0000you have the correct ingredients and equipment at hand.^000000";
+ mes "No use crying over it later.";
+ next;
+ if (select("Combine.", "Quit.") == 2) {
mes "[Ki]";
mes "Think carefully~~";
close;
}
- if (checkweight(Knife,1) == 0 || (MaxWeight - Weight) < 2000) {
+ if (checkweight(Knife,1) == 0 || (MaxWeight - Weight) < 2000) {
mes "- Hold on!! -";
mes "- You cannot receive items -";
mes "- because you carry too much. -";
mes "- Please try again -";
mes "- after lightening your burden. -";
close;
- }
+ }
mes "[Ki]";
switch(.@item_make){
case 13076: //Raksasa_Dagger
- if (countitem(Murasame_) && countitem(Dark_Red_Jewel)) {
- delitem Murasame_,1; //Murasame_
- delitem Dark_Red_Jewel,1; //Dark_Red_Jewel
- getitem Raksasa_Dagger,1; //Raksasa_Dagger
- mes "Oh yes...";
- mes "It is a beautiful glow...";
- }
- else {
- mes "Hmm... You do not have enough to make a Raksasa Dagger.";
- mes "Why don't you check again?";
- mes "Some just can't give up what they hold.";
- }
+ if (countitem(Murasame_) && countitem(Dark_Red_Jewel)) {
+ delitem Murasame_,1; //Murasame_
+ delitem Dark_Red_Jewel,1; //Dark_Red_Jewel
+ getitem Raksasa_Dagger,1; //Raksasa_Dagger
+ mes "Oh yes...";
+ mes "It is a beautiful glow...";
+ } else {
+ mes "Hmm... You do not have enough to make a Raksasa Dagger.";
+ mes "Why don't you check again?";
+ mes "Some just can't give up what they hold.";
+ }
break;
case 13078: //Mikatsuki
- if (countitem(Hakujin_) && countitem(White_Jewel)) {
- delitem Hakujin_,1; //Hakujin_
- delitem White_Jewel,1; //White_Jewel
- getitem Mikatsuki,1; //Mikatsuki
- mes "Splendid¡¦";
- mes "It is always mesmerizing to look upon such a beautiful weapon¡¦";
- }
- else {
- mes "Hmm... You do not have enough to make a Mikatsuki.";
- mes "Why don't you check again?";
- mes "Some just can't give up what they hold.";
- }
- break;
+ if (countitem(Hakujin_) && countitem(White_Jewel)) {
+ delitem Hakujin_,1; //Hakujin_
+ delitem White_Jewel,1; //White_Jewel
+ getitem Mikatsuki,1; //Mikatsuki
+ mes "Splendid...";
+ mes "It is always mesmerizing to look upon such a beautiful weapon...";
+ }
+ else {
+ mes "Hmm... You do not have enough to make a Mikatsuki.";
+ mes "Why don't you check again?";
+ mes "Some just can't give up what they hold.";
+ }
+ break;
case 13313: //Huuma_Swirling_Petal
- if (countitem(Huuma_Calm_Mind) && countitem(Broken_Shuriken) > 99) {
- delitem Huuma_Calm_Mind,1; //Huuma_Calm_Mind
- delitem Broken_Shuriken,100; //Broken_Shuriken
- getitem Huuma_Swirling_Petal,1; //Huuma_Swirling_Petal
- mes "Swirling Petal!!";
- }
- else {
- mes "Hmm... You do not have enough to make Petal Shurikens.";
- mes "Why don't you check again?";
- mes "Some just can't give up what they hold.";
- }
+ if (countitem(Huuma_Calm_Mind) && countitem(Broken_Shuriken) > 99) {
+ delitem Huuma_Calm_Mind,1; //Huuma_Calm_Mind
+ delitem Broken_Shuriken,100; //Broken_Shuriken
+ getitem Huuma_Swirling_Petal,1; //Huuma_Swirling_Petal
+ mes "Swirling Petal!!";
+ }
+ else {
+ mes "Hmm... You do not have enough to make Petal Shurikens.";
+ mes "Why don't you check again?";
+ mes "Some just can't give up what they hold.";
+ }
break;
}
close;
diff --git a/npc/re/quests/eden/100-110.txt b/npc/re/quests/eden/100-110.txt
index 0cbcb610b..2fa43097c 100644
--- a/npc/re/quests/eden/100-110.txt
+++ b/npc/re/quests/eden/100-110.txt
@@ -87,7 +87,7 @@ moc_para01,37,95,5 script Gelkah#1 4_F_GELKA,{
mes "That person standing next to me is my master... He came back after long journey of practice.";
next;
mes "[Gelkah]";
- mes "I understand you might wonder why a Sura wants an Archbishop as a teacher...";
+ mes "I understand you might wonder why a Sura wants an Archbishop as a teacher...";
}
else {
cutin "gelca03",2;
diff --git a/npc/re/quests/eden/111-120.txt b/npc/re/quests/eden/111-120.txt
index 9f503666d..39b7de701 100644
--- a/npc/re/quests/eden/111-120.txt
+++ b/npc/re/quests/eden/111-120.txt
@@ -878,7 +878,7 @@ moc_para01,17,95,5 script Mingmin#1 4_F_GENETIC,{
case 3:
mes "[Mingmin]";
if (questprogress(13098,PLAYTIME) == 1)
- mes "They all look the same for me. I should research harder.";
+ mes "They all look the same for me. I should research harder.";
else if (questprogress(13097,HUNTING) == 1) {
cutin "º£³ªÅõ",3; //venatu_card
mes "There is one more reason why many adventurers are sent to Juperos and that is my real request.";
diff --git a/npc/re/quests/quests_dicastes.txt b/npc/re/quests/quests_dicastes.txt
index 562d205d3..d52de0f70 100644
--- a/npc/re/quests/quests_dicastes.txt
+++ b/npc/re/quests/quests_dicastes.txt
@@ -52,9 +52,9 @@
manuk,321,182,5 script Entrance Manager#ep133 4_MAN_GALTUN,{
if (!isequipped(2782)) {
mes "[Average Galten]";
- mes "¢¤¡ð¡ú? ¢£ ¡ù¡ð...";
- mes "¡ï¡ò¡Ð ¢¤ ?";
- mes "¡ñ¡ï..?";
+ mes sprintf("¢¤¡ð¡ú? ¢£ ¡ù¡ð...");
+ mes sprintf("¡ï¡ò¡Ð ¢¤ ?");
+ mes sprintf("¡ñ¡ï..?");
close;
}
if (ep13_3_invite >= 4) {
@@ -81,7 +81,7 @@ manuk,321,182,5 script Entrance Manager#ep133 4_MAN_GALTUN,{
dic_dun01,266,113,5 script Curious Sapha#ep13_3_ 4_MAN_BENKUNI,{
if (!isequipped(2782)) {
mes "[Curious Sapha]";
- mes "¡ö¡ñ¡Ð ¡ò ¡õ?";
+ mes sprintf("¡ö¡ñ¡Ð ¡ò ¡õ?");
next;
mes "- Cannot understand a word. -";
close;
@@ -207,8 +207,8 @@ sec_in02,16,43,5 script Scaraba Dungeon Entrance 4_MAN_BENKUNI,{
if (compare(strnpcinfo(0),"ep133_26")) {
if (!isequipped(2782)) {
mes "[Vigilante]";
- mes "¡ô¡ó¡ö ¡÷ ¡þ¡ù¡ó?";
- mes "¢¤¡ö¡ø ¢³ ¡÷¢£¡ü ¡ø ¡Ð¡õ¡û...";
+ mes sprintf("¡ô¡ó¡ö ¡÷ ¡þ¡ù¡ó?");
+ mes sprintf("¢¤¡ö¡ø ¢³ ¡÷¢£¡ü ¡ø ¡Ð¡õ¡û...");
next;
mes "The Vigilante says something and then shakes his head.";
mes "Looks like a negative reaction from the looks of his firm pose holding his shield in front of him.";
@@ -231,9 +231,9 @@ sec_in02,16,43,5 script Scaraba Dungeon Entrance 4_MAN_BENKUNI,{
}
if (!isequipped(2782)) {
mes "[Vigilante]";
- mes "¡ô¡ó¡ö ¡÷ ¡þ¡ù¡ó?";
- mes "¢¤¡ö¡ø ¢³ ¡÷¢£¡ü ¡ø ¡Ð¡õ¡û...";
- mes "¡ð¡ú¢± ¡ô ¡ò¡õ¡ú ¡õ..! ";
+ mes sprintf("¡ô¡ó¡ö ¡÷ ¡þ¡ù¡ó?");
+ mes sprintf("¢¤¡ö¡ø ¢³ ¡÷¢£¡ü ¡ø ¡Ð¡õ¡û...");
+ mes sprintf("¡ð¡ú¢± ¡ô ¡ò¡õ¡ú ¡õ..! ");
next;
mes "Cannot communicate with him.";
close;
@@ -267,8 +267,8 @@ dic_dun01,30,216,5 duplicate(Vigilante#main) Vigilante#ep133_26 4_MAN_GALTUN1
dic_dun01,284,102,5 script Dirty Vigilante#ep13_3 4_MAN_GALTUN,{
if (!isequipped(2782)) {
mes "[Vigilante]";
- mes "¡ô¡ó¡ö ¡÷ ¡þ¡ù¡ó¢¤¡ö¡ø ¢³ ¡÷¢£¡ü ¡ø ¡Ð¡õ¡û.";
- mes "¡ð¡ú¢± ¡ô ¡ò¡õ¡ú ¡õ..! ";
+ mes sprintf("¡ô¡ó¡ö ¡÷ ¡þ¡ù¡ó¢¤¡ö¡ø ¢³ ¡÷¢£¡ü ¡ø ¡Ð¡õ¡û.");
+ mes sprintf("¡ð¡ú¢± ¡ô ¡ò¡õ¡ú ¡õ..! ");
next;
mes "Cannot understand a word.";
close;
@@ -361,8 +361,8 @@ OnEnable:
- script Guard#ep133_11 4_MAN_GALTUN1,{
if (!isequipped(2782)) {
mes "[Capital City Guard]";
- mes "¡ô¡ó¡ö ¡÷ ¡þ¡ù¡ó?";
- mes "¡ð¡ú¢± ¡ô ¡ò¡õ¡ú ¡õ..!";
+ mes sprintf("¡ô¡ó¡ö ¡÷ ¡þ¡ù¡ó?");
+ mes sprintf("¡ð¡ú¢± ¡ô ¡ò¡õ¡ú ¡õ..!");
next;
mes "- Cannot communicate with him. -";
close;
@@ -502,8 +502,8 @@ dic_in01,48,263,5 script Hunting Dept. 1 Manager 4_MAN_BENKUNI,{
close;
}
if (!isequipped(2782)) {
- mes "¡õ¢£¡ô";
- mes "¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£";
+ mes sprintf("¡õ¢£¡ô");
+ mes sprintf("¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£");
next;
mes "I don't feel confident in talking since you wouldn't understand anything.";
close;
@@ -572,8 +572,8 @@ dic_in01,51,266,6 script Hunting Dept. 2 Manager 4_MAN_BENKUNI,{
close;
}
if (!isequipped(2782)) {
- mes "¡õ¢£¡ô";
- mes "¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£";
+ mes sprintf("¡õ¢£¡ô");
+ mes sprintf("¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£");
next;
mes "I don't feel confident in talking since you wouldn't understand anything.";
close;
@@ -641,8 +641,8 @@ dic_in01,51,270,7 script Supply Dept. 1 Manager 4_MAN_BENKUNI,{
close;
}
if (!isequipped(2782)) {
- mes "¡õ¢£¡ô";
- mes "¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£";
+ mes sprintf("¡õ¢£¡ô");
+ mes sprintf("¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£");
next;
mes "I don't feel confident in talking since you wouldn't understand anything.";
close;
@@ -712,8 +712,8 @@ dic_in01,48,273,1 script Supply Dept. 2 Manager 4_MAN_BENKUNI,{
close;
}
if (!isequipped(2782)) {
- mes "¡õ¢£¡ô";
- mes "¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£";
+ mes sprintf("¡õ¢£¡ô");
+ mes sprintf("¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£");
next;
mes "I don't feel confident in talking since you wouldn't understand anything.";
close;
@@ -779,8 +779,8 @@ dic_in01,43,273,1 script Transport Dept. 1 Mgr 4_MAN_BENKUNI,{
close;
}
if (!isequipped(2782)) {
- mes "¡õ¢£¡ô";
- mes "¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£";
+ mes sprintf("¡õ¢£¡ô");
+ mes sprintf("¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£");
next;
mes "I don't feel confident in talking since you wouldn't understand anything.";
close;
@@ -853,8 +853,8 @@ dic_in01,40,270,2 script Transport Dept. 2 Mgr 4_MAN_BENKUNI,{
close;
}
if (!isequipped(2782)) {
- mes "¡õ¢£¡ô";
- mes "¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£";
+ mes sprintf("¡õ¢£¡ô");
+ mes sprintf("¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£");
next;
mes "I don't feel confident in talking since you wouldn't understand anything.";
close;
@@ -921,8 +921,8 @@ dic_in01,40,193,1 script Papyrus#0001 4_MAN_NITT,{
close;
}
if (!isequipped(2782)) {
- mes "¡õ¢£¡ô";
- mes "¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£";
+ mes sprintf("¡õ¢£¡ô");
+ mes sprintf("¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£");
next;
mes "I don't feel confident in talking since you wouldn't understand anything.";
close;
@@ -1204,9 +1204,9 @@ cmd_fild08,324,163,0 script Stone Hearts CLEAR_NPC,{ unknown_d(12215,953); }
dic_in01,138,225,3 script Diel Guard#ep133_19 4_MAN_GALTUN1,{
if (!isequipped(2782)) {
mes "[Diel Guard]";
- mes "¡ô¡ó¡ö ¡÷ ¡þ¡ù¡ó?";
- mes "¢¤¡ö¡ø ¢³ ¡÷¢£¡ü ¡ø ¡Ð¡õ¡û...";
- mes "¡ð¡ú¢± ¡ô ¡ò¡õ¡ú ¡õ..!";
+ mes sprintf("¡ô¡ó¡ö ¡÷ ¡þ¡ù¡ó?");
+ mes sprintf("¢¤¡ö¡ø ¢³ ¡÷¢£¡ü ¡ø ¡Ð¡õ¡û...");
+ mes sprintf("¡ð¡ú¢± ¡ô ¡ò¡õ¡ú ¡õ..!");
next;
mes "Cannot communicate with him.";
close;
@@ -1267,9 +1267,9 @@ dic_in01,242,182,0 script Elevator#5f_to_4f CLEAR_NPC,{
dic_in01,263,193,3 script Diel Guard#ep133_20 4_MAN_GALTUN,{
if (!isequipped(2782)) {
mes "[Diel Guard]";
- mes "¡ô¡ó¡ö ¡÷ ¡þ¡ù¡ó?";
- mes "¢¤¡ö¡ø ¢³ ¡÷¢£¡ü ¡ø ¡Ð¡õ¡û...";
- mes "¡ð¡ú¢± ¡ô ¡ò¡õ¡ú ¡õ..!";
+ mes sprintf("¡ô¡ó¡ö ¡÷ ¡þ¡ù¡ó?");
+ mes sprintf("¢¤¡ö¡ø ¢³ ¡÷¢£¡ü ¡ø ¡Ð¡õ¡û...");
+ mes sprintf("¡ð¡ú¢± ¡ô ¡ò¡õ¡ú ¡õ..!");
next;
mes "Cannot communicate with him.";
close;
@@ -1804,8 +1804,8 @@ OnTouch:
if (ep13_3_secret == 19) {
if (!isequipped(2782)) {
mes "[Quiet Voice]";
- mes "¡þ¡ù¡ó ¢¤¡ö¡ø....";
- mes "¡ò¡õ¡ú ¡÷¢£¡ü ¡ø ¡Ð¡õ¡û...";
+ mes sprintf("¡þ¡ù¡ó ¢¤¡ö¡ø....");
+ mes sprintf("¡ò¡õ¡ú ¡÷¢£¡ü ¡ø ¡Ð¡õ¡û...");
}
else {
mes "[Quiet Voice]";
@@ -1821,9 +1821,9 @@ OnTouch:
dic_in01,158,188,3 script Jarute HesLanta#ep133_2 4_MAN_JERUTOO,{
if (!isequipped(2782)) {
mes "[Jarute HesLanta]";
- mes "¡ô¡ó¡ö ¡÷ ¡þ¡ù¡ó?";
- mes "¢¤¡ö¡ø ¢³ ¡÷¢£¡ü ¡ø ¡Ð¡õ¡û...";
- mes "¡ð¡ú¢± ¡ô ¡ò¡õ¡ú ¡õ..!";
+ mes sprintf("¡ô¡ó¡ö ¡÷ ¡þ¡ù¡ó?");
+ mes sprintf("¢¤¡ö¡ø ¢³ ¡÷¢£¡ü ¡ø ¡Ð¡õ¡û...");
+ mes sprintf("¡ð¡ú¢± ¡ô ¡ò¡õ¡ú ¡õ..!");
next;
mes "Cannot communicate with him.";
mes "Sapha's minister looks hopeless.";
@@ -2331,8 +2331,8 @@ dicastes01,223,190,1 script Calyon#pa8029 4_MAN_NITT,{
close;
}
if (!isequipped(2782)) {
- mes "¡õ¢£¡ô";
- mes "¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£";
+ mes sprintf("¡õ¢£¡ô");
+ mes sprintf("¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£");
next;
mes "I don't feel confident in talking since you wouldn't understand anything.";
close;
@@ -2504,8 +2504,8 @@ dicastes01,211,178,2 script Moltuka#pa0829 4_MAN_NITT,{
close;
}
if (!isequipped(2782)) {
- mes "¡õ¢£¡ô";
- mes "¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£";
+ mes sprintf("¡õ¢£¡ô");
+ mes sprintf("¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£");
next;
mes "I don't feel confident in talking since you wouldn't understand anything.";
close;
@@ -2728,8 +2728,8 @@ dicastes01,175,217,5 script Kalipo#pa0829 4_MAN_NITT,{
close;
}
if (!isequipped(2782)) {
- mes "¡õ¢£¡ô";
- mes "¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£";
+ mes sprintf("¡õ¢£¡ô");
+ mes sprintf("¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£");
next;
mes "I don't feel confident in talking since you wouldn't understand anything.";
close;
@@ -2870,8 +2870,8 @@ dicastes01,187,230,5 script Laponte#pa0829 4_MAN_NITT,{
close;
}
if (!isequipped(2782)) {
- mes "¡õ¢£¡ô";
- mes "¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£";
+ mes sprintf("¡õ¢£¡ô");
+ mes sprintf("¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£");
next;
mes "I don't feel confident in talking since you wouldn't understand anything.";
close;
@@ -3041,8 +3041,8 @@ dicastes01,208,230,3 script Pura#pa0829 4_MAN_NITT,{
close;
}
if (!isequipped(2782)) {
- mes "¡õ¢£¡ô";
- mes "¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£";
+ mes sprintf("¡õ¢£¡ô");
+ mes sprintf("¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£");
next;
mes "I don't feel confident in talking since you wouldn't understand anything.";
close;
@@ -3232,8 +3232,8 @@ dicastes01,225,211,3 script Tragis#pa0829 4_MAN_NITT,{
close;
}
if (!isequipped(2782)) {
- mes "¡õ¢£¡ô";
- mes "¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£";
+ mes sprintf("¡õ¢£¡ô");
+ mes sprintf("¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£");
next;
mes "I don't feel confident in talking since you wouldn't understand anything.";
close;
@@ -4300,8 +4300,8 @@ dic_in01,245,119,4 script Shay#ep133_13 4_M_ACROSS,{
dicastes01,207,210,5 script Walking Knit#ep133_15 4_MAN_BENKUNI,{
if (!isequipped(2782)) {
mes "[Knit]";
- mes "¡õ¢£¡ô";
- mes "¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£";
+ mes sprintf("¡õ¢£¡ô");
+ mes sprintf("¡ö¡ø¡ó ¢£ ¡ö¡ñ¡ï ¡ù ¡ð¢²¢£");
next;
mes "Cannot communicate with him.";
close;
@@ -4398,9 +4398,9 @@ dicastes01,207,210,5 script Walking Knit#ep133_15 4_MAN_BENKUNI,{
dicastes01,112,248,5 script Resting Piom#ep133_16 4_MAN_PIOM5,{
mes "[Piom]";
if (!isequipped(2782)) {
- mes "¡ñ¡÷¢¤ ¡ö ¢±¡ñ¡ú?";
- mes "¡ò¢³~!";
- mes "¡Ð¢²¢¤ ¢± ¡ü¡ñ¡õ ¢³ ¡ð !!!";
+ mes sprintf("¡ñ¡÷¢¤ ¡ö ¢±¡ñ¡ú?");
+ mes sprintf("¡ò¢³~!");
+ mes sprintf("¡Ð¢²¢¤ ¢± ¡ü¡ñ¡õ ¢³ ¡ð !!!");
next;
mes "Cannot communicate with him.";
close;
@@ -4471,8 +4471,8 @@ dicastes01,112,248,5 script Resting Piom#ep133_16 4_MAN_PIOM5,{
dicastes01,249,140,3 script Training Galten#ep133_17 4_MAN_GALTUN,{
if (!isequipped(2782)) {
mes "[Galten]";
- mes "¡ø¡ô¡ü ¡ø ¡ø¡ô¡ü";
- mes "¡ø¡ô¡ü";
+ mes sprintf("¡ø¡ô¡ü ¡ø ¡ø¡ô¡ü");
+ mes sprintf("¡ø¡ô¡ü");
next;
mes "Cannot communicate with him.";
close;
@@ -5045,8 +5045,8 @@ dicastes01,117,262,0 script Frede#13_3 4_MAN_PIOM5,2,2,{
close;
}
mes "[Frede]";
- mes "¢£¡ô¡ñ ¡û";
- mes "¡ú¡ö¡ø ¢£ ¡ô";
+ mes sprintf("¢£¡ô¡ñ ¡û");
+ mes sprintf("¡ú¡ö¡ø ¢£ ¡ô");
close;
OnTouch:
if (isequipped(2782) && ep13_3_invite > 5 && ep13_3_bra < 1) {
@@ -5352,8 +5352,8 @@ dic_in01,165,104,0 script Frede#13_3_in 4_MAN_PIOM,{
close;
}
mes "[Frede]";
- mes "¢£¡ô¡ñ ¡û ";
- mes "¡ú¡ö¡ø ¢£ ¡ô";
+ mes sprintf("¢£¡ô¡ñ ¡û ");
+ mes sprintf("¡ú¡ö¡ø ¢£ ¡ô");
close;
}
@@ -5450,9 +5450,9 @@ dic_dun01,205,43,5 script Brian#ep13_3_ 4_MAN_PIOM4,{
close;
}
mes "[Brian]";
- mes "¡ô¡õ¡ó ¡ø ¡ð¢±¡û ¡ö ¡ð";
- mes "¡ð¡þ¡þ ¡ù ¡Ð¡ñ¡ï ¢¤";
- mes "¡ô¡ò¢² ¡ø";
+ mes sprintf("¡ô¡õ¡ó ¡ø ¡ð¢±¡û ¡ö ¡ð");
+ mes sprintf("¡ð¡þ¡þ ¡ù ¡Ð¡ñ¡ï ¢¤");
+ mes sprintf("¡ô¡ò¢² ¡ø");
close;
}
@@ -5576,9 +5576,9 @@ dic_dun01,153,107,4 script Tyler#13_3 4_MAN_PIOM6,{
close;
}
mes "[Tyler]";
- mes "¡ï¡þ¡÷";
- mes "¡þ¡ó¡Ð ¡þ ¡Ð¡ø¢± ¡ü ";
- mes "¡ó¡ø¢¤ ¡ó ";
+ mes sprintf("¡ï¡þ¡÷");
+ mes sprintf("¡þ¡ó¡Ð ¡þ ¡Ð¡ø¢± ¡ü ");
+ mes sprintf("¡ó¡ø¢¤ ¡ó ");
close;
}
@@ -5679,8 +5679,8 @@ dic_dun01,235,243,0 script John#13_3 4_MAN_PIOM,{
close;
}
mes "[John]";
- mes "¡ù¡õ¡Ð ¢³ ¡ó";
- mes "¡ï¡ï¡ò ¡÷ ¡þ¡ð¡ö ¢£ ¡ñ¡ü¡ú ¡ó ¢¤¡ü ¡ó ";
+ mes sprintf("¡ù¡õ¡Ð ¢³ ¡ó");
+ mes sprintf("¡ï¡ï¡ò ¡÷ ¡þ¡ð¡ö ¢£ ¡ñ¡ü¡ú ¡ó ¢¤¡ü ¡ó ");
close;
}
@@ -5773,13 +5773,14 @@ dic_dun02,110,127,5 script Rose#13_3 4_MAN_PIOM6,{
next;
mes "[Rose]";
mes "We must be connected?";
- mes "^f57d7dHahaha¢½^000000";
+ mes sprintf("^f57d7d%s¢½^000000",
+ _("Hahaha"));;
close;
}
mes "[Rose]";
- mes "¡ù¡ó¡ð ¢² ¡ð";
- mes "¡û¡ö¡÷ ¡ù ¢³";
- mes "¢£¡ó¢²";
+ mes sprintf("¡ù¡ó¡ð ¢² ¡ð");
+ mes sprintf("¡û¡ö¡÷ ¡ù ¢³");
+ mes sprintf("¢£¡ó¢²");
close;
}
@@ -5872,8 +5873,8 @@ dic_dun01,64,107,7 script Bain#13_3 4_MAN_PIOM4,{
close;
}
mes "[Bain]";
- mes "¡ó¡ø¢± ¡÷ ";
- mes "¡ö¡ñ¡Ð ¡ò ¡õ";
+ mes sprintf("¡ó¡ø¢± ¡÷ ");
+ mes sprintf("¡ö¡ñ¡Ð ¡ò ¡õ");
close;
}
@@ -5970,11 +5971,11 @@ dic_dun01,58,225,4 script Lash#13_3 4_MAN_PIOM5,{
close;
}
mes "[Lash]";
- mes "¡ô¡õ¡ó ¡ø ¡ð¢±¡û ¡ö ¡ð";
- mes "¡ð¡þ¡þ ¡ù ¡Ð¡ñ¡ï ¢¤ ";
- mes "¡ô¡ò¢² ¡ø ";
- mes "¡÷";
- mes "¡õ¢³¡ñ ¡õ ¡ñ";
+ mes sprintf("¡ô¡õ¡ó ¡ø ¡ð¢±¡û ¡ö ¡ð");
+ mes sprintf("¡ð¡þ¡þ ¡ù ¡Ð¡ñ¡ï ¢¤ ");
+ mes sprintf("¡ô¡ò¢² ¡ø ");
+ mes sprintf("¡÷");
+ mes sprintf("¡õ¢³¡ñ ¡õ ¡ñ");
close;
}
@@ -6095,9 +6096,9 @@ dic_in01,349,129,5 script Bouy#13_3 4_MAN_BENKUNI,{
close;
}
mes "[Bouy]";
- mes "¡ø¡ö¡þ ¡ù ¡ú¡ð¡ï ¡ø";
- mes "¡ï¡ú¡ö ¡ù";
- mes "¡õ¡ï¡õ ¡ò";
+ mes sprintf("¡ø¡ö¡þ ¡ù ¡ú¡ð¡ï ¡ø");
+ mes sprintf("¡ï¡ú¡ö ¡ù");
+ mes sprintf("¡õ¡ï¡õ ¡ò");
close;
}
@@ -6591,9 +6592,9 @@ mid_campin,168,128,3 script Sapha from Manuk 4_MAN_JERUTOO,{
mes "That is it.";
}
mes "[Sapha]";
- mes "¢¤¡ð¡ú? ¢£ ¡ù¡ð...";
- mes "¡ï¡ò¡Ð ¢¤ ?";
- mes "¡ñ¡ï..?";
+ mes sprintf("¢¤¡ð¡ú? ¢£ ¡ù¡ð...");
+ mes sprintf("¡ï¡ò¡Ð ¢¤ ?");
+ mes sprintf("¡ñ¡ï..?");
next;
mes "[Hound]";
mes "Where is your interpreter ring?";
@@ -6673,9 +6674,9 @@ OnInit:
man_in01,315,52,3 script Guard Captain Avalanche 4_MAN_GALTUN,{
mes "[Guard Captain Avalanche]";
if (!isequipped(2782)) {
- mes "¢¤¡ð¡ú? ¢£ ¡ù¡ð...";
- mes "¡ï¡ò¡Ð ¢¤ ?";
- mes "¡ñ¡ï..?";
+ mes sprintf("¢¤¡ð¡ú? ¢£ ¡ù¡ð...");
+ mes sprintf("¡ï¡ò¡Ð ¢¤ ?");
+ mes sprintf("¡ñ¡ï..?");
close;
}
if (ep13_3_invite == 4) {
@@ -6751,8 +6752,8 @@ man_in01,315,52,3 script Guard Captain Avalanche 4_MAN_GALTUN,{
dic_in01,42,264,3 script Adventurer Clerk#ep133 4_MAN_NITT,{
if (!isequipped(2782)) {
mes "[Clerk Knit]";
- mes "¡ð¡ñ¡ô ¡õ ¡ü¢±¢³ ¡ö ¡ò...?";
- mes "¢¤¡ö¡ø ... ¢³ ¡÷¢£¡ü ¡ø ¡Ð¡õ¡û...";
+ mes sprintf("¡ð¡ñ¡ô ¡õ ¡ü¢±¢³ ¡ö ¡ò...?");
+ mes sprintf("¢¤¡ö¡ø ... ¢³ ¡÷¢£¡ü ¡ø ¡Ð¡õ¡û...");
next;
mes "- Cannot communicate with him. -";
close;
diff --git a/npc/re/quests/quests_eclage.txt b/npc/re/quests/quests_eclage.txt
index 79fbcd4b0..055d63e8f 100644
--- a/npc/re/quests/quests_eclage.txt
+++ b/npc/re/quests/quests_eclage.txt
@@ -12028,7 +12028,7 @@ ecl_in04,105,216,4 script Hiel's Workshop#pa0829 HIDDEN_NPC,{
next;
cutin "EP14_etran1",1;
mes "[Etran]";
- mes "Welcome welcomeow~! We are cat merchants, always serving guests as our kingeow~! Special sale! One piece of meat for 200æ´Ã!!";
+ mes "Welcome welcomeow~! We are cat merchants, always serving guests as our kingeow~! Special sale! One piece of meat for 200meow!!";
next;
cutin "EP14_robert1",1;
mes "[Robert]";
diff --git a/npc/re/quests/quests_malangdo.txt b/npc/re/quests/quests_malangdo.txt
index 54b2a00c0..9a3a3284f 100644
--- a/npc/re/quests/quests_malangdo.txt
+++ b/npc/re/quests/quests_malangdo.txt
@@ -825,7 +825,8 @@ mal_in02,174,64,5 script Linguist Devore#mal 4_CAT_MERMASTER,{
mes "If you see the words on the first page of this book, there's a sentence seeming like short conversation.";
next;
mes "[Linguist Devore]";
- mes "It's like this, for the question, ¬¬¬Ñ¬Ü ¬ã¬Ú?, it says, ¬¡¬Ù ¬ã¬ì¬Þ ¬Õ¬à¬Ò¬â¬Ö, ¬Ò¬Ý¬Ñ¬Ô¬à¬Õ¬Ñ¬â¬ñ. ¬¡ ¬£¬Ú¬Ö?";
+ mes sprintf(_$("It's like this, for the question, %s, it says, %s"),
+ "¬¬¬Ñ¬Ü ¬ã¬Ú?", "¬¡¬Ù ¬ã¬ì¬Þ ¬Õ¬à¬Ò¬â¬Ö, ¬Ò¬Ý¬Ñ¬Ô¬à¬Õ¬Ñ¬â¬ñ. ¬¡ ¬£¬Ú¬Ö?");
next;
mes "[Linguist Devore]";
mes "Though I tried talking to Biscuit like this, there was no feedback.";
@@ -9649,7 +9650,7 @@ mal_in01,134,221,4 script KungKung#gamer 4_M_BABYCAT,{
case 1: // Attack
mes "How would you like to attack?";
mes " ";
- mes "¡¡ Tip !!";
+ mes "- Tip -";
mes "Choose back: ^FF0000You win if the cat shows the back of its paw.^000000";
mes "Choose palm: ^FF0000You win if the cat shows the palm of its paw.^000000";
next;
@@ -9695,7 +9696,7 @@ mal_in01,134,221,4 script KungKung#gamer 4_M_BABYCAT,{
case 2: // Defend
mes "How would you like to defend?";
mes " ";
- mes "¡¡ Tip !!";
+ mes "- Tip -";
mes "Choose back: ^FF0000You win if the cat shows the back of its paw.^000000";
mes "Choose palm: ^FF0000You win if the cat shows the palm of its paw.^000000";
next;
diff --git a/npc/re/quests/quests_mora.txt b/npc/re/quests/quests_mora.txt
index 0d64f23d9..34999bbd8 100644
--- a/npc/re/quests/quests_mora.txt
+++ b/npc/re/quests/quests_mora.txt
@@ -3432,7 +3432,8 @@ L_ShowReport:
mes "the mysterious power.";
mes " ";
mes "<Material analysis>";
- mes "*** Temperature ***** 33.5¡Æ";
+ mes sprintf("*** %s ***** 33.5¡Æ",
+ _("Temperature"));
mes "*** PH ************ 9.8";
mes "*** Solid residues *** 176";
mes "*** K+ ************ 0,23";
diff --git a/npc/re/warps/cities/dicastes.txt b/npc/re/warps/cities/dicastes.txt
index 0d8922e51..e9b90614c 100644
--- a/npc/re/warps/cities/dicastes.txt
+++ b/npc/re/warps/cities/dicastes.txt
@@ -59,7 +59,7 @@ dic_in01,299,248,0 warp eldicastes0015 1,1,dic_in01,262,191
dic_in01,242,182,0 script #eldicastes0016 CLEAR_NPC,{
if (isequipped(2782)) select("Administrative Office");
- else select("¡÷¡ú¡ð");
+ else select(sprintf("¡÷¡ú¡ð"));
warp "dic_in01",138,221;
end;
}
diff --git a/src/common/HPMDataCheck.h b/src/common/HPMDataCheck.h
index 3d25d7330..a0ec8fc7e 100644
--- a/src/common/HPMDataCheck.h
+++ b/src/common/HPMDataCheck.h
@@ -648,6 +648,7 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = {
{ "casecheck_data", sizeof(struct casecheck_data), SERVER_TYPE_MAP },
{ "reg_db", sizeof(struct reg_db), SERVER_TYPE_MAP },
{ "script_array", sizeof(struct script_array), SERVER_TYPE_MAP },
+ { "script_buf", sizeof(struct script_buf), SERVER_TYPE_MAP },
{ "script_code", sizeof(struct script_code), SERVER_TYPE_MAP },
{ "script_data", sizeof(struct script_data), SERVER_TYPE_MAP },
{ "script_function", sizeof(struct script_function), SERVER_TYPE_MAP },
@@ -662,6 +663,7 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = {
{ "script_syntax_data", sizeof(struct script_syntax_data), SERVER_TYPE_MAP },
{ "str_data_struct", sizeof(struct str_data_struct), SERVER_TYPE_MAP },
{ "string_translation", sizeof(struct string_translation), SERVER_TYPE_MAP },
+ { "string_translation_entry", sizeof(struct string_translation_entry), SERVER_TYPE_MAP },
#else
#define MAP_SCRIPT_H
#endif // MAP_SCRIPT_H
diff --git a/src/common/db.h b/src/common/db.h
index d7d111c86..1c0955221 100644
--- a/src/common/db.h
+++ b/src/common/db.h
@@ -1395,6 +1395,16 @@ HPShared struct db_interface *DB;
} while(false)
/**
+ * Removes all values from the vector.
+ *
+ * Does not free the allocated data.
+ */
+#define VECTOR_TRUNCATE(_vec) \
+ do { \
+ VECTOR_LENGTH(_vec) = 0; \
+ } while (false)
+
+/**
* Clears the vector, freeing allocated data.
*
* @param _vec Vector.
diff --git a/src/common/strlib.c b/src/common/strlib.c
index 9690151b4..b67adb63c 100644
--- a/src/common/strlib.c
+++ b/src/common/strlib.c
@@ -772,6 +772,7 @@ size_t sv_escape_c(char* out_dest, const char* src, size_t len, const char* esca
case '\v': out_dest[j++] = 'v'; break;
case '\f': out_dest[j++] = 'f'; break;
case '\?': out_dest[j++] = '?'; break;
+ case '\"': out_dest[j++] = '"'; break;
default:// to octal
out_dest[j++] = '0'+((char)(((unsigned char)src[i]&0700)>>6));
out_dest[j++] = '0'+((char)(((unsigned char)src[i]&0070)>>3));
diff --git a/src/config/core.h b/src/config/core.h
index 09954e0cb..afd138a43 100644
--- a/src/config/core.h
+++ b/src/config/core.h
@@ -40,6 +40,17 @@
/// your map-server using more resources while this is active, comment the line
#define SCRIPT_CALLFUNC_CHECK
+/**
+ * Strip linebreaks from `mes` dialogs.
+ *
+ * Leave this line commented out to keep the hard line-breaks (`\r`) in the
+ * displayed `mes` dialogs (as in official servers).
+ * Uncomment it to strip the line-breaks and replace them with spaces, letting
+ * the client automatically wrap text in dialogs, depending on font size and
+ * dialog window size (may work better for clients using a non-standard font).
+ */
+//#define SCRIPT_MES_STRIP_LINEBREAK
+
/// Comment to disable Hercules' console_parse
/// CONSOLE_INPUT allows you to type commands into the server's console,
/// Disabling it saves one thread.
diff --git a/src/map/atcommand.c b/src/map/atcommand.c
index 841cf855d..094e64e2a 100644
--- a/src/map/atcommand.c
+++ b/src/map/atcommand.c
@@ -132,7 +132,6 @@ bool msg_config_read(const char *cfg_name, bool allow_override) {
int msg_number;
char line[1024], w1[1024], w2[1024];
FILE *fp;
- static int called = 1;
nullpo_retr(false, cfg_name);
if ((fp = fopen(cfg_name, "r")) == NULL) {
@@ -170,21 +169,6 @@ bool msg_config_read(const char *cfg_name, bool allow_override) {
}
fclose(fp);
- if( ++called == 1 ) { //Original
- if( script->lang_export_fp ) {
- int i;
- for(i = 0; i < MAX_MSG;i++) {
- if( atcommand->msg_table[0][i] != NULL ) {
- fprintf(script->lang_export_fp, "msgctxt \"messages.conf\"\n"
- "msgid \"%s\"\n"
- "msgstr \"\"\n",
- atcommand->msg_table[0][i]
- );
- }
- }
- }
- }
-
return true;
}
diff --git a/src/map/clif.c b/src/map/clif.c
index 40545cd6d..13a7b0839 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -1978,6 +1978,10 @@ void clif_selllist(struct map_session_data *sd)
void clif_scriptmes(struct map_session_data *sd, int npcid, const char *mes)
{
int fd, slen;
+#ifdef SCRIPT_MES_STRIP_LINEBREAK
+ char *stripmes = NULL;
+ int i;
+#endif
nullpo_retv(sd);
nullpo_retv(mes);
@@ -1992,7 +1996,17 @@ void clif_scriptmes(struct map_session_data *sd, int npcid, const char *mes)
WFIFOW(fd,0) = 0xb4;
WFIFOW(fd,2) = slen;
WFIFOL(fd,4) = npcid;
+#ifdef SCRIPT_MES_STRIP_LINEBREAK
+ stripmes = aStrdup(mes);
+ for (i = 0; stripmes[i] != '\0'; ++i) {
+ if (stripmes[i] == '\r')
+ stripmes[i] = ' ';
+ }
+ memcpy(WFIFOP(fd,8), stripmes, slen-8);
+ aFree(stripmes);
+#else // ! SCRIPT_MES_STRIP_LINEBREAK
memcpy(WFIFOP(fd,8), mes, slen-8);
+#endif // SCRIPT_MES_STRIP_LINEBREAK
WFIFOSET(fd,WFIFOW(fd,2));
}
diff --git a/src/map/map.c b/src/map/map.c
index 3a7d752c3..779f8d601 100644
--- a/src/map/map.c
+++ b/src/map/map.c
@@ -6002,22 +6002,6 @@ static CMDLINEARG(loadscript)
}
/**
- * --generate-translations
- *
- * Creates "./generated_translations.pot"
- * @see cmdline->exec
- **/
-static CMDLINEARG(generatetranslations) {
- script->lang_export_file = aStrdup("./generated_translations.pot");
-
- if( !(script->lang_export_fp = fopen(script->lang_export_file,"wb")) ) {
- ShowError("export-dialog: failed to open '%s' for writing\n",script->lang_export_file);
- }
- core->runflag = CORE_ST_STOP;
- return true;
-}
-
-/**
* Defines the local command line arguments
*/
void cmdline_args_init_local(void)
@@ -6033,7 +6017,6 @@ void cmdline_args_init_local(void)
CMDLINEARG_DEF2(log-config, logconfig, "Alternative logging configuration.", CMDLINE_OPT_NORMAL|CMDLINE_OPT_PARAM);
CMDLINEARG_DEF2(script-check, scriptcheck, "Doesn't run the server, only tests the scripts passed through --load-script.", CMDLINE_OPT_SILENT);
CMDLINEARG_DEF2(load-script, loadscript, "Loads an additional script (can be repeated).", CMDLINE_OPT_NORMAL|CMDLINE_OPT_PARAM);
- CMDLINEARG_DEF2(generate-translations, generatetranslations, "Creates './generated_translations.pot' file with all translateable strings from scripts, server terminates afterwards.", CMDLINE_OPT_NORMAL);
}
int do_init(int argc, char *argv[])
diff --git a/src/map/npc.c b/src/map/npc.c
index 6b55bf5ae..945a84957 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -3759,7 +3759,7 @@ const char *npc_parse_function(const char *w1, const char *w2, const char *w3, c
struct script_code *oldscript = (struct script_code*)DB->data2ptr(&old_data);
ShowWarning("npc_parse_function: Overwriting user function [%s] in file '%s', line '%d'.\n", w3, filepath, strline(buffer,start-buffer));
script->free_vars(oldscript->local.vars);
- aFree(oldscript->script_buf);
+ VECTOR_CLEAR(oldscript->script_buf);
aFree(oldscript);
}
@@ -5002,12 +5002,6 @@ int do_init_npc(bool minimal) {
timer->add_func_list(npc->timerevent,"npc_timerevent");
}
- if( script->lang_export_fp ) {
- ShowInfo("Lang exported to '%s'\n",script->lang_export_file);
- fclose(script->lang_export_fp);
- script->lang_export_fp = NULL;
- }
-
// Init dummy NPC
CREATE(npc->fake_nd, struct npc_data, 1);
npc->fake_nd->bl.m = -1;
diff --git a/src/map/script.c b/src/map/script.c
index 07b37571e..64966f987 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -83,36 +83,18 @@
struct script_interface script_s;
struct script_interface *script;
-static inline int GETVALUE(const unsigned char* buf, int i) {
- return (int)MakeDWord(MakeWord(buf[i], buf[i+1]), MakeWord(buf[i+2], 0));
-}
-static inline void SETVALUE(unsigned char* buf, int i, int n) {
- buf[i] = GetByte(n, 0);
- buf[i+1] = GetByte(n, 1);
- buf[i+2] = GetByte(n, 2);
-}
-
-static inline void script_string_buf_ensure(struct script_string_buf *buf, size_t ensure) {
- if( buf->pos+ensure >= buf->size ) {
- do {
- buf->size += 512;
- } while ( buf->pos+ensure >= buf->size );
- RECREATE(buf->ptr, char, buf->size);
- }
-}
-
-static inline void script_string_buf_addb(struct script_string_buf *buf,uint8 b) {
- if( buf->pos+1 >= buf->size ) {
- buf->size += 512;
- RECREATE(buf->ptr, char, buf->size);
- }
- buf->ptr[buf->pos++] = b;
+static inline int GETVALUE(const struct script_buf *buf, int i)
+{
+ Assert_ret(VECTOR_LENGTH(*buf) > i + 2);
+ return (int)MakeDWord(MakeWord(VECTOR_INDEX(*buf, i), VECTOR_INDEX(*buf, i+1)),
+ MakeWord(VECTOR_INDEX(*buf, i+2), 0));
}
-
-static inline void script_string_buf_destroy(struct script_string_buf *buf) {
- if( buf->ptr )
- aFree(buf->ptr);
- memset(buf,0,sizeof(struct script_string_buf));
+static inline void SETVALUE(struct script_buf *buf, int i, int n)
+{
+ Assert_retv(VECTOR_LENGTH(*buf) > i + 2);
+ VECTOR_INDEX(*buf, i) = GetByte(n, 0);
+ VECTOR_INDEX(*buf, i+1) = GetByte(n, 1);
+ VECTOR_INDEX(*buf, i+2) = GetByte(n, 2);
}
const char* script_op2name(int op) {
@@ -606,21 +588,26 @@ int script_add_str(const char* p)
return script->str_num++;
}
-/// Appends 1 byte to the script buffer.
+/**
+ * Appends 1 byte to the script buffer.
+ *
+ * @param a The byte to append.
+ */
void add_scriptb(int a)
{
- if( script->pos+1 >= script->size )
- {
- script->size += SCRIPT_BLOCK_SIZE;
- RECREATE(script->buf,unsigned char,script->size);
- }
- script->buf[script->pos++] = (uint8)(a);
+ VECTOR_ENSURE(script->buf, 1, SCRIPT_BLOCK_SIZE);
+ VECTOR_PUSH(script->buf, (uint8)a);
}
-/// Appends a c_op value to the script buffer.
-/// The value is variable-length encoded into 8-bit blocks.
-/// The encoding scheme is ( 01?????? )* 00??????, LSB first.
-/// All blocks but the last hold 7 bits of data, topmost bit is always 1 (carries).
+/**
+ * Appends a c_op value to the script buffer.
+ *
+ * The value is variable-length encoded into 8-bit blocks.
+ * The encoding scheme is ( 01?????? )* 00??????, LSB first.
+ * All blocks but the last hold 7 bits of data, topmost bit is always 1 (carries).
+ *
+ * @param a The value to append.
+ */
void add_scriptc(int a)
{
while( a >= 0x40 )
@@ -632,10 +619,15 @@ void add_scriptc(int a)
script->addb(a);
}
-/// Appends an integer value to the script buffer.
-/// The value is variable-length encoded into 8-bit blocks.
-/// The encoding scheme is ( 11?????? )* 10??????, LSB first.
-/// All blocks but the last hold 7 bits of data, topmost bit is always 1 (carries).
+/**
+ * Appends an integer value to the script buffer.
+ *
+ * The value is variable-length encoded into 8-bit blocks.
+ * The encoding scheme is ( 11?????? )* 10??????, LSB first.
+ * All blocks but the last hold 7 bits of data, topmost bit is always 1 (carries).
+ *
+ * @param a The value to append.
+ */
void add_scripti(int a)
{
while( a >= 0x40 )
@@ -646,11 +638,11 @@ void add_scripti(int a)
script->addb(a|0x80);
}
-/// Appends a script->str_data object (label/function/variable/integer) to the script buffer.
-
-///
-/// @param l The id of the script->str_data entry
-// Maximum up to 16M
+/**
+ * Appends a script->str_data object (label/function/variable/integer) to the script buffer.
+ *
+ * @param l The id of the script->str_data entry (Maximum up to 16M)
+ */
void add_scriptl(int l)
{
int backpatch = script->str_data[l].backpatch;
@@ -667,7 +659,7 @@ void add_scriptl(int l)
case C_USERFUNC:
// Embedded data backpatch there is a possibility of label
script->addc(C_NAME);
- script->str_data[l].backpatch = script->pos;
+ script->str_data[l].backpatch = VECTOR_LENGTH(script->buf);
script->addb(backpatch);
script->addb(backpatch>>8);
script->addb(backpatch>>16);
@@ -705,9 +697,9 @@ void set_label(int l,int pos, const char* script_pos)
script->str_data[l].type=(script->str_data[l].type == C_USERFUNC ? C_USERFUNC_POS : C_POS);
script->str_data[l].label=pos;
for (i = script->str_data[l].backpatch; i >= 0 && i != 0x00ffffff; ) {
- int next = GETVALUE(script->buf,i);
- script->buf[i-1]=(script->str_data[l].type == C_USERFUNC ? C_USERFUNC_POS : C_POS);
- SETVALUE(script->buf,i,pos);
+ int next = GETVALUE(&script->buf, i);
+ VECTOR_INDEX(script->buf, i-1) = (script->str_data[l].type == C_USERFUNC ? C_USERFUNC_POS : C_POS);
+ SETVALUE(&script->buf, i, pos);
i = next;
}
}
@@ -811,26 +803,25 @@ const char* parse_callfunc(const char* p, int require_paren, int is_custom)
char *arg = NULL;
char null_arg = '\0';
int func;
- bool nested_call = false, macro = false;
+ bool macro = false;
// is need add check for arg null pointer below?
func = script->add_word(p);
- if( script->str_data[func].type == C_FUNC ) {
- /** only when unset (-1), valid values are >= 0 **/
- if( script->syntax.last_func == -1 )
- script->syntax.last_func = script->str_data[func].val;
- else { //Nested function call
- script->syntax.nested_call++;
- nested_call = true;
-
- if( script->str_data[func].val == script->buildin_lang_macro_offset ) {
+ if (script->str_data[func].type == C_FUNC) {
+ script->syntax.nested_call++;
+ if (script->syntax.last_func != -1) {
+ if (script->str_data[func].val == script->buildin_lang_macro_offset) {
script->syntax.lang_macro_active = true;
macro = true;
+ } else if (script->str_data[func].val == script->buildin_lang_macro_fmtstring_offset) {
+ script->syntax.lang_macro_fmtstring_active = true;
+ macro = true;
}
}
if( !macro ) {
// buildin function
+ script->syntax.last_func = script->str_data[func].val;
script->addl(func);
script->addc(C_ARG);
}
@@ -919,18 +910,17 @@ const char* parse_callfunc(const char* p, int require_paren, int is_custom)
disp_error_message("parse_callfunc: expected ')' to close argument list",p);
++p;
- if( script->str_data[func].val == script->buildin_lang_macro_offset )
+ if (script->str_data[func].val == script->buildin_lang_macro_offset)
script->syntax.lang_macro_active = false;
+ else if (script->str_data[func].val == script->buildin_lang_macro_fmtstring_offset)
+ script->syntax.lang_macro_fmtstring_active = false;
}
- if( nested_call )
- script->syntax.nested_call--;
-
- if( !script->syntax.nested_call )
- script->syntax.last_func = -1;
-
- if( !macro )
+ if (!macro) {
+ if (0 == --script->syntax.nested_call)
+ script->syntax.last_func = -1;
script->addc(C_FUNC);
+ }
return p;
}
@@ -942,7 +932,7 @@ void parse_nextline(bool first, const char* p)
if( !first )
{
script->addc(C_EOL); // mark end of line for stack cleanup
- script->set_label(LABEL_NEXTLINE, script->pos, p); // fix up '-' labels
+ script->set_label(LABEL_NEXTLINE, VECTOR_LENGTH(script->buf), p); // fix up '-' labels
}
// initialize data for new '-' label fix up scheduling
@@ -1066,6 +1056,8 @@ const char* parse_variable(const char* p)
}
// push the set function onto the stack
+ script->syntax.nested_call++;
+ script->syntax.last_func = script->str_data[script->buildin_set_ref].val;
script->addl(script->buildin_set_ref);
script->addc(C_ARG);
@@ -1117,6 +1109,8 @@ const char* parse_variable(const char* p)
// close the script by appending the function operator
script->addc(C_FUNC);
+ if (--script->syntax.nested_call == 0)
+ script->syntax.last_func = -1;
// push the buffer from the method
return p;
@@ -1159,13 +1153,19 @@ bool is_number(const char *p) {
}
/**
+ * Duplicates a script string into the script string list.
*
- **/
-int script_string_dup(char *str) {
- size_t len = strlen(str);
+ * Grows the script string list as needed.
+ *
+ * @param str The string to insert.
+ * @return the string position in the script string list.
+ */
+int script_string_dup(char *str)
+{
+ int len = (int)strlen(str);
int pos = script->string_list_pos;
- while( pos+len+1 >= script->string_list_size ) {
+ while (pos+len+1 >= script->string_list_size) {
script->string_list_size += (1024*1024)/2;
RECREATE(script->string_list,char,script->string_list_size);
}
@@ -1179,231 +1179,194 @@ int script_string_dup(char *str) {
/*==========================================
* Analysis section
*------------------------------------------*/
-const char* parse_simpleexpr(const char *p)
+const char *parse_simpleexpr(const char *p)
{
p=script->skip_space(p);
- if(*p==';' || *p==',')
+ if (*p == ';' || *p == ',')
disp_error_message("parse_simpleexpr: unexpected end of expression",p);
- if(*p=='(') {
- int i = script->syntax.curly_count-1;
- if (i >= 0 && script->syntax.curly[i].type == TYPE_ARGLIST)
- ++script->syntax.curly[i].count;
- p=script->parse_subexpr(p+1,-1);
- p=script->skip_space(p);
- if( (i=script->syntax.curly_count-1) >= 0 && script->syntax.curly[i].type == TYPE_ARGLIST
- && script->syntax.curly[i].flag == ARGLIST_UNDEFINED && --script->syntax.curly[i].count == 0
- ) {
- if( *p == ',' ) {
- script->syntax.curly[i].flag = ARGLIST_PAREN;
- return p;
- } else {
- script->syntax.curly[i].flag = ARGLIST_NO_PAREN;
- }
- }
- if( *p != ')' )
- disp_error_message("parse_simpleexpr: unmatched ')'",p);
- ++p;
- } else if(is_number(p)) {
- char *np;
- long long lli;
- while(*p == '0' && ISDIGIT(p[1])) p++; // Skip leading zeros, we don't support octal literals
- lli=strtoll(p,&np,0);
- if( lli < INT_MIN ) {
- lli = INT_MIN;
- script->disp_warning_message("parse_simpleexpr: underflow detected, capping value to INT_MIN",p);
- } else if( lli > INT_MAX ) {
- lli = INT_MAX;
- script->disp_warning_message("parse_simpleexpr: overflow detected, capping value to INT_MAX",p);
- }
- script->addi((int)lli); // Cast is safe, as it's already been checked for overflows
- p=np;
- } else if(*p=='"') {
- struct string_translation *st = NULL;
- const char *start_point = p;
- bool duplicate = true;
- struct script_string_buf *sbuf = &script->parse_simpleexpr_str;
-
- do {
- p++;
- while( *p && *p != '"' ) {
- if( (unsigned char)p[-1] <= 0x7e && *p == '\\' ) {
- char buf[8];
- size_t len = sv->skip_escaped_c(p) - p;
- size_t n = sv->unescape_c(buf, p, len);
- if( n != 1 )
- ShowDebug("parse_simpleexpr: unexpected length %d after unescape (\"%.*s\" -> %.*s)\n", (int)n, (int)len, p, (int)n, buf);
- p += len;
- script_string_buf_addb(sbuf, *buf);
- continue;
- } else if( *p == '\n' ) {
- disp_error_message("parse_simpleexpr: unexpected newline @ string",p);
- }
- script_string_buf_addb(sbuf, *p++);
- }
- if(!*p)
- disp_error_message("parse_simpleexpr: unexpected end of file @ string",p);
- p++; //'"'
- p = script->skip_space(p);
- } while( *p && *p == '"' );
-
- script_string_buf_addb(sbuf, 0);
-
- if (!(script->syntax.translation_db && (st = strdb_get(script->syntax.translation_db, sbuf->ptr)) != NULL)) {
- script->addc(C_STR);
-
- if( script->pos+sbuf->pos >= script->size ) {
- do {
- script->size += SCRIPT_BLOCK_SIZE;
- } while( script->pos+sbuf->pos >= script->size );
- RECREATE(script->buf,unsigned char,script->size);
- }
+ if (*p == '(') {
+ return script->parse_simpleexpr_paren(p);
+ } else if (is_number(p)) {
+ return script->parse_simpleexpr_number(p);
+ } else if(*p == '"') {
+ return script->parse_simpleexpr_string(p);
+ } else {
+ return script->parse_simpleexpr_name(p);
+ }
+}
- memcpy(script->buf+script->pos, sbuf->ptr, sbuf->pos);
- script->pos += sbuf->pos;
+const char *parse_simpleexpr_paren(const char *p)
+{
+ int i = script->syntax.curly_count - 1;
+ if (i >= 0 && script->syntax.curly[i].type == TYPE_ARGLIST)
+ ++script->syntax.curly[i].count;
+ p = script->parse_subexpr(p + 1, -1);
+ p = script->skip_space(p);
+ if ((i = script->syntax.curly_count - 1) >= 0
+ && script->syntax.curly[i].type == TYPE_ARGLIST
+ && script->syntax.curly[i].flag == ARGLIST_UNDEFINED
+ && --script->syntax.curly[i].count == 0
+ ) {
+ if (*p == ',') {
+ script->syntax.curly[i].flag = ARGLIST_PAREN;
+ return p;
} else {
- int expand = sizeof(int) + sizeof(uint8);
- unsigned char j;
- unsigned int st_cursor = 0;
+ script->syntax.curly[i].flag = ARGLIST_NO_PAREN;
+ }
+ }
+ if (*p != ')')
+ disp_error_message("parse_simpleexpr: unmatched ')'", p);
- script->addc(C_LSTR);
+ return p + 1;
+}
- expand += (sizeof(char*) + sizeof(uint8)) * st->translations;
+const char *parse_simpleexpr_number(const char *p)
+{
+ char *np = NULL;
+ long long lli;
- while( script->pos+expand >= script->size ) {
- script->size += SCRIPT_BLOCK_SIZE;
- RECREATE(script->buf,unsigned char,script->size);
- }
+ while (*p == '0' && ISDIGIT(p[1]))
+ p++; // Skip leading zeros, we don't support octal literals
- *((int *)(&script->buf[script->pos])) = st->string_id;
- *((uint8 *)(&script->buf[script->pos + sizeof(int)])) = st->translations;
+ lli = strtoll(p, &np, 0);
+ if (lli < INT_MIN) {
+ lli = INT_MIN;
+ script->disp_warning_message("parse_simpleexpr: underflow detected, capping value to INT_MIN", p);
+ } else if (lli > INT_MAX) {
+ lli = INT_MAX;
+ script->disp_warning_message("parse_simpleexpr: overflow detected, capping value to INT_MAX", p);
+ }
+ script->addi((int)lli); // Cast is safe, as it's already been checked for overflows
- script->pos += sizeof(int) + sizeof(uint8);
+ return np;
+}
- for(j = 0; j < st->translations; j++) {
- *((uint8 *)(&script->buf[script->pos])) = RBUFB(st->buf, st_cursor);
- *((char **)(&script->buf[script->pos+sizeof(uint8)])) = &st->buf[st_cursor + sizeof(uint8)];
- script->pos += sizeof(char*) + sizeof(uint8);
- st_cursor += sizeof(uint8);
- while(st->buf[st_cursor++]);
- st_cursor += sizeof(uint8);
- }
- }
+const char *parse_simpleexpr_string(const char *p)
+{
+ const char *start_point = p;
- /* When exporting we don't know what is a translation and what isn't */
- if( script->lang_export_fp && sbuf->pos > 1 ) {//sbuf->pos will always be at least 1 because of the '\0'
- if( !script->syntax.strings ) {
- script->syntax.strings = strdb_alloc(DB_OPT_DUP_KEY|DB_OPT_ALLOW_NULL_DATA, 0);
+ do {
+ p++;
+ while (*p != '\0' && *p != '"') {
+ if ((unsigned char)p[-1] <= 0x7e && *p == '\\') {
+ char buf[8];
+ size_t len = sv->skip_escaped_c(p) - p;
+ size_t n = sv->unescape_c(buf, p, len);
+ if (n != 1)
+ ShowDebug("parse_simpleexpr: unexpected length %d after unescape (\"%.*s\" -> %.*s)\n", (int)n, (int)len, p, (int)n, buf);
+ p += len;
+ VECTOR_ENSURE(script->parse_simpleexpr_strbuf, 1, 512);
+ VECTOR_PUSH(script->parse_simpleexpr_strbuf, buf[0]);
+ continue;
}
-
- if( !strdb_exists(script->syntax.strings,sbuf->ptr) ) {
- strdb_put(script->syntax.strings, sbuf->ptr, NULL);
- duplicate = false;
+ if (*p == '\n') {
+ disp_error_message("parse_simpleexpr: unexpected newline @ string", p);
}
+ VECTOR_ENSURE(script->parse_simpleexpr_strbuf, 1, 512);
+ VECTOR_PUSH(script->parse_simpleexpr_strbuf, *p++);
}
+ if (*p == '\0')
+ disp_error_message("parse_simpleexpr: unexpected end of file @ string", p);
+ p++; //'"'
+ p = script->skip_space(p);
+ } while (*p != '\0' && *p == '"');
- if( script->lang_export_fp && !duplicate &&
- ( ( ( script->syntax.last_func == script->buildin_mes_offset ||
- script->syntax.last_func == script->buildin_select_offset ) && !script->syntax.nested_call
- ) || script->syntax.lang_macro_active ) ) {
- const char *line_start = start_point;
- const char *line_end = start_point;
- struct script_string_buf *lbuf = &script->lang_export_line_buf;
- struct script_string_buf *ubuf = &script->lang_export_unescaped_buf;
- size_t line_length, cursor;
+ VECTOR_ENSURE(script->parse_simpleexpr_strbuf, 1, 512);
+ VECTOR_PUSH(script->parse_simpleexpr_strbuf, '\0');
- while( line_start > script->parser_current_src ) {
- if( *line_start != '\n' )
- line_start--;
- else
- break;
- }
+ script->add_translatable_string(&script->parse_simpleexpr_strbuf, start_point);
- while( *line_end != '\n' && *line_end != '\0' )
- line_end++;
+ VECTOR_TRUNCATE(script->parse_simpleexpr_strbuf);
- line_length = (size_t)(line_end - line_start);
- if( line_length > 0 ) {
- script_string_buf_ensure(lbuf,line_length + 1);
+ return p;
+}
- memcpy(lbuf->ptr, line_start, line_length);
- lbuf->pos = line_length;
- script_string_buf_addb(lbuf, 0);
+const char *parse_simpleexpr_name(const char *p)
+{
+ int l;
+ const char *pv = NULL;
- normalize_name(lbuf->ptr, "\r\n\t ");
- }
+ // label , register , function etc
+ if (script->skip_word(p) == p)
+ disp_error_message("parse_simpleexpr: unexpected character", p);
- for(cursor = 0; cursor < sbuf->pos; cursor++) {
- if( sbuf->ptr[cursor] == '"' )
- script_string_buf_addb(ubuf, '\\');
- script_string_buf_addb(ubuf, sbuf->ptr[cursor]);
- }
- script_string_buf_addb(ubuf, 0);
-
- fprintf(script->lang_export_fp, "#: %s\n"
- "# %s\n"
- "msgctxt \"%s\"\n"
- "msgid \"%s\"\n"
- "msgstr \"\"\n",
- script->parser_current_file ? script->parser_current_file : "Unknown File",
- lbuf->ptr,
- script->parser_current_npc_name ? script->parser_current_npc_name : "Unknown NPC",
- ubuf->ptr
- );
- lbuf->pos = 0;
- ubuf->pos = 0;
+ l = script->add_word(p);
+ if (script->str_data[l].type == C_FUNC || script->str_data[l].type == C_USERFUNC || script->str_data[l].type == C_USERFUNC_POS) {
+ return script->parse_callfunc(p,1,0);
+#ifdef SCRIPT_CALLFUNC_CHECK
+ } else {
+ const char *name = script->get_str(l);
+ if (strdb_get(script->userfunc_db,name) != NULL) {
+ return script->parse_callfunc(p, 1, 1);
}
- sbuf->pos = 0;
+#endif
+ }
+
+ if ((pv = script->parse_variable(p)) != NULL) {
+ // successfully processed a variable assignment
+ return pv;
+ }
+
+ if (script->str_data[l].type == C_INT && script->str_data[l].deprecated) {
+ disp_warning_message("This constant is deprecated and it will be removed in a future version. Please see the script documentation and constants.conf for an alternative.\n", p);
+ }
+
+ p = script->skip_word(p);
+ if (*p == '[') {
+ // array(name[i] => getelementofarray(name,i) )
+ script->addl(script->buildin_getelementofarray_ref);
+ script->addc(C_ARG);
+ script->addl(l);
+
+ p = script->parse_subexpr(p + 1, -1);
+ p = script->skip_space(p);
+ if (*p != ']')
+ disp_error_message("parse_simpleexpr: unmatched ']'", p);
+ ++p;
+ script->addc(C_FUNC);
} else {
- int l;
- const char* pv;
+ script->addl(l);
+ }
- // label , register , function etc
- if(script->skip_word(p)==p)
- disp_error_message("parse_simpleexpr: unexpected character",p);
+ return p;
+}
- l=script->add_word(p);
- if( script->str_data[l].type == C_FUNC || script->str_data[l].type == C_USERFUNC || script->str_data[l].type == C_USERFUNC_POS) {
- return script->parse_callfunc(p,1,0);
-#ifdef SCRIPT_CALLFUNC_CHECK
- } else {
- const char* name = script->get_str(l);
- if( strdb_get(script->userfunc_db,name) != NULL ) {
- return script->parse_callfunc(p,1,1);
- }
-#endif
- }
+void script_add_translatable_string(const struct script_string_buf *string, const char *start_point)
+{
+ struct string_translation *st = NULL;
- if( (pv = script->parse_variable(p)) ) {
- // successfully processed a variable assignment
- return pv;
- }
+ if (script->syntax.translation_db == NULL
+ || (st = strdb_get(script->syntax.translation_db, VECTOR_DATA(*string))) == NULL) {
+ script->addc(C_STR);
- if (script->str_data[l].type == C_INT && script->str_data[l].deprecated) {
- disp_warning_message("This constant is deprecated and it will be removed in a future version. Please see the script documentation and constants.conf for an alternative.\n", p);
- }
+ VECTOR_ENSURE(script->buf, VECTOR_LENGTH(*string), SCRIPT_BLOCK_SIZE);
- p=script->skip_word(p);
- if( *p == '[' ) {
- // array(name[i] => getelementofarray(name,i) )
- script->addl(script->buildin_getelementofarray_ref);
- script->addc(C_ARG);
- script->addl(l);
+ VECTOR_PUSHARRAY(script->buf, VECTOR_DATA(*string), VECTOR_LENGTH(*string));
+ } else {
+ unsigned char u;
+ int st_cursor = 0;
- p=script->parse_subexpr(p+1,-1);
- p=script->skip_space(p);
- if( *p != ']' )
- disp_error_message("parse_simpleexpr: unmatched ']'",p);
- ++p;
- script->addc(C_FUNC);
- } else {
- script->addl(l);
- }
+ script->addc(C_LSTR);
- }
+ VECTOR_ENSURE(script->buf, (int)(sizeof(st->string_id) + sizeof(st->translations)), SCRIPT_BLOCK_SIZE);
+ VECTOR_PUSHARRAY(script->buf, (void *)&st->string_id, sizeof(st->string_id));
+ VECTOR_PUSHARRAY(script->buf, (void *)&st->translations, sizeof(st->translations));
- return p;
+ for (u = 0; u != st->translations; u++) {
+ struct string_translation_entry *entry = (void *)(st->buf+st_cursor);
+ char *stringptr = &entry->string[0];
+ st_cursor += sizeof(*entry);
+ VECTOR_ENSURE(script->buf, (int)(sizeof(entry->lang_id) + sizeof(char *)), SCRIPT_BLOCK_SIZE);
+ VECTOR_PUSHARRAY(script->buf, (void *)&entry->lang_id, sizeof(entry->lang_id));
+ VECTOR_PUSHARRAY(script->buf, (void *)&stringptr, sizeof(stringptr));
+ st_cursor += sizeof(uint8); // FIXME: What are we skipping here?
+ while (st->buf[st_cursor++] != 0)
+ (void)0; // Skip string
+ st_cursor += sizeof(uint8); // FIXME: What are we skipping here?
+ }
+ }
}
/*==========================================
@@ -1582,7 +1545,7 @@ const char* parse_curly_close(const char* p)
// You are here labeled
sprintf(label,"__SW%x_%x", (unsigned int)script->syntax.curly[pos].index, (unsigned int)script->syntax.curly[pos].count);
l=script->add_str(label);
- script->set_label(l,script->pos, p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
if(script->syntax.curly[pos].flag) {
//Exists default
@@ -1595,7 +1558,7 @@ const char* parse_curly_close(const char* p)
// Label end
sprintf(label,"__SW%x_FIN", (unsigned int)script->syntax.curly[pos].index);
l=script->add_str(label);
- script->set_label(l,script->pos, p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
linkdb_final(&script->syntax.curly[pos].case_label); // free the list of case label
script->syntax.curly_count--;
//Closing decision if, for , while
@@ -1674,7 +1637,7 @@ const char* parse_syntax(const char* p)
// You are here labeled
sprintf(label,"__SW%x_%x", (unsigned int)script->syntax.curly[pos].index, (unsigned int)script->syntax.curly[pos].count);
l=script->add_str(label);
- script->set_label(l,script->pos, p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
}
//Decision statement switch
p = script->skip_space(p2);
@@ -1714,7 +1677,7 @@ const char* parse_syntax(const char* p)
// Label after the completion of FALLTHRU
sprintf(label, "__SW%x_%xJ", (unsigned int)script->syntax.curly[pos].index, (unsigned int)script->syntax.curly[pos].count);
l=script->add_str(label);
- script->set_label(l,script->pos,p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
}
// check duplication of case label [Rayce]
if(linkdb_search(&script->syntax.curly[pos].case_label, (void*)h64BPTRSIZE(v)) != NULL)
@@ -1781,7 +1744,7 @@ const char* parse_syntax(const char* p)
}
sprintf(label, "__SW%x_%x", (unsigned int)script->syntax.curly[pos].index, (unsigned int)script->syntax.curly[pos].count);
l=script->add_str(label);
- script->set_label(l,script->pos,p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
// Skip to the next link w/o condition
sprintf(label, "goto __SW%x_%x;", (unsigned int)script->syntax.curly[pos].index, (unsigned int)script->syntax.curly[pos].count + 1);
@@ -1792,7 +1755,7 @@ const char* parse_syntax(const char* p)
// The default label
sprintf(label, "__SW%x_DEF", (unsigned int)script->syntax.curly[pos].index);
l=script->add_str(label);
- script->set_label(l,script->pos,p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
script->syntax.curly[script->syntax.curly_count - 1].flag = 1;
script->syntax.curly[pos].count++;
@@ -1810,7 +1773,7 @@ const char* parse_syntax(const char* p)
// Label of the (do) form here
sprintf(label, "__DO%x_BGN", (unsigned int)script->syntax.curly[script->syntax.curly_count].index);
l=script->add_str(label);
- script->set_label(l,script->pos,p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
script->syntax.curly_count++;
return p;
}
@@ -1841,7 +1804,7 @@ const char* parse_syntax(const char* p)
// Form the start of label decision
sprintf(label, "__FR%x_J", (unsigned int)script->syntax.curly[pos].index);
l=script->add_str(label);
- script->set_label(l,script->pos,p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
p=script->skip_space(p);
if(*p == ';') {
@@ -1870,7 +1833,7 @@ const char* parse_syntax(const char* p)
// Labels to form the next loop
sprintf(label, "__FR%x_NXT", (unsigned int)script->syntax.curly[pos].index);
l=script->add_str(label);
- script->set_label(l,script->pos,p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
// Process the next time you enter the loop
// A ')' last for; flag to be treated as'
@@ -1889,7 +1852,7 @@ const char* parse_syntax(const char* p)
// Loop start labeling
sprintf(label, "__FR%x_BGN", (unsigned int)script->syntax.curly[pos].index);
l=script->add_str(label);
- script->set_label(l,script->pos,p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
return p;
} else if( p2 - p == 8 && strncmp(p, "function", 8) == 0 ) {
// internal script function
@@ -1939,9 +1902,9 @@ const char* parse_syntax(const char* p)
if( script->str_data[l].type == C_NOP || script->str_data[l].type == C_USERFUNC )// register only, if the name was not used by something else
{
script->str_data[l].type = C_USERFUNC;
- script->set_label(l, script->pos, p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
if( script->parse_options&SCRIPT_USE_LABEL_DB )
- script->label_add(l,script->pos);
+ script->label_add(l, VECTOR_LENGTH(script->buf));
}
else
disp_error_message("parse_syntax:function: function name is invalid", func_name);
@@ -2021,7 +1984,7 @@ const char* parse_syntax(const char* p)
// Form the start of label decision
sprintf(label, "__WL%x_NXT", (unsigned int)script->syntax.curly[script->syntax.curly_count].index);
l=script->add_str(label);
- script->set_label(l,script->pos,p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
// Skip to the end point if the condition is false
sprintf(label, "__WL%x_FIN", (unsigned int)script->syntax.curly[script->syntax.curly_count].index);
@@ -2078,7 +2041,7 @@ const char* parse_syntax_close_sub(const char* p,int* flag)
// Put the label of the location
sprintf(label, "__IF%x_%x", (unsigned int)script->syntax.curly[pos].index, (unsigned int)script->syntax.curly[pos].count);
l=script->add_str(label);
- script->set_label(l,script->pos,p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
script->syntax.curly[pos].count++;
p = script->skip_space(p);
@@ -2116,7 +2079,7 @@ const char* parse_syntax_close_sub(const char* p,int* flag)
// Put the label of the final location
sprintf(label, "__IF%x_FIN", (unsigned int)script->syntax.curly[pos].index);
l=script->add_str(label);
- script->set_label(l,script->pos,p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
if(script->syntax.curly[pos].flag == 1) {
// Because the position of the pointer is the same if not else for this
return bp;
@@ -2129,7 +2092,7 @@ const char* parse_syntax_close_sub(const char* p,int* flag)
// (Come here continue) to form the label here
sprintf(label, "__DO%x_NXT", (unsigned int)script->syntax.curly[pos].index);
l=script->add_str(label);
- script->set_label(l,script->pos,p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
}
// Skip to the end point if the condition is false
@@ -2164,7 +2127,7 @@ const char* parse_syntax_close_sub(const char* p,int* flag)
// Form label of the end point conditions
sprintf(label, "__DO%x_FIN", (unsigned int)script->syntax.curly[pos].index);
l=script->add_str(label);
- script->set_label(l,script->pos,p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
p = script->skip_space(p);
if(*p != ';') {
disp_error_message("parse_syntax: need ';'",p);
@@ -2186,7 +2149,7 @@ const char* parse_syntax_close_sub(const char* p,int* flag)
// End for labeling
sprintf(label, "__FR%x_FIN", (unsigned int)script->syntax.curly[pos].index);
l=script->add_str(label);
- script->set_label(l,script->pos,p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
script->syntax.curly_count--;
return p;
} else if(script->syntax.curly[pos].type == TYPE_WHILE) {
@@ -2202,7 +2165,7 @@ const char* parse_syntax_close_sub(const char* p,int* flag)
// End while labeling
sprintf(label, "__WL%x_FIN", (unsigned int)script->syntax.curly[pos].index);
l=script->add_str(label);
- script->set_label(l,script->pos,p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
script->syntax.curly_count--;
return p;
} else if(script->syntax.curly[pos].type == TYPE_USERFUNC) {
@@ -2215,7 +2178,7 @@ const char* parse_syntax_close_sub(const char* p,int* flag)
// Put the label of the location
sprintf(label, "__FN%x_FIN", (unsigned int)script->syntax.curly[pos].index);
l=script->add_str(label);
- script->set_label(l,script->pos,p);
+ script->set_label(l, VECTOR_LENGTH(script->buf), p);
script->syntax.curly_count--;
return p;
} else {
@@ -2544,9 +2507,6 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o
script->parse_cleanup_timer_id = timer->add(timer->gettick() + 10, script->parse_cleanup_timer, 0, 0);
}
- if( script->syntax.strings ) /* used only when generating translation file */
- db_destroy(script->syntax.strings);
-
memset(&script->syntax,0,sizeof(script->syntax));
script->syntax.last_func = -1;/* as valid values are >= 0 */
if( script->parser_current_npc_name ) {
@@ -2556,11 +2516,7 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o
script->syntax.translation_db = strdb_get(script->translation_db, script->parser_current_npc_name);
}
- if( !script->buf ) {
- script->buf = (unsigned char *)aMalloc(SCRIPT_BLOCK_SIZE*sizeof(unsigned char));
- script->size = SCRIPT_BLOCK_SIZE;
- }
- script->pos=0;
+ VECTOR_TRUNCATE(script->buf);
script->parse_nextline(true, NULL);
// who called parse_script is responsible for clearing the database after using it, but just in case... lets clear it here
@@ -2574,7 +2530,7 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o
if( script->error_report )
script->error(src,file,line,script->error_msg,script->error_pos);
aFree( script->error_msg );
- script->pos = 0;
+ VECTOR_TRUNCATE(script->buf);
for(i=LABEL_START;i<script->str_num;i++)
if(script->str_data[i].type == C_NOP) script->str_data[i].type = C_NAME;
for(i=0; i<size; i++)
@@ -2594,9 +2550,9 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o
p=script->skip_space(p);
if( options&SCRIPT_IGNORE_EXTERNAL_BRACKETS )
{// does not require brackets around the script
- if( *p == '\0' && !(options&SCRIPT_RETURN_EMPTY_SCRIPT) )
- {// empty script and can return NULL
- script->pos = 0;
+ if (*p == '\0' && !(options&SCRIPT_RETURN_EMPTY_SCRIPT)) {
+ // empty script and can return NULL
+ VECTOR_TRUNCATE(script->buf);
#ifdef ENABLE_CASE_CHECK
script->local_casecheck.clear();
script->parser_current_src = NULL;
@@ -2614,9 +2570,9 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o
if (retval) *retval = EXIT_FAILURE;
}
p = script->skip_space(p+1);
- if( *p == '}' && !(options&SCRIPT_RETURN_EMPTY_SCRIPT) )
- {// empty script and can return NULL
- script->pos = 0;
+ if (*p == '}' && !(options&SCRIPT_RETURN_EMPTY_SCRIPT)) {
+ // empty script and can return NULL
+ VECTOR_TRUNCATE(script->buf);
#ifdef ENABLE_CASE_CHECK
script->local_casecheck.clear();
script->parser_current_src = NULL;
@@ -2648,9 +2604,9 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o
tmpp=script->skip_space(script->skip_word(p));
if(*tmpp==':' && !(strncmp(p,"default:",8) == 0 && p + 7 == tmpp)) {
i=script->add_word(p);
- script->set_label(i,script->pos,p);
+ script->set_label(i, VECTOR_LENGTH(script->buf), p);
if( script->parse_options&SCRIPT_USE_LABEL_DB )
- script->label_add(i,script->pos);
+ script->label_add(i, VECTOR_LENGTH(script->buf));
p=tmpp+1;
p=script->skip_space(p);
continue;
@@ -2672,8 +2628,8 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o
script->str_data[i].type=C_NAME;
script->str_data[i].label=i;
for (j = script->str_data[i].backpatch; j >= 0 && j != 0x00ffffff; ) {
- int next = GETVALUE(script->buf,j);
- SETVALUE(script->buf,j,i);
+ int next = GETVALUE(&script->buf, j);
+ SETVALUE(&script->buf, j, i);
j = next;
}
} else if(script->str_data[i].type == C_USERFUNC) {
@@ -2690,37 +2646,39 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o
}
#ifdef SCRIPT_DEBUG_DISP
- for(i=0;i<script->pos;i++) {
- if((i&15)==0) ShowMessage("%04x : ",i);
- ShowMessage("%02x ",script->buf[i]);
- if((i&15)==15) ShowMessage("\n");
+ for (i = 0; i < VECTOR_LENGTH(script->buf); i++) {
+ if ((i&15) == 0)
+ ShowMessage("%04x : ",i);
+ ShowMessage("%02x ", VECTOR_INDEX(script->buf, i));
+ if ((i&15) == 15)
+ ShowMessage("\n");
}
ShowMessage("\n");
#endif
#ifdef SCRIPT_DEBUG_DISASM
i = 0;
- while (i < script->pos) {
- c_op op = script->get_com(script->buf, &i);
+ while (i < VECTOR_LENGTH(script->buf)) {
+ c_op op = script->get_com(&script->buf, &i);
int j = i; // Note: i is modified in the line above.
ShowMessage("%06x %s", i, script->op2name(op));
switch (op) {
case C_INT:
- ShowMessage(" %d", script->get_num(script->buf,&i));
+ ShowMessage(" %d", script->get_num(&script->buf, &i));
break;
case C_POS:
- ShowMessage(" 0x%06x", *(int*)(script->buf+i)&0xffffff);
+ ShowMessage(" 0x%06x", *(int*)(&VECTOR_INDEX(script->buf, i))&0xffffff);
i += 3;
break;
case C_NAME:
- j = (*(int*)(script->buf+i)&0xffffff);
+ j = (*(int*)(&VECTOR_INDEX(script->buf, i))&0xffffff);
ShowMessage(" %s", ( j == 0xffffff ) ? "?? unknown ??" : script->get_str(j));
i += 3;
break;
case C_STR:
- j = (int)strlen((char*)script->buf + i);
- ShowMessage(" %s", script->buf + i);
+ j = (int)strlen((char*)&VECTOR_INDEX(script->buf, i));
+ ShowMessage(" %s", &VECTOR_INDEX(script->buf, i));
i += j+1;
break;
}
@@ -2729,9 +2687,9 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o
#endif
CREATE(code,struct script_code,1);
- code->script_buf = (unsigned char *)aMalloc(script->pos*sizeof(unsigned char));
- memcpy(code->script_buf, script->buf, script->pos);
- code->script_size = script->pos;
+ VECTOR_INIT(code->script_buf);
+ VECTOR_ENSURE(code->script_buf, VECTOR_LENGTH(script->buf), 1);
+ VECTOR_PUSHARRAY(code->script_buf, VECTOR_DATA(script->buf), VECTOR_LENGTH(script->buf));
code->local.vars = NULL;
code->local.arrays = NULL;
#ifdef ENABLE_CASE_CHECK
@@ -3624,7 +3582,7 @@ void script_free_code(struct script_code* code)
script->free_vars(code->local.vars);
if (code->local.arrays)
code->local.arrays->destroy(code->local.arrays,script->array_free_db);
- aFree(code->script_buf);
+ VECTOR_CLEAR(code->script_buf);
aFree(code);
}
@@ -3749,32 +3707,32 @@ void script_add_pending_ref(struct script_state *st, struct reg_db *ref) {
/*==========================================
* Read command
*------------------------------------------*/
-c_op get_com(unsigned char *scriptbuf,int *pos)
+c_op get_com(const struct script_buf *scriptbuf, int *pos)
{
int i = 0, j = 0;
- if(scriptbuf[*pos]>=0x80) {
+ if (VECTOR_INDEX(*scriptbuf, *pos) >= 0x80) {
return C_INT;
}
- while(scriptbuf[*pos]>=0x40) {
- i=scriptbuf[(*pos)++]<<j;
+ while (VECTOR_INDEX(*scriptbuf, *pos) >= 0x40) {
+ i = VECTOR_INDEX(*scriptbuf, (*pos)++) << j;
j+=6;
}
- return (c_op)(i+(scriptbuf[(*pos)++]<<j));
+ return (c_op)(i+(VECTOR_INDEX(*scriptbuf, (*pos)++)<<j));
}
/*==========================================
* Income figures
*------------------------------------------*/
-int get_num(unsigned char *scriptbuf,int *pos)
+int get_num(const struct script_buf *scriptbuf, int *pos)
{
int i,j;
i=0; j=0;
- while(scriptbuf[*pos]>=0xc0) {
- i+=(scriptbuf[(*pos)++]&0x7f)<<j;
+ while (VECTOR_INDEX(*scriptbuf, *pos) >= 0xc0) {
+ i+= (VECTOR_INDEX(*scriptbuf, (*pos)++)&0x7f)<<j;
j+=6;
}
- return i+((scriptbuf[(*pos)++]&0x7f)<<j);
+ return i+((VECTOR_INDEX(*scriptbuf, (*pos)++)&0x7f)<<j);
}
/// Ternary operators
@@ -4394,7 +4352,7 @@ void run_script_main(struct script_state *st) {
st->state = RUN;
while( st->state == RUN ) {
- enum c_op c = script->get_com(st->script->script_buf,&st->pos);
+ enum c_op c = script->get_com(&st->script->script_buf, &st->pos);
switch(c) {
case C_EOL:
if( stack->defsp > stack->sp )
@@ -4403,27 +4361,29 @@ void run_script_main(struct script_state *st) {
script->pop_stack(st, stack->defsp, stack->sp);// pop unused stack data. (unused return value)
break;
case C_INT:
- script->push_val(stack,C_INT,script->get_num(st->script->script_buf,&st->pos),NULL);
+ script->push_val(stack,C_INT,script->get_num(&st->script->script_buf, &st->pos), NULL);
break;
case C_POS:
case C_NAME:
- script->push_val(stack,c,GETVALUE(st->script->script_buf,st->pos),NULL);
+ script->push_val(stack,c,GETVALUE(&st->script->script_buf, st->pos), NULL);
st->pos+=3;
break;
case C_ARG:
script->push_val(stack,c,0,NULL);
break;
case C_STR:
- script->push_conststr(stack, (const char *)(st->script->script_buf+st->pos));
- while(st->script->script_buf[st->pos++]);
+ script->push_conststr(stack, (const char *)&VECTOR_INDEX(st->script->script_buf, st->pos));
+ while (VECTOR_INDEX(st->script->script_buf, st->pos++) != 0)
+ (void)0; // Skip string
break;
case C_LSTR:
{
- int string_id = *((int *)(&st->script->script_buf[st->pos]));
- uint8 translations = *((uint8 *)(&st->script->script_buf[st->pos+sizeof(int)]));
struct map_session_data *lsd = NULL;
-
- st->pos += sizeof(int) + sizeof(uint8);
+ uint8 translations = 0;
+ int string_id = *((int *)(&VECTOR_INDEX(st->script->script_buf, st->pos)));
+ st->pos += sizeof(string_id);
+ translations = *((uint8 *)(&VECTOR_INDEX(st->script->script_buf, st->pos)));
+ st->pos += sizeof(translations);
if( (!st->rid || !(lsd = map->id2sd(st->rid)) || !lsd->lang_id) && !map->default_lang_id )
script->push_conststr(stack, script->string_list+string_id);
@@ -4432,7 +4392,7 @@ void run_script_main(struct script_state *st) {
int offset = st->pos;
for(k = 0; k < translations; k++) {
- uint8 lang_id = *(uint8 *)(&st->script->script_buf[offset]);
+ uint8 lang_id = *(uint8 *)(&VECTOR_INDEX(st->script->script_buf, offset));
offset += sizeof(uint8);
if( lang_id == wlang_id )
break;
@@ -4441,7 +4401,7 @@ void run_script_main(struct script_state *st) {
if (k == translations)
script->push_conststr(stack, script->string_list+string_id);
else
- script->push_conststr(stack, *(const char**)(&st->script->script_buf[offset]) );
+ script->push_conststr(stack, *(const char**)(&VECTOR_INDEX(st->script->script_buf, offset)));
}
st->pos += ( ( sizeof(char*) + sizeof(uint8) ) * translations );
}
@@ -4855,9 +4815,6 @@ void do_final_script(void)
script->clear_translations(false);
script->parser_clean_leftovers();
-
- if( script->lang_export_file )
- aFree(script->lang_export_file);
}
/**
@@ -4879,7 +4836,7 @@ void script_load_translations(void) {
const char *config_filename = "db/translations.conf"; // FIXME hardcoded name
struct config_setting_t *translations = NULL;
int i, size;
- uint32 total = 0;
+ int total = 0;
uint8 lang_id = 0, k;
if (map->minimal) // No translations in minimal mode
@@ -4916,24 +4873,22 @@ void script_load_translations(void) {
for(i = 0; i < size; i++) {
const char *translation_file = libconfig->setting_get_string_elem(translations, i);
- script->load_translation(translation_file, ++lang_id, &total);
+ total += script->load_translation(translation_file, ++lang_id);
}
libconfig->destroy(&translations_conf);
- if( total ) {
+ if (total != 0) {
struct DBIterator *main_iter;
struct DBMap *string_db;
struct string_translation *st = NULL;
- uint32 j = 0;
- CREATE(script->translation_buf, char *, total);
- script->translation_buf_size = total;
+ VECTOR_ENSURE(script->translation_buf, total, 1);
main_iter = db_iterator(script->translation_db);
for (string_db = dbi_first(main_iter); dbi_exists(main_iter); string_db = dbi_next(main_iter)) {
struct DBIterator *sub_iter = db_iterator(string_db);
for (st = dbi_first(sub_iter); dbi_exists(sub_iter); st = dbi_next(sub_iter)) {
- script->translation_buf[j++] = st->buf;
+ VECTOR_PUSH(script->translation_buf, st->buf);
}
dbi_destroy(sub_iter);
}
@@ -4955,47 +4910,69 @@ void script_load_translations(void) {
}
/**
+ * Generates a language name from a translation filename.
*
- **/
+ * @param file The filename.
+ * @return The corresponding translation name.
+ */
const char *script_get_translation_file_name(const char *file)
{
- int i, len = (int)strlen(file), last_bar = -1, last_dot = -1;
+ const char *basename = NULL, *last_dot = NULL;
+
+ nullpo_retr("Unknown", file);
- for(i = 0; i < len; i++) {
- if( file[i] == '/' || file[i] == '\\' )
- last_bar = i;
- else if ( file[i] == '.' )
- last_dot = i;
+ basename = strrchr(file, '/');;
+#ifdef WIN32
+ {
+ const char *basename_windows = strrchr(file, '\\');
+ if (basename_windows > basename)
+ basename = basename_windows;
}
+#endif // WIN32
+ if (basename == NULL)
+ basename = file;
+ else
+ basename++; // Skip slash
+ Assert_retr("Unknown", *basename != '\0');
- if( last_bar != -1 || last_dot != -1 ) {
+ last_dot = strrchr(basename, '.');
+ if (last_dot != NULL) {
static char file_name[200];
- if( last_bar != -1 && last_dot < last_bar )
- last_dot = -1;
- safestrncpy(file_name, file+(last_bar >= 0 ? last_bar+1 : 0), ( last_dot >= 0 ? ( last_bar >= 0 ? last_dot - last_bar : last_dot ) : sizeof(file_name) ));
+ if (last_dot == basename)
+ return basename + 1;
+
+ safestrncpy(file_name, basename, last_dot - basename + 1);
return file_name;
}
- return file;
+ return basename;
}
/**
- * Parses a individual translation file
- **/
-void script_load_translation(const char *file, uint8 lang_id, uint32 *total) {
- uint32 translations = 0;
+ * Parses an individual translation file.
+ *
+ * @param file The filename to parse.
+ * @param lang_id The language identifier.
+ * @return The amount of strings loaded.
+ */
+int script_load_translation(const char *file, uint8 lang_id)
+{
+ int translations = 0;
char line[1024];
char msgctxt[NAME_LENGTH*2+1] = { 0 };
struct DBMap *string_db;
size_t i;
FILE *fp;
- struct script_string_buf msgid = { 0 }, msgstr = { 0 };
+ struct script_string_buf msgid, msgstr;
if( !(fp = fopen(file,"rb")) ) {
ShowError("load_translation: failed to open '%s' for reading\n",file);
- return;
+ return 0;
}
+ VECTOR_INIT(msgid);
+ VECTOR_INIT(msgstr);
+
script->add_language(script->get_translation_file_name(file));
if( lang_id >= atcommand->max_message_table )
atcommand->expand_message_table();
@@ -5023,39 +5000,45 @@ void script_load_translation(const char *file, uint8 lang_id, uint32 *total) {
}
msgctxt[cursor] = '\0';
} else if ( strncasecmp(line, "msgid \"", 7) == 0 ) {
- msgid.pos = 0;
+ VECTOR_TRUNCATE(msgid);
for(i = 7; i < len - 2; i++) {
+ VECTOR_ENSURE(msgid, 1, 512);
if( line[i] == '\\' && line[i+1] == '"' ) {
- script_string_buf_addb(&msgid, '"');
+ VECTOR_PUSH(msgid, '"');
i++;
- } else
- script_string_buf_addb(&msgid, line[i]);
+ } else {
+ VECTOR_PUSH(msgid, line[i]);
+ }
}
- script_string_buf_addb(&msgid,0);
+ VECTOR_ENSURE(msgid, 1, 512);
+ VECTOR_PUSH(msgid, '\0');
} else if ( len > 9 && line[9] != '"' && strncasecmp(line, "msgstr \"",8) == 0 ) {
- msgstr.pos = 0;
+ VECTOR_TRUNCATE(msgstr);
for(i = 8; i < len - 2; i++) {
+ VECTOR_ENSURE(msgstr, 1, 512);
if( line[i] == '\\' && line[i+1] == '"' ) {
- script_string_buf_addb(&msgstr, '"');
+ VECTOR_PUSH(msgstr, '"');
i++;
- } else
- script_string_buf_addb(&msgstr, line[i]);
+ } else {
+ VECTOR_PUSH(msgstr, line[i]);
+ }
}
- script_string_buf_addb(&msgstr,0);
+ VECTOR_ENSURE(msgstr, 1, 512);
+ VECTOR_PUSH(msgstr, '\0');
}
- if( msgctxt[0] && msgid.pos > 1 && msgstr.pos > 1 ) {
- size_t msgstr_len = msgstr.pos;
+ if( msgctxt[0] && VECTOR_LENGTH(msgid) > 1 && VECTOR_LENGTH(msgstr) > 1 ) {
+ int msgstr_len = VECTOR_LENGTH(msgstr);
unsigned int inner_len = 1 + (uint32)msgstr_len + 1; //uint8 lang_id + msgstr_len + '\0'
if( strcasecmp(msgctxt, "messages.conf") == 0 ) {
int k;
for(k = 0; k < MAX_MSG; k++) {
- if( atcommand->msg_table[0][k] && strcmpi(atcommand->msg_table[0][k],msgid.ptr) == 0 ) {
+ if( atcommand->msg_table[0][k] && strcmpi(atcommand->msg_table[0][k], VECTOR_DATA(msgid)) == 0 ) {
if( atcommand->msg_table[lang_id][k] )
aFree(atcommand->msg_table[lang_id][k]);
- atcommand->msg_table[lang_id][k] = aStrdup(msgstr.ptr);
+ atcommand->msg_table[lang_id][k] = aStrdup(VECTOR_DATA(msgstr));
break;
}
}
@@ -5067,33 +5050,33 @@ void script_load_translation(const char *file, uint8 lang_id, uint32 *total) {
strdb_put(script->translation_db, msgctxt, string_db);
}
- if( !(st = strdb_get(string_db, msgid.ptr) ) ) {
+ if ((st = strdb_get(string_db, VECTOR_DATA(msgid))) == NULL) {
CREATE(st, struct string_translation, 1);
- st->string_id = script->string_dup(msgid.ptr);
- strdb_put(string_db, msgid.ptr, st);
+ st->string_id = script->string_dup(VECTOR_DATA(msgid));
+ strdb_put(string_db, VECTOR_DATA(msgid), st);
}
- RECREATE(st->buf, char, st->len + inner_len);
+ RECREATE(st->buf, uint8, st->len + inner_len);
WBUFB(st->buf, st->len) = lang_id;
- safestrncpy(WBUFP(st->buf, st->len + 1), msgstr.ptr, msgstr_len + 1);
+ safestrncpy(WBUFP(st->buf, st->len + 1), VECTOR_DATA(msgstr), msgstr_len + 1);
st->translations++;
st->len += inner_len;
}
msgctxt[0] = '\0';
- msgid.pos = msgstr.pos = 0;
+ VECTOR_TRUNCATE(msgid);
+ VECTOR_TRUNCATE(msgstr);
translations++;
}
}
- *total += translations;
-
fclose(fp);
- script_string_buf_destroy(&msgid);
- script_string_buf_destroy(&msgstr);
+ VECTOR_CLEAR(msgid);
+ VECTOR_CLEAR(msgstr);
- ShowStatus("Done reading '"CL_WHITE"%u"CL_RESET"' translations in '"CL_WHITE"%s"CL_RESET"'.\n", translations, file);
+ ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' translations in '"CL_WHITE"%s"CL_RESET"'.\n", translations, file);
+ return translations;
}
/**
@@ -5109,15 +5092,10 @@ void script_clear_translations(bool reload) {
script->string_list_pos = 0;
script->string_list_size = 0;
- if( script->translation_buf ) {
- for(i = 0; i < script->translation_buf_size; i++) {
- aFree(script->translation_buf[i]);
- }
- aFree(script->translation_buf);
+ while (VECTOR_LENGTH(script->translation_buf) > 0) {
+ aFree(VECTOR_POP(script->translation_buf));
}
-
- script->translation_buf = NULL;
- script->translation_buf_size = 0;
+ VECTOR_CLEAR(script->translation_buf);
if( script->languages ) {
for(i = 0; i < script->max_lang_id; i++)
@@ -5159,26 +5137,16 @@ int script_translation_db_destroyer(union DBKey key, struct DBData *data, va_lis
/**
*
**/
-void script_parser_clean_leftovers(void) {
- if( script->buf )
- aFree(script->buf);
-
- script->buf = NULL;
- script->size = 0;
+void script_parser_clean_leftovers(void)
+{
+ VECTOR_CLEAR(script->buf);
if( script->translation_db ) {
script->translation_db->destroy(script->translation_db,script->translation_db_destroyer);
script->translation_db = NULL;
}
- if( script->syntax.strings ) { /* used only when generating translation file */
- db_destroy(script->syntax.strings);
- script->syntax.strings = NULL;
- }
-
- script_string_buf_destroy(&script->parse_simpleexpr_str);
- script_string_buf_destroy(&script->lang_export_line_buf);
- script_string_buf_destroy(&script->lang_export_unescaped_buf);
+ VECTOR_CLEAR(script->parse_simpleexpr_strbuf);
}
/**
@@ -5197,6 +5165,7 @@ int script_parse_cleanup_timer(int tid, int64 tick, int id, intptr_t data) {
*------------------------------------------*/
void do_init_script(bool minimal) {
script->parse_cleanup_timer_id = INVALID_TIMER;
+ VECTOR_INIT(script->parse_simpleexpr_strbuf);
script->st_db = idb_alloc(DB_OPT_BASE);
script->userfunc_db = strdb_alloc(DB_OPT_DUP_KEY,0);
@@ -5283,6 +5252,232 @@ const char *script_getfuncname(struct script_state *st) {
return NULL;
}
+/**
+ * Writes a string to a StringBuf by combining a format string and a set of
+ * arguments taken from the current script state (caller script function
+ * arguments).
+ *
+ * @param[in] st Script state (must have at least a string at index
+ * 'start').
+ * @param[in] start Index of the format string argument.
+ * @param[out] out Output string buffer (managed by the caller, must be
+ * already initialized)
+ * @retval false if an error occurs.
+ */
+bool script_sprintf(struct script_state *st, int start, struct StringBuf *out)
+{
+ const char *format = NULL;
+ const char *p = NULL, *np = NULL;
+ char *buf = NULL;
+ int buf_len = 0;
+ int lastarg = start;
+ int argc = script_lastdata(st) + 1;
+
+ Assert_retr(-1, start >= 2 && start <= argc);
+ Assert_retr(-1, script_hasdata(st, start));
+
+ p = format = script_getstr(st, start);
+
+ /*
+ * format-string = "" / *(text / placeholder)
+ * placeholder = "%%" / "%n" / std-placeholder
+ * std-placeholder = "%" [pos-parameter] [flags] [width] [precision] [length] type
+ * pos-parameter = number "$"
+ * flags = *("-" / "+" / "0" / SP)
+ * width = number / ("*" [pos-parameter])
+ * precision = "." (number / ("*" [pos-parameter]))
+ * length = "hh" / "h" / "l" / "ll" / "L" / "z" / "j" / "t"
+ * type = "d" / "i" / "u" / "f" / "F" / "e" / "E" / "g" / "G" / "x" / "X" / "o" / "s" / "c" / "p" / "a" / "A"
+ * number = digit-nonzero *DIGIT
+ * digit-nonzero = "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"
+ */
+
+ while ((np = strchr(p, '%')) != NULL) {
+ bool flag_plus = false, flag_minus = false, flag_zero = false, flag_space = false;
+ bool positional_arg = false;
+ int width = 0, nextarg = lastarg + 1, thisarg = nextarg;
+
+ if (p != np) {
+ int len = (int)(np - p + 1);
+ if (buf_len < len) {
+ RECREATE(buf, char, len);
+ buf_len = len;
+ }
+ safestrncpy(buf, p, len);
+ StrBuf->AppendStr(out, buf);
+ }
+
+ p = np;
+ np++;
+
+ // placeholder = "%%" ; (special case)
+ if (*np == '%') {
+ StrBuf->AppendStr(out, "%");
+ p = np + 1;
+ continue;
+ }
+ // placeholder = "%n" ; (ignored)
+ if (*np == 'n') {
+ ShowWarning("script_sprintf: Format %%n not supported! Skipping...\n");
+ script->reportsrc(st);
+ lastarg = nextarg;
+ p = np + 1;
+ continue;
+ }
+
+ // std-placeholder = "%" [pos-parameter] [flags] [width] [precision] [length] type
+
+ // pos-parameter = number "$"
+ if (ISDIGIT(*np) && *np != '0') {
+ const char *pp = np;
+ while (ISDIGIT(*pp))
+ pp++;
+ if (*pp == '$') {
+ thisarg = atoi(np) + start;
+ positional_arg = true;
+ np = pp + 1;
+ }
+ }
+
+ if (thisarg >= argc) {
+ ShowError("buildin_sprintf: Not enough arguments passed!\n");
+ if (buf != NULL)
+ aFree(buf);
+ return false;
+ }
+
+ // flags = *("-" / "+" / "0" / SP)
+ while (true) {
+ if (*np == '-') {
+ flag_minus = true;
+ } else if (*np == '+') {
+ flag_plus = true;
+ } else if (*np == ' ') {
+ flag_space = true;
+ } else if (*np == '0') {
+ flag_zero = true;
+ } else {
+ break;
+ }
+ np++;
+ }
+
+ // width = number / ("*" [pos-parameter])
+ if (ISDIGIT(*np)) {
+ width = atoi(np);
+ while (ISDIGIT(*np))
+ np++;
+ } else if (*np == '*') {
+ bool positional_widtharg = false;
+ int width_arg;
+ np++;
+ // pos-parameter = number "$"
+ if (ISDIGIT(*np) && *np != '0') {
+ const char *pp = np;
+ while (ISDIGIT(*pp))
+ pp++;
+ if (*pp == '$') {
+ width_arg = atoi(np) + start;
+ positional_widtharg = true;
+ np = pp + 1;
+ }
+ }
+ if (!positional_widtharg) {
+ width_arg = nextarg;
+ nextarg++;
+ if (!positional_arg)
+ thisarg++;
+ }
+
+ if (width_arg >= argc || thisarg >= argc) {
+ ShowError("buildin_sprintf: Not enough arguments passed!\n");
+ if (buf != NULL)
+ aFree(buf);
+ return false;
+ }
+ width = script_getnum(st, width_arg);
+ }
+
+ // precision = "." (number / ("*" [pos-parameter])) ; (not needed/implemented)
+
+ // length = "hh" / "h" / "l" / "ll" / "L" / "z" / "j" / "t" ; (not needed/implemented)
+
+ // type = "d" / "i" / "u" / "f" / "F" / "e" / "E" / "g" / "G" / "x" / "X" / "o" / "s" / "c" / "p" / "a" / "A"
+ if (buf_len < 16) {
+ RECREATE(buf, char, 16);
+ buf_len = 16;
+ }
+ {
+ int i = 0;
+ memset(buf, '\0', buf_len);
+ buf[i++] = '%';
+ if (flag_minus)
+ buf[i++] = '-';
+ if (flag_plus)
+ buf[i++] = '+';
+ else if (flag_space) // ignored if '+' is specified
+ buf[i++] = ' ';
+ if (flag_zero)
+ buf[i++] = '0';
+ if (width > 0)
+ safesnprintf(buf + i, buf_len - i - 1, "%d", width);
+ }
+ buf[(int)strlen(buf)] = *np;
+ switch (*np) {
+ case 'd':
+ case 'i':
+ case 'u':
+ case 'x':
+ case 'X':
+ case 'o':
+ // Piggyback printf
+ StrBuf->Printf(out, buf, script_getnum(st, thisarg));
+ break;
+ case 's':
+ // Piggyback printf
+ StrBuf->Printf(out, buf, script_getstr(st, thisarg));
+ break;
+ case 'c':
+ {
+ const char *str = script_getstr(st, thisarg);
+ // Piggyback printf
+ StrBuf->Printf(out, buf, str[0]);
+ }
+ break;
+ case 'f':
+ case 'F':
+ case 'e':
+ case 'E':
+ case 'g':
+ case 'G':
+ case 'p':
+ case 'a':
+ case 'A':
+ ShowWarning("buildin_sprintf: Format %%%c not supported! Skipping...\n", *np);
+ script->reportsrc(st);
+ lastarg = nextarg;
+ p = np + 1;
+ continue;
+ default:
+ ShowError("buildin_sprintf: Invalid format string.\n");
+ if (buf != NULL)
+ aFree(buf);
+ return false;
+ }
+ lastarg = nextarg;
+ p = np + 1;
+ }
+
+ // Append the remaining part
+ if (p != NULL)
+ StrBuf->AppendStr(out, p);
+
+ if (buf != NULL)
+ aFree(buf);
+
+ return true;
+}
+
//-----------------------------------------------------------------------------
// buildin functions
//
@@ -5298,20 +5493,42 @@ const char *script_getfuncname(struct script_state *st) {
BUILDIN(mes)
{
struct map_session_data *sd = script->rid2sd(st);
- if( sd == NULL )
+ if (sd == NULL)
return true;
- if( !script_hasdata(st, 3) ) {// only a single line detected in the script
- clif->scriptmes(sd, st->oid, script_getstr(st, 2));
- } else {// parse multiple lines as they exist
- int i;
+ clif->scriptmes(sd, st->oid, script_getstr(st, 2));
- for( i = 2; script_hasdata(st, i); i++ ) {
- // send the message to the client
- clif->scriptmes(sd, st->oid, script_getstr(st, i));
- }
+ return true;
+}
+
+/**
+ * Appends a message to the npc dialog, applying format string conversions (see
+ * sprintf).
+ *
+ * If a dialog doesn't exist yet, one is created.
+ *
+ * @code
+ * mes "<message>";
+ * @endcode
+ */
+BUILDIN(mesf)
+{
+ struct map_session_data *sd = script->rid2sd(st);
+ struct StringBuf buf;
+
+ if (sd == NULL)
+ return true;
+
+ StrBuf->Init(&buf);
+
+ if (!script_sprintf(st, 2, &buf)) {
+ StrBuf->Destroy(&buf);
+ return false;
}
+ clif->scriptmes(sd, st->oid, StrBuf->Value(&buf));
+ StrBuf->Destroy(&buf);
+
return true;
}
@@ -15242,130 +15459,19 @@ BUILDIN(implode)
// Implements C sprintf, except format %n. The resulting string is
// returned, instead of being saved in variable by reference.
//-------------------------------------------------------
-BUILDIN(sprintf) {
- unsigned int argc = 0, arg = 0;
- const char* format;
- char* p;
- char* q;
- char* buf = NULL;
- char* buf2 = NULL;
- struct script_data* data;
- size_t len, buf2_len = 0;
- StringBuf final_buf;
-
- // Fetch init data
- format = script_getstr(st, 2);
- argc = script_lastdata(st)-2;
- len = strlen(format);
-
- // Skip parsing, where no parsing is required.
- if(len==0) {
- script_pushconststr(st,"");
- return true;
- }
-
- // Pessimistic alloc
- CREATE(buf, char, len+1);
-
- // Need not be parsed, just solve stuff like %%.
- if(argc==0) {
- memcpy(buf,format,len+1);
- script_pushstrcopy(st, buf);
- aFree(buf);
- return true;
- }
-
- safestrncpy(buf, format, len+1);
-
- // Issue sprintf for each parameter
- StrBuf->Init(&final_buf);
- q = buf;
- while((p = strchr(q, '%'))!=NULL) {
- if(p!=q) {
- len = p-q+1;
- if(buf2_len<len) {
- RECREATE(buf2, char, len);
- buf2_len = len;
- }
- safestrncpy(buf2, q, len);
- StrBuf->AppendStr(&final_buf, buf2);
- q = p;
- }
- p = q+1;
- if(*p=='%') { // %%
- StrBuf->AppendStr(&final_buf, "%");
- q+=2;
- continue;
- }
- if(*p=='n') { // %n
- ShowWarning("buildin_sprintf: Format %%n not supported! Skipping...\n");
- script->reportsrc(st);
- q+=2;
- continue;
- }
- if(arg>=argc) {
- ShowError("buildin_sprintf: Not enough arguments passed!\n");
- aFree(buf);
- if(buf2) aFree(buf2);
- StrBuf->Destroy(&final_buf);
- script_pushconststr(st,"");
- return false;
- }
- if((p = strchr(q+1, '%'))==NULL) {
- p = strchr(q, 0); // EOS
- }
- len = p-q+1;
- if(buf2_len<len) {
- RECREATE(buf2, char, len);
- buf2_len = len;
- }
- safestrncpy(buf2, q, len);
- q = p;
-
- // Note: This assumes the passed value being the correct
- // type to the current format specifier. If not, the server
- // probably crashes or returns anything else, than expected,
- // but it would behave in normal code the same way so it's
- // the scripter's responsibility.
- data = script_getdata(st, arg+3);
- if(data_isstring(data)) { // String
- StrBuf->Printf(&final_buf, buf2, script_getstr(st, arg+3));
- } else if(data_isint(data)) { // Number
- StrBuf->Printf(&final_buf, buf2, script_getnum(st, arg+3));
- } else if(data_isreference(data)) { // Variable
- char* name = reference_getname(data);
- if(name[strlen(name)-1]=='$') { // var Str
- StrBuf->Printf(&final_buf, buf2, script_getstr(st, arg+3));
- } else { // var Int
- StrBuf->Printf(&final_buf, buf2, script_getnum(st, arg+3));
- }
- } else { // Unsupported type
- ShowError("buildin_sprintf: Unknown argument type!\n");
- aFree(buf);
- if(buf2) aFree(buf2);
- StrBuf->Destroy(&final_buf);
- script_pushconststr(st,"");
- return false;
- }
- arg++;
- }
-
- // Append anything left
- if(*q) {
- StrBuf->AppendStr(&final_buf, q);
- }
+BUILDIN(sprintf)
+{
+ struct StringBuf buf;
+ StrBuf->Init(&buf);
- // Passed more, than needed
- if(arg<argc) {
- ShowWarning("buildin_sprintf: Unused arguments passed.\n");
- script->reportsrc(st);
+ if (!script_sprintf(st, 2, &buf)) {
+ StrBuf->Destroy(&buf);
+ script_pushconststr(st, "");
+ return false;
}
- script_pushstrcopy(st, StrBuf->Value(&final_buf));
-
- aFree(buf);
- if(buf2) aFree(buf2);
- StrBuf->Destroy(&final_buf);
+ script_pushstrcopy(st, StrBuf->Value(&buf));
+ StrBuf->Destroy(&buf);
return true;
}
@@ -20214,8 +20320,10 @@ bool script_add_builtin(const struct script_function *buildin, bool override) {
else if( strcmp(buildin->name, "callfunc") == 0 ) script->buildin_callfunc_ref = n;
else if( strcmp(buildin->name, "getelementofarray") == 0 ) script->buildin_getelementofarray_ref = n;
else if( strcmp(buildin->name, "mes") == 0 ) script->buildin_mes_offset = script->buildin_count;
+ else if( strcmp(buildin->name, "mesf") == 0 ) script->buildin_mesf_offset = script->buildin_count;
else if( strcmp(buildin->name, "select") == 0 ) script->buildin_select_offset = script->buildin_count;
else if( strcmp(buildin->name, "_") == 0 ) script->buildin_lang_macro_offset = script->buildin_count;
+ else if( strcmp(buildin->name, "_$") == 0 ) script->buildin_lang_macro_fmtstring_offset = script->buildin_count;
offset = script->buildin_count;
@@ -20309,7 +20417,8 @@ void script_parse_builtin(void) {
BUILDIN_DEF(__setr,"rv?"),
// NPC interaction
- BUILDIN_DEF(mes,"s*"),
+ BUILDIN_DEF(mes,"s"),
+ BUILDIN_DEF(mesf,"s*"),
BUILDIN_DEF(next,""),
BUILDIN_DEF(close,""),
BUILDIN_DEF(close2,""),
@@ -20821,6 +20930,7 @@ void script_parse_builtin(void) {
BUILDIN_DEF(showscript, "s?"),
BUILDIN_DEF(mergeitem,""),
BUILDIN_DEF(_,"s"),
+ BUILDIN_DEF2(_, "_$", "s"),
};
int i, len = ARRAYLENGTH(BUILDIN);
RECREATE(script->buildin, char *, script->buildin_count + len); // Pre-alloc to speed up
@@ -21054,8 +21164,8 @@ void script_defaults(void) {
script->label_count = 0;
script->labels_size = 0;
- script->buf = NULL;
- script->pos = 0, script->size = 0;
+ VECTOR_INIT(script->buf);
+ VECTOR_INIT(script->translation_buf);
script->parse_options = 0;
script->buildin_set_ref = 0;
@@ -21181,6 +21291,11 @@ void script_defaults(void) {
script->parse_nextline = parse_nextline;
script->parse_variable = parse_variable;
script->parse_simpleexpr = parse_simpleexpr;
+ script->parse_simpleexpr_paren = parse_simpleexpr_paren;
+ script->parse_simpleexpr_number = parse_simpleexpr_number;
+ script->parse_simpleexpr_string = parse_simpleexpr_string;
+ script->parse_simpleexpr_name = parse_simpleexpr_name;
+ script->add_translatable_string = script_add_translatable_string;
script->parse_expr = parse_expr;
script->parse_line = parse_line;
script->read_constdb = read_constdb;
diff --git a/src/map/script.h b/src/map/script.h
index a1fbe31f0..61c6a4583 100644
--- a/src/map/script.h
+++ b/src/map/script.h
@@ -394,11 +394,20 @@ struct script_data {
struct reg_db *ref; ///< Reference to the scope's variables
};
+/**
+ * A script string buffer, used to hold strings used by the script engine.
+ */
+VECTOR_STRUCT_DECL(script_string_buf, char);
+
+/**
+ * Script buffer, used to hold parsed script data.
+ */
+VECTOR_STRUCT_DECL(script_buf, unsigned char);
+
// Moved defsp from script_state to script_stack since
// it must be saved when script state is RERUNLINE. [Eoe / jA 1094]
struct script_code {
- int script_size;
- unsigned char *script_buf;
+ struct script_buf script_buf;
struct reg_db local; ///< Local (npc) vars
unsigned short instances;
};
@@ -493,8 +502,8 @@ struct script_syntax_data {
int index; // Number of the syntax used in the script
int last_func; // buildin index of the last parsed function
unsigned int nested_call; //Dont really know what to call this
- bool lang_macro_active;
- struct DBMap *strings; // string map parsed (used when exporting strings only)
+ bool lang_macro_active; // Used to generate translation strings
+ bool lang_macro_fmtstring_active; // Used to generate translation strings
struct DBMap *translation_db; //non-null if this npc has any translated strings to be linked
};
@@ -517,16 +526,16 @@ struct script_array {
unsigned int *members;/* member list */
};
-struct script_string_buf {
- char *ptr;
- size_t pos,size;
+struct string_translation_entry {
+ uint8 lang_id;
+ char string[];
};
struct string_translation {
int string_id;
uint8 translations;
- unsigned int len;
- char *buf;
+ int len;
+ uint8 *buf; // Array of struct string_translation_entry
};
/**
@@ -576,8 +585,7 @@ struct script_interface {
/* */
/// temporary buffer for passing around compiled bytecode
/// @see add_scriptb, set_label, parse_script
- unsigned char* buf;
- int pos, size;
+ struct script_buf buf;
/* */
struct script_syntax_data syntax;
/* */
@@ -611,26 +619,22 @@ struct script_interface {
/* */
unsigned int *generic_ui_array;
unsigned int generic_ui_array_size;
- /* Set during startup when attempting to export the lang, unset after server initialization is over */
- FILE *lang_export_fp;
- char *lang_export_file;/* for lang_export_fp */
/* set and unset on npc_parse_script */
const char *parser_current_npc_name;
/* */
int buildin_mes_offset;
+ int buildin_mesf_offset;
int buildin_select_offset;
int buildin_lang_macro_offset;
+ int buildin_lang_macro_fmtstring_offset;
/* */
struct DBMap *translation_db;/* npc_name => DBMap (strings) */
- char **translation_buf;/* */
- uint32 translation_buf_size;
+ VECTOR_DECL(uint8 *) translation_buf;
/* */
char **languages;
uint8 max_lang_id;
/* */
- struct script_string_buf parse_simpleexpr_str;
- struct script_string_buf lang_export_line_buf;
- struct script_string_buf lang_export_unescaped_buf;
+ struct script_string_buf parse_simpleexpr_strbuf;
/* */
int parse_cleanup_timer_id;
/* */
@@ -706,8 +710,8 @@ struct script_interface {
const char * (*parse_syntax_close) (const char *p);
const char * (*parse_syntax_close_sub) (const char *p, int *flag);
const char * (*parse_syntax) (const char *p);
- c_op (*get_com) (unsigned char *scriptbuf, int *pos);
- int (*get_num) (unsigned char *scriptbuf, int *pos);
+ c_op (*get_com) (const struct script_buf *scriptbuf, int *pos);
+ int (*get_num) (const struct script_buf *scriptbuf, int *pos);
const char* (*op2name) (int op);
void (*reportsrc) (struct script_state *st);
void (*reportdata) (struct script_data *data);
@@ -724,10 +728,15 @@ struct script_interface {
int (*add_word) (const char *p);
const char* (*parse_callfunc) (const char *p, int require_paren, int is_custom);
void (*parse_nextline) (bool first, const char *p);
- const char* (*parse_variable) (const char *p);
- const char* (*parse_simpleexpr) (const char *p);
- const char* (*parse_expr) (const char *p);
- const char* (*parse_line) (const char *p);
+ const char *(*parse_variable) (const char *p);
+ const char *(*parse_simpleexpr) (const char *p);
+ const char *(*parse_simpleexpr_paren) (const char *p);
+ const char *(*parse_simpleexpr_number) (const char *p);
+ const char *(*parse_simpleexpr_string) (const char *p);
+ const char *(*parse_simpleexpr_name) (const char *p);
+ void (*add_translatable_string) (const struct script_string_buf *string, const char *start_point);
+ const char *(*parse_expr) (const char *p);
+ const char *(*parse_line) (const char *p);
void (*read_constdb) (void);
void (*constdb_comment) (const char *comment);
void (*load_parameters) (void);
@@ -807,7 +816,7 @@ struct script_interface {
unsigned short (*mapindexname2id) (struct script_state *st, const char* name);
int (*string_dup) (char *str);
void (*load_translations) (void);
- void (*load_translation) (const char *file, uint8 lang_id, uint32 *total);
+ int (*load_translation) (const char *file, uint8 lang_id);
int (*translation_db_destroyer) (union DBKey key, struct DBData *data, va_list ap);
void (*clear_translations) (bool reload);
int (*parse_cleanup_timer) (int tid, int64 tick, int id, intptr_t data);
diff --git a/src/plugins/HPMHooking/HPMHooking.Defs.inc b/src/plugins/HPMHooking/HPMHooking.Defs.inc
index 65bc2bd82..8a6f34e2e 100644
--- a/src/plugins/HPMHooking/HPMHooking.Defs.inc
+++ b/src/plugins/HPMHooking/HPMHooking.Defs.inc
@@ -5796,10 +5796,10 @@ typedef const char* (*HPMHOOK_pre_script_parse_syntax_close_sub) (const char **p
typedef const char* (*HPMHOOK_post_script_parse_syntax_close_sub) (const char* retVal___, const char *p, int *flag);
typedef const char* (*HPMHOOK_pre_script_parse_syntax) (const char **p);
typedef const char* (*HPMHOOK_post_script_parse_syntax) (const char* retVal___, const char *p);
-typedef c_op (*HPMHOOK_pre_script_get_com) (unsigned char **scriptbuf, int **pos);
-typedef c_op (*HPMHOOK_post_script_get_com) (c_op retVal___, unsigned char *scriptbuf, int *pos);
-typedef int (*HPMHOOK_pre_script_get_num) (unsigned char **scriptbuf, int **pos);
-typedef int (*HPMHOOK_post_script_get_num) (int retVal___, unsigned char *scriptbuf, int *pos);
+typedef c_op (*HPMHOOK_pre_script_get_com) (const struct script_buf **scriptbuf, int **pos);
+typedef c_op (*HPMHOOK_post_script_get_com) (c_op retVal___, const struct script_buf *scriptbuf, int *pos);
+typedef int (*HPMHOOK_pre_script_get_num) (const struct script_buf **scriptbuf, int **pos);
+typedef int (*HPMHOOK_post_script_get_num) (int retVal___, const struct script_buf *scriptbuf, int *pos);
typedef const char* (*HPMHOOK_pre_script_op2name) (int *op);
typedef const char* (*HPMHOOK_post_script_op2name) (const char* retVal___, int op);
typedef void (*HPMHOOK_pre_script_reportsrc) (struct script_state **st);
@@ -5836,6 +5836,16 @@ typedef const char* (*HPMHOOK_pre_script_parse_variable) (const char **p);
typedef const char* (*HPMHOOK_post_script_parse_variable) (const char* retVal___, const char *p);
typedef const char* (*HPMHOOK_pre_script_parse_simpleexpr) (const char **p);
typedef const char* (*HPMHOOK_post_script_parse_simpleexpr) (const char* retVal___, const char *p);
+typedef const char* (*HPMHOOK_pre_script_parse_simpleexpr_paren) (const char **p);
+typedef const char* (*HPMHOOK_post_script_parse_simpleexpr_paren) (const char* retVal___, const char *p);
+typedef const char* (*HPMHOOK_pre_script_parse_simpleexpr_number) (const char **p);
+typedef const char* (*HPMHOOK_post_script_parse_simpleexpr_number) (const char* retVal___, const char *p);
+typedef const char* (*HPMHOOK_pre_script_parse_simpleexpr_string) (const char **p);
+typedef const char* (*HPMHOOK_post_script_parse_simpleexpr_string) (const char* retVal___, const char *p);
+typedef const char* (*HPMHOOK_pre_script_parse_simpleexpr_name) (const char **p);
+typedef const char* (*HPMHOOK_post_script_parse_simpleexpr_name) (const char* retVal___, const char *p);
+typedef void (*HPMHOOK_pre_script_add_translatable_string) (const struct script_string_buf **string, const char **start_point);
+typedef void (*HPMHOOK_post_script_add_translatable_string) (const struct script_string_buf *string, const char *start_point);
typedef const char* (*HPMHOOK_pre_script_parse_expr) (const char **p);
typedef const char* (*HPMHOOK_post_script_parse_expr) (const char* retVal___, const char *p);
typedef const char* (*HPMHOOK_pre_script_parse_line) (const char **p);
@@ -5978,8 +5988,8 @@ typedef int (*HPMHOOK_pre_script_string_dup) (char **str);
typedef int (*HPMHOOK_post_script_string_dup) (int retVal___, char *str);
typedef void (*HPMHOOK_pre_script_load_translations) (void);
typedef void (*HPMHOOK_post_script_load_translations) (void);
-typedef void (*HPMHOOK_pre_script_load_translation) (const char **file, uint8 *lang_id, uint32 **total);
-typedef void (*HPMHOOK_post_script_load_translation) (const char *file, uint8 lang_id, uint32 *total);
+typedef int (*HPMHOOK_pre_script_load_translation) (const char **file, uint8 *lang_id);
+typedef int (*HPMHOOK_post_script_load_translation) (int retVal___, const char *file, uint8 lang_id);
typedef int (*HPMHOOK_pre_script_translation_db_destroyer) (union DBKey *key, struct DBData **data, va_list ap);
typedef int (*HPMHOOK_post_script_translation_db_destroyer) (int retVal___, union DBKey key, struct DBData *data, va_list ap);
typedef void (*HPMHOOK_pre_script_clear_translations) (bool *reload);
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
index 5c2ead5ef..776099871 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
@@ -4672,6 +4672,16 @@ struct {
struct HPMHookPoint *HP_script_parse_variable_post;
struct HPMHookPoint *HP_script_parse_simpleexpr_pre;
struct HPMHookPoint *HP_script_parse_simpleexpr_post;
+ struct HPMHookPoint *HP_script_parse_simpleexpr_paren_pre;
+ struct HPMHookPoint *HP_script_parse_simpleexpr_paren_post;
+ struct HPMHookPoint *HP_script_parse_simpleexpr_number_pre;
+ struct HPMHookPoint *HP_script_parse_simpleexpr_number_post;
+ struct HPMHookPoint *HP_script_parse_simpleexpr_string_pre;
+ struct HPMHookPoint *HP_script_parse_simpleexpr_string_post;
+ struct HPMHookPoint *HP_script_parse_simpleexpr_name_pre;
+ struct HPMHookPoint *HP_script_parse_simpleexpr_name_post;
+ struct HPMHookPoint *HP_script_add_translatable_string_pre;
+ struct HPMHookPoint *HP_script_add_translatable_string_post;
struct HPMHookPoint *HP_script_parse_expr_pre;
struct HPMHookPoint *HP_script_parse_expr_post;
struct HPMHookPoint *HP_script_parse_line_pre;
@@ -10575,6 +10585,16 @@ struct {
int HP_script_parse_variable_post;
int HP_script_parse_simpleexpr_pre;
int HP_script_parse_simpleexpr_post;
+ int HP_script_parse_simpleexpr_paren_pre;
+ int HP_script_parse_simpleexpr_paren_post;
+ int HP_script_parse_simpleexpr_number_pre;
+ int HP_script_parse_simpleexpr_number_post;
+ int HP_script_parse_simpleexpr_string_pre;
+ int HP_script_parse_simpleexpr_string_post;
+ int HP_script_parse_simpleexpr_name_pre;
+ int HP_script_parse_simpleexpr_name_post;
+ int HP_script_add_translatable_string_pre;
+ int HP_script_add_translatable_string_post;
int HP_script_parse_expr_pre;
int HP_script_parse_expr_post;
int HP_script_parse_line_pre;
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
index 77ee32f2f..573ef06c5 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
@@ -2391,6 +2391,11 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(script->parse_nextline, HP_script_parse_nextline) },
{ HP_POP(script->parse_variable, HP_script_parse_variable) },
{ HP_POP(script->parse_simpleexpr, HP_script_parse_simpleexpr) },
+ { HP_POP(script->parse_simpleexpr_paren, HP_script_parse_simpleexpr_paren) },
+ { HP_POP(script->parse_simpleexpr_number, HP_script_parse_simpleexpr_number) },
+ { HP_POP(script->parse_simpleexpr_string, HP_script_parse_simpleexpr_string) },
+ { HP_POP(script->parse_simpleexpr_name, HP_script_parse_simpleexpr_name) },
+ { HP_POP(script->add_translatable_string, HP_script_add_translatable_string) },
{ HP_POP(script->parse_expr, HP_script_parse_expr) },
{ HP_POP(script->parse_line, HP_script_parse_line) },
{ HP_POP(script->read_constdb, HP_script_read_constdb) },
diff --git a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
index 48fae567f..dc4df803c 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
@@ -61773,11 +61773,11 @@ const char* HP_script_parse_syntax(const char *p) {
}
return retVal___;
}
-c_op HP_script_get_com(unsigned char *scriptbuf, int *pos) {
+c_op HP_script_get_com(const struct script_buf *scriptbuf, int *pos) {
int hIndex = 0;
c_op retVal___ = C_NOP;
if( HPMHooks.count.HP_script_get_com_pre ) {
- c_op (*preHookFunc) (unsigned char **scriptbuf, int **pos);
+ c_op (*preHookFunc) (const struct script_buf **scriptbuf, int **pos);
*HPMforce_return = false;
for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_com_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_script_get_com_pre[hIndex].func;
@@ -61792,7 +61792,7 @@ c_op HP_script_get_com(unsigned char *scriptbuf, int *pos) {
retVal___ = HPMHooks.source.script.get_com(scriptbuf, pos);
}
if( HPMHooks.count.HP_script_get_com_post ) {
- c_op (*postHookFunc) (c_op retVal___, unsigned char *scriptbuf, int *pos);
+ c_op (*postHookFunc) (c_op retVal___, const struct script_buf *scriptbuf, int *pos);
for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_com_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_script_get_com_post[hIndex].func;
retVal___ = postHookFunc(retVal___, scriptbuf, pos);
@@ -61800,11 +61800,11 @@ c_op HP_script_get_com(unsigned char *scriptbuf, int *pos) {
}
return retVal___;
}
-int HP_script_get_num(unsigned char *scriptbuf, int *pos) {
+int HP_script_get_num(const struct script_buf *scriptbuf, int *pos) {
int hIndex = 0;
int retVal___ = 0;
if( HPMHooks.count.HP_script_get_num_pre ) {
- int (*preHookFunc) (unsigned char **scriptbuf, int **pos);
+ int (*preHookFunc) (const struct script_buf **scriptbuf, int **pos);
*HPMforce_return = false;
for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_num_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_script_get_num_pre[hIndex].func;
@@ -61819,7 +61819,7 @@ int HP_script_get_num(unsigned char *scriptbuf, int *pos) {
retVal___ = HPMHooks.source.script.get_num(scriptbuf, pos);
}
if( HPMHooks.count.HP_script_get_num_post ) {
- int (*postHookFunc) (int retVal___, unsigned char *scriptbuf, int *pos);
+ int (*postHookFunc) (int retVal___, const struct script_buf *scriptbuf, int *pos);
for(hIndex = 0; hIndex < HPMHooks.count.HP_script_get_num_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_script_get_num_post[hIndex].func;
retVal___ = postHookFunc(retVal___, scriptbuf, pos);
@@ -62302,6 +62302,140 @@ const char* HP_script_parse_simpleexpr(const char *p) {
}
return retVal___;
}
+const char* HP_script_parse_simpleexpr_paren(const char *p) {
+ int hIndex = 0;
+ const char* retVal___ = NULL;
+ if( HPMHooks.count.HP_script_parse_simpleexpr_paren_pre ) {
+ const char* (*preHookFunc) (const char **p);
+ *HPMforce_return = false;
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_parse_simpleexpr_paren_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_script_parse_simpleexpr_paren_pre[hIndex].func;
+ retVal___ = preHookFunc(&p);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.script.parse_simpleexpr_paren(p);
+ }
+ if( HPMHooks.count.HP_script_parse_simpleexpr_paren_post ) {
+ const char* (*postHookFunc) (const char* retVal___, const char *p);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_parse_simpleexpr_paren_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_script_parse_simpleexpr_paren_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, p);
+ }
+ }
+ return retVal___;
+}
+const char* HP_script_parse_simpleexpr_number(const char *p) {
+ int hIndex = 0;
+ const char* retVal___ = NULL;
+ if( HPMHooks.count.HP_script_parse_simpleexpr_number_pre ) {
+ const char* (*preHookFunc) (const char **p);
+ *HPMforce_return = false;
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_parse_simpleexpr_number_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_script_parse_simpleexpr_number_pre[hIndex].func;
+ retVal___ = preHookFunc(&p);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.script.parse_simpleexpr_number(p);
+ }
+ if( HPMHooks.count.HP_script_parse_simpleexpr_number_post ) {
+ const char* (*postHookFunc) (const char* retVal___, const char *p);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_parse_simpleexpr_number_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_script_parse_simpleexpr_number_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, p);
+ }
+ }
+ return retVal___;
+}
+const char* HP_script_parse_simpleexpr_string(const char *p) {
+ int hIndex = 0;
+ const char* retVal___ = NULL;
+ if( HPMHooks.count.HP_script_parse_simpleexpr_string_pre ) {
+ const char* (*preHookFunc) (const char **p);
+ *HPMforce_return = false;
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_parse_simpleexpr_string_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_script_parse_simpleexpr_string_pre[hIndex].func;
+ retVal___ = preHookFunc(&p);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.script.parse_simpleexpr_string(p);
+ }
+ if( HPMHooks.count.HP_script_parse_simpleexpr_string_post ) {
+ const char* (*postHookFunc) (const char* retVal___, const char *p);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_parse_simpleexpr_string_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_script_parse_simpleexpr_string_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, p);
+ }
+ }
+ return retVal___;
+}
+const char* HP_script_parse_simpleexpr_name(const char *p) {
+ int hIndex = 0;
+ const char* retVal___ = NULL;
+ if( HPMHooks.count.HP_script_parse_simpleexpr_name_pre ) {
+ const char* (*preHookFunc) (const char **p);
+ *HPMforce_return = false;
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_parse_simpleexpr_name_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_script_parse_simpleexpr_name_pre[hIndex].func;
+ retVal___ = preHookFunc(&p);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.script.parse_simpleexpr_name(p);
+ }
+ if( HPMHooks.count.HP_script_parse_simpleexpr_name_post ) {
+ const char* (*postHookFunc) (const char* retVal___, const char *p);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_parse_simpleexpr_name_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_script_parse_simpleexpr_name_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, p);
+ }
+ }
+ return retVal___;
+}
+void HP_script_add_translatable_string(const struct script_string_buf *string, const char *start_point) {
+ int hIndex = 0;
+ if( HPMHooks.count.HP_script_add_translatable_string_pre ) {
+ void (*preHookFunc) (const struct script_string_buf **string, const char **start_point);
+ *HPMforce_return = false;
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_add_translatable_string_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_script_add_translatable_string_pre[hIndex].func;
+ preHookFunc(&string, &start_point);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.script.add_translatable_string(string, start_point);
+ }
+ if( HPMHooks.count.HP_script_add_translatable_string_post ) {
+ void (*postHookFunc) (const struct script_string_buf *string, const char *start_point);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_script_add_translatable_string_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_script_add_translatable_string_post[hIndex].func;
+ postHookFunc(string, start_point);
+ }
+ }
+ return;
+}
const char* HP_script_parse_expr(const char *p) {
int hIndex = 0;
const char* retVal___ = NULL;
@@ -64326,31 +64460,32 @@ void HP_script_load_translations(void) {
}
return;
}
-void HP_script_load_translation(const char *file, uint8 lang_id, uint32 *total) {
+int HP_script_load_translation(const char *file, uint8 lang_id) {
int hIndex = 0;
+ int retVal___ = 0;
if( HPMHooks.count.HP_script_load_translation_pre ) {
- void (*preHookFunc) (const char **file, uint8 *lang_id, uint32 **total);
+ int (*preHookFunc) (const char **file, uint8 *lang_id);
*HPMforce_return = false;
for(hIndex = 0; hIndex < HPMHooks.count.HP_script_load_translation_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_script_load_translation_pre[hIndex].func;
- preHookFunc(&file, &lang_id, &total);
+ retVal___ = preHookFunc(&file, &lang_id);
}
if( *HPMforce_return ) {
*HPMforce_return = false;
- return;
+ return retVal___;
}
}
{
- HPMHooks.source.script.load_translation(file, lang_id, total);
+ retVal___ = HPMHooks.source.script.load_translation(file, lang_id);
}
if( HPMHooks.count.HP_script_load_translation_post ) {
- void (*postHookFunc) (const char *file, uint8 lang_id, uint32 *total);
+ int (*postHookFunc) (int retVal___, const char *file, uint8 lang_id);
for(hIndex = 0; hIndex < HPMHooks.count.HP_script_load_translation_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_script_load_translation_post[hIndex].func;
- postHookFunc(file, lang_id, total);
+ retVal___ = postHookFunc(retVal___, file, lang_id);
}
}
- return;
+ return retVal___;
}
int HP_script_translation_db_destroyer(union DBKey key, struct DBData *data, va_list ap) {
int hIndex = 0;
diff --git a/src/plugins/generate-translations.c b/src/plugins/generate-translations.c
new file mode 100644
index 000000000..50a0f162c
--- /dev/null
+++ b/src/plugins/generate-translations.c
@@ -0,0 +1,256 @@
+/**
+ * This file is part of Hercules.
+ * http://herc.ws - http://github.com/HerculesWS/Hercules
+ *
+ * Copyright (C) 2016 Hercules Dev Team
+ *
+ * Hercules 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.
+ *
+ * This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "config/core.h"
+
+#include "common/hercules.h"
+#include "common/cbasetypes.h"
+#include "common/memmgr.h"
+#include "common/showmsg.h"
+#include "common/strlib.h"
+#include "map/atcommand.h"
+#include "map/map.h"
+#include "map/script.h"
+
+#include "plugins/HPMHooking.h"
+#include "common/HPMDataCheck.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+HPExport struct hplugin_info pinfo = {
+ "generate-translations", // Plugin name
+ SERVER_TYPE_MAP, // Which server types this plugin works with?
+ "0.1", // Plugin version
+ HPM_VERSION, // HPM Version (don't change, macro is automatically updated)
+};
+
+struct DBMap *translatable_strings; // string map parsed (used when exporting strings only)
+/* Set during startup when attempting to export the lang, unset after server initialization is over */
+FILE *lang_export_fp;
+char *lang_export_file;/* for lang_export_fp */
+struct script_string_buf lang_export_line_buf;
+struct script_string_buf lang_export_escaped_buf;
+
+/// Whether the translations template generator will automatically run.
+bool generating_translations = false;
+
+/**
+ * --generate-translations
+ *
+ * Creates "./generated_translations.pot"
+ * @see cmdline->exec
+ */
+CMDLINEARG(generatetranslations)
+{
+ lang_export_file = aStrdup("./generated_translations.pot");
+
+ if ((lang_export_fp = fopen(lang_export_file, "wb")) == NULL) {
+ ShowError("export-dialog: failed to open '%s' for writing\n", lang_export_file);
+ } else {
+ time_t t = time(NULL);
+ struct tm *lt = localtime(&t);
+ int year = lt->tm_year+1900;
+ fprintf(lang_export_fp,
+ "# This file is part of Hercules.\n"
+ "# http://herc.ws - http://github.com/HerculesWS/Hercules\n"
+ "#\n"
+ "# Copyright (C) 2013-%d Hercules Dev Team\n"
+ "#\n"
+ "# Hercules is free software: you can redistribute it and/or modify\n"
+ "# it under the terms of the GNU General Public License as published by\n"
+ "# the Free Software Foundation, either version 3 of the License, or\n"
+ "# (at your option) any later version.\n"
+ "#\n"
+ "# This program is distributed in the hope that it will be useful,\n"
+ "# but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+ "# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+ "# GNU General Public License for more details.\n"
+ "#\n"
+ "# You should have received a copy of the GNU General Public License\n"
+ "# along with this program. If not, see <http://www.gnu.org/licenses/>.\n",
+ year);
+ }
+ generating_translations = true;
+ return true;
+}
+
+void script_add_translatable_string_posthook(const struct script_string_buf *string, const char *start_point)
+{
+ bool duplicate = true;
+ bool is_translatable_string = false;
+ bool is_translatable_fmtstring = false;
+
+ if (!generating_translations || lang_export_fp == NULL)
+ return;
+
+ /* When exporting we don't know what is a translation and what isn't */
+ if (VECTOR_LENGTH(*string) > 1) {
+ // The length of *string will always be at least 1 because of the '\0'
+ if (translatable_strings == NULL) {
+ translatable_strings = strdb_alloc(DB_OPT_DUP_KEY|DB_OPT_ALLOW_NULL_DATA, 0);
+ }
+
+ if (!strdb_exists(translatable_strings, VECTOR_DATA(*string))) {
+ strdb_put(translatable_strings, VECTOR_DATA(*string), NULL);
+ duplicate = false;
+ }
+ }
+
+ if (!duplicate) {
+ if (script->syntax.last_func == script->buildin_mes_offset
+ || script->syntax.last_func == script->buildin_select_offset
+ || script->syntax.lang_macro_active
+ ) {
+ is_translatable_string = true;
+ } else if (script->syntax.last_func == script->buildin_mesf_offset
+ || script->syntax.lang_macro_fmtstring_active
+ ) {
+ is_translatable_fmtstring = true;
+ }
+ }
+
+ if (is_translatable_string || is_translatable_fmtstring) {
+ const char *line_start = start_point;
+ const char *line_end = start_point;
+ int line_length;
+ bool has_percent_sign = false;
+
+ if (!is_translatable_fmtstring && strchr(VECTOR_DATA(*string), '%') != NULL) {
+ has_percent_sign = true;
+ }
+
+ while (line_start > script->parser_current_src && *line_start != '\n')
+ line_start--;
+
+ while (*line_end != '\n' && *line_end != '\0')
+ line_end++;
+
+ line_length = (int)(line_end - line_start);
+ if (line_length > 0) {
+ VECTOR_ENSURE(lang_export_line_buf, line_length + 1, 512);
+ VECTOR_PUSHARRAY(lang_export_line_buf, line_start, line_length);
+ VECTOR_PUSH(lang_export_line_buf, '\0');
+
+ normalize_name(VECTOR_DATA(lang_export_line_buf), "\r\n\t "); // [!] Note: VECTOR_LENGTH() will lie.
+ }
+
+ VECTOR_ENSURE(lang_export_escaped_buf, 4*VECTOR_LENGTH(*string)+1, 1);
+ VECTOR_LENGTH(lang_export_escaped_buf) = (int)sv->escape_c(VECTOR_DATA(lang_export_escaped_buf),
+ VECTOR_DATA(*string),
+ VECTOR_LENGTH(*string)-1, /* exclude null terminator */
+ "\"");
+ VECTOR_PUSH(lang_export_escaped_buf, '\0');
+
+ fprintf(lang_export_fp, "\n#: %s\n"
+ "# %s\n"
+ "%s"
+ "msgctxt \"%s\"\n"
+ "msgid \"%s\"\n"
+ "msgstr \"\"\n",
+ script->parser_current_file ? script->parser_current_file : "Unknown File",
+ VECTOR_DATA(lang_export_line_buf),
+ is_translatable_fmtstring ? "#, c-format\n" : (has_percent_sign ? "#, no-c-format\n" : ""),
+ script->parser_current_npc_name ? script->parser_current_npc_name : "Unknown NPC",
+ VECTOR_DATA(lang_export_escaped_buf)
+ );
+ VECTOR_TRUNCATE(lang_export_line_buf);
+ VECTOR_TRUNCATE(lang_export_escaped_buf);
+ }
+}
+
+struct script_code *parse_script_prehook(const char **src, const char **file, int *line, int *options, int **retval)
+{
+ if (translatable_strings != NULL) {
+ db_destroy(translatable_strings);
+ translatable_strings = NULL;
+ }
+ return NULL;
+}
+
+void script_parser_clean_leftovers_posthook(void)
+{
+ if (translatable_strings != NULL) {
+ db_destroy(translatable_strings);
+ translatable_strings = NULL;
+ }
+
+ VECTOR_CLEAR(lang_export_line_buf);
+ VECTOR_CLEAR(lang_export_escaped_buf);
+}
+
+bool msg_config_read_posthook(bool retVal, const char *cfg_name, bool allow_override)
+{
+ static int called = 1;
+
+ if (!generating_translations || lang_export_fp == NULL)
+ return retVal;
+
+ if (!retVal)
+ return retVal;
+
+ if (++called == 1) { // Original
+ int i;
+ for (i = 0; i < MAX_MSG; i++) {
+ if (atcommand->msg_table[0][i] == NULL)
+ continue;
+ fprintf(lang_export_fp, "msgctxt \"messages.conf\"\n"
+ "msgid \"%s\"\n"
+ "msgstr \"\"\n",
+ atcommand->msg_table[0][i]
+ );
+ }
+ }
+
+ return retVal;
+}
+
+HPExport void server_preinit(void)
+{
+ addArg("--generate-translations", false, generatetranslations,
+ "Creates './generated_translations.pot' file with all translateable strings from scripts, server terminates afterwards.");
+ VECTOR_INIT(lang_export_line_buf);
+ VECTOR_INIT(lang_export_escaped_buf);
+ addHookPost(script, add_translatable_string, script_add_translatable_string_posthook);
+ addHookPre(script, parse, parse_script_prehook);
+ addHookPost(script, parser_clean_leftovers, script_parser_clean_leftovers_posthook);
+ addHookPost(atcommand, msg_read, msg_config_read_posthook);
+}
+
+HPExport void plugin_init(void)
+{
+}
+
+HPExport void server_online(void)
+{
+ if (generating_translations && lang_export_fp != NULL) {
+ ShowInfo("Lang exported to '%s'\n", lang_export_file);
+ fclose(lang_export_fp);
+ lang_export_fp = NULL;
+ }
+ core->runflag = CORE_ST_STOP;
+}
+
+HPExport void plugin_final(void)
+{
+ if (lang_export_file != NULL) {
+ aFree(lang_export_file);
+ lang_export_file = NULL;
+ }
+}
diff --git a/travis.sh b/travis.sh
index 051c632d5..b1f639935 100755
--- a/travis.sh
+++ b/travis.sh
@@ -75,7 +75,7 @@ case "$MODE" in
;;
build)
(cd tools && ./validateinterfaces.py silent) || aborterror "Interface validation error."
- ./configure $@ || aborterror "Configure error, aborting build."
+ ./configure $@ || (cat config.log && aborterror "Configure error, aborting build.")
make sql -j3 || aborterror "Build failed."
make plugin.script_mapquit -j3 || aborterror "Build failed."
;;