summaryrefslogtreecommitdiff
path: root/npc/029-2
diff options
context:
space:
mode:
authorJesusaves <cpntb1@ymail.com>2021-04-09 13:33:57 -0300
committerJesusaves <cpntb1@ymail.com>2021-04-09 13:33:57 -0300
commitcf18ce071c79ae37e14ea38943e0b1d88da70a7b (patch)
treef9159c9b60b3018300dd22ffba0d797bc5e828e5 /npc/029-2
parent8a4bf716002a017de77fe7df301ef8e4aaf00a2e (diff)
downloadserverdata-cf18ce071c79ae37e14ea38943e0b1d88da70a7b.tar.gz
serverdata-cf18ce071c79ae37e14ea38943e0b1d88da70a7b.tar.bz2
serverdata-cf18ce071c79ae37e14ea38943e0b1d88da70a7b.tar.xz
serverdata-cf18ce071c79ae37e14ea38943e0b1d88da70a7b.zip
Override
Diffstat (limited to 'npc/029-2')
-rw-r--r--npc/029-2/_import.txt16
-rw-r--r--npc/029-2/_mobs.txt3
-rw-r--r--npc/029-2/_warps.txt8
-rwxr-xr-xnpc/029-2/alchemy.txt98
-rwxr-xr-xnpc/029-2/bankroom.txt5
-rwxr-xr-xnpc/029-2/barrels.txt45
-rwxr-xr-xnpc/029-2/barrels_config.txt84
-rwxr-xr-xnpc/029-2/cynric.txt6
-rwxr-xr-xnpc/029-2/mapflags.txt3
-rwxr-xr-xnpc/029-2/morgan.txt113
-rwxr-xr-xnpc/029-2/nyle.txt47
-rwxr-xr-xnpc/029-2/sorfina.txt387
-rwxr-xr-xnpc/029-2/stat_reset.txt49
-rwxr-xr-xnpc/029-2/tanisha.txt286
-rwxr-xr-xnpc/029-2/two_arms.txt3
15 files changed, 1153 insertions, 0 deletions
diff --git a/npc/029-2/_import.txt b/npc/029-2/_import.txt
new file mode 100644
index 00000000..1a254643
--- /dev/null
+++ b/npc/029-2/_import.txt
@@ -0,0 +1,16 @@
+// Map 029-2: Candor Island Indoor
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/029-2/_mobs.txt",
+"npc/029-2/_warps.txt",
+"npc/029-2/alchemy.txt",
+"npc/029-2/bankroom.txt",
+"npc/029-2/barrels.txt",
+"npc/029-2/barrels_config.txt",
+"npc/029-2/cynric.txt",
+"npc/029-2/mapflags.txt",
+"npc/029-2/morgan.txt",
+"npc/029-2/nyle.txt",
+"npc/029-2/sorfina.txt",
+"npc/029-2/stat_reset.txt",
+"npc/029-2/tanisha.txt",
+"npc/029-2/two_arms.txt",
diff --git a/npc/029-2/_mobs.txt b/npc/029-2/_mobs.txt
new file mode 100644
index 00000000..46230226
--- /dev/null
+++ b/npc/029-2/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 029-2: Candor Island Indoor mobs
+029-2,33,57,12,3 monster Wicked Mushroom 1050,7,100000,30000
diff --git a/npc/029-2/_warps.txt b/npc/029-2/_warps.txt
new file mode 100644
index 00000000..3a6e62bb
--- /dev/null
+++ b/npc/029-2/_warps.txt
@@ -0,0 +1,8 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 029-2: Candor Island Indoor warps
+029-2,29,62,0 warp #029-2_29_62 0,0,029-1,40,89
+029-2,22,93,0 warp #029-2_22_93 0,0,029-1,44,84
+029-2,112,84,0 warp #029-2_112_84 0,0,029-2,44,30
+029-2,103,62,0 warp #029-2_103_62 0,0,029-1,52,85
+029-2,94,31,0 warp #029-2_94_31 0,0,029-1,58,80
+029-2,24,124,0 warp #029-2_24_124 0,0,029-1,49,78
diff --git a/npc/029-2/alchemy.txt b/npc/029-2/alchemy.txt
new file mode 100755
index 00000000..f9799252
--- /dev/null
+++ b/npc/029-2/alchemy.txt
@@ -0,0 +1,98 @@
+- script _N-Alchemy NPC32767,{
+ @npc_distance = 1;
+ callfunc "PCtoNPCRange";
+ if (@npc_check) end;
+
+ title "Alchemy Lab";
+ mes "This is an alchemy lab.";
+ mes "With it, you can combine reagents together to create powerful potions.";
+ next;
+ clear;
+ mes "##BDrag & drop 2 items from your inventory. All items used will be lost.##b";
+ cleararray @alchlab_items$[0], "", 2; // since we're not using a scoped (.@) array, we need to clean it
+ requestitem @alchlab_items$[0], 2; // TODO: add a craft builtin (npc action 12)
+ clear;
+ if (@alchlab_items$[0] == "" || @alchlab_items$[1] == "")
+ goto L_NoItems;
+
+ mes "You are about to combine the following:";
+ mes " ["+ getitemlink(@alchlab_items$[0]) +"]";
+ mes " ["+ getitemlink(@alchlab_items$[1]) +"]";
+ mes;
+ mes "##BWarning! This will permanently destroy the selected items.##b";
+ // can not use a scope variable to store item names because menu is a script terminator (destroys the scope)
+ menu
+ "Abort Mission.", L_Abort,
+ "Proceed.", L_Proceed;
+
+L_Proceed:
+ // XXX: here we could make it wait a little, while the potion is boiling (and show an animation/particles/sound)
+ if (countitem(@alchlab_items$[0]) < 1 || countitem(@alchlab_items$[1]) < 1) // this shouldn't happen, but just to be safe..
+ goto L_NoItems;
+ delitem @alchlab_items$[0], 1;
+ delitem @alchlab_items$[1], 1;
+ if (@alchlab_items$[0] == "BottleOfWater" || @alchlab_items$[1] == "BottleOfWater") // give back used bottles
+ getitem "EmptyBottle", if_then_else(@alchlab_items$[0] == "BottleOfWater" && @alchlab_items$[1] == "BottleOfWater",2,1);
+
+ .@n = -3;
+ goto L_CheckRecipes;
+
+L_CheckRecipes:
+ .@n = .@n+3;
+ if (.@n == get(.rsize, "_N-Alchemy"))
+ goto L_Failed;
+ if (!(get(.recipes$[.@n], "_N-Alchemy") == @alchlab_items$[0] && get(.recipes$[.@n+1], "_N-Alchemy") == @alchlab_items$[1]) &&
+ !(get(.recipes$[.@n], "_N-Alchemy") == @alchlab_items$[1] && get(.recipes$[.@n+1], "_N-Alchemy") == @alchlab_items$[0]))
+ goto L_CheckRecipes;
+
+ getitem get(.recipes$[.@n+2], "_N-Alchemy"), 1; // XXX: here we could also make it fail sometimes depending on your expertise
+
+ // XXX: here we could make it give profession/crafting exp
+ clear;
+ mes "You combined the following:";
+ mes " ["+ getitemlink(@alchlab_items$[0]) +"]";
+ mes " ["+ getitemlink(@alchlab_items$[1]) +"]";
+ mes;
+ mes "You obtained:";
+ mes " ["+ getitemlink(get(.recipes$[.@n+2], "_N-Alchemy")) +"]";
+ close;
+
+L_NoItems:
+ mes "You must put exactly 2 items.";
+ close;
+
+L_Failed:
+ mes "The potion bubbles violently and evaporates."; // XXX: here we could have random failure messages
+ close;
+
+L_Abort:
+ close;
+
+S_Spawn:
+ .@s = getarraysize(.x1);
+ if (.spawned >= .@s)
+ goto S_Return;
+ .@n$ = "#_Al-lab"+chr(3)+.spawned;
+ if (puppet(.m$[.spawned], .x1[.spawned], .y1[.spawned], .@n$, 399) < 1) mapexit;
+ .spawned = .spawned + 1;
+ if (.spawned < .@s)
+ goto S_Spawn;
+ return;
+
+S_Return:
+ return;
+
+OnMaybeStart:
+ callsub S_Spawn;
+ if (.started == 0)
+ goto L_InitVars;
+ end;
+
+L_InitVars:
+ setarray .recipes$[0], 0,
+ "DilutedConcentrationPot", "DarkConcentrationPotion", "ConcentrationPotion",
+ "CactusDrink", "CactusDrink", "CactusPotion",
+ "PinkPetal", "BottleOfWater", "ConcentrationPotion";
+ .rsize = getarraysize(.recipes$);
+ end;
+}
diff --git a/npc/029-2/bankroom.txt b/npc/029-2/bankroom.txt
new file mode 100755
index 00000000..12a7390c
--- /dev/null
+++ b/npc/029-2/bankroom.txt
@@ -0,0 +1,5 @@
+
+029-2,35,122,0 script #BankRoom NPC32767,0,0,{
+ message strcharinfo(0), "The door is locked. This must be where Cynric saves the people's money and items.";
+ end;
+}
diff --git a/npc/029-2/barrels.txt b/npc/029-2/barrels.txt
new file mode 100755
index 00000000..b44fec43
--- /dev/null
+++ b/npc/029-2/barrels.txt
@@ -0,0 +1,45 @@
+029-2,23,86,0 script Barrel#0 NPC400,{
+ @barrel = 0;
+ callfunc "CheckBarrel";
+ end;
+
+OnMaggotDeath:
+ @mobId = 1050;
+ callfunc "MobPoints";
+ end;
+}
+029-2,28,86,0 script Barrel#1 NPC400,{
+ @barrel = 1;
+ callfunc "CheckBarrel";
+ end;
+}
+029-2,31,91,0 script Barrel#2 NPC400,{
+ @barrel = 2;
+ callfunc "CheckBarrel";
+ end;
+}
+029-2,36,85,0 script Barrel#3 NPC400,{
+ @barrel = 3;
+ callfunc "CheckBarrel";
+ end;
+}
+029-2,40,89,0 script Barrel#4 NPC400,{
+ @barrel = 4;
+ callfunc "CheckBarrel";
+ end;
+}
+029-2,38,91,0 script Barrel#5 NPC400,{
+ @barrel = 5;
+ callfunc "CheckBarrel";
+ end;
+}
+029-2,29,92,0 script Barrel#6 NPC400,{
+ @barrel = 6;
+ callfunc "CheckBarrel";
+ end;
+}
+029-2,24,91,0 script Barrel#7 NPC400,{
+ @barrel = 7;
+ callfunc "CheckBarrel";
+ end;
+}
diff --git a/npc/029-2/barrels_config.txt b/npc/029-2/barrels_config.txt
new file mode 100755
index 00000000..84f4b111
--- /dev/null
+++ b/npc/029-2/barrels_config.txt
@@ -0,0 +1,84 @@
+029-2,33,88,24,7 monster HouseMaggot 1050,2,100000,30000,Barrel#0::OnMaggotDeath
+- script #BarrelConfig NPC32767,{
+ end;
+
+OnInit:
+ setarray $@BarrelBits, (1 << 20), (1 << 21), (1 << 22), (1 << 23), (1 << 24), (1 << 25), (1 << 26), (1 << 27);
+ setarray $@BarrelRewards, 533, 507, 505, 518, 537, 526;
+ $@BarrelSpawnCnt = 1;
+ $@BarrelSpawnId = 1050;
+ $@BarrelSpawnName$ = "House Maggot";
+ $@BarrelMax = getarraysize($@BarrelBits);
+ end;
+}
+function script CountBarrels {
+ @barrel_count = 0;
+ @count_tmp = 0;
+ goto L_Loop;
+
+L_Loop:
+ if (STARTAREA & $@BarrelBits[@barrel_count])
+ goto L_AddOne;
+ goto L_LoopAgain;
+
+L_AddOne:
+ @barrel_count = (@barrel_count + 1);
+ goto L_LoopAgain;
+
+L_LoopAgain:
+ @count_tmp = (@count_tmp + 1);
+ if (@count_tmp == getarraysize($@BarrelBits))
+ goto L_BarrelTally;
+ goto L_Loop;
+
+L_BarrelTally:
+ return;
+}
+function script CheckBarrel {
+ @npc_distance = 2;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) goto L_Return;
+ if (!(QL_ZEGAS == 2))
+ goto L_NoI;
+ if (STARTAREA & $@BarrelBits[@barrel])
+ goto L_Empty;
+ STARTAREA = STARTAREA | $@BarrelBits[@barrel];
+
+ callfunc "CountBarrels";
+ if (@barrel_count == $@BarrelMax)
+ goto L_QuestReward;
+ @player_random = rand(@barrel_count * 10);
+ @barrel_random = rand(@barrel_count * $@BarrelMax);
+ if (@barrel_random > @player_random)
+ goto L_Spawn;
+ goto L_Reward;
+
+L_NoI:
+ message strcharinfo(0), "Nothing interesting here.";
+ goto L_Return;
+
+L_Empty:
+ message strcharinfo(0), "You've already searched this barrel.";
+ goto L_Return;
+
+L_QuestReward:
+ message strcharinfo(0), "You found the bug bomb.";
+ misceffect 33;
+ QL_ZEGAS = 3;
+ killmonster getmapname() + "", "Barrel#0::OnMaggotDeath";
+ goto L_Return;
+
+L_Spawn:
+ message strcharinfo(0), "Uck, More Maggots!";
+ setarray @npc_loc, getnpcx(), getnpcy();
+ areamonster getmapname(), @npc_loc[0], @npc_loc[1], (@npc_loc[0] + 1), (@npc_loc[1] + 1), $@BarrelSpawnName$, $@BarrelSpawnId, $@BarrelSpawnCnt, "Barrel#0::OnMaggotDeath";
+ cleararray @npc_loc, 0, 2;
+ goto L_Return;
+
+L_Reward:
+ getitem $@BarrelRewards[rand(getarraysize($@BarrelRewards))], 1;
+ goto L_Return;
+
+L_Return:
+ return;
+}
diff --git a/npc/029-2/cynric.txt b/npc/029-2/cynric.txt
new file mode 100755
index 00000000..beecaa04
--- /dev/null
+++ b/npc/029-2/cynric.txt
@@ -0,0 +1,6 @@
+
+029-2,30,118,0 script Cynric NPC161,{
+ @npcname$ = "Cynric";
+ callfunc "Banker";
+ close;
+}
diff --git a/npc/029-2/mapflags.txt b/npc/029-2/mapflags.txt
new file mode 100755
index 00000000..bfe50c0c
--- /dev/null
+++ b/npc/029-2/mapflags.txt
@@ -0,0 +1,3 @@
+029-2 mapflag nosave 029-2,22,24
+//029-2 mapflag resave 029-2,22,24
+029-2 mapflag mask 1
diff --git a/npc/029-2/morgan.txt b/npc/029-2/morgan.txt
new file mode 100755
index 00000000..5c12dfc3
--- /dev/null
+++ b/npc/029-2/morgan.txt
@@ -0,0 +1,113 @@
+029-2,105,57,0 script MorganDebug NPC355,{
+ mes "[Morgan Debug]";
+ mes "Reset?";
+ menu
+ "Yes.", L_Reset,
+ "No.", L_End;
+L_Reset:
+ QL_MORGAN = 0;
+ mes "Reset!";
+ goto L_End;
+
+L_End:
+ end;
+
+OnInit:
+ if (!debug)
+ disablenpc "MorganDebug";
+ end;
+}
+029-2,101,57,0 script Morgan#_M NPC355,{
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+
+ if (Int >= 5)
+ goto L_Learn;
+ goto L_NotMagic;
+
+L_Learn:
+ if (QL_MORGAN == 0)
+ goto L_NotSeen;
+ if (QL_MORGAN == 1)
+ goto L_Seen;
+ if (QL_MORGAN == 2)
+ goto L_Started;
+ if (QL_MORGAN == 3)
+ goto L_CastOnce;
+ if (QL_MORGAN == 4)
+ goto L_LearningDone;
+ goto L_close;
+
+L_NotSeen:
+ QL_MORGAN = 1;
+ mes "[Morgan]";
+ mes "\"Welcome to the magic school of Candor\"";
+ mes "\"My name is Morgan, I'm Head of Wizardry.\"";
+ mes "\"You appear to have the markings to use magic.\"";
+ mes "\"Granted you are still to young to cast spells.\"";
+ mes "\"But we can teach you to use simple magic devices.\"";
+ mes "\"Would you like to learn some apprentice skills?\"";
+ menu
+ "Yes.", L_Start,
+ "Maybe later", L_close;
+
+L_Seen:
+ mes "[Morgan]";
+ mes "\"Have you returned to learn some magic?\"";
+ menu
+ "Yes.", L_Start,
+ "Maybe later", L_close;
+
+L_NotMagic:
+ mes "[Morgan]";
+ mes "\"Hrmm you don't appear to posses enough magical talent to teach.\"";
+ goto L_close;
+
+L_Start:
+ QL_MORGAN = 2;
+ mes "\"Great, lets begin your first lesson.\"";
+ getitem 1171, 1;
+ mes "\"This is a wand, there are many like it but this one is now yours.\"";
+ mes "\"Various wands and staffs are found throughout the land with many different strengths and weaknesses.\"";
+ mes "\"To use the wand you need to have it equipped and speak the incantation to let it tap into your mana.\"";
+ mes "\"As the power of your magic grows so will the spells you can cast.\"";
+ mes "\"Lets start with a basic wand attack. " + get(.invocation$, "spell-wand") + "\"";
+ mes "\"Equip the wand and lets try out that spell.\"";
+ mes "\"To cast a spell open the chat window, type the invocation and press enter.\"";
+ mes "\"Speak to me again once you've cast the spell.\"";
+ goto L_close;
+
+L_Started:
+ mes "[Morgan]";
+ mes "\"Lets start with a basic wand attack. " + get(.invocation$, "spell-wand") + "\"";
+ mes "\"Equip the wand and lets try out that spell.\"";
+ mes "\"To cast a spell open the chat window, type the invocation and press enter.\"";
+ mes "\"Speak to me again once you've cast the spell.\"";
+ goto L_close;
+
+L_CastOnce:
+ mes "[Morgan]";
+ mes "\"Ok, good job! Looks like you have good mana flow.\"";
+ mes "\"Onto the next lesson. Now that you have " + get(.invocation$, "spell-wand") + " cast,\"";
+ mes "\"Each time you attack the wand will convert a bit of you mana into a magic bolt.\"";
+ mes "\"After so many attacks, you will need to recast the invocation to stay attuned to the wand.\"";
+ mes "\"(Logging out will also cancel any spell effects currently active in-game.).\"";
+ next;
+ mes "\"I've taught you all I can for now. You should visit the Mana Seed north west of Hurnscald.\"";
+ QL_MORGAN = 4;
+ goto L_close;
+
+L_LearningDone:
+ mes "[Morgan]";
+ mes "\"" + get(.invocation$, "spell-wand") + " is a basic wand attack.\"";
+ mes "\"A Wand must be equipped to use the spell.\"";
+ mes "\"To cast a spell open the chat window, type the invocation and press enter.\"";
+ mes "\"You can also discharge any active spell by saying " + get(.invocation$, "discharge spell") + ".\"";
+ mes "\"I've taught you all I can for now. You should visit the Mana Seed north west of Hurnscald.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
+
+029-2,113,59,0 shop Zitoni NPC103,501:25,502:35,825:50,826:100
diff --git a/npc/029-2/nyle.txt b/npc/029-2/nyle.txt
new file mode 100755
index 00000000..d4573269
--- /dev/null
+++ b/npc/029-2/nyle.txt
@@ -0,0 +1,47 @@
+
+029-2,26,120,6 script Nyle NPC101,{
+ mes "[Nyle]";
+ mes "\"Visiting the bank too right? We're only a small village but Cynric is the best bank guy I know.\"";
+ menu
+ "Yeah, you're right.", L_close,
+ "What is banking?", L_Explain;
+
+L_Explain:
+ mes "[Nyle]";
+ mes "\"There are banks all over the world. Usually every important village or city has one.";
+ mes "You can save both items and money at a bank.\"";
+ menu
+ "How do I save items?", L_Items,
+ "How do I save money?", L_Money,
+ "Thanks!", L_Thanks;
+
+L_Items:
+ mes "[Nyle]";
+ mes "\"Let Cynric open your storage. You might also want to open your inventory.";
+ mes "Pick an item from either storage or inventory and choose what you want to do with it by clicking the right button.";
+ mes "You can also pick and drag items from one window into the other but this will move all items of this kind.";
+ next;
+ mes "Items in your storage are totally safe. Banking itself is totally safe.\"";
+ menu
+ "And how do I save money?", L_Money,
+ "Thanks!", L_Thanks;
+
+L_Money:
+ mes "[Nyle]";
+ mes "\"That's easy. Cynric will save your money when you ask him to deposit. Or you pick up your money by asking to withdraw.";
+ mes "You only have to tell him how much you want to deposit or withdraw.";
+ mes "Also you can ask how much he already save for you by checking your balance.";
+ next;
+ mes "Money in your storage is totally safe. Banking itself is totally safe.\"";
+ menu
+ "And how do I save items?", L_Items,
+ "Thanks!", L_Thanks;
+
+L_Thanks:
+ mes "[Nyle]";
+ mes "\"You are very welcome.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/029-2/sorfina.txt b/npc/029-2/sorfina.txt
new file mode 100755
index 00000000..fe77d09d
--- /dev/null
+++ b/npc/029-2/sorfina.txt
@@ -0,0 +1,387 @@
+029-2,27,27,0 script Sorfina NPC154,0,1,{
+ @npc_distance = 2;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ goto L_Main;
+
+L_Main:
+ if (QL_BEGIN == 10) goto L_Hasan;
+ if (QL_BEGIN >= 4) goto L_Again;
+ if (QL_BEGIN == 3) goto L_Clothes;
+ if (QL_BEGIN == 2) goto L_Dresser;
+ if (QL_BEGIN == 1) goto L_Carpet;
+ goto L_Start;
+
+L_Start:
+ mes "You open your eyes.";
+ mes "";
+ mes "[Old Woman]";
+ mes "\"Ah, you woke up. You washed ashore on the beach 3 days ago. You've been asleep since.";
+ mes "You must have been thrown off one of the ships sailing during that last tremor.\"";
+ mes "\"My little granddaughter Tanisha found you. Kaan was able to carry you to bed.";
+ mes "We've been taking care of you ever since. Waiting for you to wake up.\"";
+ mes "\"You didn't have any possessions on you when we found you and no one knows who you are.\"";
+ mes "Do you have a name?";
+ menu
+ strcharinfo(0), L_name;
+
+L_name:
+ mes "[Old Woman]";
+ mes "\"Well " + strcharinfo(0) + " what else can you tell me about yourself?.\"";
+ next;
+ mes "[Old Woman]";
+ mes "\"Go on. If you need to think a bit, take your time.\"";
+ select
+ "... Tulimshar in Tonori ... I'm a Talpan.";
+ mes "";
+ mes "[Old Woman]";
+ mes "\"Anything else you can remember?\"";
+ menu
+ "Umm... no... I... I don't remember anything else...", L_KnowNothing;
+
+L_KnowNothing:
+ mes "[Old Woman]";
+ mes "\"Well I can tell you some useful things, if you want to hear.";
+ mes "Some of it might jog your memory or at least help you catch your bearings.";
+ mes "Oh, and by the way my name is Sorfina.\"";
+ menu
+ "That would be great!",L_Tut,
+ "No, thanks. I already know how things are going.",L_SkipTut;
+
+L_Tut:
+ mes "She smiles at you.";
+ mes "[Sorfina]";
+ mes "\"You have arrived at a very strange time. The Council is visiting Candor today.\"";
+ mes "\"All the recent rumbling from the cave has all of Candor worried.\"";
+ mes "\"Our guess is something with the last big shaker was the reason you ended up here.\"";
+ mes "\"Ok, lets start by getting you dressed.\"";
+ goto L_Carpet;
+
+L_Carpet:
+ mes "[Sorfina]";
+ mes "\"Try to take a few steps and walk to that carpet over there.";
+ next;
+ camera "#Carpet";
+ mapmask getmask() | 4;
+ next;
+ camera;
+ mes "Press [###keyMoveUp;] to move up, press [###keyMoveDown;] to move down, ";
+ mes "press [###keyMoveLeft;] to move left, press [###keyMoveRight;] to move right ";
+ mes " or click on the place you want to go to.\"";
+ QL_BEGIN = 1;
+ goto L_close;
+
+L_Dresser:
+ mes "[Sorfina]";
+ mes "\"You should get dressed now.\"";
+ next;
+ camera "Dresser#tutorial";
+ mapmask getmask() | 32;
+ mes "\"In that dresser there are some clothes you can wear.\"";
+ mes "\"To interact with things in your environment or talk to NPCs you can either click on it or press [###keyTargetNPC;] to focus and [###keyTalk;] to talk/activate.\"";
+ next;
+ camera;
+ mes "\"Now get the clothes out of the dresser.\"";
+ goto L_close;
+
+L_Naked:
+ mes "[Sorfina]";
+ mes "\"Press [###keyWindowInventory;] or click on the Inventory button in the bar at the upper right corner to open your bag.\"";
+ mes "\"Once we stop talking, double-click on the clothes to equip.\"";
+ mes "\"Talk to me again after you get dressed. You can either click on me, or press [###keyTargetNPC;] to focus on me and [###keyTalk;] to talk.\"";
+ goto L_close;
+
+L_Clothes:
+ if (getequipid(equip_torso) < 0)
+ goto L_Naked;
+ mes "[Sorfina]";
+ mes "\"That's much better, don't you think?\"";
+ mes "\"Here take this.\"";
+ getitem "HitchhikersTowel", 1;
+ mes "\"Your HitchHikers Towel will return you to your last set soul menhir or here if not set.\"";
+ mes "\"It can't be used constantly as the magic needs time to power the jump.\"";
+ mes "\"I think this will help you a bit. To get more information, press the button Setup and look at the controls on the Keyboard tab. You can also change them as you like.";
+ mes "Talk to me again if you want me to explain more things.\"";
+
+ mes "\"Oh, and if you're looking for extra work, you should talk to Aidan and Valon when you go outside. They're giving rewards for monster hunting.";
+ mes "You can find Aidan near the camp fire outside and Valon out by the fields in the east.\"";
+ next;
+
+ mes "She digs in her pocket for a moment.";
+ mes "\"And here is some money for you. Don't spend it all in one place.";
+ mes "Now go help Tanisha downstairs.\"";
+ mapmask getmask() | 8;
+ Zeny = Zeny + 30;
+ QL_BEGIN = 4;
+ goto L_close;
+
+L_Again:
+ mes "[Sorfina]";
+ mes "\"Make yourself at home! Do you have any questions?\"";
+ menu
+ "Yes, could you explain about...",L_Explain,
+ "Could I get Healed?",L_Heal,
+ "No, thanks.",L_close;
+
+L_Heal:
+ if (BaseLevel > 20)
+ goto L_NoHeal;
+ mes "[Sorfina]";
+ mes "\"Hello Dear! You look tired, you should rest a moment.\"";
+ mes "You take a short nap and feel refreshed.";
+ heal MaxHp, 0;
+ goto L_Main;
+
+L_NoHeal:
+ mes "[Sorfina]";
+ mes "\"I'm sorry but your wounds are far to advanced for my skills.\"";
+ goto L_Main;
+
+L_Explain:
+ menu
+ "... walking?",L_Walk,
+ "... talking?",L_Talk,
+ "... the inventory and items?",L_Items,
+ "... shortcuts?",L_Shortcut,
+ "... what to do in Candor?",L_Aidan,
+ "... change my appearence?",L_Barber,
+ "... nevermind.",L_close;
+
+L_Walk:
+ mes "[Sorfina]";
+ mes "\"You can use the arrow keys to walk around.";
+ mes "Press [###keyMoveUp;] to move up, press [###keyMoveDown;] to move down, ";
+ mes "press [###keyMoveLeft;] to move left, press [###keyMoveRight;] to move right ";
+ mes " or click on the place you want to go to.";
+ mes "This only works if that place is reachable and walkable.\"";
+ goto L_close;
+
+L_Talk:
+ mes "[Sorfina]";
+ mes "\"If you want to talk to a normal person, you can click at him or her.";
+ mes "Or you can press [###keyTargetNPC;] to focus on the nearest person and then press [###keyTalk;] to talk.\"";
+ next;
+ mes "\"If you want to talk to other adventurers, press [###keyChat;] to open your chat window.";
+ mes "Then type your message and press Enter to send.\"";
+ next;
+ mes "\"You may want to talk privately to another adventurer sometimes. In that case you can whisper.";
+ mes "After pressing [###keyChat;] type '/whisper [name] [message]'.";
+ mes "Or you can right click on someone and choose the whisper option.\"";
+ next;
+ mes "\"Press [###keyWindowChat;] to show and hide your chat window.\"";
+ goto L_close;
+
+L_Items:
+ mes "[Sorfina]";
+ mes "\"There are three types of items.";
+ mes "They can be Consumables, Equipment or Miscellaneous.\"";
+ next;
+ mes "\"Consumable items such as Potions, can be used only once.";
+ mes "After use, they will disappear from your inventory.";
+ mes "There are some rare items that can be used but don't get consumed.\"";
+ next;
+ mes "\"Equipment items like Armors, Weapons, Accessories can be equipped for fashionable purposes or to raise your status.\"";
+ next;
+ mes "\"Miscellaneous items such as maggot slime, can be used in creating other items, or just to trade and sell.\"";
+ next;
+ mes "\"Your HitchHikers Towel will return you to your last set soul menhir or here if not set.\"";
+ mes "\"It can't be used constantly as the magic needs time to power the jump.\"";
+ next;
+ mes "\"Press [###keyWindowInventory;] to open your inventory.";
+ mes "When placing your cursor over an item there, you can see a box with some information about that item.\"";
+ next;
+ mes "\"To use or equip an item, select it by double-clicking on it.";
+ mes "Selecting the item then pressing Use or Equip also works.\"";
+ goto L_close;
+
+L_Shortcut:
+ mes "[Sorfina]";
+ mes "\"Press [###keyWindowShortcut;] or click the Shortcut button in the bar at the upper right to open your shortcut window.\"";
+ next;
+ mes "\"You can select the item you want to put on a shortcut with your mouse and then click on the position in the shortcut window you want to place it.\"";
+ next;
+ mes "\"Now you can use or equip/unequip it by pressing the number of the shortcut.\"";
+ goto L_close;
+
+L_Aidan:
+ mes "[Sorfina]";
+ mes "\"I heard Aidan and Valon are looking for brave adventurers, you might want to talk to them. ";
+ mes "You can find Aidan near the camp fire outside. The fields are just south of the town exit. ";
+ mes "You'll see Valon of the city gaurd standing there. They both are offering rewards for monster hunting.\"";
+ next;
+ mes "\"When you leave this area to the South, you'll come to the docks.";
+ mes "They will take you to Hurnscald, a major trading port.\"";
+ next;
+ mes "\"Go east out of Candor and north. You will find the cave everyone is talking about to the north.";
+ next;
+ mes "Talk to everybody. You can never tell when they might know something useful.\"";
+ goto L_close;
+
+L_Barber:
+ mes "[Sorfina]";
+ mes "\"Jessie downstairs can change your appearance.\"";
+ mes "\"They will allow you to change your hair color or style as well as gender.\"";
+ next;
+ mes "\"There are a number of people across the continent that can change this for you.\"";
+ mes "\"There is no cost or limit to the number of times it can be changed.\"";
+ goto L_close;
+
+L_Hasan:
+ mes "[Sorfina]";
+ mes "\"Make yourself at home! Do you have any questions?\"";
+ menu
+ "A guy named Hasan is bullying people.",L_Next,
+ "Yes, could you explain again about...",L_Explain,
+ "No, thanks.",L_close;
+
+L_Next:
+ mes "\"Ah, Hasan. He's causing trouble again?\"";
+ mes "She shakes her head.";
+ mes "[Sorfina]";
+ mes "\"This guy has been a plague ever since he could walk. He's always causing trouble.\"";
+ mes "\"And his father... Well, one day his father thought he should teach Hasan a lesson.\"";
+ mes "\"He took him into the desert and then left him there!";
+ mes "Hasan was only seven years old!\"";
+ mes "\"I never understood how someone could do something like that to a child, even if it's a rascal like Hasan.\"";
+ mes "\"Anyway, Hasan tried to find his way back home, but stumbled into a nest of scorpions!\"";
+ mes "She shakes her head.";
+ mes "\"If Valon hadn't have come along that moment, Hasan would have died that day.\"";
+ mes "\"However, the scorpions poison caused a bad fever and once Hasan had recovered from that, he was even more malicious than before.\"";
+ mes "She sighs.";
+ QL_BEGIN = 11;
+ goto L_close;
+
+L_SkipTut:
+ mes "[Sorfina]";
+ mes "\"Really? You seem quite unexperienced. Listening to some advice won't hurt.\"";
+ menu
+ "Thinking about it twice... please tell me.",L_Tut,
+ "Yeah, but thanks for the offer. Bye.",L_Bye;
+
+L_Bye:
+ mes "[Sorfina]";
+ mes "\"Alright, if you say so. But take at least this. See you later.\"";
+ getitem "Knife", 1;
+ getitem "SlingShot", 1;
+ getitem "SlingBullet", 500;
+ getitem "HitchhikersTowel", 1;
+ getitem "CottonShirt", 1;
+ getitem "RaggedShorts", 1;
+ set Zeny, Zeny + 35; // tanisha gives 5 Zeny
+ QL_BEGIN = 8;
+ goto L_close;
+
+L_close:
+ close;
+
+OnTouch:
+ if (QL_BEGIN > 0)
+ end;
+ goto L_Start;
+}
+
+029-2,33,27,0 script #Carpet NPC127,1,1,{
+ if (QL_BEGIN != 1)
+ end;
+ mapmask getmask();
+ mes "[Sorfina]";
+ mes "\"You should get dressed now.\"";
+ next;
+ camera "Dresser#tutorial";
+ mapmask getmask() | 16;
+ mes "\"In that dresser there are some clothes you can wear.\"";
+ mes "\"To interact with things in your environment or talk to NPCs you can either click on it or press N to focus and T to talk/activate.\"";
+ next;
+ camera;
+ mes "\"Now get the clothes out of the dresser.\"";
+ QL_BEGIN = 2;
+ close;
+}
+
+029-2,29,23,0 script Dresser#tutorial NPC400,{
+ @npc_distance = 2;
+ @distance_handler = 1;
+ callfunc "PCtoNPCRange";
+ if (@npc_check)
+ goto L_closeDis;
+ if (QL_BEGIN > 2) goto L_Empty;
+ if (QL_BEGIN == 2) goto L_Shirt;
+ goto L_Walk;
+
+L_Walk:
+ mes "[Sorfina]";
+ mes "\"Thats not what I said to do. Please don't skip ahead.\"";
+ close;
+
+L_Shirt:
+ mapmask getmask();
+ mes "You take a simple Cotton Shirt and some very worn-out Ragged Shorts out of the dresser.";
+ getitem "CottonShirt", 1;
+ getitem "RaggedShorts", 1;
+ mes "[Sorfina]";
+ mes "\"Great! Now you can equip it.\"";
+ mes "\"You can open your inventory by pressing F3 or clicking on the 'Inventory' button in the bar at the upper right corner.\"";
+ next;
+ mes "\"After we finish talking, click on the clothes and press the equip button.\"";
+ QL_BEGIN = 3;
+ close;
+
+L_Empty:
+ mes "The dresser is empty.";
+ close;
+
+L_closeDis:
+ mes "You cannot reach that far.";
+ close;
+}
+
+029-2,44,31,0 script #DoorOutTut1 NPC45,0,0,{
+ if (QL_BEGIN < 4)
+ goto L_Block;
+ mapmask getmask();
+ warp "029-2", 112, 85;
+ end;
+
+L_Block:
+ message strcharinfo(0), "Sorfina : ##BWait a moment! ##bYou're not ready to leave.";
+ // FIXME: this should be changed to npctalk with strcharinfo(0) once we increase the view area
+ end;
+}
+029-2,23,24,0 script #GameRules1 NPC32767,0,1,{
+ if (TUT_var > 0)
+ end;
+ mes "[Server/Client Notice]";
+ mes "The explanations in this tutorial are based on the official client, Manaplus.";
+ mes "If you're using another client, settings and controls may be different.";
+ callfunc "GameRules";
+ close;
+}
+029-2,21,24,0 script #GameRules2 NPC32767,0,1,{
+ if (TUT_var > 0)
+ end;
+ mes "[Server/Client Notice]";
+ mes "The explanations in this tutorial are based on the official client, Manaplus.";
+ mes "If you're using another client, settings and controls may be different.";
+ callfunc "GameRules";
+ close;
+}
+029-2,22,26,0 script #GameRules3 NPC32767,1,0,{
+ if (TUT_var == 0)
+ goto L_KnockBack;
+ end;
+
+L_KnockBack:
+ message strcharinfo(0), "Server : ##BPlease Accept the Game rules";
+ warp "029-2", 22, 24;
+ end;
+}
+029-2,24,24,0 script #GameRules4 NPC32767,0,1,{
+ if (TUT_var == 0)
+ goto L_KnockBack;
+ end;
+
+L_KnockBack:
+ message strcharinfo(0), "Server : ##BPlease Accept the Game rules";
+ warp "029-2", 22, 24;
+ end;
+}
diff --git a/npc/029-2/stat_reset.txt b/npc/029-2/stat_reset.txt
new file mode 100755
index 00000000..75fe3e66
--- /dev/null
+++ b/npc/029-2/stat_reset.txt
@@ -0,0 +1,49 @@
+
+029-2,98,92,0 script Jessie NPC159,{
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+
+ if (BaseLevel >= 10)
+ goto L_Sorry;
+
+ mes "[Jessie]";
+ mes "\"I know a spell that will";
+ mes "reset status points on the youngings.";
+ mes "";
+ mes "I can also change their appearance.\"";
+ next;
+ menu
+ "Reset my stats",L_Reset,
+ "Change my appearance", L_Appearance,
+ "Forget about it",L_Pass;
+
+L_Appearance:
+ callfunc "Barber";
+ goto L_Pass;
+
+L_Reset:
+ resetstatus;
+
+ mes "[Jessie]";
+ mes "\"There you are.";
+ mes "";
+ mes "Good as new!\"";
+ goto L_close;
+
+L_Pass:
+ mes "[Jessie]";
+ mes "\"Very well then, see you.\"";
+ goto L_close;
+
+L_Sorry:
+ mes "[Jessie]";
+ mes "\"My spell only works on the very young, sorry.\"";
+ next;
+ mes "\"You can try Mailvox in the Tulimshar Bazaar or Wyara in the Potion Shop in Hurnscald.\"";
+ menu
+ "Change my appearance", L_Appearance,
+ "Bye", L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/029-2/tanisha.txt b/npc/029-2/tanisha.txt
new file mode 100755
index 00000000..4e5abe42
--- /dev/null
+++ b/npc/029-2/tanisha.txt
@@ -0,0 +1,286 @@
+
+029-2,110,88,0 script Tanisha NPC114,{
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+
+ if (isin("029-2", 98, 84, 106, 89))
+ goto L_Fighting;
+
+ if (QL_BEGIN >= 8) goto L_Tut_Done;
+ if (QL_BEGIN == 7) goto L_Stats;
+ if (QL_BEGIN == 6) goto L_Fail;
+ if (QL_BEGIN == 5) goto L_Maggots;
+
+ mes "[Tanisha]";
+ mes "\"Hey! You're up again!\"";
+ emotion EMOTE_HAPPY, strcharinfo(0);
+ mes "\"Are you feeling better?\"";
+ menu
+ "Yes, thank you.",L_Next,
+ "Yeah, but everything is gone. My stuff and memories..",L_Next;
+
+L_Next:
+ mes "[Tanisha]";
+ mes "\"I'm glad you're feeling better. It was really bad luck what happened to you.";
+ mes "Hey, I have an idea.\"";
+ QL_BEGIN = 5;
+ goto L_Maggots;
+
+L_Maggots:
+ mes "[Tanisha]";
+ mes "\"There are some maggots eating the goods and I'm supposed to get rid of them.";
+ mes "But they're so yucky!\"";
+ mes "\"If you kill them, I'll give you my knife.";
+ mes "What do you say?\"";
+ menu
+ "I guess it's the least I can do.",L_Next1;
+
+L_Next1:
+ mes "[Tanisha]";
+ mes "\"Wonderful.";
+ // since the check happens here, it is actually possible to have
+ // more than $@Maggot_MaxHunters in the area at one time
+ // but that's not a BIG problem
+ if (getareausers("029-2", 98, 84, 106, 89) >= $@Maggot_MaxHunters)
+ goto L_Crowded;
+ next;
+ goto L_Fight_Again;
+
+L_Fight_Again:
+ mes "[Tanisha]";
+ mes "\"Ok, listen what to do.";
+ mes "Equip a weapon and kill the maggots.\"";
+ mes "\"Press [###keyTargetMonster;] to focus on a monster. With [###keyTargetAttack;] you can focus and start attacking the same time.";
+ mes "But it also works to click on the monster with your mouse.\"";
+ next;
+ mes "\"If you press the [###keyTarget;], you can abort your attack.\"";
+ next;
+ mes "\"Maggots aren't aggressive, so they won't harm you until you attack them first. Take them out one by one.\"";
+ next;
+ mes "\"Sometimes dead monsters leave some useful things. You can pick them up by pressing [###keyPickup;] or clicking on the items with your mouse.\"";
+ close2;
+ // The getitem must be in the same place as set QL_BEGIN, 2;
+ // since it was moved to after L_Fight_Again, add it conditionally
+ if (QL_BEGIN == 5)
+ goto L_GetFightItems;
+ goto L_ContinueFight;
+
+L_GetFightItems:
+ QL_BEGIN = 6;
+ getitem "Knife", 1;
+ getitem "SlingShot", 1;
+ getitem "SlingBullet", 500;
+ goto L_ContinueFight;
+
+L_ContinueFight:
+ QL_BEGIN = 6;
+ @Maggot_Kills = 0;
+ @time = 0;
+ if (getareausers("029-2", 98, 84, 106, 89) == 0)
+ initnpctimer;
+ warp "029-2", 101, 87;
+ goto L_Summon;
+
+L_Summon:
+ areamonster "029-2", 98, 84, 106, 89, "", 1002, 1, "Tanisha::OnMaggotDeath";
+ end;
+
+L_Stats:
+ mes "[Tanisha]";
+ mes "\"That was great! Like a professional exterminator!\"";
+ mes "\"And it seems you became stronger and more experienced.";
+ mes "That means you got some status points which you can use to increase your abilities.\"";
+ mes "\"Press [###keyWindowStatus;] or click the Status button in the bar at the upper right to see your status window. There you can distribute your points on six different properties.\"";
+ mapmask getmask() | 2;
+ next;
+ goto L_StatsRe;
+
+L_StatsRe:
+ mes "\"Strength makes you hit harder and you can carry more weight.\"";
+ mes "\"Agility increases your attack speed and your ability to dodge attacks.\"";
+ mes "\"Vitality gives you more hit points and more defense against physical attacks.\"";
+ mes "\"Intelligence is useful for magic attack and defense.";
+ mes "But as long as you don't know any magic, you shouldn't use your points on this.\"";
+ mes "\"Dexterity is needed to hit monsters. It's also very important for the damage if you use a ranged weapon.\"";
+ mes "\"Luck gives you the chance to do critical hits and lowers the chance to receive a critical hit from your opponent.\"";
+ next;
+ mes "\"Think about how you want to play before assigning the points.\"";
+ mes "\"My Uncle sitting at the counter knows a spell to help the younglings reset their stats.\"";
+ mes "\"He can also change your hair style and color, along with your gender.\"";
+ mes "\"Furthermore, he knows of mages with even more powerful reset spells for your stats.\"";
+ next;
+ if (QL_BEGIN == 7)
+ goto L_Money;
+ goto L_Advice;
+
+L_Money:
+ next;
+ mes "[Tanisha]";
+ mes "\"Hey, you are so smart taking out all that yucky maggots for me.";
+ mes "You can have my pocket money. Here.\"";
+ QL_BEGIN = 8;
+ Zeny = Zeny + 5;
+ next;
+ goto L_Advice;
+
+L_Advice:
+ mes "\"When you go to Hurnscald, you should see Bernard. He can make a delicious soup!";
+ mes "Good luck!\"";
+ emotion EMOTE_HAPPY, strcharinfo(0);
+ goto L_close;
+
+L_Explain:
+ menu
+ "... how to fight?",L_Fight,
+ "... monsters?",L_Mob,
+ "... status points?",L_StatsRe,
+ "... what to do in Hurnscald?",L_Advice,
+ "... nevermind.",L_close;
+
+L_Fight:
+ mes "[Tanisha]";
+ mes "\"Press [###keyTargetMonster;] to focus on a monster. With [###keyTargetAttack;] you can focus and attack.";
+ mes "But it also works to click on the monster with your mouse.\"";
+ next;
+ mes "\"If you press the [###keyTarget;] button, you can abort your attack.\"";
+ next;
+ mes "\"Sometimes dead monsters leave some useful things. You can pick them up with pressing [###keyPickup;] or clicking on the items with your mouse.\"";
+ next;
+ mes "\"If you feel exhausted from battle you can sit down by pressing [###keyBeingSit;] to recover faster.\"";
+ goto L_close;
+
+L_Mob:
+ mes "[Tanisha]";
+ mes "\"I don't know much about monsters, I'm just a little girl. But I know a few things.";
+ mes "There are several types of monsters...Aggressive, Neutral, and Assistants.\"";
+ next;
+ mes "\"Aggressive monsters will attack you as soon as they see you.\"";
+ next;
+ mes "\"Neutral monsters are peaceful until they get attacked.\"";
+ next;
+ mes "\"Assistants are monsters who help each other.\"";
+ goto L_close;
+
+L_Tut_Done:
+ mes "[Tanisha]";
+ mes "\"These yucky maggots! They're eating our goods!";
+ mes "No matter how many of them you kill, they always come back.\"";
+ mes "She sighs.";
+ mes "[Tanisha]";
+ mes "\"Do you have any questions?\"";
+ menu
+ "Yes, could you explain about...", L_Explain,
+ "No, thanks.", L_close;
+
+L_Crowded:
+ mes "[Tanisha]";
+ mes "\"That's great! But...";
+ mes "it seems a little crowded in there.\"";
+ mes "\"Let's wait a short while.\"";
+ goto L_close;
+
+L_Sleep:
+ warp "029-2", 101, 87;
+ mes "[Tanisha]";
+ mes "\"What are you doing in there?";
+ mes "Sleeping?";
+ mes "Come back when you're serious.\"";
+ @Maggot_Kills = 0;
+ @time = 0;
+ close2;
+ if (getareausers("029-2", 98, 84, 106, 89) == 0)
+ goto L_CleanUp;
+ end;
+
+L_Fail:
+ mes "Tanisha seems to be trying hard to supress laughter.";
+ mes "[Tanisha]";
+ mes "\"The maggots defeated you.\"";
+ mes "She bursts out with laughter.";
+ mes "\"Oops, I'm sorry. It's just too funny.";
+ mes "Do you want to try it again?\"";
+ menu
+ "Sure!", L_Next2,
+ "No, I need a rest.", L_close;
+
+L_Next2:
+ if (getareausers("029-2", 98, 84, 106, 89) >= $@Maggot_MaxHunters)
+ goto L_Crowded;
+ goto L_Fight_Again;
+
+L_Fighting:
+ npctalk strnpcinfo(0), "##3I believe in you!", strcharinfo(0);
+ end;
+
+OnTimer1000:
+ setnpctimer 0;
+ if (getareausers("029-2", 98, 84, 106, 89) == 0)
+ goto L_CleanUp;
+ // This is needed because multiple players can be in the area at once
+ areatimer 0, "029-2", 98, 84, 106, 89, 0, "Tanisha::OnTick";
+ end;
+
+L_CleanUp:
+ killmonster "029-2", "Tanisha::OnMaggotDeath";
+ $@Maggot_Hunters = 0;
+ stopnpctimer;
+ areamonster "029-2", 98, 84, 106, 89, "", 1002, 1, "Tanisha::OnMaggotDeath";
+ end;
+
+OnTick:
+ @time = @time + 1;
+ if (@time > 300)
+ goto L_Sleep;
+ if (ispcdead())
+ end;
+ if (Hp > 20)
+ end;
+ heal MaxHp, 0;
+ npctalk strnpcinfo(0), "##3You're doing good!", strcharinfo(0);
+ end;
+
+OnMaggotDeath:
+ if (@Maggot_Kills == 1)
+ npctalk strnpcinfo(0), "##3Aaahhhh... another one! It will crawl up your legs!", strcharinfo(0);
+ if (@Maggot_Kills == 2)
+ npctalk strnpcinfo(0), "##3Ohh... Irrhk... Eeeeww... They just appear from nowhere!", strcharinfo(0);
+ if (@Maggot_Kills == 3)
+ npctalk strnpcinfo(0), "##3Yuck... I think I am getting sick.", strcharinfo(0);
+ if (isin("029-2", 98, 84, 106, 89))
+ @Maggot_Kills = @Maggot_Kills + 1;
+ if (@Maggot_Kills < 5)
+ goto L_Summon;
+ // else, complete
+ warp "029-2", 110, 88;
+ QL_BEGIN = 7;
+ @Maggot_Kills = 0;
+ @time = 0;
+ if (getareausers("029-2", 98, 84, 106, 89) == 0)
+ goto L_CleanUp;
+ end;
+
+L_close:
+ close;
+
+OnInit:
+ $@Maggot_MaxHunters = 4;
+ areamonster "029-2", 98, 84, 106, 89, "", 1002, 1, "Tanisha::OnMaggotDeath";
+ end;
+}
+029-2,114,93,0 script #DoorOutTut2 NPC45,0,0,{
+ end;
+
+OnTouch:
+ if (QL_BEGIN >= 8)
+ goto L_Warp;
+ goto L_Block;
+
+L_Warp:
+ mapmask getmask();
+ warp "029-1", 32, 100;
+ end;
+
+L_Block:
+ npctalk "Tanisha", "##3##BPlease come here. ##bI'd like some help!", strcharinfo(0);
+ end;
+}
diff --git a/npc/029-2/two_arms.txt b/npc/029-2/two_arms.txt
new file mode 100755
index 00000000..48dec1cb
--- /dev/null
+++ b/npc/029-2/two_arms.txt
@@ -0,0 +1,3 @@
+
+029-2,99,25,0 shop Rosen NPC311,903:50,904:0,530:8000,1199:2,529:2
+029-2,112,24,0 shop Toichi NPC377,1201:25,522:50,521:500,523:1000,603:1000