summaryrefslogtreecommitdiff
path: root/world/map/npc/002-2
diff options
context:
space:
mode:
authorWushin <pasekei@gmail.com>2015-01-07 21:25:14 -0600
committerWushin <pasekei@gmail.com>2015-01-07 21:25:14 -0600
commitb734af239e8ff1e7ea746ea327fb84c62be09b7e (patch)
treecbc5f399ccf8dd226056887a70b9a313f88bee6e /world/map/npc/002-2
parent2c09797ebd2c03b2cbe9a458f8ea8d1fbd04ccff (diff)
parent61c88ec162713b980f30e6e5111c1cfbd9f23d3a (diff)
downloadserverdata-b734af239e8ff1e7ea746ea327fb84c62be09b7e.tar.gz
serverdata-b734af239e8ff1e7ea746ea327fb84c62be09b7e.tar.bz2
serverdata-b734af239e8ff1e7ea746ea327fb84c62be09b7e.tar.xz
serverdata-b734af239e8ff1e7ea746ea327fb84c62be09b7e.zip
Merge pull request #223 from wushin/moving-tutorial
Move Tutorial to Hurnscald
Diffstat (limited to 'world/map/npc/002-2')
-rw-r--r--world/map/npc/002-2/_import.txt19
-rw-r--r--world/map/npc/002-2/_warps.txt20
-rw-r--r--world/map/npc/002-2/bakery.txt158
-rw-r--r--world/map/npc/002-2/barber.txt12
-rw-r--r--world/map/npc/002-2/bleacher.txt293
-rw-r--r--world/map/npc/002-2/casino.txt208
-rw-r--r--world/map/npc/002-2/dedication.txt10
-rw-r--r--world/map/npc/002-2/eurni.txt45
-rw-r--r--world/map/npc/002-2/hetchel.txt445
-rw-r--r--world/map/npc/002-2/imec.txt113
-rw-r--r--world/map/npc/002-2/inya.txt209
-rw-r--r--world/map/npc/002-2/kps.txt164
-rw-r--r--world/map/npc/002-2/kylian.txt424
-rw-r--r--world/map/npc/002-2/latoy.txt33
-rw-r--r--world/map/npc/002-2/mapflags.txt2
-rw-r--r--world/map/npc/002-2/omar.txt335
-rw-r--r--world/map/npc/002-2/phaet.txt30
-rw-r--r--world/map/npc/002-2/rebecca.txt84
-rw-r--r--world/map/npc/002-2/shops.txt3
-rw-r--r--world/map/npc/002-2/stranger.txt464
-rw-r--r--world/map/npc/002-2/traveler.txt11
-rw-r--r--world/map/npc/002-2/troupe_leader.txt65
22 files changed, 3133 insertions, 14 deletions
diff --git a/world/map/npc/002-2/_import.txt b/world/map/npc/002-2/_import.txt
index 0cccabbf..673ba2d1 100644
--- a/world/map/npc/002-2/_import.txt
+++ b/world/map/npc/002-2/_import.txt
@@ -3,5 +3,22 @@
map: 002-2.gat
npc: npc/002-2/_mobs.txt
npc: npc/002-2/_warps.txt
+npc: npc/002-2/bakery.txt
+npc: npc/002-2/barber.txt
+npc: npc/002-2/bleacher.txt
+npc: npc/002-2/casino.txt
+npc: npc/002-2/dedication.txt
+npc: npc/002-2/eurni.txt
+npc: npc/002-2/hetchel.txt
+npc: npc/002-2/imec.txt
+npc: npc/002-2/inya.txt
+npc: npc/002-2/kps.txt
+npc: npc/002-2/kylian.txt
+npc: npc/002-2/latoy.txt
npc: npc/002-2/mapflags.txt
-npc: npc/002-2/traveler.txt
+npc: npc/002-2/omar.txt
+npc: npc/002-2/phaet.txt
+npc: npc/002-2/rebecca.txt
+npc: npc/002-2/shops.txt
+npc: npc/002-2/stranger.txt
+npc: npc/002-2/troupe_leader.txt
diff --git a/world/map/npc/002-2/_warps.txt b/world/map/npc/002-2/_warps.txt
index e370ad8f..fc78534b 100644
--- a/world/map/npc/002-2/_warps.txt
+++ b/world/map/npc/002-2/_warps.txt
@@ -1,4 +1,22 @@
// This file is generated automatically. All manually changes will be removed when running the Converter.
// Sandstorm Desert Indoors warps
-002-2.gat,28,30|warp|To Sand Storm|-1,-1,002-1.gat,104,93
+002-2.gat,44,34|warp|Outside|-1,-1,002-1.gat,73,36
+002-2.gat,44,20|warp|First Floor|0,-1,002-2.gat,45,78
+002-2.gat,46,79|warp|First Floor|0,-1,002-2.gat,43,21
+002-2.gat,46,55|warp|Penthouse|0,-1,002-2.gat,44,109
+002-2.gat,45,110|warp|Second Floor|0,-1,002-2.gat,45,56
+002-2.gat,23,110|warp|Outside|-1,-1,002-1.gat,67,30
+002-2.gat,34,20|warp|Casino|-1,-1,002-2.gat,79,69
+002-2.gat,37,20|warp|Theatre|-1,-1,002-2.gat,72,31
+002-2.gat,72,32|warp|First Floor|-1,-1,002-2.gat,37,21
+002-2.gat,79,70|warp|First Floor|-1,-1,002-2.gat,34,21
+002-2.gat,40,20|warp|Salon|-1,-1,002-2.gat,126,35
+002-2.gat,126,36|warp|First Floor|-1,-1,002-2.gat,40,21
+002-2.gat,75,101|warp|Outside|-1,-1,002-1.gat,109,46
+002-2.gat,83,101|warp|Outside|-1,-1,002-1.gat,115,46
+002-2.gat,78,132|warp|Outside|-1,-1,002-1.gat,114,36
+002-2.gat,68,121|warp|Outside|-1,-1,002-1.gat,110,28
+002-2.gat,120,67|warp|Outside|-1,-1,002-1.gat,99,44
+002-2.gat,120,95|warp|Outside|-1,-1,002-1.gat,57,36
+002-2.gat,119,132|warp|To Outside|-1,-1,002-1.gat,57,27
diff --git a/world/map/npc/002-2/bakery.txt b/world/map/npc/002-2/bakery.txt
new file mode 100644
index 00000000..b97c41c1
--- /dev/null
+++ b/world/map/npc/002-2/bakery.txt
@@ -0,0 +1,158 @@
+// The bakery
+
+// The chef
+002-2.gat,21,22,0|script|Riskim|148
+{
+ mes "[Riskim]";
+ mes "";
+ mes "\"Welcome to our bakery!\"";
+
+ callfunc "KadiyaSubquestConsts";
+ if ((@Q_kadiya_status == @Q_STATUS_WANTS_CHOCOCAKE)
+ && (countitem ("MopoxCurePotion") > 0))
+ goto L_lace_chococake;
+
+ if ((@Q_kadiya_status == @Q_STATUS_WANTS_ORANGECUPCAKE)
+ && (countitem ("MopoxCurePotion") > 0))
+ goto L_lace_cupcake;
+
+ mes "\"Would you mind bringing me 6 acorns please? I need them to make flour for the chocolate cakes. I will be so delicious!\"";
+ next;
+ mes "\"Um, I mean, the cakes will be delicious...\"";
+ emotion EMOTE_BLUSH;
+ next;
+
+ set @dq_level, 15;
+ set @dq_cost, 3;
+ set @dq_count, 6;
+ set @dq_name$, "Acorn";
+ set @dq_friendly_name$, "acorns";
+ set @dq_money, 250;
+ set @dq_exp, 50;
+
+ callfunc "DailyQuest";
+
+ next;
+ mes "\"And don't forget, our bakery is the best!\"";
+ close;
+
+L_lace_chococake:
+ next;
+ menu
+ "Thanks! Let me have a look around...", L_End,
+ "Can you put this potion into a Chocolate Cake?", L_Next,
+ "Goodbye!", L_End;
+
+L_Next:
+ mes "[Riskim]";
+ mes "";
+ mes "As you show Riskim the potion, he leans back, away from it.";
+ mes "\"Ooooh, I remember that smell...\"";
+ mes "\"Elanore's Mopox potion, right? She made me drink that, too...\"";
+ mes "He chuckles.";
+ mes "\"Yes, well, you do want to hide that somehow.\"";
+ next;
+ mes "[Riskim]";
+ mes "";
+ mes "\"We'll need extra chocolate for that one. If you can give me ten pieces of chocolate and that potion, plus 400 GP, I will bake you a special Chocolate Cake that hides the taste.\"";
+ next;
+ menu
+ "I will get them for you.", L_End,
+ "Here you are!", L_Continue,
+ "Maybe later.", L_End;
+
+L_Continue:
+ if (countitem("ChocolateBar") < 10)
+ goto L_lacking_ingredients;
+ if (countitem("MopoxCurePotion") < 1)
+ goto L_lacking_ingredients;
+ if (Zeny < 400)
+ goto L_lacking_Zeny;
+ delitem "MopoxCurePotion", 1;
+ delitem "ChocolateBar", 10;
+ getitem "LacedChocolateCake", 1;
+ set Zeny, Zeny - 400;
+
+ mes "[Riskim]";
+ mes "";
+ mes "\"Please have a seat!\"";
+ mes "You watch as Riskim melts the chocolate and stirs in the potion, then glazes a cake with the mixture.";
+ mes "\"It's a bit more chocolatey than your average chocolate cake, of course...\"";
+ next;
+ mes "[Riskim]";
+ mes "";
+ mes "Riskim hands you the cake.";
+ mes "\"Here you are. I hope that this works.\"";
+ close;
+
+L_lacking_Zeny:
+ mes "[Riskim]";
+ mes "";
+ mes "\"I'm sorry, but I have to charge 400 GP.\"";
+ close;
+
+L_lacking_ingredients:
+ mes "[Riskim]";
+ mes "";
+ mes "\"Sorry, but I need ten Chocolate Bars AND your cure potion for this. Please come back later when you have everything.\"";
+ close;
+
+L_lace_cupcake:
+ next;
+ menu
+ "Thanks! Let me have a look around...", L_End,
+ "Can you put this potion into an Orange Cupcake?", L_More,
+ "Goodbye!", L_End;
+
+L_More:
+ mes "[Riskim]";
+ mes "";
+ mes "\"Orange Cupcakes? Oh dear... I'm sorry, but I have a very bad orange allergy.\"";
+ next;
+ mes "[Riskim]";
+ mes "";
+ mes "\"Perhaps the Chef at Dimond's Cove can help you? We get all our cupcakes from him.\"";
+ next;
+ goto L_End;
+
+L_End:
+ close;
+}
+
+// Server
+002-2.gat,28,31,0|script|Sara|108
+{
+ mes "[Sara]";
+ mes "";
+ mes "\"Hello!\"";
+ close;
+}
+
+// The cashier
+002-2.gat,25,22,0|shop|Drabur|112,WhiteCake:*500,ChocolateCake:*550,OrangeCake:*600,AppleCake:*600,Cake:*30,CherryCake:*100,OrangeCupcake:*270,Milk:*1500,XmasCake:*70
+
+// Bus boy
+002-2.gat,21,28,0|script|Iormo|160
+{
+ mes "[Iormo]";
+ mes "";
+ mes "\"This room can get messy.\"";
+ close;
+}
+
+// An old couple eating at the bakery
+002-2.gat,24,27,0|script|Rynoh|159
+{
+ mes "[Rynoh]";
+ mes "";
+ mes "\"The cakes may be expensive, but they sure are delicious!\"";
+ close;
+}
+
+002-2.gat,26,27,0|script|Ontas|154
+{
+ mes "[Ontas]";
+ mes "";
+ mes "\"We come here every week. This place has some of the best bread I've ever eaten!\"";
+ close;
+}
diff --git a/world/map/npc/002-2/barber.txt b/world/map/npc/002-2/barber.txt
new file mode 100644
index 00000000..eb1a5821
--- /dev/null
+++ b/world/map/npc/002-2/barber.txt
@@ -0,0 +1,12 @@
+// A barber (later we can make it so certain styles need to come from him, for a price)
+002-2.gat,117,30,0|script|Issay|156
+{
+ mes "[Issay the Barber]";
+ mes "\"Do you need a change of style?\"";
+ next;
+ callfunc "Barber";
+ mes "[Issay the Barber]";
+ mes "\"Come again!\"";
+ close;
+}
+
diff --git a/world/map/npc/002-2/bleacher.txt b/world/map/npc/002-2/bleacher.txt
new file mode 100644
index 00000000..3391a62c
--- /dev/null
+++ b/world/map/npc/002-2/bleacher.txt
@@ -0,0 +1,293 @@
+//
+
+002-2.gat,72,92,0|script|Candide|156
+{
+ mes "[Candide]";
+ mes "\"I've figured out how that volcanic ash bleaches cloth.";
+ mes "I could do it for you, but I'll need three piles of ash and 5,000 GP for supplies per item.\"";
+ next;
+
+ if (countitem("PileOfAsh") < 3) goto L_no_ash;
+
+ if (Zeny < 5000) goto L_no_money;
+
+ menu
+ "I'd like to bleach something.", L_bleach_menu,
+ "No thanks.", L_Close;
+
+L_bleach_menu:
+ mes "[Candide]";
+ mes "\"What would you like to bleach?\"";
+ next;
+
+ menu
+ "Cotton shirt.", L_cottonshirt,
+ "Contributor shirt.", L_contributor,
+ "V-Neck sweater.", L_vneck,
+ "Turtleneck sweater.", L_tneck,
+ "Cotton shorts.", L_shorts,
+ "Cotton trousers.", L_trousers,
+ "Cotton skirt.", L_skirt,
+ "Miniskirt.", L_miniskirt,
+ "Tank top .", L_tanktop,
+ "Short tank top.", L_tanktop_short,
+ "Silk robe.", L_robe,
+ "Cotton headband.", L_cotton_headband,
+ "Desert hat.", L_desert_hat,
+ "Cotton boots.", L_cotton_boots,
+ "Cotton gloves.", L_cotton_gloves,
+ "Rabbit ears.", L_rabbit_ears,
+ "Wizard hat.", L_wizard_hat,
+ "Bowler hat.", L_bowler_hat,
+ "Sorcerer robe.", L_sorcerer_robe,
+ "Bowler hat (brown).", L_bowler_hat_brown,
+ "Fine dress.", L_fine_dress,
+ "Cotton cloth.", L_cotton_cloth,
+ "Nevermind.", L_Close;
+
+L_contributor:
+ set @normal, 1178;
+ set @dyeBase, 5131;
+ goto L_choose_color;
+
+L_cottonshirt:
+ set @normal, 1202;
+ set @dyeBase, 2050;
+ goto L_choose_color;
+
+L_vneck:
+ set @normal, 624;
+ set @dyeBase, 2060;
+ goto L_choose_color;
+
+L_tneck:
+ set @normal, 564;
+ set @dyeBase, 2070;
+ goto L_choose_color;
+
+L_shorts:
+ set @normal, 586;
+ set @dyeBase, 2110;
+ goto L_choose_color;
+
+L_trousers:
+ set @normal, 648;
+ set @dyeBase, 2180;
+ goto L_choose_color;
+
+L_skirt:
+ set @normal, 632;
+ set @dyeBase, 2100;
+ goto L_choose_color;
+
+L_miniskirt:
+ set @normal, 771;
+ set @dyeBase, 2170;
+ goto L_choose_color;
+
+L_tanktop:
+ set @normal, 688;
+ set @dyeBase, 2090;
+ goto L_choose_color;
+
+L_tanktop_short:
+ set @normal, 689;
+ set @dyeBase, 2120;
+ goto L_choose_color;
+
+L_robe:
+ set @normal, 720;
+ set @dyeBase, 2080;
+ goto L_choose_color;
+
+L_cotton_headband:
+ set @normal, 724;
+ set @dyeBase, 2140;
+ goto L_choose_color;
+
+L_desert_hat:
+ set @normal, 723;
+ set @dyeBase, 2130;
+ goto L_choose_color;
+
+L_cotton_boots:
+ set @normal, 735;
+ set @dyeBase, 2150;
+ goto L_choose_color;
+
+L_cotton_gloves:
+ set @normal, 741;
+ set @dyeBase, 2160;
+ goto L_choose_color;
+
+L_rabbit_ears:
+ set @normal, 1255;
+ set @dyeBase, 2190;
+ goto L_choose_color;
+
+L_wizard_hat:
+ set @normal, 4028;
+ set @dyeBase, 2200;
+ goto L_choose_color;
+
+L_bowler_hat:
+ set @normal, 4030;
+ set @dyeBase, 2210;
+ goto L_choose_color;
+
+L_sorcerer_robe:
+ mes "[Candide]";
+ mes "\"Which one?\"";
+ next;
+ menu
+ "A red lined one.", L_red_lined_sorcerer_robe,
+ "A green lined one.", L_green_lined_sorcerer_robe,
+ "A dark blue lined one.", L_dark_blue_lined_sorcerer_robe,
+ "A yellow lined one.", L_yellow_lined_sorcerer_robe,
+ "A light blue lined one.", L_light_blue_lined_sorcerer_robe,
+ "A pink lined one.", L_pink_lined_sorcerer_robe,
+ "A black lined one.", L_black_lined_sorcerer_robe,
+ "An orange lined one.", L_orange_lined_sorcerer_robe,
+ "A purple lined one.", L_purple_lined_sorcerer_robe,
+ "A dark green lined one.", L_dark_green_lined_sorcerer_robe,
+ "A white lined one.", L_white_lined_sorcerer_robe,
+ "Nevermind.", L_Close;
+
+L_red_lined_sorcerer_robe:
+ set @normal, 798;
+ set @dyeBase, 2220;
+ goto L_choose_color;
+
+L_green_lined_sorcerer_robe:
+ set @normal, 5010;
+ set @dyeBase, 5000;
+ goto L_choose_color;
+
+L_dark_blue_lined_sorcerer_robe:
+ set @normal, 5021;
+ set @dyeBase, 5011;
+ goto L_choose_color;
+
+L_yellow_lined_sorcerer_robe:
+ set @normal, 5032;
+ set @dyeBase, 5022;
+ goto L_choose_color;
+
+L_light_blue_lined_sorcerer_robe:
+ set @normal, 5043;
+ set @dyeBase, 5033;
+ goto L_choose_color;
+
+L_pink_lined_sorcerer_robe:
+ set @normal, 5054;
+ set @dyeBase, 5044;
+ goto L_choose_color;
+
+L_black_lined_sorcerer_robe:
+ set @normal, 5065;
+ set @dyeBase, 5055;
+ goto L_choose_color;
+
+L_orange_lined_sorcerer_robe:
+ set @normal, 5076;
+ set @dyeBase, 5066;
+ goto L_choose_color;
+
+L_purple_lined_sorcerer_robe:
+ set @normal, 5087;
+ set @dyeBase, 5077;
+ goto L_choose_color;
+
+L_dark_green_lined_sorcerer_robe:
+ set @normal, 5098;
+ set @dyeBase, 5088;
+ goto L_choose_color;
+
+L_white_lined_sorcerer_robe:
+ set @normal, 5109;
+ set @dyeBase, 5099;
+ goto L_choose_color;
+
+L_bowler_hat_brown:
+ set @normal, 800;
+ set @dyeBase, 2230;
+ goto L_choose_color;
+
+L_fine_dress:
+ set @normal, 870;
+ set @dyeBase, 2240;
+ goto L_choose_color;
+
+L_cotton_cloth:
+ set @normal, 660;
+ set @dyeBase, 2250;
+ goto L_choose_color;
+
+L_choose_color:
+ mes "[Candide]";
+ mes "\"And the color?\"";
+ next;
+
+ menu
+ "Red.", L_MenuItems,
+ "Green.", L_MenuItems,
+ "Dark Blue.", L_MenuItems,
+ "Yellow.", L_MenuItems,
+ "Light Blue.", L_MenuItems,
+ "Pink.", L_MenuItems,
+ "Black.", L_MenuItems,
+ "Orange.", L_MenuItems,
+ "Purple.", L_MenuItems,
+ "Dark Green.", L_MenuItems;
+
+L_MenuItems:
+ set @del, @dyeBase + @menu - 1;
+
+ if (countitem(@del) == 0) goto L_no_item;
+
+ if (countitem("PileOfAsh") < 3) goto L_no_ash;
+
+ if (Zeny < 5000) goto L_no_money;
+
+ delitem @del, 1;
+ getitem @normal, 1;
+ delitem "PileOfAsh", 3;
+ set Zeny, Zeny - 5000;
+ goto L_again;
+
+L_again:
+ mes "[Candide]";
+ mes "\"Would you like to bleach something else?\"";
+ next;
+
+ menu
+ "Yes.", L_bleach_menu,
+ "No.", L_Close;
+
+L_no_item:
+ mes "[Candide]";
+ mes "\"You don't have one of those.\"";
+ next;
+
+ goto L_again;
+
+L_no_ash:
+ mes "[Candide]";
+ mes "\"You don't have enough ash for me to bleach anything.";
+ mes "I need three piles.\"";
+ goto L_Close;
+
+L_no_money:
+ mes "[Candide]";
+ mes "\"You don't have enough gold for me to bleach anything.";
+ mes "I need 5,000 GP for supplies.\"";
+ goto L_Close;
+
+L_Close:
+ mes "[Candide]";
+ mes "\"Come again.\"";
+ set @normal, 0;
+ set @dyeBase, 0;
+ set @del, 0;
+ close;
+}
diff --git a/world/map/npc/002-2/casino.txt b/world/map/npc/002-2/casino.txt
new file mode 100644
index 00000000..4733bb63
--- /dev/null
+++ b/world/map/npc/002-2/casino.txt
@@ -0,0 +1,208 @@
+// Casino
+
+// takes part in quest given by 021-2/kylian.txt
+002-2.gat,79,68,0|script|#CasinoEntrance|32767,13,0
+{
+ set QUEST_NorthTulimshar, QUEST_NorthTulimshar | $@knowCasinoNT;
+ set @kylian, ((QUEST_NorthTulimshar & NIBBLE_5_MASK) >> NIBBLE_5_SHIFT);
+ if (@kylian != 6)
+ goto L_End;
+ message strcharinfo(0), "You wonder if Kylian would like to visit the casino in the evening.";
+ goto L_End;
+
+L_End:
+ set @kylian, 0;
+ end;
+}
+
+002-2.gat,86,29,0|script|Valdo|117
+{
+ mes "[Valdo the Worker]";
+ mes "\"Please let me work. I'm really in a hurry!\"";
+ close;
+}
+
+002-2.gat,84,62,0|script|Slots#1|400
+{
+ callfunc "SlotMachine";
+ close;
+}
+
+002-2.gat,86,62,0|script|Slots#2|400
+{
+ callfunc "SlotMachine";
+ close;
+}
+
+002-2.gat,88,62,0|script|Slots#3|400
+{
+ callfunc "SlotMachine";
+ close;
+}
+
+002-2.gat,78,56,0|shop|MoneyChanger|124,CasinoCoins:*10
+
+002-2.gat,75,60,0|script|BlackJack|107
+{
+ mes "[Croupier]";
+ mes "\"Would you like to play Black Jack?";
+ mes "You will need 15 casino coins.\"";
+ next;
+ menu
+ "Yes", L_Begin,
+ "No", L_Close;
+
+L_Begin:
+ if(countitem("CasinoCoins") < 15) goto L_NoCoin;
+ delitem "CasinoCoins", 15;
+ set @croupier, rand(0, 4);
+ set @croupier, @croupier + 17;
+ set @player, rand(4, 21);
+ mes "\"You got " + @player + " with your cards.";
+ if(@player == 21) goto L_End;
+ mes "Do you want another card?\"";
+ next;
+ menu
+ "Yes", L_Another,
+ "No", L_End;
+
+L_Another:
+ set @tempace, rand(2, 11);
+ if (@tempace == 11) goto L_Ace;
+ set @player, @player + @tempace;
+ if (@player > 21) goto L_Lost;
+ if (@player == 21) goto L_End;
+ mes "\"You got " + @player + " with your cards.";
+ mes "Do you want another card?\"";
+ next;
+ menu
+ "Yes", L_Another,
+ "No", L_End;
+
+L_End:
+ if (@player <= @croupier) goto L_Lost;
+ mes "\"Congratulations, you won!";
+ mes "I had " + @croupier + ".";
+ mes "You get 45 casino coins.\"";
+ getitem "CasinoCoins", 45;
+ goto L_Close;
+
+L_NoCoin:
+ mes "\"You need at least 15 coins.\"";
+ goto L_Close;
+
+L_Lost:
+ mes "\"I'm sorry but you lost.";
+ mes "You got " + @player + " with your cards.";
+ mes "I had " + @croupier + ".\"";
+ goto L_Close;
+
+L_Ace:
+ set @player, @player + 11;
+ if (@player > 21) set @player, @player - 10;
+ if (@player > 21) goto L_Lost;
+ if (@player == 21) goto L_End;
+ mes "You got " + @player + " with your cards.";
+ mes "Do you want another card?";
+ next;
+ menu
+ "Yes", L_Another,
+ "No", L_End;
+
+L_Close:
+ mes "\"As you wish.\"";
+ set @croupier, 0;
+ set @player, 0;
+ set @tempace, 0;
+ close;
+}
+
+002-2.gat,69,67,0|script|Roulette|107
+{
+ mes "[Croupier]";
+ mes "\"Good evening monsieur...";
+ mes "How much would you like to bet?\"";
+ next;
+ menu
+ "1 coin", L_b1,
+ "5 coins", L_b5,
+ "10 coins", L_b10,
+ "50 coins", L_b50,
+ "100 coins", L_b100,
+ "Maybe I'll play later", L_Close;
+
+L_b1:
+ set @bet, 1;
+ goto L_Check;
+
+L_b5:
+ set @bet, 5;
+ goto L_Check;
+
+L_b10:
+ set @bet, 10;
+ goto L_Check;
+
+L_b50:
+ set @bet, 50;
+ goto L_Check;
+
+L_b100:
+ set @bet, 100;
+ goto L_Check;
+
+L_Check:
+ if(countitem("CasinoCoins") < @bet) goto L_NoCoin;
+ delitem "CasinoCoins", @bet;
+ menu
+ "Choose a color", L_PickColor,
+ "Choose a number", L_Number;
+
+L_PickColor:
+ menu
+ "Black", L_Color,
+ "Red", L_Color;
+
+L_Color:
+ set @color,rand(2);
+ if(@color == 1) goto L_Lost;
+ mes "You won!";
+ getitem "CasinoCoins", @bet * 2;
+ goto L_Close;
+
+L_Number:
+ menu
+ "0", L_Menuitems, "00", L_Menuitems, "1", L_Menuitems, "2", L_Menuitems, "3", L_Menuitems, "4", L_Menuitems, "5", L_Menuitems, "6", L_Menuitems, "7", L_Menuitems, "8", L_Menuitems,
+ "9", L_Menuitems, "10", L_Menuitems, "11", L_Menuitems, "12", L_Menuitems, "13", L_Menuitems, "14", L_Menuitems, "15", L_Menuitems, "16", L_Menuitems, "17", L_Menuitems, "18", L_Menuitems,
+ "19", L_Menuitems, "20", L_Menuitems, "21", L_Menuitems, "22", L_Menuitems, "23", L_Menuitems, "24", L_Menuitems, "25", L_Menuitems, "26", L_Menuitems, "27", L_Menuitems, "28", L_Menuitems,
+ "29", L_Menuitems, "30", L_Menuitems, "31", L_Menuitems, "32", L_Menuitems, "33", L_Menuitems, "34", L_Menuitems, "35", L_Menuitems, "36", L_Menuitems;
+
+L_Menuitems:
+ if (@menu == 1) set @number, 0;
+ if (@menu == 2) set @number, 37;
+ if (@menu >= 3) set @number, @menu - 2;
+
+ set @roulette, rand(38);
+ if (@roulette == 37) mes "The ball stopped on 00";
+ if (@roulette < 37) mes "The ball stopped on " + @roulette;
+ if (@number != @roulette) goto L_Lost;
+ mes "\"You won!\"";
+ getitem "CasinoCoins", @bet * 10;
+ goto L_Close;
+
+L_NoCoin:
+ mes "\"You don't have enough coins.\"";
+ goto L_Close;
+
+L_Lost:
+ mes "\"I'm sorry, you lost.\"";
+ goto L_Close;
+
+L_Close:
+ mes "Come again.";
+ set @number, 0;
+ set @roulette, 0;
+ set @color, 0;
+ set @bet, 50;
+ close;
+}
diff --git a/world/map/npc/002-2/dedication.txt b/world/map/npc/002-2/dedication.txt
new file mode 100644
index 00000000..4ab9ba22
--- /dev/null
+++ b/world/map/npc/002-2/dedication.txt
@@ -0,0 +1,10 @@
+// Dedication to Irene Christina
+
+002-2.gat,116,123,0|script|#IreneDedication|400
+{
+ mes "~ Irene Christina ~";
+ mes "The song in this house is dedicated to Irene.";
+ next;
+ mes "She had seen only twenty hours of this world when she died in her father's arms.";
+ close;
+}
diff --git a/world/map/npc/002-2/eurni.txt b/world/map/npc/002-2/eurni.txt
new file mode 100644
index 00000000..a084acbc
--- /dev/null
+++ b/world/map/npc/002-2/eurni.txt
@@ -0,0 +1,45 @@
+//
+
+002-2.gat,22,77,0|script|Eurni|136
+{
+ set @halloween_npc_id, $@halloween_npc_eurni;
+ callfunc "TrickOrTreat";
+
+ if (BaseLevel < 10) goto L_TooYoung;
+ if (Zeny < 10000) goto L_NoMoney;
+
+ mes "[Eurni the Surgeon]";
+ mes "\"Are you tired of being what you are?\"";
+ next;
+
+ mes "[Eurni the Surgeon]";
+ mes "\"Would you maybe be interested in a sex change?\"";
+ next;
+
+ mes "[Server]";
+ mes "Warning: All characters under this login will be changed. Once it's done, you will be kicked from the server. Don't panic, as everything is fine.";
+ next;
+ menu
+ "Please do, my dear...", L_Change,
+ "Leave alone my family treasure!", L_Close;
+
+L_Change:
+ if (Zeny < 10000)
+ goto L_NoMoney;
+ set Zeny, Zeny - 10000;
+ changesex;
+ close;
+
+L_TooYoung:
+ mes "[Eurni the Surgeon]";
+ mes "\"Move along, kid.\"";
+ close;
+
+L_NoMoney:
+ mes "[Eurni the Surgeon]";
+ mes "\"You don't have enough to pay for my services.\"";
+ close;
+
+L_Close:
+ close;
+}
diff --git a/world/map/npc/002-2/hetchel.txt b/world/map/npc/002-2/hetchel.txt
new file mode 100644
index 00000000..b595bd88
--- /dev/null
+++ b/world/map/npc/002-2/hetchel.txt
@@ -0,0 +1,445 @@
+// Hetchel the Silk Weaver
+// bh28
+// 2013-03, GPLv2.
+//
+// Hetchel is referred to by Lora Tay.
+// She weaves and sells standard double elbow square silk sheets.
+// She could also sell, dyed sheets, Silk robes from Lora Tay.
+// (6000 with cocoons, 40000 (?) with no cocoons).
+//
+// @wg_state: variable indicating winter gloves status.
+// Lora Tay proposes silk Robe if (@wg_state>= 11).
+// @SHEET_COCOONS_NR:* Number of cocoons required per sheet.
+// Might ne calculated from @ROBE_COCOONS_NR/@ROBE_SHEETS_NR
+// Actually: 150∕6 = 25
+// @SHEET_ZENY :* Money to pay per sheet: A sixth of 10000-2*500-6000
+// @SheetCount Number of sheets to buy (variable).
+//
+// @silkpants_state: variable indicating silkpant quest status.
+
+002-2.gat,76,92,0|script|Hetchel|376
+{
+ set @wg_state, ((QUEST_WG_state & BYTE_0_MASK) >> BYTE_0_SHIFT);
+ set @spants_state, ((QUEST_WG_state & NIBBLE_2_MASK) >> NIBBLE_2_SHIFT);
+ set @SHEET_COCOONS_NR, 25;
+ set @SHEET_ZENY, 500;
+ set @spants_minlvl, 45;
+ setarray @spants_req_hmn$, "Silk Cocoons", "Pieces of Cotton Cloth", "Silk Headbands";
+ setarray @spants_req$, "SilkCocoon", "CottonCloth", "SilkHeadband";
+ setarray @spants_req_amt, 154, 14, 2;
+ set @spants_reward, 45000;
+ set @spants_job_reward, 10000;
+ set @SheetCount, 0;
+
+ if (@wg_state < 11)
+ goto L_WG_quest_not_done;
+ if ( BaseLevel > @spants_minlvl && @spants_state < 1 ) goto L_Spants_Cry;
+ if ( @spants_state == 1 ) goto L_Spants_Cry_2;
+ if ( @spants_state == 2 ) goto L_Spants_Start;
+ if ( @spants_state > 2 && @spants_state < 8 ) goto L_Spants_Steal;
+ if ( @spants_state == 8 ) goto L_Spants_Make;
+
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Hello I am Hetchel, I weave fine textiles, what can I do for you?\"";
+ menu
+ "Sorry to bother, I'm just visiting.", L_Close,
+ "I am looking for silk sheets, Lora Tay told me that I could find some in this market. Can you help?", L_main_menu;
+
+L_WG_quest_not_done:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Hello I am Hetchel, I weave fine textiles.";
+ mes "My best client is Lora Tay, at Dimond's.";
+ mes "What can I do for you?\"";
+ menu
+ "Sorry to bother, I'm new to this country, just visting.", L_Close,
+ "What are you selling?", L_main_menu;
+
+L_Spants_Cry:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Hello I am Hetchel, I weave fine textiles, what can I do for you?\"";
+ menu
+ "Sorry to bother, I'm just visiting.", L_Close,
+ "I am looking for silk sheets, Lora Tay told me that I could find some in this market. Can you help?", L_Spants_Cry_Cont_1;
+
+L_Spants_Cry_2:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Hello I am Hetchel, I weave fine textiles, what can I do for you?\"";
+ menu
+ "Sorry to bother, I'm just visiting.", L_Close,
+ "I am looking for silk sheets, Lora Tay told me that I could find some in this market. Can you help?", L_main_menu,
+ "Hey you have been crying so badly, can I help you somehow?", L_Spants_Reply_Cry,
+ "Give Hetchel something to dry her tears", L_Spants_Wipe_Tears;
+
+L_Spants_Start:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Hello I am Hetchel, I weave fine textiles, what can I do for you?\"";
+ menu
+ "Sorry to bother, I'm just visiting.", L_Close,
+ "I am looking for silk sheets, Lora Tay told me that I could find some in this market. Can you help?", L_main_menu,
+ "So you are looking for new goals in your life?", L_Spants_No_Cry;
+
+L_Spants_Steal:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Hello I am Hetchel, I weave fine textiles, what can I do for you?\"";
+ menu
+ "Sorry to bother, I'm just visiting.", L_Close,
+ "I am looking for silk sheets, Lora Tay told me that I could find some in this market. Can you help?", L_main_menu,
+ "About the Pants...", L_Spants_Steal_Cont;
+
+L_Spants_Make:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Hello I am Hetchel, I weave fine textiles, what can I do for you?\"";
+ menu
+ "Sorry to bother, I'm just visiting.", L_Close,
+ "I am looking for silk sheets, Lora Tay told me that I could find some in this market. Can you help?", L_main_menu,
+ "Hey what about the Pants you were planning to make?", L_Spants_Make_Cont;
+
+L_Spants_Cry_Cont_1:
+ mes "You notice how the tiny woman blushes, she suddenly bursts into tears.";
+ next;
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Hello\"";
+ mes "Hetchel hides her face in her hands";
+ mes "";
+ mes "";
+ menu
+ "\"Hey, what is the problem?\"", L_Spants_Reply_Cry,
+ "Give Hetchel something to dry her tears", L_Spants_Wipe_Tears,
+ "\"Oh really? Just sell me some Silk Sheets if you have them\"", L_main_menu;
+
+L_Spants_Wipe_Tears:
+ mes "Hand Hetchel a (please type the Item you want to give her)";
+ next;
+ mes "This is case sensitive. Also do not enter whitespaces.";
+ input @spants_wipe_thingy$;
+ if (@spants_wipe_thingy$ == "") goto L_Spants_Wrong;
+ if (countitem(@spants_wipe_thingy$) < 1) goto L_Spants_No_Item;
+ if (@spants_wipe_thingy$ == "RedCottonCloth") goto L_Spants_Wipe_Tears_Cont;
+ if (@spants_wipe_thingy$ == "RedHitchhikersTowel") goto L_Spants_Wipe_Tears_Towel;
+ mes "Hetchel looks at you, then looks at the" + @spants_wipe_thingy$ + ".";
+ mes "She hangs her head and weeps more";
+ mes "Red is the only color I have ever loved, bring me something red to dry my tears";
+ goto L_Close;
+
+L_Spants_Wipe_Tears_Towel:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"No, I recognize this towel, it is one of those warping towels, are you trying to mess with me?\"";
+ goto L_Close;
+
+L_Spants_Wrong:
+ mes "It appears you forgot to type the item you want to give.";
+ goto L_Close;
+
+L_Spants_No_Item:
+ mes "Oh you do not have it.";
+ goto L_Close;
+
+L_Spants_Wipe_Tears_Cont:
+ mes "Hetchel dries her tears with the Red Piece of Cloth you gave her.";
+ mes "This seems to have consoled her.";
+ delitem "RedCottonCloth", 1;
+ set @spants_state, 2;
+ callsub S_Update_Spants;
+ goto L_Spants_No_Cry;
+
+L_Spants_No_Cry:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Oh thank you my dear friend.";
+ mes "Yes, to some extent.";
+ next;
+ mes "I am just so sad because I realized that this is going to be the thing I will be doing for the rest of my life\"";
+ menu
+ "\"You are still young, Hetchel, You can still accomplish things\"", L_Spants_Cry_Cont_2,
+ "\"Yes, you are probably correct.\"", L_Close;
+
+L_Spants_Cry_Cont_2:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "Hetchel thinks for a while";
+ mes "";
+ mes "\"Oh my friend, I have been dreaming of making a garment of my own.";
+ mes "It always bothered me to see all those wizards and witches here being naked under their cloaks\"";
+ mes "\"They must be so embarrassed - they are true heroes to give up their dignity to be able to fight the perils of this world\"";
+ mes "Hetchel sobs";
+ menu
+ "\"So you want to make pants for mages?\"", L_Spants_Cry_Cont_3,
+ "\"This sounds ridiculous. Good Bye.\"", L_Close;
+
+L_Spants_Cry_Cont_3:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Ok, so I figured I could make some trousers like Lora Tay makes but from the much finer Material the Silk Worms are making for us\"";
+ mes "\"But I really need the base plans for the trousers, otherwise I do not know how to attempt this.";
+ mes "Can you get me those plans from her?\"";
+ menu
+ "\"No, sorry I am too busy for that\"", L_Close,
+ "\"Of course!\"", L_Spants_Cry_Cont_4;
+
+L_Spants_Cry_Cont_4:
+ set @spants_state, 3;
+ callsub S_Update_Spants;
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Oh wait! I am not sure if it is such a good idea to ask her about that, I think she would not give the plans to you anyway.";
+ mes "Maybe you can find a way to get those plans on a different way?";
+ mes "I think there are some people in Hurnscald who have their means of getting you every possible item there is\"";
+ next;
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "Please please please - I need those plans";
+ goto L_Close;
+
+L_Spants_Reply_Cry:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"...\"";
+ set @spants_state, 1;
+ callsub S_Update_Spants;
+ goto L_Close;
+
+
+L_Spants_Steal_Cont:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Have you gotten hold of the plans?\"";
+ menu
+ "Yes I have them somewhere here", L_Spants_Steal_Cont2,
+ "No, not yet", L_Close;
+
+L_Spants_Steal_Cont2:
+ if @spants_state < 7 goto L_Spants_No_Item;
+ set @spants_state, 8;
+ callsub S_Update_Spants;
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Oh this is miraculous\"";
+ mes "";
+ mes "Hetchel sheds some tears of joy";
+ next;
+ mes "You hand her the crumpled plans Crastur the Ugly gave you.";
+ next;
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"I need to figure out how to do this now... \"";
+ next;
+ mes "Hetchel adjusts her glasses and reads carefully";
+ next;
+ mes "She seems to be very busy, maybe you should come back later.";
+ goto L_Close;
+
+L_Spants_Make_Cont:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Yes, I already made a prototype but it cost me a lot of time and effort.";
+ mes "I can give it to you if you are willing to pay for my expenses though.\"";
+ menu
+ "What do you want for those silken pants?", L_Spants_Make_Cont_2,
+ "No, I am not particularly interested.", L_Close;
+
+L_Spants_Make_Cont_2:
+ if(getarraysize(@spants_req_amt) < 3 || getarraysize(@spants_req$) < 3 || getarraysize(@spants_req_hmn$) < 3)
+ goto L_Spants_Error;
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"I need you to bring me " + @spants_req_amt[0] +" "+ @spants_req_hmn$[0] + ", " + @spants_req_amt[1] +" "+ @spants_req_hmn$[1] + " and " + @spants_req_amt[2] +" "+ @spants_req_hmn$[2];
+ next;
+ mes "You will not have to pay for my time, I am so proud to have accomplished this on my own!\"";
+ menu
+ "\"I have those items with me\"", L_Spants_Pay,
+ "\"I am still looking for them\"", L_Close,
+ "\"What do you need again?\"", L_Spants_Make_Cont_2;
+
+L_Spants_Pay:
+ if (countitem(@spants_req$[0]) < @spants_req_amt[0] || countitem(@spants_req$[1]) < @spants_req_amt[1] || countitem(@spants_req$[2]) < @spants_req_amt[2])
+ goto L_Spants_No_Item;
+ getinventorylist;
+ if (inventorylist_count == 100) goto L_TooMany;
+ mes "Hetchel takes your items.";
+ delitem @spants_req$[0], @spants_req_amt[0];
+ delitem @spants_req$[1], @spants_req_amt[1];
+ delitem @spants_req$[2], @spants_req_amt[2];
+ getitem "SilkPants", 1;
+ set @spants_state, 9;
+ callsub S_Update_Spants;
+ next;
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Here are your pants my dear.";
+ mes "Keep them safe I do not know if I will ever try this again.\"";
+ getexp @spants_reward, @spants_job_reward;
+ goto L_Close;
+
+L_Spants_Error:
+ mes "Something went wrong in the script, please inform a developer about that";
+ close;
+
+L_main_menu:
+ mes "[Hetchel]";
+ mes "\"I have some silk sheets: double-elbow squares.\"";
+ menu
+ "I'm not interested at the moment, maybe later; thanks anyway.", L_Close,
+ "Can I buy some?", L_Next;
+// "Do you have a silk robe I could buy?", L_robe,
+// "Goodbye.", L_Close;
+
+L_Next:
+ mes "[Hetchel]";
+ mes "";
+ mes "\"Sure but you need to provide raw materials.";
+ mes "I'll need " + @SHEET_COCOONS_NR +" silk cocoons per sheet,";
+ mes "and also " + @SHEET_ZENY +" GP per sheet for my work.\"";
+ next;
+ if (countitem("SilkCocoon") == 0)
+ goto L_sheet_no_cocoon;
+ goto L_sheet_menu;
+
+L_sheet_menu:
+ menu
+ "I have what you asked for.", L_Next1,
+ "Sorry I didn't pay attention enough, what do you need?", L_how_many_cocoons,
+ "Oops! Sorry, I'll come back soon with them.", L_Close;
+
+L_Next1:
+ mes "[Hetchel]";
+ mes "";
+ mes "\"How many would you like?\"";
+ input @SheetCount;
+ if (@SheetCount == 0)
+ goto L_zero_sheet;
+ if (countitem("SilkCocoon") < @SheetCount * @SHEET_COCOONS_NR)
+ goto L_sheet_missing_cocoons;
+ if (Zeny < @SheetCount * @SHEET_ZENY)
+ goto L_sheet_missing_Zeny;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("SilkSheet") < 1 && countitem("SilkCocoon") > @SheetCount * @SHEET_COCOONS_NR)
+ goto L_TooMany;
+ set Zeny, Zeny - @SheetCount * @SHEET_ZENY;
+ delitem "SilkCocoon", @SheetCount * @SHEET_COCOONS_NR;
+ getitem "SilkSheet", @SheetCount;
+ mes "[Hetchel]";
+ mes "";
+ mes "\"Thank you, I hope the sheets will fit your needs.";
+ mes "Please greet Lora for me when you see her.\"";
+ emotion EMOTE_HAPPY;
+ goto L_Close;
+
+L_sheet_missing_cocoons:
+ mes "[Hetchel]";
+ mes "";
+ mes "\"I'm sorry, but I need " + @SheetCount * @SHEET_COCOONS_NR + ", not " + countitem("SilkCocoon") + ".\"";
+ goto L_Close;
+
+L_sheet_missing_Zeny:
+ mes "[Hetchel]";
+ mes "";
+ mes "\"No, no no. The way this works is that you give me the GP first and I give you the sheets afterwards.";
+ mes "You're " + (@SheetCount * @SHEET_ZENY - Zeny) + " GP short, so come back when you can afford the sheets you asked for!\"";
+ goto L_Close;
+
+L_how_many_cocoons:
+ mes "[Hetchel]";
+ mes "";
+ mes "\"I need an average of " + @SHEET_COCOONS_NR + " cocoons per sheet";
+ mes "and also " + @SHEET_ZENY + " GP per sheet for my work.\"";
+ next;
+ goto L_sheet_menu;
+
+L_sheet_no_cocoon:
+ mes "[Hetchel]";
+ mes "";
+ mes "\"You don't have any cocoon? I'm sorry I can't do anything for you.\"";
+ menu
+ "I'll seek for them.", L_Close,
+ "Where can I get cocoons?", L_Next2;
+
+L_Next2:
+ mes "[Hetchel]";
+ mes "\"Silk cocoons come from Silkworms. Silkworms live in the woodland area around Hurnscald.";
+ mes "Silkworms like especially woods and dark areas. You can go there by ferry.\"";
+ goto L_Close;
+
+//L_robe:
+// mes "[Hetchel]";
+// mes "\"I am not a seamstress but I have a few silk robes from Lora Tay left.";
+// mes "It is not your size as Lora made them for me, but Tondar was kind enough";
+// mes "to cast a spell on it, so that it will fit to you as soon as you wear it.";
+// mes "However his prices are not that low.\"";
+// next;
+// goto L_main_menu;
+
+L_zero_sheet:
+ mes "[Hetchel]";
+ mes "";
+ mes "\"It's the best way to get quickly served!\"";
+ goto L_Close;
+
+L_TooMany:
+ mes "[Hetchel]";
+ mes "";
+ mes "\"Your bag hasn't room enough. Store some things and come back.\"";
+ goto L_Close;
+
+S_Update_Spants:
+ set QUEST_WG_state, (QUEST_WG_state & ~(NIBBLE_2_MASK) | (@spants_state << NIBBLE_2_SHIFT));
+ return;
+
+L_Close:
+ set QUEST_WG_state, (QUEST_WG_state & ~(NIBBLE_2_MASK) | (@spants_state << NIBBLE_2_SHIFT));
+ set @wg_state, 0;
+ set @spants_state, 0;
+ set @spants_minlvl, 0;
+ set @spants_reward, 0;
+ set @spants_job_reward, 0;
+ set @spants_wipe_thingy, "";
+ set @SHEET_COCOONS_NR, 0;
+ set @SHEET_ZENY, 0;
+ set @SheetCount, 0;
+ set @wg_state, 0;
+ close;
+}
+
+002-2.gat,73,95,0|script|HetchelDebug|376
+{
+set @wg_state, ((QUEST_WG_state & BYTE_0_MASK) >> BYTE_0_SHIFT);
+set @spants_state, ((QUEST_WG_state & NIBBLE_2_MASK) >> NIBBLE_2_SHIFT);
+
+mes "Lora Tay Quest State: "+ @wg_state;
+mes "Silk Pants Quest State: "+ @spants_state;
+
+menu
+ "Set Lora Tay Quest State", L_Lora_Tay,
+ "Set Silk Pants Quest State", L_Spants,
+ "Close", L_Close;
+
+L_Lora_Tay:
+ mes "Set Lora Tay Visited State (0 - reset , 11 - enough for SilkPants Quest)";
+ input @wg_state;
+ goto L_Close;
+
+L_Spants:
+ mes "Set SilkPants Quest State (0 - reset)";
+ input @spants_state;
+ goto L_Close;
+
+L_Close:
+ set QUEST_WG_state, (QUEST_WG_state & ~(BYTE_0_MASK) | (@wg_state << BYTE_0_SHIFT));
+ set @wg_state, 0;
+ set QUEST_WG_state, (QUEST_WG_state & ~(NIBBLE_2_MASK) | (@spants_state << NIBBLE_2_SHIFT));
+ set @spants_state, 0;
+ close;
+
+OnInit:
+ if (!debug)
+ disablenpc "HetchelDebug";
+ end;
+}
diff --git a/world/map/npc/002-2/imec.txt b/world/map/npc/002-2/imec.txt
new file mode 100644
index 00000000..851dd49b
--- /dev/null
+++ b/world/map/npc/002-2/imec.txt
@@ -0,0 +1,113 @@
+// Merchant got his shop shot down due to selling poison and asks the player for some errand
+// after finishing this, daily quest with scorpion stingers
+// Using bit 8 and 9 of QUEST_NorthTulimshar (first half of nibble 2)
+// author: Jenalya
+002-2.gat,36,75,0|script|Imec|162
+{
+ set @state, ((QUEST_NorthTulimshar & TWOBIT_4_MASK) >> TWOBIT_4_SHIFT);
+ set @EXP, 90;
+ set @money, 500;
+
+ if (@state >= 3) goto L_Stingers;
+ if (@state == 2) goto L_Return;
+ if (@state == 1) goto L_Bring;
+
+ mes "[Imec]";
+ mes "\"The Wizard's Council shut down my shop!";
+ mes "They said I was selling illegal things, but what's so illegal about poison?\"";
+ next;
+ mes "\"Anyway, I hope to get a merchant's permit again... One of these days...\"";
+ mes "He looks at you.";
+ next;
+ mes "[Imec]";
+ mes "\"You can do an errand for me. I just finished writing a petition to the Council about my shop.";
+ mes "If you bring it to the government building near the docks, I'll give you a small reward.\"";
+ goto L_Offer;
+
+L_Offer:
+ menu
+ "Where are the docks and what is the government building?",L_Explain,
+ "Ok, sounds good.",L_Next,
+ "No!",L_Close;
+
+L_Next:
+ mes "[Imec]";
+ mes "\"Very good. Here is the paper.\"";
+ mes "Imec gives you a sealed letter. You put it away in a pocket separated from your inventory, so it won't get lost.";
+ set @state, 1;
+ callsub S_Update_Mask;
+ goto L_Close;
+
+L_Explain:
+ mes "[Imec]";
+ mes "\"Follow the road to the north through the gate, then go west when you reach the docks. It's right before the castle mount.\"";
+ next;
+ mes "\"In the building there are several offices. If you want to join or form a party, you have to pay your taxes there first.\"";
+ next;
+ mes "\"So, will you bring my petition to the office in that building?\"";
+ if (@state == 0)
+ goto L_Offer;
+ goto L_Close;
+
+L_Bring:
+ mes "[Imec]";
+ mes "\"What are you waiting for? Bring my petition to the government building.\"";
+ menu
+ "Where is it again?",L_Explain,
+ "I'm on my way.",L_Close;
+
+L_Return:
+ mes "[Imec]";
+ mes "\"Ah, you're back.\"";
+ mes "You hand the letter of acknowledgement over to Imec.";
+ next;
+ mes "[Imec]";
+ mes "\"Very well. I'm sure I'll be able to open my shop again soon.\"";
+ next;
+ mes "It seems Imec doesn't notice you anymore.";
+ menu
+ "You mentioned a reward.",L_Next1;
+
+L_Next1:
+ mes "[Imec]";
+ mes "\"What? Ah, right. Here, have this.\"";
+ getexp @EXP, 0;
+ set Zeny, Zeny + @money;
+ set @state, 3;
+ callsub S_Update_Mask;
+ next;
+ mes "\"Actually, you could be of further help to me.\"";
+ next;
+ goto L_Stingers;
+
+L_Stingers:
+ mes "[Imec]";
+ set @dq_level, 10;
+ set @dq_cost, 3;
+ set @dq_count, 3;
+ set @dq_name$, "ScorpionStinger";
+ set @dq_friendly_name$, "Scorpion Stingers";
+ set @dq_money, 200;
+ set @dq_exp, 40;
+
+ callfunc "DailyQuest";
+ goto L_Close;
+
+L_Close:
+ set @money, 0;
+ set @state, 0;
+
+ set @dq_level, 0;
+ set @dq_cost, 0;
+ set @dq_count, 0;
+ set @dq_name$, "";
+ set @dq_friendly_name$, "";
+ set @dq_money, 0;
+ set @dq_exp, 0;
+ set @dq_return, 0;
+ close;
+
+S_Update_Mask:
+ set QUEST_NorthTulimshar, (QUEST_NorthTulimshar & ~(TWOBIT_4_MASK)) | (@state << TWOBIT_4_SHIFT);
+ return;
+}
diff --git a/world/map/npc/002-2/inya.txt b/world/map/npc/002-2/inya.txt
new file mode 100644
index 00000000..322d0eb3
--- /dev/null
+++ b/world/map/npc/002-2/inya.txt
@@ -0,0 +1,209 @@
+//Gemstones: Diamond (white) , Ruby (red), Emerald (green), Sapphire (blue), Topaz (yellow), Amethyst (purple)
+//The power of the gems is important to future balance of these rings. Are they related to stats, tiers of power, schools of magic?
+
+002-2.gat,116,61,0|shop|#InyaShop|127,SimpleRing:*100000
+
+002-2.gat,116,61,0|script|Inya|106
+{
+ mes "[Inya]";
+ mes "\"I am Inya, a jeweler of fine rings. I sell and make rings.\"";
+ next;
+ mes "\"If you have a Simple Ring and a gem, I can set the gem in it for 100,000 gold pieces.\"";
+ next;
+ mes "\"Also, if you have a ring with gems on it, I can remove the gems and return the Simple Ring to you for 50,000 gold pieces.\"";
+ next;
+ mes "\"So, how can I help you?\"";
+ menu
+ "What jewelry do you have for sale?", L_Inya_Shop,
+ "I have a wedding ring, will that do?", L_Inya_Wedding_Ring,
+ "I'd like to remove a gem (50000 GP).", L_Inya_Remove_RingGem,
+ "I'd like to add a gem (100000 GP).", L_Inya_Add_RingGem,
+ "Not interested.", L_Inya_NotInterested;
+
+L_Inya_Shop:
+ close2;
+ shop "#InyaShop";
+
+L_Inya_Wedding_Ring:
+ mes "[Inya]";
+ mes "\"No, sorry. I do not alter wedding rings at this time.\"";
+ close;
+
+L_Inya_Remove_RingGem:
+ mes "[Inya]";
+ mes "\"What kind of gem would you like to have removed?\"";
+ menu
+ "Diamond.", L_Inya_Remove_Diamond,
+ "Ruby.", L_Inya_Remove_Ruby,
+ "Emerald.", L_Inya_Remove_Emerald,
+ "Sapphire.", L_Inya_Remove_Sapphire,
+ "Topaz.", L_Inya_Remove_Topaz,
+ "Amethyst.", L_Inya_Remove_Amethyst,
+ "I've changed my mind.", L_Inya_NotInterested;
+
+L_Inya_Add_RingGem:
+ mes "[Inya]";
+ mes "\"What kind of gem would you like to add?\"";
+ menu
+ "Diamond.", L_Inya_Add_Diamond,
+ "Ruby.", L_Inya_Add_Ruby,
+ "Emerald.", L_Inya_Add_Emerald,
+ "Sapphire.", L_Inya_Add_Sapphire,
+ "Topaz.", L_Inya_Add_Topaz,
+ "Amethyst.", L_Inya_Add_Amethyst,
+ "I've changed my mind.", L_Inya_NotInterested;
+
+L_Inya_Remove_Diamond:
+ if ( (Zeny < 50000)
+ | (countitem ("DiamondRing") < 1) )
+ goto L_Inya_Not_Enough;
+ set Zeny, Zeny - 50000;
+ delitem "DiamondRing", 1;
+ getitem "SimpleRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Remove_Ruby:
+ if ( (Zeny < 50000)
+ | (countitem ("RubyRing") < 1) )
+ goto L_Inya_Not_Enough;
+ set Zeny, Zeny - 50000;
+ delitem "RubyRing", 1;
+ getitem "SimpleRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Remove_Emerald:
+ if ( (Zeny < 50000)
+ | (countitem ("EmeraldRing") < 1) )
+ goto L_Inya_Not_Enough;
+ set Zeny, Zeny - 50000;
+ delitem "EmeraldRing", 1;
+ getitem "SimpleRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Remove_Sapphire:
+ if ( (Zeny < 50000)
+ | (countitem ("SapphireRing") < 1) )
+ goto L_Inya_Not_Enough;
+ set Zeny, Zeny - 50000;
+ delitem "SapphireRing", 1;
+ getitem "SimpleRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Remove_Topaz:
+ if ( (Zeny < 50000)
+ | (countitem ("TopazRing") < 1) )
+ goto L_Inya_Not_Enough;
+ set Zeny, Zeny - 50000;
+ delitem "TopazRing", 1;
+ getitem "SimpleRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Remove_Amethyst:
+ if ( (Zeny < 50000)
+ | (countitem ("AmethystRing") < 1) )
+ goto L_Inya_Not_Enough;
+ set Zeny, Zeny - 50000;
+ delitem "AmethystRing", 1;
+ getitem "SimpleRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Add_Diamond:
+ if ( (Zeny < 100000)
+ | (countitem ("SimpleRing") < 1)
+ | (countitem ("Diamond") < 1) )
+ goto L_Inya_Not_Enough;
+ set Zeny, Zeny - 100000;
+ delitem "SimpleRing", 1;
+ delitem "Diamond", 1;
+ getitem "DiamondRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Add_Ruby:
+ if ( (Zeny < 100000)
+ | (countitem ("SimpleRing") < 1)
+ | (countitem ("Ruby") < 1) )
+ goto L_Inya_Not_Enough;
+ set Zeny, Zeny - 100000;
+ delitem "SimpleRing", 1;
+ delitem "Ruby", 1;
+ getitem "RubyRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Add_Emerald:
+ if ( (Zeny < 100000)
+ | (countitem ("SimpleRing") < 1)
+ | (countitem ("Emerald") < 1) )
+ goto L_Inya_Not_Enough;
+ set Zeny, Zeny - 100000;
+ delitem "SimpleRing", 1;
+ delitem "Emerald", 1;
+ getitem "EmeraldRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Add_Sapphire:
+ if ( (Zeny < 100000)
+ | (countitem ("SimpleRing") < 1)
+ | (countitem ("Sapphire") < 1) )
+ goto L_Inya_Not_Enough;
+ set Zeny, Zeny - 100000;
+ delitem "SimpleRing", 1;
+ delitem "Sapphire", 1;
+ getitem "SapphireRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Add_Topaz:
+ if ( (Zeny < 100000)
+ | (countitem ("SimpleRing") < 1)
+ | (countitem ("Topaz") < 1) )
+ goto L_Inya_Not_Enough;
+ set Zeny, Zeny - 100000;
+ delitem "SimpleRing", 1;
+ delitem "Topaz", 1;
+ getitem "TopazRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Add_Amethyst:
+ if ( (Zeny < 100000)
+ | (countitem ("SimpleRing") < 1)
+ | (countitem ("Amethyst") < 1) )
+ goto L_Inya_Not_Enough;
+ set Zeny, Zeny - 100000;
+ delitem "SimpleRing", 1;
+ delitem "Amethyst", 1;
+ getitem "AmethystRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_NotInterested:
+ mes "[Inya]";
+ mes "\"Come back later and I will try to be of assistance.\"";
+ close;
+
+L_Inya_Not_Enough:
+ mes "[Inya]";
+ mes "\"I am sorry, you simply do not seem to have the necessary items for me to help you. Please come back when you do, and I would be more than happy to help you out.\"";
+ close;
+}
diff --git a/world/map/npc/002-2/kps.txt b/world/map/npc/002-2/kps.txt
new file mode 100644
index 00000000..a17df1a3
--- /dev/null
+++ b/world/map/npc/002-2/kps.txt
@@ -0,0 +1,164 @@
+// KPS (Killian Parcel Service)
+// Author: Wushin
+// Kylian_Timer denotes current quest time & holds last completed.
+// reuse the 4 bits
+// To Mark 4 Different NPCs.
+// setarray $@kps_npc_bits, $@knowYanisNT, $@knowLatoyNT, $@knowWeellosNT, $@knowCasinoNT;
+002-2.gat,120,89,0|script|KPS Manager|191
+{
+ set @state, ((QUEST_NorthTulimshar & NIBBLE_5_MASK) >> NIBBLE_5_SHIFT);
+ set @run, ((QUEST_NorthTulimshar & TWOBIT_8_MASK) >> TWOBIT_8_SHIFT);
+ set @run_cnt, ((QUEST_NorthTulimshar & TWOBIT_9_MASK) >> TWOBIT_9_SHIFT);
+ if (@state == 15)
+ goto L_SeeKylian;
+ if (@state == 14)
+ goto L_RunComplete;
+ if (@state == 13)
+ goto L_RunStarted;
+ if (@state == 12)
+ goto L_JobSelect;
+ if (@state == 11)
+ goto L_AcceptJob;
+ if (@state == 10)
+ goto L_OfferJob;
+ goto L_Default;
+
+L_Default:
+ mes "[KPS Manager]";
+ mes "\"Kylian staying at the Inn bought this shop recently.\"";
+ mes "\"I'm waiting for him to open the shop.\"";
+ next;
+ mes "\"I wonder if he needs any help?\"";
+ goto L_Close;
+
+L_OfferJob:
+ mes "[KPS Manager]";
+ mes "\"Hello and what how can I help you today?\"";
+ menu
+ "My name is " + strcharinfo(0), L_MyName,
+ "Nothing.", L_Close;
+
+L_MyName:
+ set @state, 11;
+ callfunc "SetKylianQuest";
+ mes "\"Ahhh, Kylian said you would be dropping by.\"";
+ next;
+ mes "\"I assume you are looking for some work?\"";
+ menu
+ "Yes.", L_StartJob,
+ "No.", L_Close;
+
+L_AcceptJob:
+ mes "[KPS Manager]";
+ mes "\"Interested in some work?\"";
+ menu
+ "Yes.", L_StartJob,
+ "No.", L_Close;
+
+L_StartJob:
+ set @run, 0;
+ callfunc "SetKylianRun";
+ set @run_cnt, 0;
+ callfunc "SetKylianRunCnt";
+ set @state, 12;
+ callfunc "SetKylianQuest";
+ goto L_JobSelect;
+
+L_StartJobAgain:
+ set @run, 0;
+ callfunc "SetKylianRun";
+ set @state, 12;
+ callfunc "SetKylianQuest";
+ goto L_JobSelect;
+
+L_JobSelect:
+ if ((gettimetick(2) - Kylian_Timer) < 86400)
+ goto L_NoPackages;
+ mes "[KPS Manager]";
+ mes "\"We have a number of deliveries that need to go all over the world.\"";
+ next;
+ goto L_RandJob;
+
+L_RandJob:
+ set @rand_quest, rand(1,3);
+ goto L_JobInfo;
+
+L_JobInfo:
+ mes "\"We have a delivery for:* " + $@random_quests$[@rand_quest] + "\"";
+ menu
+ "Take It.", L_StartRun,
+ "Anything Else?", L_RandJob,
+ "I need a break.", L_Close;
+
+L_StartRun:
+ set @state, 13;
+ callfunc "SetKylianQuest";
+ set @run, @rand_quest;
+ callfunc "SetKylianRun";
+ set Kylian_Timer, gettimetick(2);
+ goto L_Close;
+
+L_RunStarted:
+ mes "Deliver this package to:* " + $@random_quests$[@run] + "\"";
+ goto L_Close;
+
+L_RunComplete:
+ set @elapsed_time, (gettimetick(2) - Kylian_Timer);
+ if (@elapsed_time > 600)
+ goto L_Failed;
+ set @run_cnt, (@run_cnt + 1);
+ callfunc "SetKylianRunCnt";
+ // Set Kylian wants to see you reward state
+ if (@run_cnt > 3)
+ goto L_KylianReward;
+ goto L_RunAgain;
+
+L_SeeKylian:
+ mes "\"You need to go see Kylian before I can give you any more work.\"";
+ goto L_Close;
+
+L_Failed:
+ mes "\"You need to be faster next time to earn a bonus.\"";
+ next;
+ goto L_RunAgain;
+
+L_KylianReward:
+ set Zeny, Zeny + $@delivery_money;
+ getexp ($@delivery_exp_mod * BaseLevel), 0;
+ callfunc "SetKylianRun";
+ set @state, 15;
+ callfunc "SetKylianQuest";
+ mes "[" + $@delivery_money + " money]";
+ mes "[" + ($@delivery_exp_mod * BaseLevel) + " experience points]";
+ next;
+ mes "\"I have a message Kylian wants me to send you over right away.\"";
+ goto L_Close;
+
+L_RunAgain:
+ set Zeny, Zeny + $@delivery_money;
+ getexp ($@delivery_exp_mod * BaseLevel), 0;
+ callfunc "SetKylianRun";
+ mes "[" + $@delivery_money + " money]";
+ mes "[" + ($@delivery_exp_mod * BaseLevel) + " experience points]";
+ next;
+ mes "\"Good job, keep up the nice work and I'm sure the bonus will give you a bonus.\"";
+ next;
+ goto L_StartJobAgain;
+
+L_NoPackages:
+ mes "\"Come back tomorrow, maybe we will have some more work.\"";
+ goto L_Close;
+
+L_Close:
+ close;
+}
+function|script|SetKylianRun
+{
+ set QUEST_NorthTulimshar, (QUEST_NorthTulimshar & ~(TWOBIT_8_MASK)) | (@run << TWOBIT_8_SHIFT);
+ return;
+}
+function|script|SetKylianRunCnt
+{
+ set QUEST_NorthTulimshar, (QUEST_NorthTulimshar & ~(TWOBIT_9_MASK)) | (@run_cnt << TWOBIT_9_SHIFT);
+ return;
+}
diff --git a/world/map/npc/002-2/kylian.txt b/world/map/npc/002-2/kylian.txt
new file mode 100644
index 00000000..7f832b87
--- /dev/null
+++ b/world/map/npc/002-2/kylian.txt
@@ -0,0 +1,424 @@
+// Kylian is a businessman from Argeas who wants to eventually open a shop in Tulimshar
+// asks the player for several information about the city
+// Quest uses Nibble 4 and 5 of QUEST_NorthTulimshar
+// Author: Jenalya
+
+// Nibble 4 is used as flags to indicate if the player knows certain places/persons
+// Bit 0: player talked to Yanis in the government building
+// Bit 1: player talked to Latoy on the market in North Tulimshar
+// Bit 2: player talked to Weellos as the historic building
+// Bit 3: player was in the casino rooms
+
+// Nibble 5 is used to save the quest progress with Kylian
+// state 1: player has the task to get the luggage from the harbor
+// state 2: Adrian gave the luggage to the player
+// state 3: player gave luggage to Kylian and Kylian asks who to talk to for the shop license
+// after the player answered this, @KylianNTLicense is set.
+// the player can only continue the quest when logging out and therefore setting that value to 0 again
+// state 4: Kylian asks for a historical building to get some cultural knowledge
+// state 5: Kylian asks where to get some typical food
+// after the player answered this, @KylianNTSightSeeing is set.
+// the player can only continue the quest when logging out and therefore setting that value to 0 again
+// state 6: Kylian asks where to go to have some fun in the evening (casino)
+// state 7: Kylian asks where to get exquisite clothing before going out in the evening
+// after the player answered this, @KylianNTSightSeeing is set.
+// the player can only continue the quest when logging out and therefore setting that value to 0 again
+// state 8: Kylian was in the casino and gives a desert hat as reward
+// state 9: Shop approved, go talk Kylian's shopkeeper if you are looking for work.
+// state 10: Meet Shop keeper
+// state 11: Start Time Trial
+// state 12: Return
+// state 13: Start Daily Timed
+// state 14: Return
+// state 15: Completed
+// Kylian_Timer is used to denote start time.
+
+// temporary variables used to check if the player logged out or left the building in the meanwhile
+// this is to ensure some 'time in between' different actions of the quest
+// @KylianNTLicense
+// @KylianNTSightSeeing
+// @KylianNTCasino
+
+-|script|#businessmanNTconfig|-1
+{
+ end;
+
+OnInit:
+ // Nibble 4
+ // Used in Random Quest later as a Nibble
+ set $@knowYanisNT, (1 << 16);
+ set $@knowLatoyNT, (1 << 17);
+ set $@knowWeellosNT, (1 << 18);
+ set $@knowCasinoNT, (1 << 19);
+
+ // Random Quests for Later
+ setarray $@random_quests$, "None", "Falkurn", "Old Wizard", "Baktar";
+ set $@delivery_money, 100;
+ set $@delivery_exp_mod, 10;
+ end;
+}
+002-2.gat,44,107,0|script|#KylianOut|32767,1,1
+{
+ set @KylianNTLicense, 0;
+ set @KylianNTSightSeeing, 0;
+ set @KylianNTCasino, 0;
+ end;
+}
+002-2.gat,43,101,0|script|Kylian|193
+{
+ set @state, ((QUEST_NorthTulimshar & NIBBLE_5_MASK) >> NIBBLE_5_SHIFT);
+
+ set @acorn_amount, 12;
+ set @suitcase_money, 100;
+ set @suitcase_exp, 50;
+ set @license_money, 50;
+ set @license_exp, 20;
+ set @sightseeing_money, 50;
+ set @sightseeing_exp, 20;
+ set @food_money, 50;
+ set @food_exp, 20;
+ set @clothes_money, 50;
+ set @clothes_exp, 20;
+ set @fun_money, 50;
+ set @fun_exp, 20;
+
+ // This NPC previously used the variable TMW_Quest
+ callfunc "ClearVarTMW_Quest";
+ set @fieri, ((QUEST_SouthTulimshar & NIBBLE_6_MASK) >> NIBBLE_6_SHIFT);
+
+ if (@state == 15) goto L_Done;
+ if (@state >= 11) goto L_Helping;
+ if (@state == 10) goto L_OfferedJob;
+ if (@state == 9) goto L_Shop;
+ if (@KylianNTCasino) goto L_CasinoDone;
+ if (@state == 8) goto L_DesertHat;
+ if (@state == 7) goto L_Clothes;
+ if (@KylianNTSightSeeing) goto L_SightSeeingDone;
+ if (@state == 6) goto L_Casino;
+ if (@state == 5) goto L_Food;
+ if (@KylianNTLicense) goto L_LicenseDone;
+ if (@state == 4) goto L_SightSeeing;
+ if (@state == 3) goto L_ShopLicense;
+ if (@state >= 1) goto L_Suitcase;
+
+ mes "[Kylian]";
+ mes "\"Ah, are you the room service? I've some requests.\"";
+ menu
+ "Sure, what can I do for you?",L_Luggage,
+ "No, I'm not!",L_Next;
+
+L_Next:
+ mes "[Kylian]";
+ mes "\"Too bad. Would you be interested in earning some quick money with some errands regardless?\"";
+ menu
+ "I'm a great adventurer! I don't do errands.",L_Close,
+ "No, I'm busy.",L_Close,
+ "Mh, ok.",L_Luggage;
+
+L_Luggage:
+ mes "[Kylian]";
+ mes "\"I need someone to get my luggage from the docks. Show this paper to the sailor who's watching the luggage.\"";
+ mes "He gives you his ticket which you store in your pocket, separated from your inventory.";
+ set @state, 1;
+ callfunc "SetKylianQuest";
+ goto L_Close;
+
+L_Suitcase: // @state >= 1, but below 3
+ mes "[Kylian]";
+ mes "\"Did you already get my luggage from the docks?\"";
+ if (@state != 2)
+ goto L_Close;
+ menu
+ "Here it is.",L_Continue,
+ "I'm on my way, don't worry.",L_Close;
+
+L_Continue:
+ if (countitem("LeatherSuitcase") < 1)
+ goto L_NoItem;
+ delitem "LeatherSuitcase", 1;
+ set Zeny, Zeny + @suitcase_money;
+ getexp @suitcase_exp, 0;
+ set @state, 3;
+ callfunc "SetKylianQuest";
+ mes "[Kylian]";
+ mes "\"Ah, very good. I really need to have a look at some of my papers in there.\"";
+ mes "He gives you some money.";
+ next;
+ mes "[Kylian]";
+ mes "\"Oh, and I have some acorns left, I had them with me as travelling fare. You can have them, they're tasty.";
+ mes "In case you don't like them, you could also bring them to the Tulimshar bakery. I heard they use them to make some special flour.\"";
+ getitem "Acorn", @acorn_amount;
+ next;
+ goto L_ShopLicense;
+
+L_ShopLicense: // @state == 3
+ mes "[Kylian]";
+ mes "\"I'm a salesman and came to Tulimshar because I'm thinking about establishing a shop here. While I'm going through my papers, could you find out who I have to talk to about opening a shop in this city?\"";
+ if (!(QUEST_NorthTulimshar & $@knowYanisNT))
+ goto L_Close;
+ menu
+ "You need to talk to Yanis in the government building.",L_GovBuild,
+ "I'll see what I can do.",L_Close;
+
+L_GovBuild:
+ set Zeny, Zeny + @license_money;
+ getexp @license_exp, 0;
+ set @state, 4;
+ callfunc "SetKylianQuest";
+ set @KylianNTLicense, 1;
+ mes "[Kylian]";
+ mes "\"Ah, excellent. That's very helpful. Could you tell me how to get to that building?\"";
+ mes "You explain the way to the building.";
+ next;
+ goto L_LicenseDone;
+
+L_LicenseDone: // the player didn't log out yet after telling about Yanis
+ mes "[Kylian]";
+ mes "\"I need to prepare my papers now. I might have some more questions later.\"";
+ goto L_Close;
+
+L_SightSeeing: // @state == 4 and logged out sometime between getting to that state and now
+ mes "[Kylian]";
+ mes "\"You just came here the right moment. I have finished my business affairs. I think I should use my time here to also get a bit of cultural knowledge about the area. Can you tell me if there are any historical places to visit?\"";
+ if (!(QUEST_NorthTulimshar & $@knowWeellosNT))
+ goto L_Close;
+ menu
+ "There is a very old historic building not far from here.",L_HistBuild,
+ "I don't know, but will have a look around.",L_Close;
+
+L_HistBuild:
+ set Zeny, Zeny + @sightseeing_money;
+ getexp @sightseeing_exp, 0;
+ set @state, 5;
+ callfunc "SetKylianQuest";
+ mes "[Kylian]";
+ mes "\"This sounds interesting. Please tell me the way.\"";
+ mes "You tell him how to get to the historic building.";
+ next;
+ goto L_Food;
+
+L_Food: // @state == 5
+ mes "[Kylian]";
+ mes "\"While I'm out, I could also get something to eat. Maybe some typical dish for this region. Do you have a good suggestion for that?\"";
+ if (@fieri < 4) // didn't yet help Fieri make Tonori Delight
+ goto L_Close;
+ menu
+ "Fieri at the castle makes great Tonori Delight.",L_SoupBer,
+ "No idea, I'll try to find out.",L_Close;
+
+L_SoupBer:
+ set Zeny, Zeny + @food_money;
+ getexp @food_exp, 0;
+ set @state, 6;
+ callfunc "SetKylianQuest";
+ set @KylianNTSightSeeing, 1;
+ goto L_SightSeeingDone;
+
+L_SightSeeingDone:
+ mes "[Kylian]";
+ mes "\"I'm going to see the historic building you told me about and try this local food at the castle. Thank you for the suggestions.\"";
+ goto L_Close;
+
+L_Casino: // @state == 6 and logged out sometime between getting to that state and now
+ mes "[Kylian]";
+ mes "\"Hello. I just came back from my sight-seeing tour. And this Tonori Delight really was delicious. I wonder what it's made of...\"";
+ next;
+ mes "\"However, I was wondering if you know about a good place to spend the evening? Some place to have fun?\"";
+ if (!(QUEST_NorthTulimshar & $@knowCasinoNT))
+ goto L_Close;
+ menu
+ "Of course! The casino!",L_CasinoFound,
+ "Not really.",L_Close;
+
+L_CasinoFound:
+ set Zeny, Zeny + @casino_money;
+ getexp @casino_exp, 0;
+ set @state, 7;
+ callfunc "SetKylianQuest";
+ mes "[Kylian]";
+ mes "\"Oh, there's a casino in this city? That's a wonderful thing. Where can I find it?\"";
+ mes "You explain how to get to the casino.";
+ next;
+ goto L_Clothes;
+
+L_Clothes: // @state == 7
+ mes "[Kylian]";
+ mes "\"I should get proper clothing before I go to the casino tonight. Do you know a reputable shop where clothing of high quality is sold?\"";
+ if (!(QUEST_NorthTulimshar & $@knowLatoyNT))
+ goto L_Close;
+ menu
+ "Latoy's shop. On the west side of Tulimshar.",L_HarborDistrict,
+ "Mh, I don't know.",L_Close;
+
+L_HarborDistrict:
+ set Zeny, Zeny + @clothes_money;
+ getexp @clothes_exp, 0;
+ set @state, 8;
+ callfunc "SetKylianQuest";
+ set @KylianNTCasino, 1;
+ mes "You explain about Latoy and the high quality shop.";
+ mes "[Kylian]";
+ mes "\"This seems to be exactly what I need. Thanks a lot.\"";
+ goto L_Close;
+
+L_CasinoDone:
+ mes "[Kylian]";
+ mes "\"I'm looking forward to going to the casino tonight. See me tomorrow.\"";
+ goto L_Close;
+
+L_DesertHat: // @state == 8
+ mes "Kylian looks a bit tired.";
+ mes "[Kylian]";
+ mes "\"That was an interesting night. Thanks for your suggestion to visit the casino.\"";
+ next;
+ getinventorylist;
+ mes "\"You helped me a lot, so I bought a souvenir for you while I was shopping.\"";
+ if ((checkweight("DesertHat", 1) == 0) || (@inventorylist_count == 100))
+ goto L_Inventory;
+ getitem "DesertHat", 1;
+ set @state, 9;
+ callfunc "SetKylianQuest";
+ next;
+ goto L_Close;
+
+L_Shop:
+ mes "[Kylian]";
+ mes "\"The Council of Wizards approved my shop license!\"";
+ mes "\"I purchased a store just acorss the way from the hotel exit.\"";
+ next;
+ mes "\"If you are looking for work, go see the shop keeper I have working for me.\"";
+ mes "\"Mention your name and he will know I sent you.\"";
+ set @state, 10;
+ callfunc "SetKylianQuest";
+ goto L_Close;
+
+L_OfferedJob:
+ mes "[Kylian]";
+ mes "\"I spoke with the shopkeeper, They said you haven't stopped in yet.\"";
+ next;
+ mes "\"I wish you would consider working for KPS.\"";
+ next;
+ mes "\"KPS needs a well-traveled go getter like you.\"";
+ goto L_Close;
+
+L_Helping:
+ mes "[Kylian]";
+ mes "\"I've heard you decided to come work for me. That is great news.\"";
+ mes "\"Keep up the good work and I might have something a little extra for you.\"";
+ goto L_Close;
+
+L_Done:
+ mes "[Kylian]";
+ mes "\"Thanks a bunch, buisness is booming!\"";
+ mes "\"For your hard work take this.\"";
+ next;
+ set Zeny, Zeny + $@delivery_money;
+ getexp ($@delivery_exp_mod * BaseLevel), 0;
+ set @run_cnt, 0;
+ callfunc "SetKylianRunCnt";
+ set @state, 12;
+ callfunc "SetKylianQuest";
+ mes "[" + $@delivery_money + " money]";
+ mes "[" + ($@delivery_exp_mod * BaseLevel) + " experience points]";
+ next;
+ goto L_Close;
+
+L_Inventory:
+ mes "[Kylian]";
+ mes "\"Oh, you're carrying a lot of things. Come back when you have more room.\"";
+ goto L_Close;
+
+L_NoItem:
+ mes "[Kylian]";
+ mes "\"I don't see it! Are you trying to tease me? This is not funny!\"";
+ goto L_Close;
+
+L_Close:
+ set @acorn_amount, 0;
+ set @suitcase_money, 0;
+ set @suitcase_exp, 0;
+ set @license_money, 0;
+ set @license_exp, 0;
+ set @sightseeing_money, 0;
+ set @sightseeing_exp, 0;
+ set @food_money, 0;
+ set @food_exp, 0;
+ set @clothes_money, 0;
+ set @clothes_exp, 0;
+ set @fun_money, 0;
+ set @fun_exp, 0;
+ set @inventorylist_count, 0;
+ set @fieri, 0;
+ // NOT set to zero: @KylianNTLicense, @KylianNTSightSeeing and @KylianNTCasino
+ // those are used to check if the player logged out in the meanwhile
+ close;
+}
+function|script|SetKylianQuest
+{
+ set QUEST_NorthTulimshar, (QUEST_NorthTulimshar & ~(NIBBLE_5_MASK)) | (@state << NIBBLE_5_SHIFT);
+ return;
+}
+function|script|KylianDebug
+{
+ set @state, ((QUEST_NorthTulimshar & NIBBLE_5_MASK) >> NIBBLE_5_SHIFT);
+ callfunc "ClearVarTMW_Quest";
+ set @fieri, ((QUEST_SouthTulimshar & NIBBLE_0_MASK) >> NIBBLE_0_SHIFT);
+ set @run, ((QUEST_NorthTulimshar & TWOBIT_8_MASK) >> TWOBIT_8_SHIFT);
+ set @run_cnt, ((QUEST_NorthTulimshar & TWOBIT_9_MASK) >> TWOBIT_9_SHIFT);
+ goto L_Menu;
+
+L_Menu:
+ mes "[Kylian Debug]";
+ menu
+ "Show Quest State", L_ShowState,
+ "Set Quest State", L_SetState,
+ "Reset Timer to now", L_WorkTimer,
+ "Reset Timer + 24 hours", L_MoreWorkTimer,
+ "Close.", L_Close;
+
+L_ShowState:
+ mes "State: " + @state;
+ mes "Timer: " + Kylian_Timer;
+ mes "Time: " + gettimetick(2);
+ mes "Elapsed Time: " + (gettimetick(2) - Kylian_Timer);
+ mes "Reset Timer: 86400 > " + (gettimetick(2) - Kylian_Timer);
+ mes "Run: " + @run;
+ mes "Run NPC: " + $@random_quests$[@run];
+ mes "Run Count: " + @run_cnt;
+ goto L_Menu;
+
+L_SetState:
+ mes "\"Input the quest state desired.\"";
+ input @state;
+ callfunc "SetKylianQuest";
+ goto L_Menu;
+
+L_WorkTimer:
+ set Kylian_Timer, gettimetick(2);
+ goto L_Menu;
+
+L_MoreWorkTimer:
+ set Kylian_Timer, (gettimetick(2) - 86401);
+ goto L_Menu;
+
+L_Close:
+ close;
+}
+002-2.gat,40,101,0|script|KylianDebug#1|193
+{
+ callfunc "KylianDebug";
+ end;
+OnInit:
+ if (!debug)
+ disablenpc "KylianDebug#1";
+ end;
+}
+002-2.gat,118,89,0|script|KylianDebug#2|193
+{
+ callfunc "KylianDebug";
+ end;
+OnInit:
+ if (!debug)
+ disablenpc "KylianDebug#2";
+ end;
+}
diff --git a/world/map/npc/002-2/latoy.txt b/world/map/npc/002-2/latoy.txt
new file mode 100644
index 00000000..4c847af7
--- /dev/null
+++ b/world/map/npc/002-2/latoy.txt
@@ -0,0 +1,33 @@
+// A snobby store that won't sell to the player
+// takes part in quest given by 021-2/kylian.txt
+
+002-2.gat,86,93,0|shop|#LatoyShop|127,SilkHeadband:*20000,SilkGloves:*20000,SilkPants:*30000,SilkRobe:*40000
+
+002-2.gat,86,93,0|script|Latoy|106
+{
+ set QUEST_NorthTulimshar, QUEST_NorthTulimshar | $@knowLatoyNT;
+ set @kylian, ((QUEST_NorthTulimshar & NIBBLE_5_MASK) >> NIBBLE_5_SHIFT);
+
+ mes "[Latoy]";
+ mes "\"Is there something I can help you with?\"";
+ if (@kylian != 7)
+ goto L_Shop;
+ next;
+ mes "Maybe this is the kind of shop Kylian is looking for?";
+ goto L_Shop;
+
+L_Shop:
+ mes "[Latoy]";
+ mes "\"How would you like to browse my wares?\"";
+ menu
+ "Yes.", L_LatoyShop,
+ "No.", L_Close;
+
+L_LatoyShop:
+ close2;
+ shop "#LatoyShop";
+
+L_Close:
+ set @kylian, 0;
+ close;
+}
diff --git a/world/map/npc/002-2/mapflags.txt b/world/map/npc/002-2/mapflags.txt
index c23a7f11..5448030e 100644
--- a/world/map/npc/002-2/mapflags.txt
+++ b/world/map/npc/002-2/mapflags.txt
@@ -1 +1 @@
-002-2.gat|mapflag|resave|001-1,57,71
+002-2.gat|mapflag|resave|001-1,60,105
diff --git a/world/map/npc/002-2/omar.txt b/world/map/npc/002-2/omar.txt
new file mode 100644
index 00000000..048f129c
--- /dev/null
+++ b/world/map/npc/002-2/omar.txt
@@ -0,0 +1,335 @@
+//
+function|script|KadiyaSubquestConsts
+{
+ set @Q_kadiya_status, (QUEST_MAGIC2 & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT;
+
+ set @Q_STATUS_NONE, 0;
+ set @Q_STATUS_KNOWS_MOPOX, 1;
+ set @Q_STATUS_MADE_MOPOX, 2;
+ set @Q_STATUS_DIDNT_DRINK, 3;
+ set @Q_STATUS_WANTS_CHOCOCAKE, 4;
+ set @Q_STATUS_WANTS_ORANGECUPCAKE, 5;
+ set @Q_STATUS_COMPLETED, 6;
+ set @Q_STATUS_COMPLETED_ELANORE, 7;
+ set @Q_STATUS_COMPLETED_NOELANORE, 8;
+ set @Q_STATUS_COMPLETED_POST_ELANORE, 9;
+
+ if (((QUEST_MAGIC2 & NIBBLE_1_MASK) >> NIBBLE_1_SHIFT) < 4) set @Q_kadiya_status, @Q_STATUS_NONE;
+
+ if (((QUEST_MAGIC2 & NIBBLE_1_MASK) >> NIBBLE_1_SHIFT) > 4) set @Q_kadiya_status, @Q_STATUS_COMPLETED_POST_ELANORE;
+
+ return;
+}
+
+002-2.gat,117,126,0|script|Omar|162
+{
+ callfunc "ElanoreFix";
+ callfunc "KadiyaSubquestConsts";
+
+ set @Q_status, @Q_kadiya_status;
+
+ if (@Q_status >= @Q_STATUS_COMPLETED) goto L_cured;
+
+ if (@Q_status == @Q_STATUS_DIDNT_DRINK) goto L_didnt_drink;
+
+ if (@Q_status > @Q_STATUS_DIDNT_DRINK) goto L_make_food;
+
+ mes "[Omar]";
+ mes "\"Welcome to my humble abode.\"";
+ next;
+ menu
+ "Well met! May I ask who you are?", L_omar,
+ "What's wrong with your daughter?", L_kadiya_sick,
+ "Thank you!", L_Close;
+
+L_omar:
+ mes "[Omar]";
+ mes "\"My name is Omar; I am a trader of oils and spices.\"";
+ goto L_Close;
+
+L_kadiya_sick:
+ mes "[Omar]";
+ mes "\"Kadiya has caught Ponderpox, I fear.\"";
+ mes "He sighs.";
+ mes "\"She's has been feverish for many days now. I wish there were something I could do.\"";
+ next;
+ menu
+ "Have you asked Elanore the healer?", L_sick_elanore,
+ "How about the Hurnscald hospital?", L_sick_hospital,
+ "Can I help?", L_sick_self,
+ "I'm sorry to hear that.", L_Next;
+
+L_Next:
+ mes "[Omar]";
+ mes "\"Well, she is a strong girl. I am sure that she will get over it eventually.\"";
+ mes "He smiles, but you see doubt in his eyes.";
+ goto L_Close;
+
+L_sick_elanore:
+ mes "[Omar]";
+ mes "\"Elanore?\"";
+ mes "He frowns.";
+ mes "\"She knows nothing. I see no point in talking to her.\"";
+ goto L_Close;
+
+L_sick_hospital:
+ mes "[Omar]";
+ mes "\"Hurnscald is too far away. I don't think that it would be good for her to go on such a long trip.\"";
+ goto L_Close;
+
+L_sick_self:
+ mes "[Omar]";
+ mes "\"You are very kind, but I don't think there is anything you can do.\"";
+ goto L_Close;
+
+L_didnt_drink:
+ mes "[Omar]";
+ mes "\"So she has Mopox, not Ponderpox, you say? Hmm. That is much harder to cure, I think.\"";
+ mes "\"I am grateful for the effort you put into brewing a potion for her. But it does smell vile...\"";
+ next;
+ mes "[Omar]";
+ mes "\"I promised my dear wife that I would never make Kadiya eat or drink anything she doesn't like. So I won't force her to drink this.\"";
+ next;
+ mes "[Omar]";
+ set @Q_status, (@Q_STATUS_WANTS_CHOCOCAKE + rand(2));
+ callsub S_update_var;
+ if (@Q_status == @Q_STATUS_WANTS_ORANGECUPCAKE)
+ mes "\"If only we could make it smell and taste like orange cupcakes... she really loves those cupcakes.\"";
+ if (@Q_status == @Q_STATUS_WANTS_CHOCOCAKE)
+ mes "\"If only this were a chocolate cake and not a potion... she really loves chocolate cakes.\"";
+ goto L_Close;
+
+L_make_food:
+ mes "[Omar]";
+ mes "\"I should stay here to watch over her. I wish I could think of a way to convince her to drink the potion...\"";
+ if (@Q_status == @Q_STATUS_WANTS_ORANGECUPCAKE)
+ mes "\"Alas, it is not an orange cupcake.\"";
+ if (@Q_status == @Q_STATUS_WANTS_CHOCOCAKE)
+ mes "\"If only it were to smell and taste like her favourite chocolate cake...\"";
+ goto L_Close;
+
+L_cured:
+ if (@Q_status == @Q_STATUS_COMPLETED) goto L_cured_choice;
+ mes "[Omar]";
+ mes "\"She is sleeping now, but she seems to be much better. I am sure that she will be up and running around again soon.\"";
+ goto L_Close;
+
+L_cured_choice:
+ mes "[Omar]";
+ mes "\"I am very grateful for your help. I really was sure that it was Ponderpox, not Mopox, that she had.\"";
+ next;
+ menu
+ "Oh, it was nothing.", L_cured_nothing,
+ "I didn't do it alone; Elanore helped.", L_cured_elanore,
+ "That will be 5000 GP.", L_Next1;
+
+L_Next1:
+ mes "[Omar]";
+ mes "\"Ah, certainly.\"";
+ mes "He hands you a small bag of money.";
+ next;
+ set @Q_status, @Q_STATUS_COMPLETED_NOELANORE;
+ callsub S_update_var;
+ set Zeny, Zeny + 5000;
+ goto L_Close;
+
+L_cured_nothing:
+ mes "[Omar]";
+ mes "\"No, this wasn't nothing. She is everything to me. Here, you deserve a reward.\"";
+ mes "He hands you a bag of money containing 10,000 GP and two pearls.";
+ mes "\"And feel free to drop by again whenever you would like!\"";
+ set @Q_status, @Q_STATUS_COMPLETED_NOELANORE;
+ callsub S_update_var;
+ getitem "Pearl", 2;
+ set Zeny, Zeny + 10000;
+ goto L_Close;
+
+L_cured_elanore:
+ mes "[Omar]";
+ mes "Omar frowns.";
+ mes "\"That witch? You worked with her without telling me?\"";
+ mes "He looks over to his daughter, concern suddenly in his eyes.";
+ mes "\"She is looking better, though...\"";
+ next;
+ mes "[Omar]";
+ mes "Omar shakes his head.";
+ mes "\"I will have to think about this. Please leave me alone.\"";
+ next;
+ set @Q_status, @Q_STATUS_COMPLETED_ELANORE;
+ callsub S_update_var;
+ goto L_Close;
+
+L_Close:
+ set @Q_STATUS_KNOWS_MOPOX, 0;
+ set @Q_STATUS_MADE_MOPOX, 0;
+ set @Q_STATUS_DIDNT_DRINK, 0;
+ set @Q_STATUS_WANTS_CHOCOCAKE, 0;
+ set @Q_STATUS_WANTS_ORANGECUPCAKE, 0;
+ set @Q_STATUS_COMPLETED, 0;
+ set @Q_STATUS_COMPLETED_ELANORE, 0;
+ set @Q_STATUS_COMPLETED_NOELANORE, 0;
+ set @Q_STATUS_COMPLETED_POST_ELANORE, 0;
+ set @Q_status, 0;
+ close;
+
+
+S_update_var:
+ set QUEST_MAGIC2, (QUEST_MAGIC2 & ~(NIBBLE_3_MASK) | (@Q_status << NIBBLE_3_SHIFT));
+ return;
+}
+
+002-2.gat,124,124,0|script|Kadiya|174
+{
+ set @child_number, 7;
+ callfunc "XmasList";
+
+ callfunc "ElanoreFix";
+ set @Q_MASK, NIBBLE_3_MASK;
+ set @Q_SHIFT, NIBBLE_3_SHIFT;
+ callfunc "KadiyaSubquestConsts";
+ set @Q_status, @Q_kadiya_status;
+ if (@Q_status >= @Q_STATUS_COMPLETED) goto L_cured;
+
+ mes "You see a young girl lying in bed. At first she doesn't seem to notice you approaching.";
+ mes "Finally, she turns her head towards you. Judging from the sweat on her forehead and look in her eyes, she is suffering from some kind of fever.";
+ next;
+ mes "[Kadiya]";
+ mes "\"Hello,\" she says in a tiny voice.";
+ next;
+ set @M_NAME, 1;
+ set @M_CANDY, 2;
+ set @M_POTION, 3;
+ set @M_CHOCOCAKE, 4;
+ set @M_CUPCAKE, 5;
+
+ setarray @choice$, "Hello! What's your name?", "Would you like some candy?", "", "", "", "", "", "";
+ setarray @choice_idx, @M_NAME, @M_CANDY, 0, 0, 0, 0, 0, 0;
+ set @choices_nr, 2;
+
+ if (countitem("MopoxCurePotion") == 0) goto L_M_no_cure;
+
+ set @choice_idx[@choices_nr], @M_POTION;
+ set @choice$[@choices_nr], "This potion will cure your illness!";
+ set @choices_nr, @choices_nr + 1;
+ goto L_M_no_cure;
+
+L_M_no_cure:
+ if ((countitem("LacedChocolateCake") == 0) || (@Q_status != @Q_STATUS_WANTS_CHOCOCAKE))
+ goto L_M_no_chococake;
+ set @choice_idx[@choices_nr], @M_CHOCOCAKE;
+ set @choice$[@choices_nr], "Would you like special chocolate cake?";
+ set @choices_nr, @choices_nr + 1;
+ goto L_M_no_chococake;
+
+L_M_no_chococake:
+ if ((countitem("LacedOrangeCupcake") == 0) || (@Q_status != @Q_STATUS_WANTS_ORANGECUPCAKE))
+ goto L_M_no_cupcake;
+ set @choice_idx[@choices_nr], @M_CUPCAKE;
+ set @choice$[@choices_nr], "Would you like special orange cupcake?";
+ set @choices_nr, @choices_nr + 1;
+ goto L_M_no_cupcake;
+
+L_M_no_cupcake:
+ set @choice_idx[@choices_nr], 0;
+ set @choice$[@choices_nr], "Goodbye.";
+ set @choices_nr, @choices_nr + 1;
+
+ menu
+ @choice$[0], L_MenuItems,
+ @choice$[1], L_MenuItems,
+ @choice$[2], L_MenuItems,
+ @choice$[3], L_MenuItems,
+ @choice$[4], L_MenuItems,
+ @choice$[5], L_MenuItems;
+
+L_MenuItems:
+ set @choice, @choice_idx[@menu - 1];
+
+ if (@choice == @M_NAME) goto L_name;
+ if (@choice == @M_CANDY) goto L_no_candy;
+ if (@choice == @M_POTION) goto L_potion;
+ if (@choice == @M_CHOCOCAKE) goto L_chococake;
+ if (@choice == @M_CUPCAKE) goto L_cupcake;
+ goto L_Close;
+
+L_name:
+ mes "[Kadiya]";
+ mes "She smiles a faint smile.";
+ mes "\"My name is Kadiya.\"";
+ goto L_Close;
+
+L_no_candy:
+ mes "[Kadiya]";
+ mes "She hesitates for a moment.";
+ mes "\"No, thank you. I don't think I should.\"";
+ goto L_Close;
+
+L_potion:
+ mes "[Kadiya]";
+ if (@Q_status < @Q_STATUS_DIDNT_DRINK) set @Q_status, @Q_STATUS_DIDNT_DRINK;
+ callsub S_update_var;
+
+ mes "Kadiya grimaces and pushes the bottle away.";
+ mes "\"That smells terrible!\"";
+ next;
+ mes "[Kadiya]";
+ mes "She pulls the sheets over her head.";
+ mes "\"I won't drink that!\"";
+ goto L_Close;
+
+L_chococake:
+ delitem "LacedChocolateCake", 1;
+ goto L_do_cure;
+
+L_cupcake:
+ delitem "LacedOrangeCupcake", 1;
+ goto L_do_cure;
+
+L_do_cure:
+ if (@Q_status < @Q_STATUS_COMPLETED) set @Q_status, @Q_STATUS_COMPLETED;
+ callsub S_update_var;
+
+ mes "[Kadiya]";
+ mes "Kadiya's eyes widen.";
+ mes "\"Oh! Daddy, is it okay if I eat this?\"";
+ mes "Omar nods and smiles. \"You should eat a bit to regain your strength, sweetheart.\"";
+ next;
+ mes "[Kadiya]";
+ mes "Kadiya devours your gift in just a handful of bites.";
+ next;
+ mes "[Kadiya]";
+ mes "She smiles. \"Thank you! I feel better already!\".";
+ next;
+ mes "[Kadiya]";
+ mes "She looks much healthier, too. Omar walks over and touches her forehead.";
+ mes "\"Now that is funny – your fever has gone down quite a bit!\"";
+ mes "He smiles at you. \"Thank you for your help!\"";
+ next;
+ mes "[Kadiya]";
+ mes "\"You should get some sleep now, sweetheart. I'm sure that you will be better soon.\"";
+ goto L_Close;
+
+L_cured:
+ mes "[Kadiya]";
+ mes "Kadiya seems to be sleeping calmly. She looks much less sweaty than earlier; unless you are very much mistaken, her fever has disappeared.";
+ goto L_Close;
+
+L_Close:
+ set @Q_status, 0;
+ set @Q_MASK, 0;
+ set @Q_SHIFT, 0;
+ set @M_NAME, 0;
+ set @M_CANDY, 0;
+ set @M_POTION, 0;
+ set @M_CHOCOCAKE, 0;
+ set @M_CUPCAKE, 0;
+ set @choice, 0;
+ set @choices_nr, 0;
+ cleararray @choice_idx[0], 0, 7;
+ cleararray @choice$[0], "", 7;
+ close;
+
+S_update_var:
+ set QUEST_MAGIC2, (QUEST_MAGIC2 & ~(@Q_MASK) | (@Q_status << @Q_SHIFT));
+ return;
+}
diff --git a/world/map/npc/002-2/phaet.txt b/world/map/npc/002-2/phaet.txt
new file mode 100644
index 00000000..eb464e1e
--- /dev/null
+++ b/world/map/npc/002-2/phaet.txt
@@ -0,0 +1,30 @@
+//
+
+002-2.gat,75,56,0|script|Phaet|125,0,0
+{
+ mes "[Phaet the Royal Guard]";
+ mes "\"Hey, you seem tough enough! Would you like to prove your skills? I'll let you in the arena if you give me 50 gp. You can fight against other players there.\"";
+ next;
+ menu
+ "Yes", L_Sure,
+ "No", L_Next;
+
+L_Next:
+ mes "[Phaet the Royal Guard]";
+ mes "\"Ha ha, coward.\"";
+ close;
+
+L_Sure:
+ if (Zeny < 50) goto L_NoMoney;
+ set Zeny, Zeny - 50;
+
+ mes "[Phaet the Royal Guard]";
+ mes "\"Get ready!\"";
+ next;
+ warp "001-3.gat", 0, 0;
+ close;
+
+L_NoMoney:
+ mes "\"Wait a second, you don't have enough money.\"";
+ close;
+}
diff --git a/world/map/npc/002-2/rebecca.txt b/world/map/npc/002-2/rebecca.txt
new file mode 100644
index 00000000..54244115
--- /dev/null
+++ b/world/map/npc/002-2/rebecca.txt
@@ -0,0 +1,84 @@
+//
+
+002-2.gat,44,27,0|script|Rebecca|118
+{
+ set @npcname$, "Rebecca the Inn Keeper";
+ set @cost, 100;
+ mes "[" + @npcname$ + "]";
+ mes "\"Welcome to 'The Wizard's Rest'\"";
+ goto L_MainMenu;
+
+L_MainMenu:
+ mes "\"How may I help you?\"";
+ menu
+ "Can I get a room?", L_Inn,
+ "Any interesting guests?", L_Guests,
+ "Bakery?", L_Bakery,
+ "Barber?", L_Barber,
+ "Casino?", L_Casino,
+ "Theatre?", L_Theatre,
+ "Pvp?", L_Pvp,
+ "I don't need any help, thanks.", L_Close;
+
+L_Guests:
+ mes "\"We had a very rich business man show up the other day.\"";
+ next;
+ mes "\"He caused quite a stir when he paid for the penthouse so far in advance.";
+ mes "I hear he is looking for help.\"";
+ next;
+ mes "\"Other then that feel free to mingle with the guests.\"";
+ next;
+ mes "\"You can find them in the door behind me.\"";
+ goto L_Close;
+
+
+L_Bakery:
+ mes "\"Ahh yes, the World Famous Riskim's bakery.\"";
+ next;
+ mes "\"They only use the finest ingredients like Acorn Flour";
+ mes "to make some of the tastest treats in Tonori.\"";
+ next;
+ mes "Second only to the Wizards' private chef, Fieri.\"";
+ goto L_MainMenu;
+
+L_Barber:
+ mes "\"Issay the barber of Tonori can be found through the door behind me\"";
+ next;
+ mes "\"The master stylist can do anything with anyones hair.\"";
+ next;
+ mes "\"He always welcomes walk ins.\"";
+ goto L_MainMenu;
+
+L_Casino:
+ mes "\"Games, Games, Games.\"";
+ next;
+ mes "\"Test your luck or skill in the Casino. From Blackjack to Pvp.\"";
+ next;
+ mes "\"Win or Lose, you'll still have fun!\"";
+ goto L_MainMenu;
+
+L_Theatre:
+ mes "\"A touring troop from Hurnscald just arrived.\"";
+ next;
+ mes "\"The are currently rehearsing for their next show.\"";
+ next;
+ mes "\"Feel free to talk to the troupe leader, they are in the theatre behind me.\"";
+ goto L_MainMenu;
+
+L_Pvp:
+ mes "\"Yes, our Casino has Pvp in the Casino behind me.\"";
+ next;
+ mes "\"Test your self against other players and gamble on the outcome.\"";
+ next;
+ mes "\"Fame and glory awaits you gladiator!\"";
+ goto L_MainMenu;
+
+L_Inn:
+ callfunc "Inn";
+ goto L_Close;
+
+L_Close:
+ set @npcname$, "";
+ set @cost, 0;
+ close;
+}
diff --git a/world/map/npc/002-2/shops.txt b/world/map/npc/002-2/shops.txt
new file mode 100644
index 00000000..87986111
--- /dev/null
+++ b/world/map/npc/002-2/shops.txt
@@ -0,0 +1,3 @@
+// Bartender
+
+002-2.gat,68,25,0|shop|Bartender#Casino|112,Beer:*175,Cake:*30,CherryCake:*100
diff --git a/world/map/npc/002-2/stranger.txt b/world/map/npc/002-2/stranger.txt
new file mode 100644
index 00000000..563af742
--- /dev/null
+++ b/world/map/npc/002-2/stranger.txt
@@ -0,0 +1,464 @@
+002-2.gat,38,57,0|script|Stranger|192
+{
+ set @IRONINGOT, 5;
+ set @PINKANTENNA, 21;
+ set @Exp, 20000;
+ setarray @towelReq$, "WhiteHitchhikersTowel","RedHitchhikersTowel","GreenHitchhikersTowel","BlueHitchhikersTowel","YellowHitchhikersTowel","PurpleHitchhikersTowel","OrangeHitchhikersTowel","PinkHitchhikersTowel","TealHitchhikersTowel","LimeHitchhikersTowel","HitchhikersTowel";
+
+ if (FLAGS & FLAG_TOWEL_COMPLETED) goto L_Event_Done;
+ if ((gettimetick(2)-TUT_var < 6*7*86400) || (BaseLevel < 42)) //player must be created at least 6 weeks ago and at least level 42
+ goto L_No_Event;
+ if (FLAGS & FLAG_TOWEL_HELPED) goto L_Towel;
+
+ mes "[Stranger]";
+ mes "\"Hello, hello! It's great to see you. Maybe you can help me with a little problem I have.\"";
+ next;
+ mes "\"I need some materials to repair my spacesh- ahm, it's not important why I need it.\"";
+ next;
+ mes "\"Anyway, I'd be really happy if you can give me " + @IRONINGOT + " Iron Ingots and " + @PINKANTENNA + " Pink Antennas.\"";
+ next;
+ mes "\"Do you have that for me?\"";
+ menu
+ "Yeah, sure.",L_Items,
+ "No.",L_Close;
+
+L_Items:
+ if (countitem("IronIngot") < @IRONINGOT) goto L_No_Item;
+ if (countitem("PinkAntenna") < @PINKANTENNA) goto L_No_Item;
+ delitem "IronIngot", @IRONINGOT;
+ delitem "PinkAntenna", @PINKANTENNA;
+ getexp @Exp, 0;
+ set FLAGS, FLAGS | FLAG_TOWEL_HELPED;
+
+ mes "[Stranger]";
+ mes "\"Great! Thank you!\"";
+ next;
+ mes "\"I have a lot of work to do now. But before you leave...\"";
+ next;
+ goto L_Towel;
+
+L_Towel:
+ getinventorylist;
+ if (@inventorylist_count == 100) goto L_Full_Inv;
+ mes "[Stranger]";
+ mes "\"On May 25th it is a very special day - Towel Day.\"";
+ next;
+ mes "\"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;
+ mes "";
+ mes "[Server]";
+ mes "The answers might need to have whitespaces.";
+ mes "If you're using a client which confirms your answer when pressing space, change this setting before continuing.";
+ mes "";
+ next;
+ mes "[Stranger]";
+ mes "\"The first one is easy.\"";
+ next;
+
+ setarray @easy_questions$,
+ "What two words are written in big friendly letters on the back cover?",
+ "What's the name of the paranoid robot?",
+ "What is the answer to life, the universe and everything?",
+ "What is the first name of the author of the hitchhikers guide?",
+ "What is the last name of the author of the hitchhikers guide?",
+ "Who is the male human protagonist?",
+ "Who is the female human protagonist?",
+ "According to the Guide, space is ____?",
+ "What is the name of the spaceship which was stolen by the president of the universe?",
+ "How many heads does Zaphod Beeblebrox have?";
+
+ setarray @easy_answers_amount,2,2,2,2,2,4,4,2,4,2;
+
+ set @random, rand(10);
+ mes "\"" + @easy_questions$[@random] + "\"";
+ input @answer$;
+
+ if (@easy_answers_amount[@random] < 4)
+ goto L_Easy_Skip4;
+ set @quizparam$, "towelanswer0" + @random + "d";
+ callfunc "StrangerQuiz";
+ if (("###" + @answer$ == @quizanswer$))
+ goto L_Right_Answer_Easy;
+ goto L_Easy_Skip4;
+
+L_Easy_Skip4:
+ if (@easy_answers_amount[@random] < 3)
+ goto L_Easy_Skip3;
+ set @quizparam$, "towelanswer0" + @random + "c";
+ callfunc "StrangerQuiz";
+ if (("###" + @answer$ == @quizanswer$))
+ goto L_Right_Answer_Easy;
+ goto L_Easy_Skip3;
+
+L_Easy_Skip3:
+ set @quizparam$, "towelanswer0" + @random + "b";
+ callfunc "StrangerQuiz";
+ if (("###" + @answer$ == @quizanswer$))
+ goto L_Right_Answer_Easy;
+
+ set @quizparam$, "towelanswer0" + @random + "a";
+ callfunc "StrangerQuiz";
+ if (("###" + @answer$ == @quizanswer$))
+ goto L_Right_Answer_Easy;
+
+ goto L_Wrong_Answer;
+
+L_Right_Answer_Easy:
+ mes "[Stranger]";
+ mes "\"You're absolutely right. The next one will be more tricky.\"";
+ next;
+
+ setarray @medium_questions$,
+ "What is the name of the rock group claiming to be the loudest band in the universe?",
+ "What star is near Ford's home planet?",
+ "Which country does the human protagonist come from?",
+ "What is the name of the computer on The Heart of Gold?",
+ "What color is a Babel Fish?",
+ "What did the bowl of petunias think?",
+ "What body orifice should a babel fish be inserted in to work properly?",
+ "What is the name of the super computer?",
+ "What were the second most intelligent creatures on Earth?",
+ "What race creates the worst poetry in universe?",
+ "What is the name of the Vogon home planet?",
+ "What is the name of the Restaurant at the End of the Universe?";
+
+ setarray @medium_answers_amount,2,2,2,2,2,3,2,2,4,4,2,2;
+
+ set @random, rand(12);
+ mes "\"" + @medium_questions$[@random] + "\"";
+ input @answer$;
+
+ if (@medium_answers_amount[@random] < 4)
+ goto L_Medium_Skip4;
+
+ set @quizparam$, "towelanswer1" + @random + "d";
+ callfunc "StrangerQuiz";
+ if (("###" + @answer$ == @quizanswer$))
+ goto L_Right_Answer_Medium;
+ goto L_Medium_Skip4;
+
+L_Medium_Skip4:
+ if (@medium_answers_amount[@random] < 3)
+ goto L_Medium_Skip3;
+ set @quizparam$, "towelanswer1" + @random + "c";
+ callfunc "StrangerQuiz";
+ if (("###" + @answer$ == @quizanswer$))
+ goto L_Right_Answer_Medium;
+ goto L_Medium_Skip3;
+
+L_Medium_Skip3:
+ set @quizparam$, "towelanswer1" + @random + "b";
+ callfunc "StrangerQuiz";
+ if (("###" + @answer$ == @quizanswer$))
+ goto L_Right_Answer_Medium;
+
+ set @quizparam$, "towelanswer1" + @random + "a";
+ callfunc "StrangerQuiz";
+ if (("###" + @answer$ == @quizanswer$))
+ goto L_Right_Answer_Medium;
+
+ goto L_Wrong_Answer;
+
+L_Right_Answer_Medium:
+ mes "[Stranger]";
+ mes "\"Not bad, not bad. Let's see if you can answer an even more difficult one.\"";
+ next;
+
+ setarray @hard_questions$,
+ "Drinking what drink is like having your brain smashed out by a slice of lemon wrapped round a large gold brick?",
+ "How many pints of beers should you drink before hitchhiking?",
+ "What initials are carved into Zaphod Beeblebrox's brain?",
+ "What is Ford Prefect's nickname?",
+ "Who is responsible for the fjords of Norway?",
+ "What game is played on earth as a relict of memories to an ancient war?",
+ "What is the name of the triple-breasted whore from Eroticon VI?",
+ "Who will insult every living being in the universe, because he is immortal and getting bored?",
+ "What is the name of the piteous creature that is continually reincarnated and subsequently killed, each time unknowingly, by Arthur Dent?";
+
+ setarray @hard_answers_amount,4,2,2,2,2,2,2,4,2;
+
+ set @random, rand(9);
+ mes "\"" + @hard_questions$[@random] + "\"";
+ input @answer$;
+
+ if (@hard_answers_amount[@random] < 4)
+ goto L_Hard_Skip4;
+ set @quizparam$, "towelanswer2" + @random + "d";
+ callfunc "StrangerQuiz";
+ if (("###" + @answer$ == @quizanswer$))
+ goto L_Right_Answer_Hard;
+ goto L_Hard_Skip4;
+
+L_Hard_Skip4:
+ if (@hard_answers_amount[@random] < 3)
+ goto L_Hard_Skip3;
+ set @quizparam$, "towelanswer2" + @random + "c";
+ callfunc "StrangerQuiz";
+ if (("###" + @answer$ == @quizanswer$))
+ goto L_Right_Answer_Hard;
+ goto L_Hard_Skip3;
+
+L_Hard_Skip3:
+ set @quizparam$, "towelanswer2" + @random + "b";
+ callfunc "StrangerQuiz";
+ if (("###" + @answer$ == @quizanswer$))
+ goto L_Right_Answer_Hard;
+
+ set @quizparam$, "towelanswer2" + @random + "a";
+ callfunc "StrangerQuiz";
+ if (("###" + @answer$ == @quizanswer$))
+ goto L_Right_Answer_Hard;
+
+ goto L_Wrong_Answer;
+
+L_Right_Answer_Hard:
+ mes "[Stranger]";
+ mes "\"Unbelievable! You're really a wise person.\"";
+ next;
+ mes "\"One last question, but this shouldn't be a problem for you.\"";
+ next;
+ mes "\"What is the most important item for every hitchhiker to have?\"";
+ input @answer$;
+ if (@answer$ != "Towel" && @answer$ != "towel")
+ goto L_Wrong_Answer;
+
+ mes "[Stranger]";
+ mes "\"There you are! A towel is really the most important item for a hitchhiker to have.\"";
+ next;
+ mes "\"Please take this.\""; // no full inventory check, this is done before the game
+ set FLAGS, FLAGS | FLAG_TOWEL_COMPLETED;
+ next;
+ goto L_Explain;
+
+L_Explain:
+ mes "[Stranger]";
+ mes "\"This towel is even more useful than usual towels are. If you change its color, it uses a special techno-, ahm, let's say, it can help you to get to other places.\"";
+ next;
+ mes "\"Bring me some powder made from gemstones and a bottle of water, and I can prepare it for you.\"";
+ next;
+ mes "\"Depending on the color it will bring you to different places. It might wear out after a while and it'll loose its color, but I can prepare it for you again.\"";
+ next;
+ mes "\"Since I'm not familar with this plane-, ahm, with this area, I can't tell which places you will end up in.\"";
+ goto L_Close;
+
+L_No_Event:
+ mes "[Stranger]";
+ mes "\"Hello. Isn't this a beautiful place?\"";
+ next;
+ mes "\"And 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.\"";
+ next;
+ mes "\"You can read more about that in my favourite book, 'The Hitchhiker's Guide to the Galaxy'.\"";
+ if (FLAGS & FLAG_TOWEL_COMPLETED)
+ menu
+ "Thanks for the advice.",L_Close,
+ "I have my towel with me too.",L_Dye;
+ goto L_Close;
+
+L_Dye:
+ mes "[Stranger]";
+ mes "\"Wonderful! Let me have a look.\"";
+ mes "He's taking a very interested look at your towel.";
+ next;
+ mes "[Stranger]";
+ mes "\"I'm impressed. This is not an usual towel.\"";
+ next;
+ menu
+ "Oh? Can you explain about it?",L_Explain,
+ "I know. Could you dye it for me?",L_StartDyeTowel,
+ "It's great, isn't it? I have to go now.",L_Close;
+
+L_No_Item:
+ mes "[Stranger]";
+ mes "\"Hu? It seems you haven't.\"";
+ goto L_Close;
+
+L_Wrong_Answer:
+ mes "[Stranger]";
+ mes "\"Nah, that's wrong. Come back if you want to try again.\"";
+ goto L_Close;
+
+L_Event_Done:
+ mes "[Stranger]";
+ mes "\"Ah, welcome back. Thanks again for your help.\"";
+ next;
+ mes "\"Shall I dye your towel?\"";
+ menu
+ "That would be great!", L_StartDyeTowel,
+ "No, thanks.", L_Close;
+
+L_StartDyeTowel:
+ mes "[Stranger]";
+ mes "\"Alright, which color do you want?\"";
+// the other colors should be added when more places are released
+ menu
+ "Red",L_Red,
+ "Yellow",L_Yellow,
+ "White",L_White,
+ "Blue",L_Blue,
+ "Green",L_Green,
+ "Purple",L_Purple,
+ "Orange",L_Orange,
+ "Pink",L_Pink,
+ "Lime",L_Lime,
+ "Teal",L_Teal,
+ "I changed my mind.", L_Close;
+
+L_White:
+ // Koga
+ set @warpTowelName$, "WhiteHitchhikersTowel";
+ setarray @towelPowder$, "DiamondPowder";
+ setarray @towelPowderCnt, 2;
+ goto L_DyeChecks;
+
+L_Red:
+ // Barbarians
+ set @warpTowelName$, "RedHitchhikersTowel";
+ setarray @towelPowder$, "RubyPowder";
+ setarray @towelPowderCnt, 2;
+ goto L_DyeChecks;
+
+L_Green:
+ // Candor
+ set @warpTowelName$, "GreenHitchhikersTowel";
+ setarray @towelPowder$, "EmeraldPowder";
+ setarray @towelPowderCnt, 2;
+ goto L_DyeChecks;
+
+L_Blue:
+ // Blue Sages
+ set @warpTowelName$, "BlueHitchhikersTowel";
+ setarray @towelPowder$, "SapphirePowder";
+ setarray @towelPowderCnt, 2;
+ goto L_DyeChecks;
+
+L_Yellow:
+ // Tulimshar Mines
+ set @warpTowelName$, "YellowHitchhikersTowel";
+ setarray @towelPowder$, "TopazPowder";
+ setarray @towelPowderCnt, 2;
+ goto L_DyeChecks;
+
+L_Purple:
+ // Dimonds Inn
+ set @warpTowelName$, "PurpleHitchhikersTowel";
+ setarray @towelPowder$, "AmethystPowder";
+ setarray @towelPowderCnt, 2;
+ goto L_DyeChecks;
+
+L_Orange:
+ // Graveyard
+ set @warpTowelName$, "OrangeHitchhikersTowel";
+ setarray @towelPowder$, "RubyPowder", "TopazPowder";
+ setarray @towelPowderCnt, 1, 1;
+ goto L_DyeChecks;
+
+L_Pink:
+ // Terranite Cave
+ set @warpTowelName$, "PinkHitchhikersTowel";
+ setarray @towelPowder$, "RubyPowder", "DiamondPowder";
+ setarray @towelPowderCnt, 1, 1;
+ goto L_DyeChecks;
+
+L_Teal:
+ // Mana Seed
+ set @warpTowelName$, "TealHitchhikersTowel";
+ setarray @towelPowder$, "EmeraldPowder", "SapphirePowder";
+ setarray @towelPowderCnt, 1, 1;
+ goto L_DyeChecks;
+
+L_Lime:
+ // Panchua
+ set @warpTowelName$, "LimeHitchhikersTowel";
+ setarray @towelPowder$, "EmeraldPowder", "TopazPowder";
+ setarray @towelPowderCnt, 1, 1;
+ goto L_DyeChecks;
+
+L_DyeChecks:
+ mes "[Stranger]";
+ mes "\"Ok, I'll need a bottle of water first.\"";
+ next;
+ getinventorylist;
+ if (@inventorylist_count == 100) goto L_Full_Inv;
+ if (countitem("BottleOfWater") < 1) goto L_No_Water;
+ set @powderCheckCount, 0;
+ goto L_PowderChecks;
+
+L_PowderCheckAgain:
+ mes "[Stranger]";
+ mes "\"Now I need " + @towelPowderCnt[@powderCheckCount] + " " + @towelPowder$[@powderCheckCount] + ".\"";
+ next;
+ if((@powderCheckCount + 1) == getarraysize(@towelPowder$))
+ goto L_TowelChecks;
+ set @powderCheckCount, (@powderCheckCount + 1);
+ goto L_PowderChecks;
+
+L_PowderChecks:
+ if (countitem(@towelPowder$[@powderCheckCount]) < @towelPowderCnt[@powderCheckCount])
+ goto L_No_Powder;
+ goto L_PowderCheckAgain;
+
+L_TowelCheckAgain:
+ set @towelCheckCount, (@towelCheckCount + 1);
+ if(@towelCheckCount >= getarraysize(@towelReq$))
+ goto L_No_Towel;
+ goto L_TowelChecks;
+
+L_TowelChecks:
+ if (countitem(@towelReq$[@towelCheckCount]) > 0)
+ goto L_DeletePowder;
+ goto L_TowelCheckAgain;
+
+L_DeleteAgain:
+ set @powderCheckCount, (@powderCheckCount - 1);
+ goto L_DeletePowder;
+
+L_DeletePowder:
+ delitem @towelPowder$[@powderCheckCount], @towelPowderCnt[@powderCheckCount];
+ if (@powderCheckCount)
+ goto L_DeleteAgain;
+ goto L_DyeTowel;
+
+L_DyeTowel:
+ delitem @towelReq$[@towelCheckCount], 1;
+ callfunc "MultiWarpTowel";
+ delitem "BottleOfWater", 1;
+ getitem @warpTowelName$, 1;
+ mes "He takes your towel, the water and the gem powder, then he turns away and does something you can't see. After a few minutes, he turns to you again.";
+ next;
+ mes "[Stranger]";
+ mes "\"Done! It'll use its color after being used, but just come back and I can dye it again for you.\"";
+ goto L_Close;
+
+L_No_Water:
+ mes "[Stranger]";
+ mes "\"You don't have water.\"";
+ goto L_Close;
+
+L_No_Powder:
+ mes "[Stranger]";
+ mes "\"You need to bring me enough gem powder in that color. Maybe someone used to mining can help you with that.\"";
+ goto L_Close;
+
+L_No_Towel:
+ mes "[Stranger]";
+ mes "\"Where's your towel? It is really useful, you should always keep it with you.\"";
+ goto L_Close;
+
+L_Full_Inv:
+ mes "[Stranger]";
+ mes "\"You carry a lot of stuff with you, don't you? Maybe you should get rid of something.\"";
+ goto L_Close;
+
+L_Close:
+ set @IRONINGOT, 0;
+ set @PINKANTENNA, 0;
+ set @Exp, 0;
+ set @random, 0;
+ set @quizparam$, "";
+ set @warpTowelName$, "";
+ set @powderCheckCount, 0;
+ set @towelCheckCount, 0;
+ cleararray @towelPowder$, "", getarraysize(@towelPowder$);
+ cleararray @towelPowderCnt, "", getarraysize(@towelPowderCnt);
+ close;
+}
diff --git a/world/map/npc/002-2/traveler.txt b/world/map/npc/002-2/traveler.txt
deleted file mode 100644
index 945bc82e..00000000
--- a/world/map/npc/002-2/traveler.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-// This is a teleportation (warp) NPC. Its purpose is to offer expensive, fast trips throughout the world.
-// Author: Wombat, wushin
-// cost depending on level and adapted to new scripting guidelines: Jenalya
-
-002-2.gat,25,28,0|script|Jena the Traveler|103
-{
- set @NpcName$, "Jena";
- set @NpcTravelBit, $@tul_mine_bit;
- callfunc "Traveler";
- end;
-}
diff --git a/world/map/npc/002-2/troupe_leader.txt b/world/map/npc/002-2/troupe_leader.txt
new file mode 100644
index 00000000..c736899d
--- /dev/null
+++ b/world/map/npc/002-2/troupe_leader.txt
@@ -0,0 +1,65 @@
+//
+
+002-2.gat,81,21,0|script|Troupe Leader|165
+{
+ callfunc "ClearVariables";
+
+ set @inspector, ((QUEST_Hurnscald & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT);
+
+ if (@inspector == 4) goto L_NohMask_Troupe;
+ if (@inspector == 13) goto L_NohMask_Found;
+
+ mes "[Troupe Leader]";
+ mes "\"Hello. I'm the leader of a traveling theater troupe. We'll be staying here in Tulimshar for a while.\"";
+ goto L_Close;
+
+L_NohMask_Troupe:
+ mes "[Troupe Leader]";
+ mes "\"Yes, a mask was stolen from us the last night we were in Hurnscald.\"";
+ next;
+ menu
+ "Any ideas on who might have taken it?", L_NohMask_Idea,
+ "Are you sure one of your troupe members didn't hide it and commit those robberies?", L_NohMask_Accuse,
+ "Hmm...", L_Close;
+
+L_NohMask_Idea:
+ set @inspector, 5;
+ callsub S_Update_Mask;
+ mes "[Troupe Leader]";
+ mes "\"Hm...I did see an old man hang out near the theater after our last show.\"";
+ goto L_Close;
+
+L_NohMask_Accuse:
+ mes "[Troupe Leader]";
+ mes "\"I am absolutely positive. None of my troupe have left the city since we got here. Good day!\"";
+ goto L_Close;
+
+L_NohMask_Found:
+ mes "[Troupe Leader]";
+ mes "\"Thank you for finding the mask. You did such a good job, you should keep it.\"";
+ getinventorylist;
+ if (@inventorylist_count == 100) goto L_NohMask_TooMany;
+ mes "[1500 experience points]";
+ getexp 1500, 0;
+ set @inspector, 14;
+ callsub S_Update_Mask;
+ getitem "NohMask", 1;
+ next;
+ mes "[Troupe Leader]";
+ mes "\"We don't need it anymore. We're doing different shows here.\"";
+ goto L_Close;
+
+L_NohMask_TooMany:
+ next;
+ mes "[Troupe Leader]";
+ mes "\"Except, you don't seem to have any room for it. I'll hold onto it for you until you do have room.\"";
+ goto L_Close;
+
+L_Close:
+ set @inspector, 0;
+ close;
+
+S_Update_Mask:
+ set QUEST_Hurnscald, (QUEST_Hurnscald & ~(NIBBLE_3_MASK)) | (@inspector << NIBBLE_3_SHIFT);
+ return;
+}