summaryrefslogtreecommitdiff
path: root/npc/029-2
diff options
context:
space:
mode:
authorJesusaves <cpntb1@ymail.com>2021-07-07 20:36:00 -0300
committerJesusaves <cpntb1@ymail.com>2021-07-07 20:36:00 -0300
commit6967b9e0b63d19141d4f59b7933a960ac81916d0 (patch)
tree8ecd9cd2461f3598cb7faece71eb77162aa4ef2a /npc/029-2
parent9877fd4ad81120af8e63e96d5d429092014dc017 (diff)
parent046c659193e1ca8bd13478678d1277df8bf9395c (diff)
downloadserverdata-6967b9e0b63d19141d4f59b7933a960ac81916d0.tar.gz
serverdata-6967b9e0b63d19141d4f59b7933a960ac81916d0.tar.bz2
serverdata-6967b9e0b63d19141d4f59b7933a960ac81916d0.tar.xz
serverdata-6967b9e0b63d19141d4f59b7933a960ac81916d0.zip
Merge branch 'master' into legacy
Override all files with 'master' version. This version is meant to preserve git history as requested by bjorn.
Diffstat (limited to 'npc/029-2')
-rw-r--r--npc/029-2/_import.txt15
-rw-r--r--npc/029-2/_mobs.txt3
-rw-r--r--npc/029-2/_warps.txt8
-rw-r--r--npc/029-2/bankroom.txt5
-rw-r--r--npc/029-2/barrels.txt44
-rw-r--r--npc/029-2/barrels_config.txt84
-rw-r--r--npc/029-2/cynric.txt6
-rw-r--r--npc/029-2/mapflags.txt3
-rw-r--r--npc/029-2/morgan.txt158
-rw-r--r--npc/029-2/nyle.txt47
-rw-r--r--npc/029-2/sorfina.txt386
-rw-r--r--npc/029-2/stat_reset.txt45
-rw-r--r--npc/029-2/tanisha.txt286
-rw-r--r--npc/029-2/two_arms.txt32
14 files changed, 1122 insertions, 0 deletions
diff --git a/npc/029-2/_import.txt b/npc/029-2/_import.txt
new file mode 100644
index 00000000..8e47f044
--- /dev/null
+++ b/npc/029-2/_import.txt
@@ -0,0 +1,15 @@
+// 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/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..abed2b5a
--- /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 House Maggot 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/bankroom.txt b/npc/029-2/bankroom.txt
new file mode 100644
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 100644
index 00000000..c5d91621
--- /dev/null
+++ b/npc/029-2/barrels.txt
@@ -0,0 +1,44 @@
+029-2,23,86,0 script Barrel#0 NPC400,{
+ @barrel = 0;
+ callfunc "CheckBarrel";
+ end;
+
+OnMaggotDeath:
+ fix_mobkill(HouseMaggot);
+ 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 100644
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 100644
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 100644
index 00000000..481d8ee5
--- /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 100644
index 00000000..1b76a690
--- /dev/null
+++ b/npc/029-2/morgan.txt
@@ -0,0 +1,158 @@
+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 (readparam(bInt) >= 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.\"";
+ close;
+
+L_Start:
+ mesn;
+ mesq l("Great, lets begin your first lesson.");
+ next;
+ mesn;
+ mesq l("This is a wand, there are many like it but this one is now yours.");
+ getitem Wand, 1;
+ learnskill SKILL_CONFRINGO;
+ QL_MORGAN = 2;
+ next;
+ mesn;
+ mesq l("Various wands and staffs are found throughout the land with many different strengths and weaknesses.");
+ next;
+ mesq l("To use the wand you need to have it equipped and speak the incantation to let it tap into your mana.");
+ next;
+ mesn;
+ mesq l("As the power of your magic grows so will the spells you can cast.");
+ mesq l("Lets start with a basic wand attack: %s.", b("confringo"));
+ next;
+ mesn;
+ mesq l("Equip the wand and lets try out that spell.");
+ mesc l("To cast a spell open the skill window, select the spell you wish to use, and press the %s button.", b(l("Use")));
+ next;
+ mesn;
+ mesq l("It might be a good idea to drag the spell to the shortcut window, so you can target and attack using your keyboard instead of mouse.");
+ next;
+ mesn;
+ mesq l("Speak to me again once you've cast the spell.");
+ mesc l("As an offensive spell, it'll only work if you have a valid target, like a monster.");
+ close;
+
+L_Started:
+ mesn;
+ mesq l("Lets start with a basic wand attack: %s.", b("confringo"));
+ mesq l("Equip the wand and lets try out that spell.");
+ mesc l("To cast a spell open the skill window, select the spell you wish to use, and press the %s button.", b(l("Use")));
+ mesq l("Speak to me again once you've cast the spell.");
+ mesc l("As an offensive spell, it'll only work if you have a valid target, like a monster.");
+ close;
+
+L_CastOnce:
+ mesn;
+ mesq l("Ok, good job! Looks like you have good mana flow.");
+ mesq l("Onto the next lesson. Now that you have %s cast,", b("confringo"));
+ mesq l("Each time you attack the wand will convert a bit of you mana into a magic bolt.");
+ next;
+ mesq l("If an offensive spell requires an item, then after so many attacks, you may need to recast the whole invocation to stay attuned to the wand.");
+ mesc l("(Logging out will also cancel any spell effects currently active in-game.).");
+ next;
+ mesq l("In other words, offensive spells which require reagents won't consume these every time you cast, but will still require the items frequently.");
+ next;
+ mesq l("I've taught you all I can for now. You should search for the Mana Seed, I've heard there was one north west of Hurnscald.");
+ QL_MORGAN = 4;
+ close;
+
+L_LearningDone:
+ mesn;
+ mesq l("%s is a basic wand attack.", b("confringo"));
+ mesq l("A Wand must be equipped to use the spell.");
+ mesc l("To cast a spell open the skill window, select the spell you wish to use, and press the %s button.", b(l("Use")));
+ mesq l("I've taught you all I can for now. You should search for the Mana Seed, I've heard there was one north west of Hurnscald.");
+ learnskill SKILL_CONFRINGO;
+ if (get_nibble(##03_TMWQUEST, 0) == 1) {
+ mes "";
+ select
+ l("Gotcha."),
+ l("Actually, have you ever heard of Yeti's kidnapping little girls?");
+ mes "";
+ if (@menu == 2) {
+ mesn;
+ mesq l("No, but maybe someone %s would know better?", b(l("old")));
+ }
+ }
+ close;
+
+L_close:
+ close;
+}
+
+029-2,113,59,0 script Zitoni NPC103,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem CactusDrink;
+ sellitem CactusPotion;
+ sellitem TinyManaElixir, 50;
+ sellitem SmallManaElixir, 100;
+ .distance = 5;
+ end;
+}
diff --git a/npc/029-2/nyle.txt b/npc/029-2/nyle.txt
new file mode 100644
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 100644
index 00000000..81dc4a33
--- /dev/null
+++ b/npc/029-2/sorfina.txt
@@ -0,0 +1,386 @@
+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 l("You open your eyes.");
+ mes "";
+ mesn l("Old Woman");
+ mes l("\"Ah, you woke up. You washed ashore on the beach 3 days ago. You've been asleep since.");
+ mes l("You must have been thrown off one of the ships sailing during that last tremor.\"");
+ next;
+ mes l("\"My little granddaughter Tanisha found you. Kaan was able to carry you to bed.");
+ mes l("We've been taking care of you ever since. Waiting for you to wake up.\"");
+ next;
+ mesq l("You didn't have any possessions on you when we found you and no one knows who you are.");
+ mes l("Do you have a name?");
+ select
+ strcharinfo(0);
+
+ mesn l("Old Woman");
+ mesq l("Well %s what else can you tell me about yourself?.", strcharinfo(0));
+ next;
+ mesn l("Old Woman");
+ mesq l("Go on. If you need to think a bit, take your time.");
+ select
+ l("... Tulimshar in Tonori ... I'm a Talpan.");
+ mes "";
+ mesn l("Old Woman");
+ mesq l("Anything else you can remember?");
+ select
+ l("Umm... no... I... I don't remember anything else...");
+
+ mesn l("Old Woman");
+ mes l("Well I can tell you some useful things, if you want to hear.");
+ mes l("Some of it might jog your memory or at least help you catch your bearings.");
+ mes l("Oh, and by the way my name is Sorfina.\"");
+ menu
+ l("That would be great!"), L_Tut,
+ l("No, thanks. I already know how things are going."), L_SkipTut;
+
+L_Tut:
+ clear;
+ mesc l("She smiles at you.");
+ mesn;
+ 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:
+ mesn;
+ 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:
+ mesn;
+ 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:
+ mesn;
+ 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;
+ mesn;
+ 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:
+ mesn;
+ 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;
+ mesn;
+ 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:
+ mesn;
+ 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:
+ mesn;
+ 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:
+ mesn;
+ 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:
+ mesn;
+ 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:
+ mesn;
+ 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:
+ mesn;
+ 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:
+ mesn;
+ 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:
+ mesn;
+ 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.";
+ mesn;
+ 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:
+ mesn;
+ 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:
+ mesn;
+ 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;
+ equip(CottonShirt);
+ equip(RaggedShorts);
+ equip(Knife);
+ 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();
+ mesn l("Sorfina");
+ mesq l("You should get dressed now.");
+ next;
+ camera "Dresser#tutorial";
+ mapmask getmask() | 16;
+ mesq l("In that dresser there are some clothes you can wear.");
+ mesc l("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;
+ mesq l("Now get the clothes out of the dresser.");
+ QL_BEGIN = 2;
+ close;
+}
+
+029-2,29,23,0 script Dresser#tutorial NPC400,{
+ if (QL_BEGIN > 2) goto L_Empty;
+ if (QL_BEGIN == 2) goto L_Shirt;
+ goto L_Walk;
+
+L_Walk:
+ mesn l("Sorfina");
+ mesq l("Thats not what I said to do. Please don't skip ahead.");
+ close;
+
+L_Shirt:
+ mapmask getmask();
+ mesc l("You take a simple Cotton Shirt and some very worn-out Ragged Shorts out of the dresser.");
+ getitem CottonShirt, 1;
+ getitem RaggedShorts, 1;
+ QL_BEGIN = 3;
+ mesn l("Sorfina");
+ mesq l("Great! Now you can equip it.");
+ mesc l("You can open your inventory by pressing F3 or clicking on the 'Inventory' button in the bar at the upper right corner.");
+ next;
+ mesq l("After we finish talking, click on the clothes and press the equip button.");
+ close;
+
+L_Empty:
+ mes l("The dresser is empty.");
+ close;
+
+OnInit:
+ .distance=1;
+ end;
+}
+
+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]";
+ mesc l("The explanations in this tutorial are based on the Manaplus client.");
+ mesc l("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]";
+ mesc l("The explanations in this tutorial are based on the Manaplus client.");
+ mesc l("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 100644
index 00000000..5a9f8dd1
--- /dev/null
+++ b/npc/029-2/stat_reset.txt
@@ -0,0 +1,45 @@
+
+029-2,98,92,0 script Jessie NPC159,{
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+
+ if (BaseLevel > 10)
+ goto L_Sorry;
+
+ mesn;
+ 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:
+ Barber();
+ goto L_Pass;
+
+L_Reset:
+ resetstatus();
+ mesn;
+ mes "\"There you are.";
+ mes "";
+ mes "Good as new!\"";
+ close;
+
+L_Pass:
+ mesn;
+ mesq l("Very well then, see you.");
+ close;
+
+L_Sorry:
+ mesn;
+ mesq l("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_Pass;
+}
diff --git a/npc/029-2/tanisha.txt b/npc/029-2/tanisha.txt
new file mode 100644
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 100644
index 00000000..f01cf644
--- /dev/null
+++ b/npc/029-2/two_arms.txt
@@ -0,0 +1,32 @@
+
+029-2,99,25,0 script Rosen NPC311,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem SlingShot;
+ sellitem SlingBullet;
+ sellitem ShortBow;
+ sellitem Arrow, 2;
+ sellitem IronArrow;
+ .distance = 5;
+ end;
+}
+
+029-2,112,24,0 script Toichi NPC377,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem Knife;
+ sellitem SharpKnife;
+ sellitem Dagger;
+ sellitem LeatherShirt;
+ sellitem LeatherShield;
+ .distance = 5;
+ end;
+}