summaryrefslogtreecommitdiff
path: root/npc/017-1
diff options
context:
space:
mode:
authorJesusaves <cpntb1@ymail.com>2022-10-23 21:44:22 -0300
committerJesusaves <cpntb1@ymail.com>2022-10-23 21:44:22 -0300
commita7c45a192268da2601cef47a4cdba987ae2327ca (patch)
treec5fb5b97db109fe7106496dd96498c475881046b /npc/017-1
downloadserverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.tar.gz
serverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.tar.bz2
serverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.tar.xz
serverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.zip
Initial commit (Moubootaur Legends fork)
Diffstat (limited to 'npc/017-1')
-rw-r--r--npc/017-1/_import.txt24
-rw-r--r--npc/017-1/_mobs.txt6
-rw-r--r--npc/017-1/_warps.txt14
-rw-r--r--npc/017-1/boringnpc.txt67
-rw-r--r--npc/017-1/drowned_man.txt177
-rw-r--r--npc/017-1/estate.txt171
-rw-r--r--npc/017-1/fairy_collector.txt318
-rw-r--r--npc/017-1/guards.txt80
-rw-r--r--npc/017-1/guild.txt46
-rw-r--r--npc/017-1/mapflags.txt9
-rw-r--r--npc/017-1/misc.txt257
-rw-r--r--npc/017-1/nowhere_man.txt137
-rw-r--r--npc/017-1/paxel.txt263
-rw-r--r--npc/017-1/pet_detective.txt139
-rw-r--r--npc/017-1/roger.txt183
-rw-r--r--npc/017-1/shops.txt112
-rw-r--r--npc/017-1/signs.txt106
-rw-r--r--npc/017-1/soul-menhir.txt20
-rw-r--r--npc/017-1/stranger.txt184
-rw-r--r--npc/017-1/town.txt10
-rw-r--r--npc/017-1/townhall.txt116
-rw-r--r--npc/017-1/wateranimation.txt24
22 files changed, 2463 insertions, 0 deletions
diff --git a/npc/017-1/_import.txt b/npc/017-1/_import.txt
new file mode 100644
index 0000000..42925f9
--- /dev/null
+++ b/npc/017-1/_import.txt
@@ -0,0 +1,24 @@
+// Map 017-1: Land Of Fire Village
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/017-1/017-1_stranger_blackbox.txt",
+"npc/017-1/_mobs.txt",
+"npc/017-1/_warps.txt",
+"npc/017-1/boringnpc.txt",
+"npc/017-1/drowned_man.txt",
+"npc/017-1/estate.txt",
+"npc/017-1/fairy_collector.txt",
+"npc/017-1/guards.txt",
+"npc/017-1/guild.txt",
+"npc/017-1/mapflags.txt",
+"npc/017-1/misc.txt",
+"npc/017-1/nowhere_man.txt",
+"npc/017-1/paxel.txt",
+"npc/017-1/pet_detective.txt",
+"npc/017-1/roger.txt",
+"npc/017-1/shops.txt",
+"npc/017-1/signs.txt",
+"npc/017-1/soul-menhir.txt",
+"npc/017-1/stranger.txt",
+"npc/017-1/town.txt",
+"npc/017-1/townhall.txt",
+"npc/017-1/wateranimation.txt",
diff --git a/npc/017-1/_mobs.txt b/npc/017-1/_mobs.txt
new file mode 100644
index 0000000..fd9ccb5
--- /dev/null
+++ b/npc/017-1/_mobs.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 017-1: Land Of Fire Village mobs
+017-1,105,129,75,76 monster Cyan Butterfly 1172,40,30000,30000
+017-1,125,69,103,47 monster Squirrel 1053,25,30000,30000
+017-1,123,176,103,58 monster Living Potato 1181,36,30000,30000
+017-1,128,122,108,114 monster Alizarin Plant 1188,45,45000,45000
diff --git a/npc/017-1/_warps.txt b/npc/017-1/_warps.txt
new file mode 100644
index 0000000..d20e41f
--- /dev/null
+++ b/npc/017-1/_warps.txt
@@ -0,0 +1,14 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 017-1: Land Of Fire Village warps
+017-1,180,193,0 warp #017-1_180_193 0,0,018-2,63,105
+017-1,152,224,0 warp #017-1_152_224 0,0,018-1,32,68
+017-1,119,60,0 warp #017-1_119_60 0,0,017-2,41,30
+017-1,104,103,0 warp #017-1_104_103 0,0,014-4,95,33
+017-1,92,88,0 warp #017-1_92_88 2,0,017-3,32,44
+017-1,150,87,0 warp #017-1_150_87 0,0,017-4,27,41
+017-1,155,87,0 warp #017-1_155_87 0,0,017-4,35,41
+017-1,133,155,0 warp #017-1_133_155 0,0,017-5,23,33
+017-1,37,140,0 warp #017-1_37_140 0,1,017-6,29,43
+017-1,37,155,0 warp #017-1_37_155 0,1,017-6,29,52
+017-1,37,132,0 warp #017-1_37_132 0,1,017-6,29,31
+017-1,230,87,0 warp #017-1_230_87 0,3,017-0,24,78
diff --git a/npc/017-1/boringnpc.txt b/npc/017-1/boringnpc.txt
new file mode 100644
index 0000000..2ffcf29
--- /dev/null
+++ b/npc/017-1/boringnpc.txt
@@ -0,0 +1,67 @@
+// TMW2/LoF scripts.
+// Authors:
+// TMW-LoF Team
+// Jesusalva
+// Description:
+// Permanently repeatable quest, without any special limit
+
+017-1,123,58,0 script Boring NPC NPC_RUMLY,{
+ .@price=35;
+ mesn;
+ mesq l("Hwellow. I am a boring NPC which makes green dye."); // Typo on purpose: Uwhaaaaah (as in waking up) + hello
+ next;
+ mesn;
+ mesq l("Hwaaaah... Man, I'm bored. Will you be getting @@?", getitemlink(GreenDye));
+ if ($EVENT$ == "Patrick") {
+ mesc l("It's St. Patrick Day, so be warned everyone wants a green dye... So, I raise the prices.");
+ .@price*=2;
+ }
+ next;
+ mesn;
+ mes l("For you, boring person like me, It'll cost the small amount of:");
+ mes l("* @@/@@ @@", countitem(CobaltHerb), .@price+10, getitemlink(CobaltHerb));
+ mes l("* @@/@@ @@", countitem(GambogeHerb), .@price+10, getitemlink(GambogeHerb));
+ mes l("* @@/@@ @@", countitem(BugLeg), .@price-10, getitemlink(BugLeg));
+ mes l("@@/@@ GP", format_number(Zeny), format_number(.@price*2));
+ next;
+ select
+ l("Do it!"),
+ l("What a rip-off!");
+ mes "";
+ if (@menu == 2) {
+ mesn;
+ mesq l("Aha! I knew you were a boring person...");
+ close;
+ }
+ if (
+ countitem(CobaltHerb) < .@price+10 ||
+ countitem(GambogeHerb) < .@price+10 ||
+ countitem(BugLeg) < .@price-10 ||
+ Zeny < .@price*2
+ )
+ goto L_NotEnough;
+ inventoryplace GreenDye, 1;
+ delitem CobaltHerb, .@price+10;
+ delitem GambogeHerb, .@price+10;
+ delitem BugLeg, .@price-10;
+ Zeny-=.@price*2;
+ getitem GreenDye, 1;
+ getexp 200, 100; // Job Experience >>> Base Experience
+ mesn;
+ mesq l("There you go, boring person... You will look like the trees here. Ugh, disgusting.");
+ close;
+
+L_NotEnough:
+ mesn;
+ mesq l("Please don't bore me even more... That's clearly not everything.");
+ next;
+ mesn;
+ mesq l("I wonder if anyone will notice or care if I take a nap here...");
+ close;
+
+OnInit:
+ .sex=G_MALE;
+ .distance=5;
+ end;
+}
+
diff --git a/npc/017-1/drowned_man.txt b/npc/017-1/drowned_man.txt
new file mode 100644
index 0000000..9604612
--- /dev/null
+++ b/npc/017-1/drowned_man.txt
@@ -0,0 +1,177 @@
+// TMW2/TMWBR Script
+// Author:
+// Jesusalva
+// Description:
+// Access to Lilit - He aids you in jumping off the bridge and reaching Lilit
+// Of course, to swim such large distance, you need to have plenty vit and str...
+// Right spot: Between the crack (shallow) and the plant (shallow).
+
+// .@q = LilitQuest_Access
+// 0 - Access not granted
+// 1 - Access granted
+// 2 - Tree Minigame complete.
+
+// TODO: Only allow "I want to swim" if the game knows you know about Lilit
+// That is what Saulc wants, after all
+
+017-1,160,227,0 script #DrownedMan NPC_NO_SPRITE,{
+ if (!isin("017-1", 158, 222, 1))
+ end;
+ mesc l("Someone seems to be drowned in the water.");
+ select
+ l("Hello! Do you need help?"),
+ l("Why shouldn't I jump here?"),
+ l("But I want to swim!");
+ mes "";
+ switch (@menu)
+ {
+ case 1:
+ mesn l("Drowned Man");
+ mesq l("I'm afraid you can't help me... I still have one HP left.");
+ next;
+ mesn l("Drowned Man");
+ mesq l("I also broke my bones, and I was equipping a weapon which prevents HP regen...");
+ next;
+ mesn l("Drowned Man");
+ mesq l("I did some tritan friends, though. They teached me how to breath underwater. It's not so bad.");
+ next;
+ mesn l("Drowned Man");
+ mesq l("In the first eight months I wanted to go back, but now I'm pretty used to living here. Please don't rescue me.");
+ break;
+ case 2:
+ mesn l("Drowned Man");
+ mesq l("Because it may be a fatal fall!");
+ next;
+ mesn l("Drowned Man");
+ mesq l("Look the height of this bridge! Worse, the water around here is pretty shallow.");
+ next;
+ mesn l("Drowned Man");
+ mesq l("Well, there might be a deep water spot, but it would still be dangerous.");
+ next;
+ mesn l("Drowned Man");
+ mesq l("Unless you're looking forward a death penalty, DO NOT JUMP!");
+ // We're in town, are you stupid >.>
+ break;
+ case 3:
+ mesn l("Drowned Man");
+ mesq l("Well, you see, you can't jump very far. And the water near land is shallow.");
+ next;
+ mesn l("Drowned Man");
+ mesq l("I guess, there might be a single spot where water is a bit deeper, but I wasn't lucky.");
+ next;
+ mesn l("Drowned Man");
+ mes l("Remember to store somewhere any heavy stuff you might be carrying.");
+ mes l("I guess you cannot bring more than 1kg with full health. Less, if you're hurt.");
+ next;
+ mesn l("Drowned Man");
+ mesq l("Also, you need vitality and strength to survive the swimming trip. The closest island is very far away.");
+ mesc l("You need at least 35 str and 35 vit to do the trip safely - bonuses not counted - or you will lose HP."); // Can be safely mixed
+ break;
+ }
+ close;
+
+OnWarn:
+ @lofcanjump=true;
+ npctalkonce l("@@, don't jump there! It may be fatal!", strcharinfo(0));
+ end;
+
+// DO NOT LOWER
+OnInit:
+ .distance=7;
+ end;
+}
+
+// Warning Event
+017-1,158,222,0 script #DrownedManArea NPC_NO_SPRITE,0,0,{
+ end;
+OnTouch:
+ doevent("#DrownedMan::OnWarn");
+ end;
+OnInit:
+ .distance=1;
+ end;
+}
+
+
+// Any Jump. Code is obfuscated to inhibit cheaters :<
+// Of course, I could use a blackbox too, but this is not the purpose.
+// You don't want to solve the map hint, then you'll solve my formula!! /tableflip
+017-1,162,226,0 script #JumpArea01 NPC_NO_SPRITE,0,0,{
+ // Do you want to jump?
+ if (!@lofcanjump) {
+ dispbottom l("What interesting water. Just don't ask me why.");
+ end;
+ }
+
+ // Are you in the bridge?
+ if (!isin("017-1", 158, 222, 1)) {
+ dispbottom l("I'm too far to jump there.");
+ end;
+ }
+
+ mesc l("Are you really going to jump here?");
+ next;
+ if (askyesno() == ASK_YES) {
+ // Do the jump!
+ closeclientdialog;
+ slide .x, .y;
+ if (is_between(5220, 5270, .x*32) && is_between(7330, 7390, .y*32))
+ goto L_GoodJump;
+ dispbottom l("The water was too shallow...");
+ die();
+ end;
+ }
+ closeclientdialog;
+ end;
+
+L_GoodJump:
+ dispbottom l("You jump in deep waters.");
+ // You can only carry exact 2kg with full health.
+ // Weight will be 2000g - so penalty will be 100% HP.
+ .@penalty=max(0, (Weight/20)-1);
+ percentheal -.@penalty, 0;
+ @finalhp = Hp;
+
+ // vit/str counts on swimming minigame
+ mesn l("Drowned Man");
+ mesq l("Good job! I wish you luck, because now you need to SWIM!");
+ next;
+ closeclientdialog;
+ setparam(Hp, @finalhp);
+ @finalhp=0;
+ addtimer(3000, "#01850SwimmingCtrl::OnLoop");
+ warp "018-5-0", 20, 25;
+ end;
+
+OnInit:
+ .alwaysVisible=true;
+ end;
+}
+
+017-1,162,227,0 duplicate(#JumpArea01) #JumpArea02 NPC_NO_SPRITE
+017-1,162,228,0 duplicate(#JumpArea01) #JumpArea03 NPC_NO_SPRITE
+017-1,162,229,0 duplicate(#JumpArea01) #JumpArea04 NPC_NO_SPRITE
+017-1,162,230,0 duplicate(#JumpArea01) #JumpArea05 NPC_NO_SPRITE
+017-1,162,231,0 duplicate(#JumpArea01) #JumpArea06 NPC_NO_SPRITE
+
+017-1,163,226,0 duplicate(#JumpArea01) #JumpArea07 NPC_NO_SPRITE
+017-1,163,227,0 duplicate(#JumpArea01) #JumpArea08 NPC_NO_SPRITE
+017-1,163,228,0 duplicate(#JumpArea01) #JumpArea09 NPC_NO_SPRITE
+017-1,163,229,0 duplicate(#JumpArea01) #JumpArea10 NPC_NO_SPRITE
+017-1,163,230,0 duplicate(#JumpArea01) #JumpArea11 NPC_NO_SPRITE
+017-1,163,231,0 duplicate(#JumpArea01) #JumpArea12 NPC_NO_SPRITE
+
+017-1,164,226,0 duplicate(#JumpArea01) #JumpArea13 NPC_NO_SPRITE
+017-1,164,227,0 duplicate(#JumpArea01) #JumpArea14 NPC_NO_SPRITE
+017-1,164,228,0 duplicate(#JumpArea01) #JumpArea15 NPC_NO_SPRITE
+017-1,164,229,0 duplicate(#JumpArea01) #JumpArea16 NPC_NO_SPRITE
+017-1,164,230,0 duplicate(#JumpArea01) #JumpArea17 NPC_NO_SPRITE
+017-1,164,231,0 duplicate(#JumpArea01) #JumpArea18 NPC_NO_SPRITE
+
+017-1,165,226,0 duplicate(#JumpArea01) #JumpArea19 NPC_NO_SPRITE
+017-1,165,227,0 duplicate(#JumpArea01) #JumpArea20 NPC_NO_SPRITE
+017-1,165,228,0 duplicate(#JumpArea01) #JumpArea21 NPC_NO_SPRITE
+017-1,165,229,0 duplicate(#JumpArea01) #JumpArea22 NPC_NO_SPRITE
+017-1,165,230,0 duplicate(#JumpArea01) #JumpArea23 NPC_NO_SPRITE
+017-1,165,231,0 duplicate(#JumpArea01) #JumpArea24 NPC_NO_SPRITE
+
diff --git a/npc/017-1/estate.txt b/npc/017-1/estate.txt
new file mode 100644
index 0000000..434b477
--- /dev/null
+++ b/npc/017-1/estate.txt
@@ -0,0 +1,171 @@
+// TMW2: Moubootaur Legends scripts.
+// Author:
+// Jesusalva
+// Description:
+// Real Estate System
+
+// ID: 2
+// $ESTATE_OWNER[.id] → Account ID owner of the Real Estate
+// $ESTATE_OWNERNAME$[.id] → Human readable name of Real Estate owner
+// $ESTATE_RENTTIME[.id] → When the rent will expire
+// $ESTATE_MOBILIA_2[.id] → Bitmask of mobilia currently purchased on Monster Collision (6) (Use on walls only)
+// $ESTATE_MOBILIA_4[.id] → Bitmask of mobilia currently purchased on Air Collision (2)
+// $ESTATE_MOBILIA_8[.id] → Bitmask of mobilia currently purchased on Water Collision (3)
+// $ESTATE_MOBILIA_32[.id] → Bitmask of mobilia currently purchased on Yellow Collision (4)
+// $ESTATE_MOBILIA_64[.id] → Bitmask of mobilia currently purchased on Normal Collision (1)
+// $ESTATE_MOBILIA_128[.id] → Bitmask of mobilia currently purchased on Player Collision (5)
+// $ESTATE_PASSWORD$[.id] → Password to enter the estate. If it is "", then no password required
+// Note: GMs and Administrators can always use super password "mouboo" to enter a locked estate
+// $ESTATE_DOORBELL[.id] → If doorbell is disabled (enabled by default)
+
+// REAL_ESTATE_CREDITS → Credits equivalent to GP the player have. Will be used first.
+
+// The sign is the main controller
+017-1,86,177,0 script Sign#RES_0177 NPC_SWORDS_SIGN,{
+ if ($ESTATE_RENTTIME[.id] < gettimetick(2))
+ goto L_RentAvailable;
+
+ if ($ESTATE_OWNER[.id] == getcharid(3))
+ goto L_Manage;
+
+ if (is_admin() && $@GM_OVERRIDE)
+ goto L_Manage;
+
+ mesc l("This estate currently belongs to @@.", $ESTATE_OWNERNAME$[.id]);
+ mesc l("Press the doorbell?");
+ next;
+ if (askyesno() == ASK_YES)
+ doevent "Doorbell#RES_0177::OnDoorbell";
+ close;
+
+L_RentAvailable:
+ realestate_rent(.id, .price);
+ close;
+
+L_Manage:
+ realestate_manage(.id, (.price*7/10));
+ close;
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 3;
+
+ // Estate Settings
+ .id=2; // Estate ID
+ .price=40000; // Monthly rent price
+ end;
+
+}
+
+// Door entrance
+017-1,85,175,0 script #RES_0177 NPC_HIDDEN,0,0,{
+ end;
+OnTouch:
+ if ($ESTATE_RENTTIME[.id] < gettimetick(2))
+ goto L_RentAvailable;
+
+ if ($ESTATE_OWNER[.id] == getcharid(3) || $ESTATE_PASSWORD$[.id] == "")
+ goto L_Warp;
+
+ mesc l("The door is locked");
+ next;
+ mesc l("However, it can be unlocked if you know the password:");
+ if (is_gm()) mesc l("You can use super password \"mouboo\" to unlock the door."), 1;
+ input .@password$;
+ // GMs can use super password "mouboo"
+ if (.@password$ == $ESTATE_PASSWORD$[.id] || (is_gm() && .@password$ == "mouboo"))
+ goto L_Warp;
+ close;
+
+L_Warp:
+ warp "017-7", 33, 33;
+ closeclientdialog;
+ close;
+
+L_RentAvailable:
+ dispbottom l("This estate is available for rent, talk to the sign to rent it.");
+ close;
+
+OnInit:
+ // Estate Settings
+ .id=2; // Estate ID
+ end;
+
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// ID: 3
+
+// The sign is the main controller
+017-1,138,22,0 script Sign#RES_0178 NPC_SWORDS_SIGN,{
+ if ($ESTATE_RENTTIME[.id] < gettimetick(2))
+ goto L_RentAvailable;
+
+ if ($ESTATE_OWNER[.id] == getcharid(3))
+ goto L_Manage;
+
+ if (is_admin() && $@GM_OVERRIDE)
+ goto L_Manage;
+
+ mesc l("This estate currently belongs to @@.", $ESTATE_OWNERNAME$[.id]);
+ mesc l("Press the doorbell?");
+ next;
+ if (askyesno() == ASK_YES)
+ doevent "Doorbell#RES_0178::OnDoorbell";
+ close;
+
+L_RentAvailable:
+ realestate_rent(.id, .price);
+ close;
+
+L_Manage:
+ realestate_manage(.id, (.price*7/10));
+ close;
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 3;
+
+ // Estate Settings
+ .id=3; // Estate ID
+ .price=60000; // Monthly rent price
+ end;
+
+}
+
+// Door entrance
+017-1,139,20,0 script #RES_0178 NPC_HIDDEN,0,0,{
+ end;
+OnTouch:
+ if ($ESTATE_RENTTIME[.id] < gettimetick(2))
+ goto L_RentAvailable;
+
+ if ($ESTATE_OWNER[.id] == getcharid(3) || $ESTATE_PASSWORD$[.id] == "")
+ goto L_Warp;
+
+ mesc l("The door is locked");
+ next;
+ mesc l("However, it can be unlocked if you know the password:");
+ if (is_gm()) mesc l("You can use super password \"mouboo\" to unlock the door."), 1;
+ input .@password$;
+ // GMs can use super password "mouboo"
+ if (.@password$ == $ESTATE_PASSWORD$[.id] || (is_gm() && .@password$ == "mouboo"))
+ goto L_Warp;
+ close;
+
+L_Warp:
+ warp "017-8", 33, 33;
+ closeclientdialog;
+ close;
+
+L_RentAvailable:
+ dispbottom l("This estate is available for rent, talk to the sign to rent it.");
+ close;
+
+OnInit:
+ // Estate Settings
+ .id=3; // Estate ID
+ end;
+
+}
+
diff --git a/npc/017-1/fairy_collector.txt b/npc/017-1/fairy_collector.txt
new file mode 100644
index 0000000..a8ab6af
--- /dev/null
+++ b/npc/017-1/fairy_collector.txt
@@ -0,0 +1,318 @@
+// TMW2/LoF scripts.
+// Authors:
+// TMW-LoF Team
+// Jesusalva
+// Description:
+// Collect every piece of equipment ingame for no real reason
+// Cannot be completed yet, because not every piece of equipment is available ingame
+
+017-1,135,106,0 script Royal Fairy NPC_FAIRY_B,{
+ .@n=getq(LoFQuest_Fairy);
+ mesn;
+
+ if (.@n == 0) goto L_Busy;
+ if (.@n < 3) goto L_Incomplete;
+ if (.@n >= 3) goto L_Main;
+
+L_Busy:
+ mesq l("Hi, I'm too busy to talk right now, please go away. Very pressing matters at hand.");
+ close;
+
+L_Incomplete:
+ mesq l("Hello, I noticed my dear friend, Susanne, asked you to help us save my sisters; do not forget to ask Susanne where the Fafi Dragon was last seen.");
+ close;
+
+L_Main:
+ if (!(TELEPORTERS & TP_LILIT) && rand2(3) == 2) {
+ mesn;
+ mesq l("Have you ever met our Queen Lilit? She is lovely but hates @@ for some reason...", get_race());
+ next;
+ mesc l("Do you want a tip? \"It's not suicide if you know how to swim.\"");
+ next;
+ }
+ if (#COLLECTOR == (COLLECT_ALL-1)) {
+ mesn;
+ mesc l("OMG you got all equipment in Moubootaur Legends. You are truly a legend of legends."), 1;
+ next;
+ inventoryplace NPCEyes, 5;
+ mesn;
+ mesc l("Here, you can have the partly unobtainable items reserved to developers and contributors. And, uh, these NPC-only items, don't let developers know I gave you this. It'll be our little secret!"), 1;
+ #COLLECTOR = #COLLECTOR | COLLECT_ALL;
+ getitembound DEVCap, 1, 1;
+ getitembound ContributorSweater, 1, 1;
+ getitembound CommunityShirt, 1, 1;
+ getitembound RiceHat, 1, 1;
+ getitembound AlchemistArmor, 1, 1;
+ // Should we give them a NPCEyes? Or better not (would break checks)?
+ }
+ /*
+ COLLECT_CHESTPLATE: 1
+ COLLECT_HEADGEAR: 2
+ COLLECT_PANTS: 4
+ COLLECT_SHOES: 8
+ COLLECT_NECKLACES: 16
+ COLLECT_RINGS: 32
+ COLLECT_ACESSORIES: 64
+ COLLECT_SCARFS: 128
+ COLLECT_GLOVES: 256
+ COLLECT_SHIELDS: 512
+ COLLECT_1HSWORDS: 1024
+ COLLECT_2HSWORDS: 2048
+ COLLECT_BOWS: 4096
+ COLLECT_FIREGUNS: 8192
+ COLLECT_WANDS: 16384
+ COLLECT_QUIVERS: 32768
+ COLLECT_MOUNTS: 65536
+ COLLECT_PETS: 131072
+
+ */
+ do {
+ mesn;
+ mesq l("Are you trying to collect every piece of equipment ingame? Come tell me if you are and I'll give you a collector stamp!");
+ mesc l("Not every piece of equipment is ingame yet.");
+ mes "";
+ select
+ l("Good bye!"),
+ rif(false && !(#COLLECTOR & COLLECT_CHESTPLATE), l("Chestplates")),
+ rif(false && !(#COLLECTOR & COLLECT_HEADGEAR), l("Headgear")),
+ rif(false && !(#COLLECTOR & COLLECT_PANTS), l("Pants")),
+ rif(false && !(#COLLECTOR & COLLECT_SHOES), l("Shoes")),
+ rif(false && !(#COLLECTOR & COLLECT_NECKLACES), l("Necklaces")),
+ rif(false && !(#COLLECTOR & COLLECT_RINGS), l("Rings")),
+ rif(false && !(#COLLECTOR & COLLECT_ACESSORIES), l("Accessories")),
+ rif(false && !(#COLLECTOR & COLLECT_SCARFS), l("Scarfs")),
+ rif(false && !(#COLLECTOR & COLLECT_GLOVES), l("Gloves")),
+ rif(false && !(#COLLECTOR & COLLECT_SHIELDS), l("Shields")),
+ rif(false && !(#COLLECTOR & COLLECT_1HSWORDS), l("1 Hand Swords")),
+ rif(false && !(#COLLECTOR & COLLECT_2HSWORDS), l("2 Hand Swords")),
+ rif(true && !(#COLLECTOR & COLLECT_BOWS), l("Bows")),
+ rif(true && !(#COLLECTOR & COLLECT_FIREGUNS), l("Fire Staves")),
+ rif(true && !(#COLLECTOR & COLLECT_WANDS), l("Wands")),
+ rif(true && !(#COLLECTOR & COLLECT_QUIVERS), l("Quivers")),
+ rif(false && !(#COLLECTOR & COLLECT_MOUNTS), l("Mounts")),
+ rif(false && !(#COLLECTOR & COLLECT_PETS), l("Pets")),
+ l("Trade stamps");
+ mes "";
+ switch (@menu+1) {
+ // Chestplate
+ case 1:
+ msObjective(countitem(CreasedShirt), "* "+getitemlink(CreasedShirt));
+ next;
+ break;
+ // Headgear (2x bells)
+ case 2:
+ msObjective(countitem(CreasedShirt), "* "+getitemlink(CreasedShirt));
+ next;
+ break;
+ // Pants
+ case 3:
+ msObjective(countitem(CreasedShirt), "* "+getitemlink(CreasedShirt));
+ next;
+ break;
+ // Shoes
+ case 4:
+ msObjective(countitem(CreasedShirt), "* "+getitemlink(CreasedShirt));
+ next;
+ break;
+ // Necklaces
+ case 5:
+ msObjective(countitem(CreasedShirt), "* "+getitemlink(CreasedShirt));
+ next;
+ break;
+ // Rings
+ case 6:
+ msObjective(countitem(CreasedShirt), "* "+getitemlink(CreasedShirt));
+ next;
+ break;
+ // Accessories
+ case 7:
+ msObjective(countitem(CreasedShirt), "* "+getitemlink(CreasedShirt));
+ next;
+ break;
+ // Scarfs
+ case 8:
+ msObjective(countitem(CreasedShirt), "* "+getitemlink(CreasedShirt));
+ next;
+ break;
+ // Gloves
+ case 9:
+ msObjective(countitem(CreasedShirt), "* "+getitemlink(CreasedShirt));
+ next;
+ break;
+ // Shields
+ case 10:
+ msObjective(countitem(CreasedShirt), "* "+getitemlink(CreasedShirt));
+ next;
+ break;
+ // 1H Swords
+ case 11:
+ msObjective(countitem(CreasedShirt), "* "+getitemlink(CreasedShirt));
+ next;
+ break;
+ // 2H Swords
+ case 12:
+ msObjective(countitem(Scythe), "* "+getitemlink(Scythe));
+ msObjective(countitem(ThunderStaff), "* "+getitemlink(ThunderStaff));
+ msObjective(countitem(MiereCleaver), "* "+getitemlink(MiereCleaver));
+ msObjective(countitem(Broadsword), "* "+getitemlink(Broadsword));
+ msObjective(countitem(Kanabo), "* "+getitemlink(Kanabo));
+ msObjective(countitem(BlacksmithAxe), "* "+getitemlink(BlacksmithAxe));
+ msObjective(countitem(CentaurSpear), "* "+getitemlink(CentaurSpear));
+ msObjective(false, l("* More equipment coming soon..."));
+ next;
+ break;
+ // Bows
+ case 13:
+ msObjective(countitem(TrainingBow), "* "+getitemlink(TrainingBow));
+ msObjective(countitem(WoodenBow), "* "+getitemlink(WoodenBow));
+ msObjective(countitem(ShortBow), "* "+getitemlink(ShortBow));
+ msObjective(countitem(ForestBow), "* "+getitemlink(ForestBow));
+ msObjective(countitem(ElficBow), "* "+getitemlink(ElficBow));
+ msObjective(countitem(ChampionshipBow), "* "+getitemlink(ChampionshipBow));
+ msObjective(countitem(BansheeBow), "* "+getitemlink(BansheeBow));
+ next;
+ if (countitem(PynRifle) &&
+ countitem(PynGatling) &&
+ countitem(PynShotgun) &&
+ countitem(PynRevolver) &&
+ countitem(Dustynator)) {
+ #COLLECTOR = #COLLECTOR|COLLECT_BOWS;
+ getitembound SilverBell, 1, 1;
+ mesc l("CONGRATULATIONS! You have obtained the %s.", getitemlink(SilverBell)), 3;
+ }
+ break;
+ // Firearms
+ case 14:
+ msObjective(countitem(PynRifle), "* "+getitemlink(PynRifle));
+ msObjective(countitem(PynGatling), "* "+getitemlink(PynGatling));
+ msObjective(countitem(PynShotgun), "* "+getitemlink(PynShotgun));
+ msObjective(countitem(PynRevolver), "* "+getitemlink(PynRevolver));
+ msObjective(countitem(Dustynator), "* "+getitemlink(Dustynator));
+ next;
+ if (countitem(PynRifle) &&
+ countitem(PynGatling) &&
+ countitem(PynShotgun) &&
+ countitem(PynRevolver) &&
+ countitem(Dustynator)) {
+ #COLLECTOR = #COLLECTOR|COLLECT_FIREGUNS;
+ getitembound SilverBell, 1, 1;
+ mesc l("CONGRATULATIONS! You have obtained the %s.", getitemlink(SilverBell)), 3;
+ next;
+ }
+ break;
+ // Wands
+ case 15:
+ msObjective(countitem(TrainingWand), "* "+getitemlink(TrainingWand));
+ msObjective(countitem(NoviceWand), "* "+getitemlink(NoviceWand));
+ msObjective(countitem(ReinbooWand), "* "+getitemlink(ReinbooWand));
+ msObjective(countitem(ApprenticeWand), "* "+getitemlink(ApprenticeWand));
+ msObjective(countitem(LeaderWand), "* "+getitemlink(LeaderWand));
+ msObjective(countitem(MysticWand), "* "+getitemlink(MysticWand));
+ next;
+ if (countitem(TrainingWand) &&
+ countitem(NoviceWand) &&
+ countitem(ReinbooWand) &&
+ countitem(ApprenticeWand) &&
+ countitem(LeaderWand) &&
+ countitem(MysticWand)) {
+ #COLLECTOR = #COLLECTOR|COLLECT_WANDS;
+ getitembound SilverBell, 1, 1;
+ mesc l("CONGRATULATIONS! You have obtained the %s.", getitemlink(SilverBell)), 3;
+ next;
+ }
+ break;
+ // Quivers
+ case 16:
+ msObjective(countitem(LeatherQuiver), "* "+getitemlink(LeatherQuiver));
+ msObjective(countitem(IronQuiver), "* "+getitemlink(IronQuiver));
+ msObjective(countitem(BronzeQuiver), "* "+getitemlink(BronzeQuiver));
+ msObjective(countitem(PlatinumQuiver), "* "+getitemlink(PlatinumQuiver));
+ next;
+ if (countitem(LeatherQuiver) &&
+ countitem(IronQuiver) &&
+ countitem(BronzeQuiver) &&
+ countitem(PlatinumQuiver)) {
+ #COLLECTOR = #COLLECTOR|COLLECT_QUIVERS;
+ getitembound SilverBell, 1, 1;
+ mesc l("CONGRATULATIONS! You have obtained the %s.", getitemlink(SilverBell)), 3;
+ next;
+ }
+ break;
+ // Mounts
+ case 17:
+ msObjective(countitem(LegendaryTortuga), "* "+getitemlink(LegendaryTortuga));
+ msObjective(countitem(LegendaryMouboo), "* "+getitemlink(LegendaryMouboo));
+ next;
+ if (countitem(LegendaryTortuga) &&
+ countitem(LegendaryMouboo)) {
+ #COLLECTOR = #COLLECTOR|COLLECT_MOUNTS;
+ getitembound SilverBell, 1, 1;
+ mesc l("CONGRATULATIONS! You have obtained the %s.", getitemlink(SilverBell)), 3;
+ next;
+ }
+ break;
+ // Pets (2x bells)
+ case 18:
+ msObjective(countitem(CreasedShirt), "* "+getitemlink(CreasedShirt));
+ next;
+ break;
+ case 19:
+ openshop;
+ closeclientdialog;
+ close;
+ break;
+ }
+
+ } while (@menu != 0);
+ close;
+
+OnInit:
+ .distance=5;
+ tradertype(NST_CUSTOM);
+
+ // Sell: Aethyr Points, Strange Coins, Manapple, Supreme Gift, Housing Letter 3, Blueprints E, SaviorBlueprint, BoxsetEE, Tux/Linarian Soul, SunnyCrystal?, X Cards,
+ // Pets → Strange Coin
+ // You can get up to 18 stamps, but pets and hats give 2x
+ // Plan wisely and accordingly
+ sellitem SunnyCrystal, 12;
+ sellitem LegendaryMouboo, 11;
+ sellitem LegendaryTortuga, 10;
+ sellitem SupremeGift, 9;
+ sellitem PrismGift, 8;
+ sellitem MysteriousFruit, 7;
+ sellitem LinarianSoul, 6;
+ sellitem SaviorBlueprint, 5;
+ sellitem TuxSoul, 4;
+ sellitem GoldenGift, 3;
+ sellitem MercBoxEE, 2;
+ sellitem HousingLetterIII, 2;
+ sellitem ReflectCardX, 2;
+ sellitem SpeedCardX, 2;
+ sellitem PowerCardX, 2;
+ sellitem WallCardX, 2;
+ sellitem NecromancerCardX, 1;
+ sellitem HeroCardX, 1;
+ sellitem KnightCardX, 1;
+ sellitem ClericCardX, 1;
+ sellitem DruidCardX, 1;
+ sellitem MageCardX, 1;
+ sellitem NinjaCardX, 1;
+ sellitem NatureCardX, 1;
+ sellitem LightGreenDiamond, 1;
+ end;
+
+/* set currency to be item 828 */
+OnCountFunds:
+ setcurrency(countitem(SilverBell));
+ end;
+
+/* @price is total cost. @points is if we accept two items as currency. */
+OnPayFunds:
+ //dispbottom "Hi: price="+@price+" and points="+@points;
+ if( countitem(SilverBell) < @price )
+ end;
+ delitem SilverBell, @price;
+ purchaseok();
+ end;
+
+}
diff --git a/npc/017-1/guards.txt b/npc/017-1/guards.txt
new file mode 100644
index 0000000..b5606c5
--- /dev/null
+++ b/npc/017-1/guards.txt
@@ -0,0 +1,80 @@
+// TMW2 scripts.
+// Authors:
+// Jesusalva
+// Description:
+// Protect LoF
+
+// Handle Guard's logic
+function script LofGuard {
+ mesn;
+ mesq l("I am stationed here to protect Land Of Fire from monsters.");
+ next;
+ mesn;
+ mesq l("I mean, there's even an Monster King? What sort of world is this?!");
+ close;
+ return;
+}
+
+017-1,79,43,0 script Guard#lof-1 NPC_GUARD2,{
+ LofGuard();
+ end;
+
+OnInit:
+ .sex = G_FEMALE;
+ .distance = 5;
+ end;
+}
+
+
+017-1,220,44,0 script Guard#lof-2 NPC_GUARD1,{
+ LofGuard();
+ end;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 5;
+ end;
+}
+
+017-1,193,69,0 script Guard#lof-3 NPC_GUARD2,{
+ LofGuard();
+ end;
+
+OnInit:
+ .sex = G_FEMALE;
+ .distance = 5;
+ end;
+}
+
+
+017-1,69,108,0 script Guard#lof-4 NPC_GUARD1,{
+ LofGuard();
+ end;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 5;
+ end;
+}
+
+017-1,90,149,0 script Guard#lof-5 NPC_GUARD1,{
+ LofGuard();
+ end;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 5;
+ end;
+}
+
+
+017-1,85,223,0 script Guard#lof-6 NPC_GUARD2,{
+ LofGuard();
+ end;
+
+OnInit:
+ .sex = G_FEMALE;
+ .distance = 5;
+ end;
+}
+
diff --git a/npc/017-1/guild.txt b/npc/017-1/guild.txt
new file mode 100644
index 0000000..d984285
--- /dev/null
+++ b/npc/017-1/guild.txt
@@ -0,0 +1,46 @@
+// Moubootaur Legends Script
+// Author:
+// Jesusalva
+// Description:
+// Guild House
+
+017-1,57,33,0 script #GDoor NPC_NO_SPRITE,0,0,{
+ end;
+OnTouch:
+ if (getcharid(2) < 1) {
+ dispbottom l("The door is locked.");
+ end;
+ }
+ // Warp you to your guild house if exist.
+ // Build the instance otherwise.
+
+ // Well, "checking if instance exist by mapname" is an illusion.
+ // So we try to build and if we fail, we warp the player to the instance.
+ .@ID=getcharid(2);
+ @MAP_NAME$="guild@"+str(.@ID); // Max 4 chars for map name
+
+ .@INSTID = instance_create("guilds@a"+(.@ID), getcharid(2), IOT_GUILD);
+
+ // Instance already exists - .@INSTID returns "-4"
+ if (.@INSTID == -4) {
+ warp @MAP_NAME$, any(34,35), 48;
+ end;
+ }
+
+ .@instanceMapName$ = instance_attachmap("guilds", .@INSTID, 0, @MAP_NAME$);
+
+ instance_set_timeout(0, 0, .@INSTID);
+ instance_init(.@INSTID);
+ warp @MAP_NAME$, any(34,35), 48;
+ end;
+
+}
+
+017-1,58,32,0 script #GSign NPC_NO_SPRITE,{
+ mesc l("Guild Hall");
+ close;
+
+OnInit:
+ .distance=3;
+ end;
+}
diff --git a/npc/017-1/mapflags.txt b/npc/017-1/mapflags.txt
new file mode 100644
index 0000000..99a6ba9
--- /dev/null
+++ b/npc/017-1/mapflags.txt
@@ -0,0 +1,9 @@
+017-1 mapflag town
+017-1 mapflag nopenalty
+017-2 mapflag town
+017-3 mapflag town
+017-4 mapflag town
+017-5 mapflag town
+017-6 mapflag town
+017-7 mapflag town
+017-8 mapflag town
diff --git a/npc/017-1/misc.txt b/npc/017-1/misc.txt
new file mode 100644
index 0000000..5dabba3
--- /dev/null
+++ b/npc/017-1/misc.txt
@@ -0,0 +1,257 @@
+// TMW2/LoF scripts.
+// Authors:
+// Jesusalva
+// Description:
+// Essential scripts any city must have
+
+// Description:
+// The Travelers travel around the world telling stories.
+017-1,144,204,0 script Elen The Traveler NPC_F_COINKEEPER,{
+
+ mesn;
+ if (strcharinfo(0) == $MOST_HEROIC$) mesq l("Wow! Are you @@? Everyone, in every city, talks about you!", $MOST_HEROIC$);
+ if (strcharinfo(0) == $MOST_HEROIC$) next;
+
+ mesq l("Hello. I am @@, and I am from a family of travellers. We travel though the whole world, looking for exotic goods.", .name$);
+ next;
+ mesq l("You can buy rare items with me, or I can tell you about different cities in our world.");
+
+L_Menu:
+ mes "";
+ menu
+ l("I want to trade with you."), L_Trade,
+ l("Tell me about Tulimshar."), L_Tulim,
+ l("Tell me about Hurnscald."), L_Hurns,
+ l("Tell me about Nivalis."), L_Nival,
+ l("Tell me about Artis."), L_Artis,
+ l("Tell me about Frostia."), L_Frost,
+ l("Tell me about Halinarzo."), L_Halin,
+ l("Sorry, I'll pass."), L_Close;
+
+L_Tulim:
+ mes "";
+ mesn;
+ mesq l("Tulimshar is the oldest human city, and its foundation is the year zero of our calendar.");
+ next;
+ mesq l("The city only flourished because Janett Platinum had the idea to build city walls surrounding this city.");
+ next;
+ mesq l("The desert climate means you'll find mostly maggots and scorpions. Their drops include cactus drinks, cake, knifes, black pearls, gold, and other common things.");
+ next;
+ mesq l("You can find for a good price desert equipment and some kind of dyes. You find all sort of crafters, artisans and warriors here.");
+ next;
+ goto L_Menu;
+
+L_Hurns:
+ mes "";
+ mesn;
+ mesq l("Hurnscald was founded after Tulimshar, in more fertile lands. Their walls are not so sturdy as the ones of Tulimshar.");
+ next;
+ mesq l("Under the leadership of King Wusher, they were the first to accept immigrants from other races. You will find humans and non-humans there.");
+ next;
+ mesq l("The fertile climate is ideal for mushrooms. You can also find lots of wood.");
+ next;
+ mesq l("Their economy provide many edible items and potions.");
+ next;
+ goto L_Menu;
+
+L_Nival:
+ mes "";
+ mesn;
+ mesq l("Nivalis was the last human settlement built during the First Era.");
+ next;
+ mesq l("It's cold, harsh climate makes difficult to live there. It was founded by people thrown away from Tulimshar and Hunrscald for political reasons.");
+ next;
+ mesq l("The cold climate is ideal for slimes, penguins, and other icy creatures. You can find lots of... ice, of course!");
+ next;
+ mesq l("Some items are only produced in Nivalis. After all, it is hard to work properly with ice in a desert!");
+ next;
+ goto L_Menu;
+
+
+L_Artis:
+ mes "";
+ mesn;
+ mesq l("Artis is a city port founded after the Great Fire on the other continent.");
+ next;
+ mesq l("People say it is the second biggest city from the world.");
+ next;
+ mesq l("Different kind of monsters live near the city. For example, blubs. I have no idea of what are those.");
+ next;
+ mesq l("People usually dock there when travelling to the second continent. Nothing exceptional about economy.");
+ next;
+ if ($FIRESOFSTEAM) {
+ mesq l("They used to export food and other things but there has been radio silence recentely; Which is why Andrei Sakar and a group of adventurers borrowed Nard's ship and went to investigate.");
+ next;
+ }
+ goto L_Menu;
+
+
+L_Frost:
+ mes "";
+ mesn;
+ mesq l("Frostia is the only city known that was not founded by humans.");
+ next;
+ mesq l("They are strict with who is allowed inside, so you'll need either elf or ukar friends to pass.");
+ next;
+ mesq l("It is on a huge, icy mountain peak. Rumors about dragons and legendary items to be found.");
+ next;
+ mesq l("Some of finest elven craftmanship can be found there, like bows, for example.");
+ next;
+ goto L_Menu;
+
+L_Halin:
+ mes "";
+ mesn;
+ mesq l("Halinarzo was founded to explore Mana Stones.");
+ next;
+ mesq l("You can find both huge swamps, as huge desertic areas near and on it.");
+ next;
+ mesq l("Lizards are the main monster found, and they steal gold from innocent bypassers.");
+ next;
+ mesq l("Without any mana stone left, and because the walls were not very strong, most of the city was destroyed.");
+ next;
+ mesq l("Unlike many other cities, if you want people in eternal need of items, there is a good place to look.");
+ next;
+ goto L_Menu;
+
+
+L_Trade:
+ mesn;
+ mesq l("Use your @@ as currency!", getitemlink(StrangeCoin));
+ tutmes l("%s is obtained during events, daily logins, heroic deeds, gifts, etc. But cannot be bought with real money.", getitemlink(StrangeCoin));
+ next;
+ openshop "Aeros Trader";
+ closedialog;
+
+L_Close:
+ close;
+
+OnInit:
+ .@npcId = getnpcid(.name$);
+ setunitdata(.@npcId, UDT_HEADTOP, NPCEyes);
+ setunitdata(.@npcId, UDT_HEADMIDDLE, UglyChristmasSweater);
+ setunitdata(.@npcId, UDT_HEADBOTTOM, JeansShorts);
+ setunitdata(.@npcId, UDT_WEAPON, CandorBoots); // Boots
+ setunitdata(.@npcId, UDT_HAIRSTYLE, 27);
+ setunitdata(.@npcId, UDT_HAIRCOLOR, 11);
+ npcsit;
+
+ .sex = G_FEMALE;
+ .distance = 5;
+ end;
+}
+
+// Description:
+// Banker.
+017-3,85,41,0 script Stalman NPC_LLOYD,{
+ Banker(.name$, "Land Of Fire Village", 10000);
+ close;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 5;
+ end;
+}
+
+// Description:
+// Barber.
+
+017-1,147,176,0 script Milocat NPC_ELVEN_FEMALE_ARMOR_SHOP,{
+ function setRace {
+ clear;
+ setnpcdialogtitle l("%s - Modify Race", .name$);
+ mes l("Race") + ": " + get_race();
+ next;
+ mes l("Please select the desired race.");
+ select
+ l("Kaizei Human"),
+ l("Argaes Human"),
+ l("Tonori Human"),
+ l("Elf"),
+ l("Orc"),
+ l("Raijin"),
+ l("Tritan"),
+ l("Ukar"),
+ l("Redy"),
+ l("Savior");
+ switch (@menu)
+ {
+ default:
+ jobchange max(0, @menu-1);
+ }
+ return;
+ }
+
+
+ mesn;
+ mesq l("Hi! Do you want a hair cut?");
+
+ do
+ {
+ select
+ l("What is my current hairstyle and hair color?"),
+ l("I'd like to get a different style."),
+ l("Can you do something with my color?"),
+ rif(is_gm() || REBIRTH >= 5, l("I want to change my Race!")),
+ l("I'm fine for now, thank you.");
+
+ switch (@menu)
+ {
+ case 1:
+ BarberSayStyle 3;
+ break;
+ case 2:
+ BarberChangeStyle;
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Enjoy your new style.");
+ l("Anything else?");
+ break;
+ case 3:
+ BarberChangeColor;
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("I hope you like this color.");
+ l("Anything else?");
+ break;
+ case 4:
+ setRace;
+ break;
+ case 5:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Feel free to come visit me another time.");
+
+ goodbye;
+ }
+ } while (1);
+ close;
+
+
+OnInit:
+ .sex = G_FEMALE;
+ .distance = 5;
+ end;
+}
+
+
+
+
+
+
+
+
+// Whatever event use #RARE_POINTS
+// Which is a script variable, meaning it will be a really special event.
+// Side Note: Might as well add a special cap for such situations.
+017-1,118,83,0 script Pydisgner#spoints NPC_GUGLI,{
+ mesn;
+ mesq l("Hello %s and welcome to Land Of Fire Village. This used to be a whole server before the Monster King crashed it down here.", strcharinfo(0));
+ next;
+ mesn;
+ mesq l("In this town you'll find many critical things for your journey, like artifacts, dungeons, crafts and refiners. Please enjoy your stay. And keep tuned for news about us!");
+ mes "@@https://discord.gg/q3Bwzgf|LoF Discord Server@@";
+ close;
+
+OnInit:
+ .sex = G_OTHER;
+ .distance=5;
+ end;
+}
diff --git a/npc/017-1/nowhere_man.txt b/npc/017-1/nowhere_man.txt
new file mode 100644
index 0000000..a743cbb
--- /dev/null
+++ b/npc/017-1/nowhere_man.txt
@@ -0,0 +1,137 @@
+// TMW2/LoF scripts.
+// Authors:
+// TMW-LoF Team
+// Jesusalva
+// Description:
+// Pachua's Cousin. On LoF/TMWA he also crafted Iron Powder, Sulfur Powder, and Yellow Powder (for magic)
+// IMPORTANT @Saulc : DO NOT GIVE ANY EXPERIENCE ON THIS NPC.
+// This is sort of a bet, you know. “Go hunt Mountain Snakes”, or bet some precious
+// crafting material on this NPC. Two choices. The easy way is RISKY, not REWARDING.
+// The refund is the exact fair price, retrieved from database. The only "loss" here
+// is that you would rather do something else with Leather Patch but instead, you "sold" it.
+// If you sell items you don't get experience, so you shouldn't get any exp here either.
+//
+// This NPC could as well do Jeans Shorts, but I'm too lazy to calculate formula now.
+// The price is Cave Snake Skin in proportion to Jean Shorts rarity, and cost in proportion
+// to sell price difference.
+
+017-1,155,162,0 script Nowhere Man NPC_KAYLO,{
+ mesn;
+ mesq l("Welcome! I come from nowhere, and my family hunt Snakes. We also make fine leather items from their skin!");
+ next;
+ mesn;
+ mesq l("Next time an annoying snake refuses to drop their precious leather drops, come talk to us!");
+ // 160 * 1 = 160 GP vs 500 GP (340 GP)
+ mesq l("And if you bring me 1 @@ and 440 GP, I can make a @@ for you.", getitemlink(SnakeSkin), getitemlink(LeatherPatch));
+ mesq l("Or I could recover the @@ for 10 @@ and the modest fee of 4400 GP.", getitemlink(SnakeSkin), getitemlink(LeatherPatch));
+ next;
+ select
+ l("Nice to know. I'll come to you when random numbers try to kill me."),
+ rif(countitem(SnakeSkin) >= 1 && Zeny >= 440, l("I want Leather Patch")),
+ rif(countitem(LeatherPatch) >= 10 && Zeny >= 4400, l("I want Snake Skin"));
+
+ switch (@menu) {
+ case 2:
+ inventoryplace LeatherPatch, 1;
+ delitem SnakeSkin, 1;
+ Zeny=Zeny-440;
+ getitem LeatherPatch, 1;
+ mesn;
+ mesq l("Many thanks!");
+ break;
+ case 3:
+ inventoryplace SnakeSkin, 1;
+ delitem LeatherPatch, 10;
+ Zeny=Zeny-4400;
+ getitem SnakeSkin, 1;
+ mesn;
+ mesq l("Many thanks!");
+ break;
+ }
+ close;
+
+OnInit:
+ .sex=G_MALE;
+ .distance=5;
+ end;
+}
+
+
+
+017-1,174,169,0 script Nowhere Jeane NPC_SAMANTHA,{
+ mesn;
+ // 95 * 2 = 190 GP vs 400 GP (210 GP)
+ mesq l("If you bring me 2 @@ and 210 GP, I can make a @@ for you.", getitemlink(CaveSnakeSkin), getitemlink(JeansShorts));
+ mesq l("Or I can swap the @@ with a @@ - for only 2100 GP.", getitemlink(JeansShorts), getitemlink(CaveSnakeSkin));
+ next;
+ select
+ l("Nice to know. I'll come to you when random numbers try to kill me."),
+ rif(countitem(CaveSnakeSkin) >= 2 && Zeny >= 210, l("I want it.")),
+ rif(countitem(JeansShorts) && Zeny >= 2100, l("I don't care for equipment, gimme a snake skin."));
+
+ switch (@menu) {
+ case 2:
+ inventoryplace JeansShorts, 1;
+ delitem CaveSnakeSkin, 2;
+ Zeny=Zeny-210;
+ getitem JeansShorts, 1;
+ mesn;
+ mesq l("Many thanks!");
+ break;
+ case 3:
+ inventoryplace CaveSnakeSkin, 1;
+ delitem JeansShorts, 1;
+ Zeny=Zeny-2100;
+ getitem CaveSnakeSkin, 1;
+ mesn;
+ mesq l("Many thanks!");
+ break;
+ }
+ close;
+
+
+OnInit:
+ .sex=G_FEMALE;
+ .distance=5;
+ end;
+
+}
+
+
+017-1,143,161,0 script Nowhere Gluvine NPC_SERENA,{
+ mesn;
+ // 320 * 6 = 1920 GP vs 450 GP (-)
+ mesq l("If you bring me 6 @@ I can make a @@ for you.", getitemlink(MountainSnakeSkin), getitemlink(LeatherGloves));
+ mesq l("Or I can swap the @@ with a @@ - for free.", getitemlink(LeatherGloves), getitemlink(MountainSnakeSkin));
+ next;
+ select
+ l("Nice to know. I'll come to you when random numbers try to kill me."),
+ rif(countitem(MountainSnakeSkin) >= 6, l("I want it.")),
+ rif(countitem(LeatherGloves), l("I don't care for shorts, gimme a snake skin."));
+
+ switch (@menu) {
+ case 2:
+ inventoryplace LeatherGloves, 1;
+ delitem MountainSnakeSkin, 6;
+ getitem LeatherGloves, 1;
+ mesn;
+ mesq l("Many thanks!");
+ break;
+ case 3:
+ inventoryplace MountainSnakeSkin, 1;
+ delitem LeatherGloves, 6;
+ getitem MountainSnakeSkin, 1;
+ mesn;
+ mesq l("Many thanks!");
+ break;
+ }
+ close;
+
+
+OnInit:
+ .sex=G_FEMALE;
+ .distance=5;
+ end;
+
+}
+
diff --git a/npc/017-1/paxel.txt b/npc/017-1/paxel.txt
new file mode 100644
index 0000000..8a461c2
--- /dev/null
+++ b/npc/017-1/paxel.txt
@@ -0,0 +1,263 @@
+// TMW2/LoF Script
+// This is from LoF Forums, to replace LoF Paxel
+//----------------------------------------------------
+// PRSM Helmet quest (seasonal quest)
+// Create Quest: Darlord (Depredador)
+//----------------------------------------------------
+
+// Old Paxel turned Raw Coal in Coal... But we don't have Raw Coal.
+// He probably used the nice furnace NPC too... We will need another NPC to use that...
+
+017-1,131,22,0 script Paxel NPC_PLAYER,0,0,{
+ function maybeTowel;
+ if (maybeTowel())
+ npctalk3 l("I hope that strange towel man doesn't bother me again...");
+ else if (rand2(10) == 4)
+ npctalk3 l("I'm glad there's no annoying towel man. He keeps coming back to annoy me!");
+ .@q=getq(SQuest_Paxel);
+ if(.@q == 2) goto L_Done;
+ if (season() != SPRING && !$@GM_OVERRIDE) goto L_OutOfSeason;
+ if(.@q == 1) goto L_Ask2;
+
+ if (BaseLevel >= 55) goto L_Ask1;
+
+L_OutOfSeason:
+ mesn;
+ mesq l("Hello! Calm wind today!");
+ menu
+ l("Yes, but I like windy days."), L_Wind,
+ l("Hmm... sorry but gotta go..."), L_Go;
+ close;
+
+L_Go:
+ mesn;
+ mesq l("Ok, good trip then.");
+ close;
+
+L_Wind:
+ mesn;
+ mesq l("I don't like them, I can't fly straight.");
+ next;
+ mesn;
+ if (BaseLevel < 55)
+ mesq l("Well, not like you could understand that with your level! %%a");
+ else
+ mesq l("This is why I love spring!");
+ close;
+
+// ----------------------------------------------------
+// Desert Helmet quest start
+// ----------------------------------------------------
+L_Ask1:
+ mesn;
+ mesq l("Hello @@! Do you have some @@ with you?", strcharinfo(0), getitemlink(TerraniteOre));
+
+ menu
+ rif(countitem(TerraniteOre),l("Yes... right... what about Terranite Ore?")), L_Quest1,
+ rif(countitem(TerraniteOre),l("Yes, but I have grown attached to Terranite Ore...")), L_No,
+ l("Right, but now I have business in other places."), L_Rude;
+ close;
+
+L_Quest1:
+ mesn;
+ mesq l("Terranite Ore is a really special item. People without helmets can't understand @@'s real power, anyway if you could give me some of them you would understand why they are so special.", getitemlink(TerraniteOre));
+
+ menu
+ l("Certainly, you can have all my Terranite Ore."), L_Check1,
+ l("Sorry but I am not interested in that."), L_No;
+ close;
+
+L_No:
+ mesn;
+ mesq l("Ok, come back me when you want to know the @@ real power!", getitemlink(TerraniteOre));
+ close;
+
+L_Rude:
+ mesn;
+ mesq l("Well, good luck with your business.");
+ close;
+
+
+// ----------------------------------------------------
+// Arc 1: Terranite Ores
+// ----------------------------------------------------
+L_Check1:
+ if (countitem(TerraniteOre) < 4)
+ goto L_More_Needed1;
+
+ delitem TerraniteOre, 4;
+ getexp 15000, 150;
+ setq SQuest_Paxel, 1;
+ mesn;
+ mesq l("Perfect! you have enough Terranite Ore, I will take them for now but I need other items in order to bring them to life.");
+ next;
+
+L_Ask2:
+ mesn;
+ mesq l("I need a suitable base helmet, some herbs to use my magical dye, and gold:");
+ mesc l("@@/1 @@", countitem(MinerHat), getitemlink(MinerHat));
+ mesc l("@@/5 @@", countitem(GrassSeeds), getitemlink(GrassSeeds));
+ mesc l("@@/100 @@", countitem(PinkAntenna), getitemlink(PinkAntenna));
+ mesc l("@@/?? @@", countitem(CobaltHerb), getitemlink(CobaltHerb));
+ mesc l("@@/@@ GP", format_number(Zeny), format_number(10000));
+
+ menu
+ l("Please have a look, I have what you asked"), L_Check2,
+ l("On my way to get what you need."), -;
+ close;
+
+
+// ----------------------------------------------------
+// Arc 2: Prsm Helmet
+// ----------------------------------------------------
+L_Check2:
+ if (countitem(PinkAntenna) < 100 || countitem(MinerHat) < 1 || countitem(GrassSeeds) < 5 || countitem(CobaltHerb) < 60)
+ goto L_More_Needed2;
+ if (Zeny < 10000) {
+ mesn;
+ mesq l("You can't afford my work! Do some odd jobs and come back.");
+ close;
+ }
+
+ inventoryplace PrsmHelmet, 1;
+ delitem PinkAntenna, 100;
+ delitem MinerHat, 1;
+ delitem GrassSeeds, 5;
+ delitem CobaltHerb, 60;
+ //delitem TerraniteOre, 20;
+ getexp 60000, 0;
+ getitem PrsmHelmet, 1;
+ setq SQuest_Paxel, 2;
+ mesn;
+ mesq l("There you go, a special and rare @@!", getitemlink(PrsmHelmet));
+ close;
+
+// ----------------------------------------------------
+// Failure: Insufficient material
+// ----------------------------------------------------
+L_More_Needed1:
+ mesn;
+ mesq l("Your @@ is not enough, please look for more.", getitemlink(TerraniteOre));
+ close;
+
+L_More_Needed2:
+ mesn;
+ mesq l("I am sorry but I can see that you don't have all that I asked you.");
+ next;
+ mesn;
+ mesq l("Please bring me that or I won't be able to make something really special for you.");
+ close;
+
+
+// ----------------------------------------------------
+// Quest complete
+// ----------------------------------------------------
+L_Done:
+ mesn;
+ mesq l("Hello winged friend! How is the wind today?");
+
+ menu
+ rif(season() == SPRING || $@GM_OVERRIDE, l("It's spring, when the wind is always good.")), L_Spring,
+ l("Calm, perfect for a fly!"), L_Fly,
+ l("Gale, not good to fly."), L_Wind2;
+ close;
+
+L_Fly:
+ mesn;
+ mesq l("Haha yes, you are right!");
+ close;
+
+L_Wind2:
+ mesn;
+ mesq l("Yep, I never fly in these days.");
+ close;
+
+// TODO: Maybe we can add something else here
+L_Spring:
+ mesn;
+ mesq l("Hahah, good to hear! Do you know some items are only dropped on spring? You should go after them!");
+ close;
+
+// Saulc/Omatt/Prsm minigame
+OnTouch:
+ if (BaseLevel < 20)
+ {
+ die(); // Shouldn't be here
+ end;
+ }
+ addtimer(100, "Paxel::OnOmattizator");
+ end;
+
+OnOmattizator:
+ if (!isin("017-1", 131, 22, 0))
+ end;
+ if (!issit())
+ {
+ addtimer(100, "Paxel::OnOmattizator");
+ end;
+ }
+ npctalk3 l("Unsit me at once!");
+ emotion E_FURIOUS;
+ addtimer(3000, "Paxel::OnOmattizator2");
+ end;
+
+OnOmattizator2:
+ if (!isin("017-1", 131, 22, 0))
+ end;
+ if (!issit())
+ {
+ addtimer(100, "Paxel::OnOmattizator");
+ end;
+ }
+ npctalk3 l("Unsit me OR I'LL KILL YOU in name of my father, Prsm!");
+ emotion E_FURIOUS;
+ addtimer(3000, "Paxel::OnOmattizator3");
+ end;
+
+OnOmattizator3:
+ if (!isin("017-1", 131, 22, 0))
+ end;
+ if (!issit())
+ {
+ addtimer(100, "Paxel::OnOmattizator");
+ end;
+ }
+ npctalk3 l("I HAVE WARNED YOU!!!!!");
+ emotion E_FURIOUS;
+ addtimer(3000, "Paxel::OnOmattizator4");
+ end;
+
+OnOmattizator4:
+ if (!isin("017-1", 131, 22, 0))
+ end;
+ if (!issit())
+ {
+ addtimer(100, "Paxel::OnOmattizator");
+ end;
+ }
+ RegEasterEgg(EE_PRSM, 3);
+ npctalk3 l("DIE!");
+
+ slide 130, 23;
+ emotion E_FURIOUS;
+ die();
+ end;
+
+function maybeTowel {
+ return (gettime(GETTIME_MONTH) % 3 == 2 && gettime(GETTIME_DAYOFMONTH) >= 18 && gettime(GETTIME_DAYOFMONTH) <= 25);
+}
+
+OnInit:
+ .@npcId = getnpcid(.name$);
+ setunitdata(.@npcId, UDT_HEADTOP, PrsmHelmet);
+ setunitdata(.@npcId, UDT_HEADMIDDLE, WarlordPlate);
+ setunitdata(.@npcId, UDT_HEADBOTTOM, NPCEyes);
+ setunitdata(.@npcId, UDT_WEAPON, JeansChaps);
+ setunitdata(.@npcId, UDT_HAIRSTYLE, 24);
+ setunitdata(.@npcId, UDT_HAIRCOLOR, 14);
+
+ .sex=G_MALE;
+ .distance=5;
+ end;
+
+}
diff --git a/npc/017-1/pet_detective.txt b/npc/017-1/pet_detective.txt
new file mode 100644
index 0000000..388df8a
--- /dev/null
+++ b/npc/017-1/pet_detective.txt
@@ -0,0 +1,139 @@
+// TMW2/LoF scripts.
+// Authors:
+// TMW-LoF Team
+// Jesusalva
+// Description:
+// Sell pets (LoFQuest_Pets) (mesn Ace Ventura)
+
+017-1,192,23,0 script Pet Detective NPC_PET_TAMER,{
+ // Not registered
+ .@q=getq(LoFQuest_Pets);
+ if (!.@q)
+ goto L_Register;
+
+ // Out Of Stock
+ if (.stock <= 0)
+ goto L_OutOfStock;
+
+ // Normal
+ goto L_Menu;
+
+L_Register:
+ mesn l("Ace Ventura");
+ mesq l("I investigate missing pets. Many flee from their owners because they die pathetically or forgot to feed them.");
+ next;
+ mesn l("Ace Ventura");
+ mesq l("If they at least read the @@, they wouldn't have such problems.", getitemlink(PetcaringGuide));
+ mesq l("The Pet Caring Guild will collect them after a while, and capture many others.");
+ next;
+ mesn l("Ace Ventura");
+ mesq l("So, what do you say about a deal? I'll affiliate you on the Pet Caring Guild for only 5.000 GP!");
+ if (Zeny < 5000)
+ close;
+ next;
+ if (askyesno() == ASK_NO)
+ close;
+ mes "";
+ if (Zeny < 5000) {
+ mesn l("Ace Ventura");
+ mesq l("Oh, but we are affiliated with Jesusalva, whom hates cheaters. So, meet your dismissal!");
+ die();
+ /*
+ .@val=(Zeny/10)*2;
+ Zeny=(Zeny/10)*8; // You pay 20% of your GP as tax-money. Hasan gladly takes the money. Jesusalva's happy.
+ $HASAN_GP+=.@val;
+ */
+ close;
+ }
+ Zeny=Zeny-5000;
+ getexp 0, 500;
+ setq LoFQuest_Pets, 1;
+ setarray PETMEMO, 0, 0;
+ mesn l("Ace Ventura");
+ mesq l("Congrats! You are now part from the Pet Caring Guild. You can now buy pets! %%G");
+ close;
+
+L_Menu:
+ mesn l("Ace Ventura");
+ mesq l("I currently have some pets with me. For most, you need to finish their Grand Hunter Quest, of course.");
+ mes "";
+ mesc l("Note: some pets still weren't implemented!");
+ mesc l("If you unlock a pet but it is missing on this list, this means nobody elese unlocked them yet."), 1;
+ mesc l("So, you are the first and must contact Jesusalva %%g"), 1;
+ mes "";
+ select
+ rif(PDQ_CheckGHQ(Maggot) >= 10000 && !countitem(MaggotCocoon), l("Cute Maggot")),
+ rif(PDQ_CheckGHQ(ForestMushroom) >= 10000 && !countitem(ForestShroomEgg), l("Forest Mushroom")),
+ rif(PDQ_CheckGHQ(Fluffy) >= 10000 && !countitem(FluffyEgg), l("Commmon Fluffy")),
+ rif(PDQ_CheckGHQ(Duck) >= 10000 && !countitem(DuckEgg), l("Duck")),
+ rif(PDQ_CheckGHQ(Bat) >= 10000 && !countitem(BatEgg), l("Bat")),
+ rif(PDQ_CheckGHQ(Moggun) >= 10000 && !countitem(MoggunEgg), l("Moggun")),
+ rif(PDQ_CheckGHQ(GreenDragon) >= 10000 && !countitem(DragonHorn), l("Green Dragon")),
+ rif(PDQ_CheckGHQ(Snake) >= 10000 && !countitem(TamedSnakeEgg), l("Tamed Snake")),
+ rif(#LOGIN_ALLTIME >= 6 && !countitem(PiouEgg), l("Piou")),
+ l("Nothing at the moment.");
+
+ mes "";
+ switch (@menu) {
+ case 1:
+ if (PDQ_InnerSwitch(Maggot, MaggotSlime, 35))
+ .stock-=1;
+ break;
+ case 2:
+ if (PDQ_InnerSwitch(ForestMushroom, MushroomSpores, 30))
+ .stock-=1;
+ break;
+ case 3:
+ if (PDQ_InnerSwitch(Fluffy, WhiteFur, 80))
+ .stock-=1;
+ break;
+ case 4:
+ if (PDQ_InnerSwitch(Duck, CommonCarp, 4))
+ .stock-=1;
+ break;
+ case 5:
+ if (PDQ_InnerSwitch(Bat, BatWing, 80))
+ .stock-=1;
+ break;
+ case 6:
+ if (PDQ_InnerSwitch(Moggun, WhiteFur, 120))
+ .stock-=1;
+ break;
+ case 7:
+ if (PDQ_InnerSwitch(GreenDragon, DragonScales, 65))
+ .stock-=1;
+ break;
+ case 8:
+ if (PDQ_InnerSwitch(Snake, SnakeTongue, 17))
+ .stock-=1;
+ break;
+ case 9:
+ if (PDQ_InnerSwitch(Piou, PiouFeathers, 80))
+ .stock-=1;
+ break;
+ default:
+ closedialog;
+ goodbye;
+ close;
+ }
+
+ next;
+ goto L_Menu;
+
+L_OutOfStock:
+ mesn l("Ace Ventura");
+ mesq l("Sorry, I don't have any pets at the moment.");
+ close;
+
+OnInit:
+ .sex=G_MALE;
+ .distance=5;
+ .stock=1;
+ end;
+
+OnSun0000:
+OnWed1200:
+ .stock+=2;
+ end;
+}
+
diff --git a/npc/017-1/roger.txt b/npc/017-1/roger.txt
new file mode 100644
index 0000000..7514d11
--- /dev/null
+++ b/npc/017-1/roger.txt
@@ -0,0 +1,183 @@
+// TMW2/LoF scripts.
+// Authors:
+// TMW-LoF Team
+// Jesusalva
+// Description:
+// Part of George quest.
+// PS. (96,120) save these coordinates
+
+017-1,68,87,0 script Roger NPC_JOURNALMAN,{
+ .@q=getq(LoFQuest_George);
+ mesn;
+ mesq l("Paper! Paper! Get your copy of The Land of Fire Gazette here!");
+ next;
+ mesn;
+ mesq l("Hello @@, may I interest you in a copy of the Gazette? It's only 1 GP!", strcharinfo(0));
+ next;
+ menu
+ l("Yes, please."), L_GetRead,
+ l("No, thank you, kid."), L_TooBad,
+ l("Do you have anything else to read?"), L_ExtraRead;
+
+L_GetRead:
+ mesn;
+ mesq l("Let me see.....");
+ next;
+ if (.@q == 5)
+ goto L_LOF_NEWS;
+ mesq l("Oh yes, here you go, that will be 1 GP.");
+ if (Zeny < 1)
+ goto L_Poor;
+ Zeny = (Zeny-1);
+ mesc l("You are handed the Land of Fire Gazette. You look at the headline...");
+ if (!getskilllv(TMW2_ANCIENTLANGUAGES)) {
+ mesc l("...but it is written in Mananese, a language you know nothing about.");
+ } else {
+ mesc l("...but it is saying some stuff about a merge which happened literally eons ago.");
+ }
+ next;
+ mesc l("You toss the paper in the trash.");
+ close;
+
+L_TooBad:
+ mesn;
+ mesq l("Too bad, There is some really good news this week. Things like how to go to Candor for free.");
+ mesq l("And a special coupon section to get rare items for little or no money!");
+ next;
+ menu
+ l("I changed my mind, I think I would like a copy!"), L_GetRead,
+ l("That's ok, kid... I can't read, anyway."), L_TooBadTwo;
+
+L_TooBadTwo:
+ mesn;
+ mesq l("Too bad, you're really missing out!");
+ close;
+
+L_ExtraRead:
+ mesn;
+ mesq l("Now that you ask....");
+ next;
+ if (.@q == 5)
+ goto L_MadMag;
+ mesn;
+ mesq l("I might be able to get you a rare copy of the Maritime Almanac Scroll. A yearly publication for seafaring men.");
+ mesq l("It is very hard to come by, however, my father has a copy he might sell to you for the right price.");
+ menu
+ l("I will trade you a Dagger and Sailor's Hat for it."), L_BadOffer1,
+ l("I will pay you 5,000 GP in pure gold for it!"), L_BadOffer2,
+ l("I can give you a rare...(cough, cough).. Mouboo Figurine for it."), L_Success,
+ l("I have no interest in things such as that."), -;
+ close;
+
+L_Success:
+ .@q2=getq2(LoFQuest_George);
+ if (.@q2 == 1)
+ goto L_HaveScroll;
+ if (countitem(MoubooFigurine) < 1)
+ goto L_NoMouboo;
+ if (countitem(SailorHat) == 0)
+ goto L_StatNone;
+ mesn;
+ mesq l("This is great! My collection of rare figurines is now complete.");
+ next;
+ mesn;
+ mesq l("I asked my father and he agreed to trade it to you, so here is the last copy of the Maritime Almanac Scroll.");
+ inventoryplace Almanac, 1;
+ delitem MoubooFigurine, 1;
+ getitembound Almanac, 1, 1;
+ setq2 LoFQuest_George, 1;
+ close;
+
+L_BadOffer1:
+ mesn;
+ mesq l("Wow, a Dagger and a Sailor's Hat!");
+ next;
+ mesn;
+ mesq l("Although I really want the Sailor's Hat, but daggers are dangerous for kids to play with.");
+ mesq l("Besides that, do I look like a warrior to you? Why would you give a kid a sharp dagger?");
+ close;
+
+L_BadOffer2:
+ mesn;
+ mesq l("5000 GP? That sure is a lot of gold...");
+ mesq l("but I was hoping for something more valuable. No, thanks.");
+ close;
+
+L_NoMouboo:
+ mesn;
+ mesq l("You said you would trade a real Mouboo Figurine, but now I see you don't have one. Come back when you do.");
+ close;
+
+L_StatNone:
+ mesq l("You might have the Mouboo Figurine, but I don't trust everyone.");
+ if(.@q >= 3)
+ goto L_ShowHat;
+ mesq l("My friend George is much older than I am, go see him and if he trusts you, so will I.");
+ if (.@q < 2)
+ setq LoFQuest_George, 1;
+ close;
+
+L_ShowHat:
+ mesn;
+ mesq l("I heard you have met my good friend George, and you gave him some items that he needed...");
+ next;
+ mesn;
+ mesq l("Didn't he give you anything?");
+ next;
+ mesn;
+ mesq l("If you could show me what he gave you, I might trust you.");
+ close;
+
+L_MadMag:
+ /*
+ mesn;
+ mesq l("I have my favorite book of all times, Moby Dick. Let me read some of it to you....");
+ next;
+ mesc l("Roger begins to read.");
+ mesn;
+ mesq l("Towards thee I roll, thou all-destroying but unconquering whale; to the last I grapple with thee; from hell’s heart I stab at thee; for hate’s sake I spit my last breath at thee. Sink all coffins and all hearses to one common pool! And since neither can be mine, let me then tow to pieces, while still chasing thee, though tied to thee, thou damned whale! Thus, I give up the spear!"); // SORRY TRANSLATORS
+ next;
+ mesn;
+ mesq l("I don't really understand it either, but it's not for sale. Maybe you could come back later so I can read more of it to you.");
+ next;
+ */
+ Journalman(.name$);
+ // >> Will never go past this line
+ mesn;
+ mesq l("Have a nice day!");
+ close;
+
+L_Poor:
+ mesn;
+ mesq l("You don't seem to have enough gold, not even 1 GP...you should really let go of some useless stuff on your inventory.");
+ close;
+
+L_LOF_NEWS:
+ mesn;
+ mesc l("Well I see that you have completed the George Quest!");
+ mesc l("I am actually surprised you clicked me again. Well then, here's the Land of Fire News...");
+ next;
+ mesc l("As you may know, LOF ran on a modified version of The Mana World game, before being merged on TMW2: Moubootaur Legends.");
+ mesc l("However, LoF admins and developers are working on a new game to offer a new experience for players.");
+ next;
+ mesc l("The project is involving only a small group of members, but would welcome anyone who knows how to assist in development.");
+ mesc l("You can always come to #devel on our Discord, or drop by #landoffire on IRC.");
+ next;
+ mesc l("You can also visit our website. And if you want to assist on this server (TMW2: ML), you're welcome too!");
+ mesc l("Oh, and about the Candor travel for 200 GP... Which would be a rare for little or no gold... Well, that's just an attention grabber.");
+ next;
+ mesc l("BUT you can reduce the travel price to everywhere, to as low as 250 GP, by completing QUESTS!");
+ mesc l("And some from the Grand Hunter Quests give you @@, which can be traded with the travelers for rares! Good luck!", getitemlink(StrangeCoin));
+ close;
+
+L_HaveScroll:
+ mesn;
+ mesq l("Looks like I already gave you the Maritime Almanac Scroll. You need to go see George again. I am unable to get another copy for you.");
+ close;
+
+OnInit:
+ .sex=G_MALE;
+ .distance=5;
+ end;
+}
+
diff --git a/npc/017-1/shops.txt b/npc/017-1/shops.txt
new file mode 100644
index 0000000..ac5affe
--- /dev/null
+++ b/npc/017-1/shops.txt
@@ -0,0 +1,112 @@
+// TMW2/LoF scripts.
+// Authors:
+// Jesusalva
+// Description:
+// Random Sellers
+
+017-1,158,184,0 script Billy NPC_M_SHOPKEEPER,{
+ npcshopattach(.name$);
+ shop .name$;
+ close;
+
+OnInit:
+ .@npcId = getnpcid(.name$);
+ setunitdata(.@npcId, UDT_HEADTOP, NPCEyes);
+ setunitdata(.@npcId, UDT_HEADMIDDLE, any(ShortTankTop, CandorShirt, Chainmail));
+ setunitdata(.@npcId, UDT_HEADBOTTOM, RaidTrousers);
+ setunitdata(.@npcId, UDT_WEAPON, LousyMoccasins); // Boots
+ setunitdata(.@npcId, UDT_HAIRSTYLE, 10);
+ setunitdata(.@npcId, UDT_HAIRCOLOR, 9);
+
+ .sex = G_MALE;
+ .distance = 4;
+ sleep(SHOPWAIT);
+ tradertype(NST_MARKET);
+
+ sellitem LOFCoin, -1, 1;
+ sellitem YellowDye, -1, 1;
+ sellitem CottonCloth, -1, 3;
+ sellitem ArrowAmmoBox, -1, 5;
+ sellitem Bullet, -1, 2000;
+ if (!rand2(4))
+ sellitem OolongTea, getiteminfo(OolongTea, ITEMINFO_BUYPRICE)*15/10, rand2(1,3);
+ sellitem WoodenShield, -1, 1;
+ sellitem LeatherShirt, -1, 1;
+ end;
+
+OnClock1250:
+ restoreshopitem WoodenShield, 1;
+ restoreshopitem LeatherShirt, 1;
+OnClock0112:
+ restoreshopitem LOFCoin, -1, 1;
+ restoreshopitem YellowDye, -1, 1;
+ restoreshopitem CottonCloth, -1, 3;
+ restoreshopitem ArrowAmmoBox, -1, 5;
+ restoreshopitem Bullet, -1, 2000;
+ if (!rand2(4))
+ restoreshopitem OolongTea, getiteminfo(OolongTea, ITEMINFO_BUYPRICE)*15/10, rand2(1,3);
+ end;
+
+// Pay your taxes!
+OnBuyItem:
+ debugmes("Purchase confirmed");
+ PurchaseTaxes();
+ end;
+
+OnSellItem:
+ debugmes("Sale confirmed");
+ SaleTaxes();
+ end;
+
+}
+
+// Anagram for 'Demure'.
+// Sells wands and ammo (therefore, not demure, who plays speed-melee, unless she have a secret shop quest)
+017-1,135,185,0 script Drueme NPC_F_SHOPKEEPER,{
+ npcshopattach(.name$);
+ shop .name$;
+ close;
+
+OnInit:
+ .@npcId = getnpcid(.name$);
+ setunitdata(.@npcId, UDT_HEADTOP, NPCEyes);
+ setunitdata(.@npcId, UDT_HEADMIDDLE, any(ShortTankTop, CandorShirt, Chainmail));
+ setunitdata(.@npcId, UDT_HEADBOTTOM, RaidTrousers);
+ setunitdata(.@npcId, UDT_WEAPON, LousyMoccasins); // Boots
+ setunitdata(.@npcId, UDT_HAIRSTYLE, 10);
+ setunitdata(.@npcId, UDT_HAIRCOLOR, 9);
+
+ .sex = G_FEMALE;
+ .distance = 4;
+ sleep(SHOPWAIT);
+ tradertype(NST_MARKET);
+
+ sellitem TrainingWand, -1, 3;
+ sellitem NoviceWand, -1, 2;
+ restoreshopitem ArrowAmmoBox, -1, 5;
+ restoreshopitem IronAmmoBox, -1, 2;
+ restoreshopitem Bullet, -1, 5000;
+ end;
+
+OnSun0346:
+ restoreshopitem TrainingWand, -1, 3;
+ restoreshopitem NoviceWand, -1, 2;
+OnClock0848:
+OnClock2023:
+ restoreshopitem ArrowAmmoBox, -1, 5;
+ restoreshopitem IronAmmoBox, -1, 2;
+ restoreshopitem Bullet, -1, 5000;
+ end;
+
+// Pay your taxes!
+OnBuyItem:
+ debugmes("Purchase confirmed");
+ PurchaseTaxes();
+ end;
+
+OnSellItem:
+ debugmes("Sale confirmed");
+ SaleTaxes();
+ end;
+
+}
diff --git a/npc/017-1/signs.txt b/npc/017-1/signs.txt
new file mode 100644
index 0000000..cbedf30
--- /dev/null
+++ b/npc/017-1/signs.txt
@@ -0,0 +1,106 @@
+// TMW2 scripts.
+// Authors:
+// Jesusalva
+// Description:
+// Easier navigation on LoF Village
+
+// Main Signs
+017-1,71,96,0 script Northwest Avenue#lof NPC_NO_SPRITE,{
+ mesn;
+ mesc "↑ "+l("Unused House");
+ mesc "→ "+l("Northeast Avenue");
+ mesc "↓ "+l("Inn, Dimond's Cove");
+ close;
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 3;
+ end;
+}
+
+
+017-1,114,96,0 script Northeast Avenue#lof NPC_NO_SPRITE,{
+ mesn;
+ mesc "↑ "+l("Houses, Exit");
+ mesc "← "+l("Northwest Avenue");
+ mesc "→ "+l("Tech-User Forge");
+ mesc "↓ "+l("Unused House, Market");
+ close;
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 3;
+ end;
+}
+
+
+017-1,114,147,0 script Southeast Avenue#lof NPC_NO_SPRITE,{
+ mesn;
+ mesc "↑ "+l("↑ Houses, Soul Menhir");
+ mesc "← "+l("Dimond's Cove");
+ mesc "→ "+l("Market Place");
+ mesc "↓ "+l("Houses, Lake Of Tears");
+ close;
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 3;
+ end;
+}
+
+
+
+
+017-1,71,147,0 script Southwest Avenue#lof NPC_NO_SPRITE,{
+ mesn;
+ mesc "↑ "+l("Inn, Houses, Northwest Avenue");
+ mesc "← "+l("Alchemy Shop");
+ mesc "→ "+l("Market Place");
+ close;
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 3;
+ end;
+}
+
+
+// Misc signs
+017-1,71,110,0 script West Avenue#lof NPC_NO_SPRITE,{
+ mesn;
+ mesc "↑ "+l("Northwest Avenue");
+ mesc "← "+l("Fire Breath Inn");
+ mesc "↓ "+l("Southwest Avenue");
+ close;
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 3;
+ end;
+}
+
+017-1,114,63,0 script North Avenue#lof NPC_NO_SPRITE,{
+ mesn;
+ mesc "→ "+l("Dead End");
+ mesc "↓ "+l("Northeast Avenue");
+ close;
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 3;
+ end;
+}
+
+017-1,212,67,0 script Signpost#lof NPC_NO_SPRITE,{
+ mesn;
+ mesc "↑ "+l("↑ Town Hall, Noble District");
+ mesc "← "+l("Land Of Fire Village");
+ mesc "↓ "+l("Transcendence Gate");
+ close;
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 3;
+ end;
+}
+
diff --git a/npc/017-1/soul-menhir.txt b/npc/017-1/soul-menhir.txt
new file mode 100644
index 0000000..74ad4f6
--- /dev/null
+++ b/npc/017-1/soul-menhir.txt
@@ -0,0 +1,20 @@
+// TMW2 scripts.
+// Author:
+// Jesusalva
+// Description:
+// Soul Menhir
+
+017-1,120,86,0 script Soul Menhir#lof NPC_SOUL_OLD,{
+ @map$ = "017-1";
+ setarray @Xs, 119, 120, 121, 119, 120, 121;
+ setarray @Ys, 87, 88, 87, 88, 87, 88;
+ @x = 0;
+ @y = 0;
+ callfunc "SoulMenhir";
+ @map$ = "";
+ cleararray @Xs[0], 0, getarraysize(@Xs);
+ cleararray @Ys[0], 0, getarraysize(@Ys);
+ @x = 0;
+ @y = 0;
+ close;
+}
diff --git a/npc/017-1/stranger.txt b/npc/017-1/stranger.txt
new file mode 100644
index 0000000..c60e988
--- /dev/null
+++ b/npc/017-1/stranger.txt
@@ -0,0 +1,184 @@
+// TMW2/LoF scripts.
+// Authors:
+// var
+// TMW-LoF Team
+// Jesusalva
+// Description:
+// Special quest, can be done every three months, on days 18~25.
+// Months: February, May, August, November
+
+017-1,44,37,0 script Stranger#LoF NPC_LOF_STRANGER,{
+ if (!$@GM_OVERRIDE && (gettime(GETTIME_MONTH) % 3 != 2 || (gettime(GETTIME_DAYOFMONTH) < 18 && gettime(GETTIME_DAYOFMONTH) > 25))) {
+ dispbottom l("An error with Stranger#LoF happened! Please report!!");
+ disablenpc .name$;
+ end;
+ }
+
+ .@q=getq(LoFQuest_Hitchhiker);
+ if (.@q == 2) goto L_Complete;
+ if (.@q == 1) goto L_Quizz;
+ mesn;
+ mesq l("Hello, hello! It's great to see you. Maybe you can help me with a little problem I have.");
+ next;
+ mesn;
+ mesq l("I need some materials to repair my spacesh- ahm, it's not important why I need it."); // Translators: Spacesh(ip)
+ next;
+ mesn;
+ mesq l("Anyway, I'd be really happy if you could give me @@ @@, @@ @@, @@ @@ and @@ @@.",
+ 100, getitemlink(Chagashroom),
+ 3, getitemlink(FluoPowder),
+ 1, getitemlink(TinIngot),
+ 1, getitemlink(TitaniumIngot));
+
+ if (countitem(Chagashroom) < 100 ||
+ countitem(FluoPowder) < 3 ||
+ countitem(TinIngot) < 1 ||
+ countitem(TitaniumIngot) < 1)
+ close;
+ next;
+ mesn;
+ mesq l("Do you have that for me?");
+ if (askyesno() == ASK_NO)
+ close;
+ mes "";
+ // We already checked, cheaters will have their inventory ripped apart and I don't care ~ Jesusalva
+ delitem Chagashroom, 100;
+ delitem FluoPowder, 3;
+ delitem TinIngot, 1;
+ delitem TitaniumIngot, 1;
+ getexp (BaseLevel**2)*5, JobLevel*2;
+ setq LoFQuest_Hitchhiker, 1;
+ mesn;
+ mesq l("Great! Thank you!");
+ next;
+ mesn;
+ mesq l("I have a lot of work to do now. But before you leave...");
+ goto L_Quizz;
+
+L_Quizz:
+ inventoryplace OldTowel, 1;
+ mesn;
+ mesq l("Did you knew May 25th it is a very special day - the Towel Day?");
+ next;
+ mesn;
+ mesq l("To celebrate this I'll ask you some questions about my favourite book, The Hitchhiker's Guide to the Galaxy. If you can answer them, I'll give you something very useful.");
+ next;
+ mesn;
+ mesq l("The answers might need to have whitespaces. DO NOT, BY ALL MEANS, insert two whitespaces instead of one.");
+ mesq l("I'll get so mad at you that even if you are correct, I'll say otherwise. Also, mind special characters.");
+ mesq l("If I don't know the answer in your language, try answering in English. That always works.");
+ mesc l("Are you ready?"), 1;
+ mesc l("There's no time limit on this riddle.");
+ next;
+ if (askyesno() == ASK_NO)
+ close;
+ goto L_Easy;
+
+L_Easy:
+ mes "";
+ mesn;
+ mesq l("The first one is easy.");
+ next;
+ mes "";
+ if (0171_Stranger_BlackBox(EASY))
+ goto L_Medium;
+ else
+ goto L_Fail;
+
+L_Medium:
+ mes "";
+ mesn;
+ mesq l("You're absolutely right. The next one will be more tricky.");
+ next;
+ mes "";
+ if (0171_Stranger_BlackBox(MEDIUM))
+ goto L_Hard;
+ else
+ goto L_Fail;
+
+L_Hard:
+ mes "";
+ mesn;
+ mesq l("Not bad, not bad. Let's see if you can answer an even more difficult one.");
+ next;
+ mes "";
+ if (0171_Stranger_BlackBox(HARD))
+ goto L_Reward;
+ else
+ goto L_Fail;
+
+
+// Failure
+L_Fail:
+ mes "";
+ mesn;
+ if (rand2(1,2) == 1) {
+ mesq l("Sorry, but that's not right.");
+ next;
+ mesn;
+ mesq l("Come try again, some other time.");
+ } else {
+ mesq l("Nah, that's wrong. Come back if you want to try again.");
+ }
+ mesc l("If you are sure your answer is correct, please contact Jesusalva for bug fixing.");
+ close;
+
+// Reward
+L_Reward:
+ mes "";
+ mesn;
+ mesq l("Unbelievable! You're really a wise person.");
+ next;
+ mesn;
+ mesq l("One last question, but this shouldn't be a problem for you.");
+ next;
+ mesn;
+ mesq l("What is the most important item for every hitchhiker to have?");
+ input .@answer$;
+ if (strip(strtolower(.@answer$)) != "towel" && strip(strtolower(.@answer$)) != l("towel"))
+ goto L_Fail;
+ mes "";
+ mesn;
+ mesq l("There you are! A towel is really the most important item for a hitchhiker to have.");
+
+ getitem OldTowel, 1;
+ // If you complete the quest in May, you get 50% more experience
+ if (gettime(GETTIME_MONTH) == MAY)
+ getexp JobLevel*BaseLevel*3/2, BaseLevel*3;
+ else
+ getexp JobLevel*BaseLevel, BaseLevel*2;
+ setq LoFQuest_Hitchhiker, 2;
+ next;
+ mesn;
+ mesq l("It really comes in handy that I have my towel with me. A towel is about the most massively useful thing an inte- ahm, a person can have.");
+ close;
+
+// TODO: Enable another quest after main quest has been completed
+// TODO: Completing sub quest on May shall give better bonus (gettime(GETTIME_MONTH) == MAY)
+// TODO: Keep your Towel well guarded; It can only be obtained once and is required in further quests.
+L_Complete:
+ mesn;
+ mesq l("I have a lot of work to do now.");
+ if (rand2(3) == 2) {
+ next;
+ mesn;
+ mesq l("Annoying Paxel, for example %%o");
+ }
+ close;
+
+// Proccessing Core
+OnInit:
+ .sex=G_OTHER;
+ .distance=5;
+OnClock0000:
+ if (gettime(GETTIME_MONTH) % 3 == 2) {
+ if (gettime(GETTIME_DAYOFMONTH) >= 18 && gettime(GETTIME_DAYOFMONTH) <= 25) {
+ enablenpc .name$;
+ end;
+ }
+ }
+ disablenpc .name$;
+ end;
+
+}
+
diff --git a/npc/017-1/town.txt b/npc/017-1/town.txt
new file mode 100644
index 0000000..9856b71
--- /dev/null
+++ b/npc/017-1/town.txt
@@ -0,0 +1,10 @@
+// TMW-2 Script
+// Author:
+// Jesusalva
+// Description:
+// Reset LOCATION$ when entering a town
+
+017-1,104,103,0 script #LocLoF NPC_HIDDEN,2,2,{
+OnTouch:
+ EnterTown("LoF"); end;
+}
diff --git a/npc/017-1/townhall.txt b/npc/017-1/townhall.txt
new file mode 100644
index 0000000..4251629
--- /dev/null
+++ b/npc/017-1/townhall.txt
@@ -0,0 +1,116 @@
+// TMW2/LoF scripts.
+// Authors:
+// Jesusalva
+// Description:
+// LoF Townhall Access Control
+
+017-1,180,20,0 script #LoF_Townhall01 NPC_NO_SPRITE,0,0,{
+ end;
+
+OnTouch:
+ // Sponsor and Main Quest 17+ - access granted
+ .@q=getq(General_Narrator);
+ if (.@q >= 17 || getgmlevel()) {
+ warp "017-10", 56, 78;
+ } else {
+ npctalkonce l("The door is locked, I should come back later.");
+ }
+ end;
+
+}
+
+017-1,182,20,0 script #LoF_Townhall02 NPC_NO_SPRITE,0,0,{
+ end;
+
+OnTouch:
+ // Sponsor and Main Quest 17+ - access granted
+ .@q=getq(General_Narrator);
+ if (.@q >= 17 || getgmlevel()) {
+ warp "017-10", 60, 78;
+ } else {
+ npctalkonce l("The door is locked, I should come back later.");
+ }
+ end;
+}
+
+017-1,171,20,0 script #LoF_Townhall03 NPC_NO_SPRITE,0,0,{
+ end;
+
+OnTouch:
+ // Sponsor and Main Quest 17+ - access granted
+ .@q=getq(General_Narrator);
+ if (.@q >= 17 || getgmlevel()) {
+ warp "017-10", 36, 78;
+ } else {
+ npctalkonce l("The door is locked, I should come back later.");
+ }
+ end;
+}
+
+017-1,190,20,0 script #LoF_Townhall04 NPC_NO_SPRITE,0,0,{
+ end;
+
+OnTouch:
+ // Sponsor and Main Quest 17+ - access granted
+ .@q=getq(General_Narrator);
+ if (.@q >= 17 || getgmlevel()) {
+ warp "017-10", 80, 78;
+ } else {
+ npctalkonce l("The door is locked, I should come back later.");
+ }
+ end;
+}
+/////////////////////////////
+// Main Quest 6
+// LoF Arc
+/////////////////
+// Check instances and rebuild if needed
+// Returns map name
+// BarbaraInstCheck( {submap=mines} )
+// 0- Chamber ; 1 - Mines ; 2 - Hall ; 3 - Shrine
+function script BarbaraInstCheck {
+ .@house=getarg(0, true);
+
+ .@q2=getq2(LoFQuest_Barbara);
+ // Map name limit: 4 chars (sgt1)
+ .@map0$="brb0@"+getcharid(0);
+ .@map1$="brb1@"+getcharid(0);
+ .@map2$="brb2@"+getcharid(0);
+ .@map3$="brb3@"+getcharid(0);
+ if (!(isinstance(.@q2) && .@q2 != 0)) {
+ .@inst = instance_create("Forgotten Shrine "+getcharid(0), getcharid(3), IOT_CHAR);
+ instance_attachmap("018-6-0", .@inst, false, .@map0$);
+ instance_attachmap("018-6-1", .@inst, false, .@map1$);
+ instance_attachmap("018-6-2", .@inst, false, .@map2$);
+ instance_attachmap("018-6-3", .@inst, false, .@map3$);
+ // Instance lasts two hours
+ instance_set_timeout(7200, 7200, .@inst);
+ instance_init(.@inst);
+ setq2 LoFQuest_Barbara, .@inst;
+ }
+
+ // It broke
+ if (getmapinfo(MAPINFO_SIZE_X, .@map1$) <= 0) {
+ setq2 LoFQuest_Barbara, 0;
+ // Infinite Loop?
+ return callfunc("BarbaraInstCheck", .@house);
+ }
+
+ // Return map name
+ return getd(".@map"+.@house+"$");
+}
+
+017-1,32,44,0 script #LoF_EleniumMines NPC_NO_SPRITE,0,0,{
+ end;
+
+OnTouch:
+ .@q=getq(LoFQuest_Barbara);
+ if (.@q >= 1) {
+ addmapmask BarbaraInstCheck(1), 2;
+ warp BarbaraInstCheck(1), 80, 199;
+ } else {
+ warp "018-6-1", 80, 199;
+ }
+ end;
+}
+
diff --git a/npc/017-1/wateranimation.txt b/npc/017-1/wateranimation.txt
new file mode 100644
index 0000000..802b154
--- /dev/null
+++ b/npc/017-1/wateranimation.txt
@@ -0,0 +1,24 @@
+// TMW2 scripts.
+// Author:
+// gumi
+// Reid
+// Saulc
+// Jesusalva
+// Description:
+// Water animations, splash, fishes, etc...
+
+017-1,109,223,0 script #Lof_WAM0 NPC_WATER_SPLASH,{
+
+ fishing; // begin or continue fishing
+ close;
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 4;
+ end;
+}
+
+017-1,97,133,0 duplicate(#Lof_WAM0) #Lof_WAM1 NPC_WATER_SPLASH
+017-1,88,130,0 duplicate(#Lof_WAM0) #Lof_WAM2 NPC_WATER_SPLASH
+017-1,81,126,0 duplicate(#Lof_WAM0) #Lof_WAM3 NPC_WATER_SPLASH
+