summaryrefslogtreecommitdiff
path: root/npc/009-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/009-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/009-1')
-rw-r--r--npc/009-1/_import.txt14
-rw-r--r--npc/009-1/_mobs.txt11
-rw-r--r--npc/009-1/_warps.txt9
-rw-r--r--npc/009-1/charles.txt199
-rw-r--r--npc/009-1/estate.txt171
-rw-r--r--npc/009-1/fisherman.txt153
-rw-r--r--npc/009-1/foxhound.txt197
-rw-r--r--npc/009-1/guards.txt202
-rw-r--r--npc/009-1/lynnthetraveler.txt93
-rw-r--r--npc/009-1/mapflags.txt2
-rw-r--r--npc/009-1/soul-menhir.txt20
-rw-r--r--npc/009-1/teleporter.txt23
-rw-r--r--npc/009-1/town.txt11
13 files changed, 1105 insertions, 0 deletions
diff --git a/npc/009-1/_import.txt b/npc/009-1/_import.txt
new file mode 100644
index 0000000..36577f2
--- /dev/null
+++ b/npc/009-1/_import.txt
@@ -0,0 +1,14 @@
+// Map 009-1: Halinarzo
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/009-1/_mobs.txt",
+"npc/009-1/_warps.txt",
+"npc/009-1/charles.txt",
+"npc/009-1/estate.txt",
+"npc/009-1/fisherman.txt",
+"npc/009-1/foxhound.txt",
+"npc/009-1/guards.txt",
+"npc/009-1/lynnthetraveler.txt",
+"npc/009-1/mapflags.txt",
+"npc/009-1/soul-menhir.txt",
+"npc/009-1/teleporter.txt",
+"npc/009-1/town.txt",
diff --git a/npc/009-1/_mobs.txt b/npc/009-1/_mobs.txt
new file mode 100644
index 0000000..7c0859b
--- /dev/null
+++ b/npc/009-1/_mobs.txt
@@ -0,0 +1,11 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 009-1: Halinarzo mobs
+009-1,76,35,49,10 monster Giant Maggot 1031,6,30000,90000
+009-1,27,29,7,8 monster Piou 1002,1,60000,60000
+009-1,73,51,49,14 monster Fire Goblin 1067,12,45000,45000,Fisherman::OnKillFireGoblin
+009-1,70,98,47,6 monster Scorpion 1071,3,30000,20000
+009-1,70,83,47,6 monster Red Scorpion 1072,1,30000,20000
+009-1,27,96,7,9 monster Duck 1029,2,60000,60000
+009-1,0,0,0,0 monster Desert Maggot 1083,45,35000,150000
+009-1,76,105,1,0 monster Chagashroom Field 1128,1,70000,60000
+009-1,113,88,0,0 monster Chagashroom Field 1128,1,60000,60000
diff --git a/npc/009-1/_warps.txt b/npc/009-1/_warps.txt
new file mode 100644
index 0000000..82d16fb
--- /dev/null
+++ b/npc/009-1/_warps.txt
@@ -0,0 +1,9 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 009-1: Halinarzo warps
+009-1,56,109,0 warp #009-1_56_109 2,0,010-2,169,20
+009-1,119,40,0 warp #009-1_119_40 0,0,011-1,177,177
+009-1,84,63,0 warp #009-1_84_63 0,0,009-2,62,66
+009-1,73,63,0 warp #009-1_73_63 0,0,009-2,28,65
+009-1,86,34,0 warp #009-1_86_34 0,0,009-3,44,56
+009-1,33,62,0 warp #009-1_33_62 0,0,009-4,48,53
+009-1,64,38,0 warp #009-1_64_38 1,0,009-5,32,41
diff --git a/npc/009-1/charles.txt b/npc/009-1/charles.txt
new file mode 100644
index 0000000..d3cdf3e
--- /dev/null
+++ b/npc/009-1/charles.txt
@@ -0,0 +1,199 @@
+// TMW-2 Script
+// Original Creator: Adson Renato <adson25@gmail.com>
+// Date: 2010-11-19 2:31 AM BRT
+// Review:
+// * 2013-09-03: ernando2000 <ernando.quirino@hotmail.com>
+// * 2013-09-04: Lunovox Heavenfinder <rui.gravata@gmail.com>
+// * 2016-06-14: Jesusalva <tmwbr@jesussalva.com>
+// * 2017-06-17: Jesusalva <cpntb1@ymail.com>
+// * 2018-05-24: Jesusalva <admin@tmw2.org>
+// * Adapted from TMW-BR to TMW2
+// Minimum Req.: LVL 30
+// Consumables: Bandits drops: CoinBag, Dagger, Leather Shield, Empty Bottle
+// Prize: 1 BurglarMask
+// Description:
+// A contrabandist which feeds Halinarzo's black market.
+// Will later teach the Steal skill. (maybe)
+// Notes:
+// Blame Saulc.
+
+
+
+
+009-1,24,105,0 script Charles, Trader King NPC_ORC,{
+ .@q=getq(HalinarzoQuest_TraderKing);
+ if (BaseLevel < 30) goto L_Weak;
+ if (.@q == 1) goto L_Return;
+ if (.@q == 2) goto L_End;
+ goto L_Start;
+
+L_Weak:
+ mesn;
+ mesq lg("Get out of here, weakling. You'll be killed by bandits.");
+ close;
+
+L_Start:
+ mesn;
+ mes lg(":> \"Hello, youngling...\"");
+ next;
+ mesn strcharinfo(0);
+ menu
+ l("This character person is strange I better get away..."), L_Distrust,
+ l("Hmm, who are you?") , L_WhoAmI;
+
+L_WhoAmI:
+ mes "";
+ mesn;
+ mesq l("I am the Trader King, because I supply a market!"); // the Black Market
+ close;
+
+L_Distrust:
+ mes "";
+ mesn strcharinfo(0);
+ mes l("¬.¬ \"Hmm, to me, you look like a thief or bandit...\"");
+ next;
+ mesn;
+ mes l(":D \"HAHAHAHAH! Me?! a thief? only during free time...\"");
+ next;
+ mesn strcharinfo(0);
+ mes l("¬.¬ \"I knew it! I'll report you at once.\"");
+ next;
+ mesn;
+ mes l("0.0 \"No no, please no! I can propose you a great deal for your silence!\"");
+ next;
+ menu
+ l("Which deal?"), L_Deal,
+ l("No, justice must be done.") , L_Die;
+
+L_Deal:
+ mes "";
+ mesn;
+ mesq l(":/ \"Hmm... let me see... Aha, I know! I can make you a great bandit with a simple burglar mask!\"");
+ next;
+ mesn strcharinfo(0);
+ mes l(":o \"What? I'm not a bandit! But it looks SO COOL! Do you need anything while you're here?\"");
+ next;
+ mesn;
+ mes l(":D \"Ah! Yes, that would help a lot! I don't need anything a bandit couldn't give you: 25 @@, 5 @@, 2 @@ and a @@. And 6000 GP.\"", getitemlink(CoinBag), getitemlink(EmptyBottle), getitemlink(Dagger), getitemlink(LeatherShield));
+ mesq l("What do you say?");
+ next;
+ mesn strcharinfo(0);
+ menu
+ l("No way! That's absurd!"), L_Close,
+ l("That's a lot, but we have a deal!"), L_Accept;
+
+L_Accept:
+ mes "";
+ mesn;
+ mes l(">:| \"Go take the items and remember: Not even a single word about me!\"");
+ next;
+ mesn strcharinfo(0);
+ mes l(";-) \"Don't worry! Leave to me!\"");
+ next;
+ mesn;
+ mes l("Here's what I need:");
+ mes l("@@/25 @@", countitem(CoinBag), getitemlink(CoinBag));
+ mes l("@@/5 @@", countitem(EmptyBottle), getitemlink(EmptyBottle));
+ mes l("@@/2 @@", countitem(Dagger), getitemlink(Dagger));
+ mes l("@@/1 @@", countitem(LeatherShield), getitemlink(LeatherShield));
+ mes l("@@/6000 GP", Zeny);
+
+ setq HalinarzoQuest_TraderKing, 1;
+ close;
+
+L_Return:
+ mesn;
+ mes "\"Do you have what I asked for?\"";
+ next;
+ menu
+ l("Yes, of course."), L_Finish,
+ l("I forgot what you need."), L_Review,
+ l("Not yet, I'll be right back."), L_Wait;
+
+L_Wait:
+ mes "";
+ mesn;
+ mesq l("I'll be waiting for you! And trading some items of questionable origins...");
+ close;
+
+L_Finish:
+ if (countitem(CoinBag) < 25 ||
+ countitem(EmptyBottle) < 5 ||
+ countitem(Dagger) < 2 ||
+ countitem(LeatherShield) < 1)
+ goto L_Missing;
+ if (Zeny < 6000) goto L_Poor;
+
+ inventoryplace BurglarMask, 1;
+ delitem CoinBag, 25;
+ delitem EmptyBottle, 5;
+ delitem Dagger, 2;
+ delitem LeatherShield, 1;
+ Zeny = Zeny - 6000;
+ getitem BurglarMask, 1; // Bragging Rights
+ getexp 5840, 25;
+ setq HalinarzoQuest_TraderKing, 2;
+ mes "";
+ mesn;
+ mes l(":D \"Excellent! You've kept your end on the bargain!\"");
+ next;
+ mesn;
+ mesq l("I always keep my end on the bargain, so here you go.");
+ next;
+ mesn;
+ mes l(":) \"A pleasure to trade if you. Don't get caught if you're doing something wrong!\"");
+ close;
+
+L_Poor:
+ mes "";
+ mesn;
+ mes l(":< \"Hey hey! Where's the money?\"");
+ close;
+
+L_Missing:
+ percentheal -15, 0;
+ mes "";
+ mesn;
+ mes l(":< \"Never lie to me. Keep your end on the bargain! Give me everything I asked for!\"");
+ close;
+
+L_End:
+ mesn;
+ mes l(":P \"I am busy, leave me alone.\"");
+ close;
+
+L_Review:
+ mes "";
+ mesn;
+ mes l("Here's what I need:");
+ mes l("@@/30 @@", countitem(CoinBag), getitemlink(CoinBag));
+ mes l("@@/5 @@", countitem(EmptyBottle), getitemlink(EmptyBottle));
+ mes l("@@/2 @@", countitem(Dagger), getitemlink(Dagger));
+ mes l("@@/1 @@", countitem(LeatherShield), getitemlink(LeatherShield));
+ mes l("@@/6000 GP", Zeny);
+ close;
+
+L_Die:
+ mesn;
+ mesq l("Then I'll be sure you can't talk again.");
+ die();
+ close;
+
+L_Close:
+ close;
+
+OnInit:
+ .@npcId = getnpcid(.name$);
+ setunitdata(.@npcId, UDT_HEADTOP, BurglarMask);
+ setunitdata(.@npcId, UDT_HEADMIDDLE, Chainmail);
+ setunitdata(.@npcId, UDT_HEADBOTTOM, RaidTrousers);
+ setunitdata(.@npcId, UDT_WEAPON, LeatherBoots); // Boots
+ setunitdata(.@npcId, UDT_HAIRSTYLE, 7);
+ setunitdata(.@npcId, UDT_HAIRCOLOR, 1);
+
+ .sex = G_MALE;
+ .distance = 5;
+ end;
+
+
+}
diff --git a/npc/009-1/estate.txt b/npc/009-1/estate.txt
new file mode 100644
index 0000000..f530de1
--- /dev/null
+++ b/npc/009-1/estate.txt
@@ -0,0 +1,171 @@
+// TMW2: Moubootaur Legends scripts.
+// Author:
+// Jesusalva
+// Description:
+// Real Estate System
+
+// ID: 4
+// $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
+009-1,42,48,0 script Sign#RES_0096 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_0096::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=4; // Estate ID
+ .price=20000; // Monthly rent price
+ end;
+
+}
+
+// Door entrance
+009-1,43,47,0 script #RES_0096 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 "009-6", 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=4; // Estate ID
+ end;
+
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// ID: 5
+
+// The sign is the main controller
+009-1,108,46,0 script Sign#RES_0097 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_0097::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=5; // Estate ID
+ .price=20000; // Monthly rent price
+ end;
+
+}
+
+// Door entrance
+009-1,109,45,0 script #RES_0097 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 "009-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=5; // Estate ID
+ end;
+
+}
+
diff --git a/npc/009-1/fisherman.txt b/npc/009-1/fisherman.txt
new file mode 100644
index 0000000..4caa86b
--- /dev/null
+++ b/npc/009-1/fisherman.txt
@@ -0,0 +1,153 @@
+// TMW-2 Script
+// Originals: TMW BR
+//
+// Author:
+// Jesusalva
+// Description:
+// Forest Bow Quest. DO NOT RENAME THE NPC.
+
+009-1,116,106,0 script Fisherman NPC_FISHERMAN_HALI,{
+ .@q=getq(HurnscaldQuest_ForestBow);
+ if (BaseLevel < 30) goto L_Weak;
+ mesn;
+ mesq l("Hello. Ah, bad luck. I am three days without fishing a single carp.");
+ next;
+ mesn strcharinfo(0);
+ menu
+ l("Any fishing tips for me?"),-,
+ rif(.@q == 1 && getq3(HurnscaldQuest_ForestBow) < 99, l("I need a string, but not just any string, a really good string.")), L_String;
+
+ mes "";
+ mesn;
+ mesq l("Well, yes. Look this river. The water is not moving.");
+ next;
+ mesn;
+ mesq l("If the water doesn't moves, you will never fish anything. Ah, fat luck...");
+ close;
+
+L_Weak:
+ mesn;
+ mesq l("...");
+ next;
+ mesn;
+ mesq l("I am trying to fish here without success. You're weak, do not bother me.");
+ close;
+
+L_String:
+ .@k=getq3(HurnscaldQuest_ForestBow);
+ mes "";
+ switch (.@k) {
+ case 0:
+ mesn;
+ mesq l("Well, that's easy to do. For starters, I need 1.000 GP as payment, and 10 @@ to make the string.", getitemlink(Root));
+ next;
+ mesn;
+ mesq l("That's not everything, though. I am having a bad time fishing. Bring me a @@. I know, it is rare. Good luck with it.", getitemlink(GrassCarp));
+ next;
+ mesn;
+ mesq l("And one last thing I'll want. See these @@? I don't like them, so I'll have you to kill 40 of them for me.", getmonsterlink(FireGoblin));
+ next;
+ mesn strcharinfo(0);
+ mes l("o.o \"You're being unreasonable. That's way too much!\"");
+ next;
+ mesn;
+ mesq l("To make the string you want, I need a special oil, which I make myself. It's hard to do, so I'll spend time I could be using to fish or help the city guard.");
+ next;
+ mesn;
+ mesq l("I'll make your life easier, I'm also accepting 20 @@ or @@ instead the Grass Carp. Go now, pal.", getitemlink(CommonCarp), getitemlink(Roach));
+ setq3 HurnscaldQuest_ForestBow, 10;
+ close;
+ break;
+ case 50:
+ mesn;
+ mesq l("Yo, good joob killing the Fire Goblins. Do you have everything I've asked for?");
+ next;
+ goto L_Finish;
+ default:
+ mesn;
+ mesq l("You have:");
+ if (countitem(GrassCarp) > 0)
+ mes l("@@/1 @@", countitem(GrassCarp), getitemlink(GrassCarp));
+ else if (countitem(Roach) > countitem(CommonCarp))
+ mes l("@@/20 @@ (or @@)", countitem(Roach), getitemlink(Roach), getitemlink(CommonCarp));
+ else
+ mes l("@@/20 @@ (or @@)", countitem(CommonCarp), getitemlink(CommonCarp), getitemlink(Roach));
+
+ mes l("@@/10 @@", countitem(Root), getitemlink(Root));
+ mes l("@@/40 slayed @@", .@k-10, getmonsterlink(FireGoblin));
+ mes l("@@/1000 GP", Zeny);
+ close;
+ }
+ close;
+
+L_Finish:
+ mesq l("You need:");
+ if (countitem(GrassCarp) > 0)
+ mes l("@@/1 @@", countitem(GrassCarp), getitemlink(GrassCarp));
+ else if (countitem(Roach) > countitem(CommonCarp))
+ mes l("@@/20 @@ (or @@)", countitem(Roach), getitemlink(Roach), getitemlink(CommonCarp));
+ else
+ mes l("@@/20 @@ (or @@)", countitem(CommonCarp), getitemlink(CommonCarp), getitemlink(Roach));
+
+ mes l("@@/10 @@", countitem(Root), getitemlink(Root));
+ mes l("40/40 slayed @@", getmonsterlink(FireGoblin));
+ mes l("@@/1000 GP", Zeny);
+ mes "";
+ select
+ l("Not yet."),
+ rif(countitem(GrassCarp) >= 1, l("Yes, I'll pay with Grass Carp.")),
+ rif(countitem(CommonCarp) >= 20, l("Yes, I'll pay with Common Carp.")),
+ rif(countitem(Roach) >= 20, l("Yes, I'll pay with Roach."));
+ if (@menu == 1)
+ close;
+
+ if (countitem(Root) < 10 || Zeny < 1000) {
+ mesn;
+ mesq l("Well, you forgot the most important: The material I need to do the string.");
+ next;
+ mesn;
+ mesq l("I am not a half-word man, so I won't take your fish. Come back with the money and the Roots, and I'll make the string for you.");
+ close;
+ }
+
+ switch (@menu) {
+ case 2:
+ delitem GrassCarp, 1; break;
+ case 3:
+ delitem CommonCarp, 20; break;
+ case 4:
+ delitem Roach, 20; break;
+ default:
+ dispbottom l("Script Error: \"Tux didn't found his fish! Blame Saulc at once!\""); close; end;
+ }
+ delitem Root, 10;
+ Zeny=Zeny-1000;
+ setq3 HurnscaldQuest_ForestBow, 99;
+ getexp 800, 0; // 10% of max exp
+ mes "";
+ mesn;
+ mesc l("With a knife, the fisherman makes the roots as thin as he can. You wonder if he knows what he is doing.");
+ next;
+ mesn;
+ mesc l("Once the roots are of a desired thickness, he ties them to make a string, and applies an oil on it.");
+ next;
+ mesn;
+ mesc l("After waiting for the oil to dry, he hands you the string.");
+ mesq l("Here, thanks to the oil, this string is very sturdy. You better not keep it on your inventory. Good luck!");
+ close;
+
+OnKillFireGoblin:
+ if (getq(HurnscaldQuest_ForestBow) == 1 && getq3(HurnscaldQuest_ForestBow) >= 10 && getq3(HurnscaldQuest_ForestBow) < 50) {
+ setq3 HurnscaldQuest_ForestBow, getq3(HurnscaldQuest_ForestBow)+1;
+ dispbottom l("@@/40 Fire Goblins killed", getq3(HurnscaldQuest_ForestBow)-10);
+ }
+ fix_mobkill(FireGoblin);
+ end;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 5;
+ end;
+
+}
+
diff --git a/npc/009-1/foxhound.txt b/npc/009-1/foxhound.txt
new file mode 100644
index 0000000..fa6040d
--- /dev/null
+++ b/npc/009-1/foxhound.txt
@@ -0,0 +1,197 @@
+// TMW2 Script
+// Author:
+// Jesusalva
+// Description:
+// Begs for food. Lots of it. And in the end, an armor piece awaits you.
+// Enliven Reva Foxhound is an anagram of Lunovox Heavenfinder
+
+009-1,89,57,0 script Enliven Reva Foxhound NPC_IVAN,{
+ .@q=getq(HalinarzoQuest_Foxhound);
+ if (BaseLevel < .@q+30) {
+ mesn;
+ mesq l("Ah, living in Halinarzo is so difficult...");
+ next;
+ mesn;
+ mesq l("If there were strong people to give us food, ah, how that would be good...");
+ next;
+ mesn;
+ mesq l("Sorry for making you listen my rambles. I need someone strong, you see...");
+ close;
+ }
+ mesn;
+ mesq l("Please traveler, help my starving family!");
+ next;
+ mesn;
+ mesq l("We from Halinarzo are very poor, and in constant need of food. You have to help us!");
+ mes "";
+ menu
+ l("I'll help you."), -,
+ l("Sorry, I am so hungry as you."), L_Close;
+
+ switch (.@q) {
+
+ case 0:
+ mesn;
+ mesq l("There's a long time we don't eat anything. Bring us @@! Five should do it.", getitemlink(Bread));
+ select
+ rif(countitem(Bread) >= 5, l("I have it right here. You can take it!")),
+ l("I'm sorry... I can't help you either...");
+ if (@menu == 1) {
+ delitem Bread, 5;
+ getexp 20, 0;
+ Zeny=Zeny+25*5;
+ mes "";
+ mesn;
+ mesq lg("Thank you! Thank you! Savior!");
+ setq(HalinarzoQuest_Foxhound, 1);
+ next;
+ }
+ break;
+
+
+ case 1:
+ mesn;
+ mesq l("Bread is fine, but it would taste better with @@. Could you bring us three?", getitemlink(Cheese));
+ select
+ rif(countitem(Cheese) >= 3, l("I have it right here. You can take it!")),
+ l("I'm sorry... I can't help you either...");
+ if (@menu == 1) {
+ delitem Cheese, 3;
+ getexp 25, 0;
+ Zeny=Zeny+25*3;
+ mes "";
+ mesn;
+ mesq lg("Thank you! Thank you! Savior!");
+ setq(HalinarzoQuest_Foxhound, .@q+1);
+ next;
+ }
+ break;
+
+ case 2:
+ mesn;
+ mesq l("Do you know @@? It's a poisonous food you can't find around here. It can be made edible with special prepare.", getitemlink(PinkBlobime));
+ select
+ rif(countitem(PinkBlobime) >= 1, l("I have it right here. You can take it!")),
+ l("I'm sorry... I can't help you either...");
+ if (@menu == 1) {
+ delitem PinkBlobime, 1;
+ getexp 30, 0;
+ Zeny=Zeny+10*1;
+ mes "";
+ mesn;
+ mesq lg("Thank you! Thank you! Savior!");
+ setq(HalinarzoQuest_Foxhound, .@q+1);
+ next;
+ }
+ break;
+
+ case 3:
+ mesn;
+ mesq l("I saw Purple the other day... Ah, now I want to eat @@... A dozen should do...", getitemlink(Plushroom));
+ select
+ rif(countitem(Plushroom) >= 12, l("I have it right here. You can take it!")),
+ l("I'm sorry... I can't help you either...");
+ if (@menu == 1) {
+ delitem Plushroom, 12;
+ getexp 35, 0;
+ Zeny=Zeny+15*12;
+ mes "";
+ mesn;
+ mesq lg("Thank you! Thank you! Savior!");
+ setq(HalinarzoQuest_Foxhound, .@q+1);
+ next;
+ }
+ break;
+
+ case 4:
+ mesn;
+ mesq l("There exist more food than you know. But this time I don't want anything extravagant, just 6 @@ should be fine.", getitemlink(CaveSnakeEgg));
+ select
+ rif(countitem(CaveSnakeEgg) >= 6, l("I have it right here. You can take it!")),
+ l("I'm sorry... I can't help you either...");
+ if (@menu == 1) {
+ delitem CaveSnakeEgg, 6;
+ getexp 40, 0;
+ Zeny=Zeny+27*6;
+ mes "";
+ mesn;
+ mesq lg("Thank you! Thank you! Savior!");
+ setq(HalinarzoQuest_Foxhound, .@q+1);
+ next;
+ }
+ break;
+
+ case 5:
+ mesn;
+ mes l("Thanks for feeding us earlier. I wanted to give a great dinner to my family, even if just once.");
+ mes l("Could you please give us a full meal, with 5 @@, 5 @@, 5@@, 5 @@ and 5 @@?", getitemlink(SnakeEgg), getitemlink(Bread), getitemlink(Cheese), getitemlink(Aquada), getitemlink(Manana));
+ select
+ rif(countitem(SnakeEgg) >= 5 && countitem(Bread) >= 5 && countitem(Cheese) >= 5 && countitem(Aquada) >= 5 && countitem(Manana) >= 5, l("I have it right here. You can take it!")),
+ l("I'm sorry... I can't help you either...");
+ if (@menu == 1) {
+ mes "";
+ mesn;
+ mesq l("Thanks for attending even this selfish request of mine.");
+ next;
+ delitem SnakeEgg, 5;
+ delitem Bread, 5;
+ delitem Cheese, 5;
+ delitem Aquada, 5;
+ delitem Manana, 5;
+ getexp 11500, 15;
+ getitem Bucket, 1;
+ mesn;
+ mesq l("This is just a bucket, but I did some cuts on it so you can see though it. It protects your whole face.");
+ next;
+ mesn;
+ mesq l("This is the least I could do for you. Many thanks. And if you have more food, you can keep feeding my family.");
+ setq(HalinarzoQuest_Foxhound, .@q+1);
+ setq2(HalinarzoQuest_Foxhound, .@q+1);
+ next;
+ }
+ break;
+
+ default:
+ .@q=getq2(HalinarzoQuest_Foxhound);
+ // Manana (Death Penalty) or Aquadas (Hard to get item)?
+ mesn;
+ mesq l("I only need @@ @@. Please! You have to help me!", .@q, getitemlink(Manana));
+ select
+ rif(countitem(Manana) >= .@q, l("I have it right here. You can take it!")),
+ l("I'm sorry... I can't help you either...");
+ if (@menu == 1) {
+ delitem Manana, .@q;
+ Zeny=Zeny+(60*.@q);
+ getexp 0, .@q;
+ mes "";
+ mesn;
+ mesq lg("Thank you! Thank you! Savior!");
+ setq(HalinarzoQuest_Foxhound, .@q+1);
+ next;
+ }
+
+ }
+
+ goto L_Close;
+
+L_Close:
+ closedialog;
+ goodbye;
+ close;
+
+OnInit:
+ //.@npcId = getnpcid(.name$);
+ //setunitdata(.@npcId, UDT_HEADTOP, NPCEyes);
+ //setunitdata(.@npcId, UDT_HEADMIDDLE, VneckJumper);
+ //setunitdata(.@npcId, UDT_HEADBOTTOM, RaidTrousers);
+ //setunitdata(.@npcId, UDT_WEAPON, LousyMoccasins); // Boots
+ //setunitdata(.@npcId, UDT_HAIRSTYLE, 6);
+ //setunitdata(.@npcId, UDT_HAIRCOLOR, 3);
+
+ .sex = G_MALE;
+ .distance = 5;
+ end;
+
+
+
+}
diff --git a/npc/009-1/guards.txt b/npc/009-1/guards.txt
new file mode 100644
index 0000000..43bbcbd
--- /dev/null
+++ b/npc/009-1/guards.txt
@@ -0,0 +1,202 @@
+// TMW2 scripts.
+// Authors:
+// Jesusalva
+// Description:
+// Protect Halinarzo
+
+009-1,71,24,0 script Lieutenant Jacob NPC_PLAYER,{
+ // The Monster King guild have a special menu
+ if (strcharinfo(2) == "Monster King") goto L_MKControl;
+ mesn;
+ mesq l("Halt! Beyond this gate, is the Great River and the Eternal Swamps.");
+ next;
+ mesn;
+ mesq l("Was not it only flooded constantly, the graveyard is not too far. If you stray away from the path, you'll get lost.");
+ next;
+ .@fd=!(getmapmask("011-3")&1024); // .@fd - is flooded?
+ if (!.@fd && $GAME_STORYLINE >= 1) {
+ mesn;
+ // There's a limit on how much info I can send with @@
+ mesq l("Various people already went missing, including GMs. This is why if you plan to cross, ") + b(l("You won't be allowed to walk sideways, except to avoid a monster or two."));
+ mesc l("If you try to walk west or east too much, you'll hit an \"invisible wall\" to prevent you from getting lost.");
+ next;
+ select
+ l("I'm fine, thanks."),
+ l("My equipment is good, let me through!");
+ mes "";
+ if (@menu == 2 && $HURNS_LIBDATE) {
+ .@palgal$=lg("gal", "pal");
+ if (BaseLevel < 20) {
+ mesn;
+ mesq l("It might be, but your level isn't. Sorry @@. No going to Hurnscald before level 20.", .@palgal$);
+ close;
+ }
+ if (reputation("Halin") < 1) {
+ mesn;
+ mesq l("It might be, but I never heard of you before. Sorry @@, I can't let just anyone go through. It would be a disservice to see you get stuck and die.", .@palgal$);
+ close;
+ }
+ warp "011-3", 37, 219;
+ closedialog;
+ close;
+ } else if (!$HURNS_LIBDATE) {
+ mesn;
+ mesq l("No. Hurnscald is besieged and it would be too dangerous to let you go alone. You should talk to %s, instead.", b("Saulc GM"));
+ }
+ } else {
+ mesn;
+ mesq l("In fact, it is flooded at the moment. Come back later.");
+ next;
+ }
+
+ if (GHQUEST)
+ GHQ_Assign(Snake, "Halinarzo");
+ close;
+
+L_MKControl:
+ mesn;
+ mes l("Oh noes! You've found the Halinarzo control panel!");
+ next;
+ select
+ l("Abort"),
+ l("Initiate a siege");
+ mes "";
+ if (@menu == 2) {
+ doevent "Lieutenant Jacob::OnStartSiege";
+ closedialog;
+ }
+ close;
+
+OnMKSiege:
+ $@SIEGE_ABORTED = false;
+OnStartSiege:
+ kamibroadcast(col("WARNING! WARNING! Monster Army is moving towards Halinarzo!!",1));
+ do_siege("009-1", "010-2", "HALIN", TP_TULIM, .name$, .siegetime);
+ initnpctimer;
+ end;
+
+// Timers
+OnTimer5000:
+ .siegetime+=5;
+ do_siege("009-1", "010-2", "HALIN", TP_TULIM, .name$, .siegetime);
+ switch (.siegetime) {
+ case 0:
+ disablenpc "Sawis";
+ break;
+ // Monster Army arrives in town
+ case 60:
+ disablenpc "Fisherman";
+ disablenpc "Charles, Trader King";
+ disablenpc "Lynn The Traveler";
+ disablenpc "Enliven Reva Foxhound";
+ disablenpc "Ryan";
+ disablenpc "Bella, the Scholar";
+ disablenpc "Book Keeper";
+ disablenpc "Yumi";
+ disablenpc "Halinarzo's Nurse";
+ disablenpc "Joaquim";
+ disablenpc "Alvasus";
+ disablenpc "Luanna";
+ break;
+ // Monster Army deployed in town
+ case 90:
+ disablenpc "Dang Rostra";
+ disablenpc "Kevin";
+ disablenpc "Barzil";
+ break;
+ // Monster army have withdrawn completly
+ case MK_SIEGE_DURATION:
+ .siegetime=0;
+ announce(("Halinarzo siege is over!"), bc_all);
+ enablenpc "Sawis";
+ enablenpc "Fisherman";
+ enablenpc "Charles, Trader King";
+ enablenpc "Lynn The Traveler";
+ enablenpc "Enliven Reva Foxhound";
+ enablenpc "Ryan";
+ enablenpc "Bella, the Scholar";
+ enablenpc "Book Keeper";
+ enablenpc "Yumi";
+ enablenpc "Halinarzo's Nurse";
+ enablenpc "Joaquim";
+ enablenpc "Alvasus";
+ enablenpc "Luanna";
+ enablenpc "Dang Rostra";
+ enablenpc "Kevin";
+ enablenpc "Barzil";
+ stopnpctimer;
+ end;
+ break;
+ }
+
+ // Loop again
+ initnpctimer;
+ end;
+
+OnInit:
+ .siegetime=0;
+ .sex = G_MALE;
+ .distance = 4;
+
+ // Check items.xml for info about this.
+ .@npcId = getnpcid();
+ setunitdata(.@npcId, UDT_HEADTOP, BullHelmet);
+ setunitdata(.@npcId, UDT_HEADMIDDLE, LieutenantArmor);
+ setunitdata(.@npcId, UDT_HEADBOTTOM, RaidTrousers);
+ setunitdata(.@npcId, UDT_SHIELD, LousyMoccasins); // TODO FIXME: Display Boots
+ setunitdata(.@npcId, UDT_WEAPON, Backsword);
+ setunitdata(.@npcId, UDT_HAIRSTYLE, 12);
+ setunitdata(.@npcId, UDT_HAIRCOLOR, 15);
+
+ end;
+}
+
+// Handle Guard's logic
+function script HaliGuardHandler {
+ legiontalk;
+
+ return;
+}
+
+009-1,100,30,0 script Guard Corina NPC_GUARD2,{
+ HaliGuardHandler();
+ end;
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 5;
+ end;
+}
+
+
+009-1,111,48,0 script Guard Jhon NPC_GUARD1,{
+ HaliGuardHandler();
+ end;
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 5;
+ end;
+}
+
+009-1,41,56,0 script Guard Laurie NPC_GUARD2,{
+ HaliGuardHandler();
+ end;
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 5;
+ end;
+}
+
+
+009-1,62,74,0 script Guard Amy NPC_GUARD2,{
+ HaliGuardHandler();
+ end;
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 5;
+ end;
+}
+
diff --git a/npc/009-1/lynnthetraveler.txt b/npc/009-1/lynnthetraveler.txt
new file mode 100644
index 0000000..58ab3f3
--- /dev/null
+++ b/npc/009-1/lynnthetraveler.txt
@@ -0,0 +1,93 @@
+// TMW2 Script
+// Author:
+// Jesusalva
+// Description:
+// The Travelers travel around the world telling stories.
+
+009-1,30,26,0 script Lynn 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 Halinarzo."), L_Halin,
+ l("Tell me about Tulimshar."), L_Tulim,
+ l("Tell me about Hurnscald."), L_Hurns,
+ 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_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));
+ next;
+ tutmes l("%s is obtained during events, daily logins, heroic deeds, gifts, etc. But cannot be bought with real money.", getitemlink(StrangeCoin));
+ 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, 18);
+ setunitdata(.@npcId, UDT_HAIRCOLOR, 8);
+ npcsit;
+
+ .sex = G_FEMALE;
+ .distance = 5;
+ end;
+}
+
diff --git a/npc/009-1/mapflags.txt b/npc/009-1/mapflags.txt
new file mode 100644
index 0000000..e6436cf
--- /dev/null
+++ b/npc/009-1/mapflags.txt
@@ -0,0 +1,2 @@
+009-1 mapflag town
+009-1 mapflag nopenalty
diff --git a/npc/009-1/soul-menhir.txt b/npc/009-1/soul-menhir.txt
new file mode 100644
index 0000000..172f933
--- /dev/null
+++ b/npc/009-1/soul-menhir.txt
@@ -0,0 +1,20 @@
+// TMW2 scripts.
+// Author:
+// Jesusalva
+// Description:
+// Soul Menhir
+
+009-1,28,29,0 script Soul Menhir#hali NPC_SOUL_MOSS,{
+ @map$ = "009-1";
+ setarray @Xs, 26, 27, 28, 28, 29, 30;
+ setarray @Ys, 30, 31, 30, 31, 30, 30;
+ @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/009-1/teleporter.txt b/npc/009-1/teleporter.txt
new file mode 100644
index 0000000..85d85ef
--- /dev/null
+++ b/npc/009-1/teleporter.txt
@@ -0,0 +1,23 @@
+// TMW2 Script
+// Authors:
+// Jesusalva
+// Description:
+// Link portals to soul menhirs like the teleporters from old
+// The price is temporary. This feature got in because no ship in Nivalis Port
+// PS. Anise => “Aisen” Anagram
+
+
+009-1,113,89,0 script #WarpGateHalin NPC_NO_SPRITE,1,0,{
+ end;
+
+OnTouch:
+ TeleporterGate(TP_HALIN);
+ close;
+
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 1;
+ end;
+}
+
diff --git a/npc/009-1/town.txt b/npc/009-1/town.txt
new file mode 100644
index 0000000..bef1fa1
--- /dev/null
+++ b/npc/009-1/town.txt
@@ -0,0 +1,11 @@
+// TMW-2 Script
+// Author:
+// Jesusalva
+// Description:
+// Reset LOCATION$ when entering a town
+
+009-1,71,24,0 script #LocHalin NPC_HIDDEN,4,1,{
+OnTouch:
+ EnterTown("Halin"); end;
+}
+009-1,55,72,0 duplicate(#LocHalin) #LocHalinB NPC_HIDDEN,3,1