summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author+seeds <abby.hulka@gmail.com>2023-03-05 00:18:54 +0000
committerJesusalva Jesusalva <jesusalva@themanaworld.org>2023-03-05 00:48:58 +0000
commitec95a5c75d0ce36ae0cfec18726d346018c04cbc (patch)
tree5f71528bfdb5a8859040f6dee43ee0466693acfb
parentf123b04e54885559000b799e73373e5b99affc71 (diff)
downloadserverdata-cherry-pick-181de88c.tar.gz
serverdata-cherry-pick-181de88c.tar.bz2
serverdata-cherry-pick-181de88c.tar.xz
serverdata-cherry-pick-181de88c.zip
Merge branch 'PiouIsles_quests' into 'master'cherry-pick-181de88c
Update db/constants.conf See merge request ml/serverdata!94 (cherry picked from commit 181de88c329902299082dfb61f8a8e644b8e89bf) 88800735 Update db/constants.conf c32b5649 Upload New File a2f38cb8 Upload New File 2caf4ba1 Upload New File f407a2a0 Upload New File 2081d905 Upload New File 21606ee2 Upload New File 7073e232 Upload New File 1522ab30 Replace quest_db.conf b356ff2c Replace item_db.conf
-rw-r--r--db/constants.conf2
-rw-r--r--db/quest_db.conf16
-rw-r--r--db/re/item_db.conf29
-rw-r--r--npc/006-2-1/glim.txt69
-rw-r--r--npc/006-2-1/may.txt85
-rw-r--r--npc/006-2-1/piouchef.txt150
-rw-r--r--npc/006-2-5/dusk.txt89
-rw-r--r--npc/006-2-5/pouf.txt151
-rw-r--r--npc/006-2-5/reed.txt93
-rw-r--r--npc/006-2-6/hatchling.txt136
10 files changed, 819 insertions, 1 deletions
diff --git a/db/constants.conf b/db/constants.conf
index 185f72428..3467360a8 100644
--- a/db/constants.conf
+++ b/db/constants.conf
@@ -1853,7 +1853,7 @@ constants_db: {
NPC_PIOU_MAGE: 266
NPC_PIOU_QUEEN: 267
NPC_PIOU_KNIGHT_L: 268
- NPC_PIOU_KNIGHT_R: 260
+ NPC_PIOU_KNIGHT_R: 269
NPC_PIOU_ALCHEMIST: 270
NPC_DUCK_ELDER: 271
NPC_GUINEVERE: 272
diff --git a/db/quest_db.conf b/db/quest_db.conf
index 565adf2dc..0ae55974c 100644
--- a/db/quest_db.conf
+++ b/db/quest_db.conf
@@ -565,6 +565,22 @@ quest_db: (
Id: 254
Name: "LilitQuest_Raify"
},
+{
+ Id: 255
+ Name: "LilitQuest_Glim"
+},
+{
+ Id: 256
+ Name: "LilitQuest_PiouChef"
+},
+{
+ Id: 257
+ Name: "LilitQuest_Hatchling"
+},
+{
+ Id: 258
+ Name: "LilitQuest_Pouf"
+},
// ID 270 to 299: Land Of Fire Quests
{
diff --git a/db/re/item_db.conf b/db/re/item_db.conf
index e02612173..dfe317e77 100644
--- a/db/re/item_db.conf
+++ b/db/re/item_db.conf
@@ -3170,6 +3170,35 @@ item_db: (
// Mounts (690 to 699, probably there will be extra IDs)
{
+ Id: 695
+ AegisName: "BronzePin"
+ Name: "Bronze Pin"
+ Type: "IT_ARMOR"
+ Loc: "EQP_SHADOW_SHOES"
+ Buy: 45000
+ Sell: 15000
+ Weight: 300
+ Def: 5
+ EquipLv: 30
+ Refine: false
+ Trade: {
+ notrade: true
+ nodrop: true
+ noselltonpc: true
+ nomail: true
+ noauction: true
+ }
+ Script: <"
+ bonus bFlee,25;
+ bonus bAtkRate,5;
+ bonus bSpeedRate,10;
+ bonus bNoKnockback,1;
+ bonus bHPRegenRate,-50;
+ bonus bSPRegenRate,-50;
+ bonus bMaxHP,-200;
+ ">
+},
+{
Id: 696
AegisName: "RidingMouboo"
Name: "Riding Mouboo"
diff --git a/npc/006-2-1/glim.txt b/npc/006-2-1/glim.txt
new file mode 100644
index 000000000..07e644797
--- /dev/null
+++ b/npc/006-2-1/glim.txt
@@ -0,0 +1,69 @@
+// TMW2 scripts.
+// Authors:
+// Jesusalva
+// +seeds
+// Description:
+// Daily quest to exchange Tolchi Arrow Boxes for a small amount of gp and exp
+// Variables:
+// $GLIM_ST
+// How many Tolchi Arrow Boxes were given
+// q1
+// Controls your own progress helping Glim - Items today
+// q2
+// Controls your own progress helping Glim - Your timer
+
+006-2-1,82,28,0 script Glim NPC_PIOU_VIKING,{
+
+L_Loop:
+ .@q1=getq(LilitQuest_Glim);
+ .@q2=getq2(LilitQuest_Glim);
+ mesn;
+ mesq l("Argh, I've run out o' arrows! Say, ye don't have any I could use, do ye?.", $GLIM_ST);
+ next;
+ if (.@q2 < $@GLIM_QTIMER) {
+ setq1 Lilitquest_Glim, 0;
+ setq2 Lilitquest_Glim, $@GLIM_QTIMER;
+ }
+
+ // Daily limit reached
+ .@q1=getq1(Lilitquest_Glim);
+ if (.@q1 >= (BaseLevel-17)/3) goto L_Timer;
+ select
+ rif(countitem(TolchiAmmoBox) >= 1, l("Give Glim a @@"), getitemlink(TolchiAmmoBox)),
+ l("Maybe later.");
+ mes "";
+
+ switch (@menu) {
+ case 1:
+ delitem TolchiAmmoBox, 1;
+ getexp 64, 0;
+ Zeny=Zeny+50;
+ break;
+ case 2:
+ close;
+ break;
+ }
+ $GLIM_ST=$GLIM_ST+1;
+ setq1 Lilitquest_Glim, .@q1+1;
+ goto L_Loop;
+
+L_Timer:
+ if (BaseLevel < 10)
+ mesq l("Wait a minute! I ain't trustin' a weakling like ye fer good arrows!");
+ mesn;
+ mesq l("Come back when ye've grown sum muscles.");
+ mesn;
+ mesq l("I'm all stocked up now, thanks to ye. Come back in @@ and ye might be able to help me again.", FuzzyTime($@GLIM_TIMER+(60*60*24),2,2));
+ close;
+
+OnInit:
+ .sex=G_OTHER;
+ .distance=5;
+ // No end; on purpose
+
+OnHour00:
+ $@GLIM_QTIMER=gettimeparam(GETTIME_DAYOFMONTH);
+ $@GLIM_QTIMER=gettimetick(2);
+ end;
+
+}
diff --git a/npc/006-2-1/may.txt b/npc/006-2-1/may.txt
new file mode 100644
index 000000000..2de362cd2
--- /dev/null
+++ b/npc/006-2-1/may.txt
@@ -0,0 +1,85 @@
+// TMW-2 scripts.
+// Original Authors: Hal9000 & Qwerty Dragon
+// TMW-2 Authors:
+// +seeds
+// dangerduck
+// Description:
+// Piou nurse who keeps losing one of her charges.
+
+006-2-1,28,24,0 script Nurse May NPC_PIOU_NURSE,{
+ function mayHello;
+ function mayHelp;
+ function mayClose;
+ .@q=getq(LilitQuest_Hatchling);
+
+ if (.@q <= 1)
+ function mayHello {
+ mesn;
+ mesq l("Oh please help me, %s! A hatchling has escaped and I can't leave my charges to retrieve him! Will you fetch him for me?", get_race());
+ next;
+ select
+ l("Of course, I'd be happy to help!"),
+ l("I don't do well with kids, sorry."),
+ mes "";
+ switch (@menu) {
+ case 1:
+ mayHelp();
+ break;
+ case 2:
+ mayClose();
+ break;
+ }
+ return;
+}
+
+function mayHelp {
+ mesn;
+ mesq l("My charge Chuck darted through the door when I came in this morning, and escaped!");
+ mesn;
+ mesq l("One of the palace guards came by earlier to pickup her daughter, and she said he's at the castle.");
+ mesn;
+ mesq l("Apparently he's been terrorizing the staff, and keeping them out of their quarters!");
+ mesn;
+ mesq l("Nobody's been able to coax him back or catch him, but a %s might be able to.", get_race());
+ mesn;
+ mesq l("Please bring him back, and hurry!");
+ close;
+}
+
+function mayClose {
+ {
+ .@r = rand2(2);
+ if (.@r == 0)
+ {
+ npctalk3 l("I'm sorry, I simply can't spare any more time to talk with you. Oh, Kendra, don't eat that!");
+ }
+ else
+ {
+ npctalk3 l("I must get back to my hatchlings!", get_race());
+ }
+ }
+ else if (.@q == 1)
+ {
+ mesn;
+ mesq l("Oh, hello again %s! I'm afraid Chuck escaped again. Would you mind retrieving him again, please?", strcharinfo(0));
+next;
+ select
+ l("No problem! It's kind of fun chasing after him."),
+ l("Sorry, I'm too busy to worry about misbehaved chicks. Catch him yourself."),
+ mes "";
+ switch (@menu) {
+ case 1:
+ close;
+ case 2:
+ mayClose();
+ break;
+ }
+ return;
+}
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 4;
+ end;
+}
+
diff --git a/npc/006-2-1/piouchef.txt b/npc/006-2-1/piouchef.txt
new file mode 100644
index 000000000..2536053e5
--- /dev/null
+++ b/npc/006-2-1/piouchef.txt
@@ -0,0 +1,150 @@
+// TMW2 Script
+// Author:
+// dangerDuck
+// +seeds
+// Description:
+// Piou chef who asks you to check on a missing delivery.
+
+006-2-1,35,75,0 script Piou Chef NPC_PIOU_COOK,{
+ function chefAssign;
+ function chefWait;
+ function chefSupplyList;
+ function chefGiveDelivery;
+ function chefClose;
+ .@q=getq(LilitQuest_PiouChef);
+ mesn;
+ mesc l("The chef is muttering under his breath while kneading a pile of soft dough.");
+ next;
+ select
+ rif(.@q == 0, l("Do you need help with anything?")),
+ rif(.@q == 1, l("I have the supplies you asked for.")),
+ l("I better leave him to his work.");
+ mes "";
+ switch (@menu) {
+ case 1:
+ chefAssign();
+ break;
+ case 2:
+ chefWait();
+ break;
+ case 3:
+ chefGiveDelivery();
+ break;
+ default:
+ chefClose();
+ break;
+ }
+ close;
+
+function chefAssign {
+ if (BaseLevel < 50) {
+ mesn;
+ mesq l("Unfortunately, a mere fledgling like you is not strong enough to help us.");
+ next;
+ elderClose();
+ return;
+ }
+ mesn;
+ mesq l("Your information is correct, %s. Pirates have been plaguing our shores and cutting off our supply lines.", get_race());
+ next;
+ mesn;
+ mesq l("We are in desperate need of food and nesting material, as well as our sacred supply of @@.", getitemlink(CrystallizedMaggot));
+ next;
+ setq LilitQuest_PiouChef, 1;
+ chefSupplyList();
+ chefClose();
+ return;
+}
+
+function chefWait {
+ do
+ {
+ mesn;
+ mesq l("Did you bring the supplies?");
+ next;
+ select
+ l("Yes, I have them right here."),
+ l("What did you want? I've forgotten."),
+ l("Not yet. I've been... delayed.");
+ mes "";
+ switch (@menu) {
+ case 1:
+ chefGiveDelivery();
+ break;
+ case 2:
+ chefSupplyList();
+ break;
+ case 3:
+ chefClose();
+ close;
+ break;
+ }
+ } while (true);
+ return;
+}
+
+function chefSupplyList {
+ do
+ {
+ mesn;
+ mesq l("We need @@, @@, and @@ for our regular stores and nesting materials, and @@ for the royal kitchen.", 300, getitemlink(Moss), 250, getitemlink(RoastedMaggot), 20, getitemlink(FishBox), 1, getitemlink(CrystallizedMaggot));
+ next;
+ mesn;
+ mesq l("Please hurry, our citizens are going hungry, and you do NOT want to find out what a crowd of hungry pious will do!");
+ close;
+ return;
+}
+
+function chefGiveDelivery {
+ if (countitem(Moss) < 300 ||
+ countitem(RoastedMaggot) < 250 ||
+ countitem(FishBox) < 20 ||
+ countitem(CrystallizedMaggot) < 1) {
+ mesn;
+ mesq l("This isn't what I requested!!! Perhaps you should count your items more carefully.");
+ next;
+ mesn;
+ mesq l("If you aren't more careful, we might... accidentally... mistake you for an agent of the Duck Side.");
+ percentheal -99, 0;
+ close;
+ }
+
+ delitem(Moss, 300);
+ delitem(RoastedMaggot, 250);
+ delitem(FishBox, 20);
+ delitem(CrystallizedMaggot, 1);
+
+ getexp(34576, 19226);
+ setq(LilitQuest_PiouChef, 2);
+
+ mes "";
+ next;
+ mesn;
+ mesq l("I appreciate the help, %s. Come back anytime for a tasty dish!", get race());
+ close;
+}
+
+function chefClose {
+ mesn;
+ mesq l("Keep your eye out for pesky ducks, %s. I have a new sauce I want to try out...", strcharinfo(0));
+ next;
+ mesn;
+ if (BaseLevel < 50) {
+ mesq l("Perhaps you may be of assistance later.");
+ } else {
+ mesq l("Go away, %s! Can't you see I'm busy?", get_race());
+ }
+ close;
+ return;
+}
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 4;
+ end;
+
+OnInstanceInit:
+ disablenpc instance_npcname(.name$);
+ end;
+}
+
diff --git a/npc/006-2-5/dusk.txt b/npc/006-2-5/dusk.txt
new file mode 100644
index 000000000..9e523ca02
--- /dev/null
+++ b/npc/006-2-5/dusk.txt
@@ -0,0 +1,89 @@
+// TMW-2 scripts.
+// Original Authors: Hal9000 & Qwerty Dragon
+// TMW-2 Authors:
+// +seeds
+// dangerduck
+// Description:
+// Piou captain who gives information about the war, and the piou queen.
+
+006-2-5,36,25,0 script Captain Dusk NPC_PIOU_KNIGHT_R,{
+ function duskHello;
+ function duskAboutQueen;
+ function duskAboutWar;
+ .@q=getq(LilitQuest_Pouf);
+
+ if (.@q <= 2)
+ {
+ .@r = rand2(3);
+ if (.@r == 0)
+ {
+ npctalk3 l("Don't think you'll sneak anything by me. I'm watching you...");
+ }
+ else if (.@r == 1)
+ {
+ npctalk3 l("I don't tolerate a piou, or %s, who is afraid of hard work.", get_race());
+ }
+ else
+ {
+ npctalk3 l("Best steer clear of the Princess, %s. It won't go well if you upset her.", strcharinfo(0));
+ }
+ }
+ else if (.@q == 3)
+ {
+ duskHello();
+ }
+ close;
+
+function duskHello {
+ mesn;
+ mesq l("Welcome to the Order of the Piou Knights, %s.", strcharinfo(0));
+ next;
+ select
+ l("Where is the Piou Queen?"),
+ l("How is the war going?"),
+ l("I just wanted to say hi.");
+ mes "";
+ switch (@menu) {
+ case 1:
+ duskAboutQueen();
+ break;
+ case 2:
+ duskAboutWar();
+ break;
+ case 3:
+ break;
+ }
+ return;
+}
+
+function duskAboutQueen {
+ mesn;
+ mesq l("Queen +seeds of Piou Isles is busy coordinating war efforts at the front.");
+ mesn;
+ mesq l("She's a fierce piou, leading our troops into the heart of each battle. I admire her bravery.");
+ mesn;
+ mesq l("Princess Pouf has been given leadership until our Queen returns. Should Queen +seeds perish, Princess Pouf will take the crown.");
+ mesn;
+ mesq l("Fight bravely and well, %s, and perhaps our Queen will survive to return to her beloved Isles.", strcharinfo(0));
+ mesn;
+ duskHello();
+}
+
+function duskAboutWar {
+ mesn;
+ mesq l("So far neither the Duck Side or the Piou Knights have gained the upper hand in the war.");
+ mesn;
+ mesq l("However, our mages have recently sensed something dark stirring.");
+ mesn;
+ mesq l("I fear something terrible is rising, and I do not know if we can weather the coming storm.");
+ mesn;
+ mesc l("The captain falls quiet, and appears to be lost in thought.");
+ mesn;
+ return;
+}
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 4;
+ end;
+}
diff --git a/npc/006-2-5/pouf.txt b/npc/006-2-5/pouf.txt
new file mode 100644
index 000000000..6b42846c4
--- /dev/null
+++ b/npc/006-2-5/pouf.txt
@@ -0,0 +1,151 @@
+// TMW-2 scripts.
+// Original Authors: Hal9000 & Qwerty Dragon
+// TMW-2 Authors:
+// dangerDuck
+// +seeds
+// Description:
+// Piou royal who asks players to prove themselves against piou knights.
+
+function script PoufMobCount {
+ .@q=getq(LilitQuest_Pouf);
+ .@t=getq2(LilitQuest_Pouf);
+ if (.@q == 1 && killedrid == PiouKnight)
+ {
+ setq2(LilitQuest_Pouf, .@t+1);
+ }
+ if (.@t+1 >= 10)
+ {
+ setq(LilitQuest_Pouf, 2);
+ }
+
+ // Report progress
+ dispbottom l("@@/@@", .@t+1, 10);
+
+ return;
+}
+
+006-2-5,38,23,0 script Princess Pouf NPC_PIOU_QUEEN,{
+ function poufChallenge;
+ function poufQuest;
+ function poufQuestReport;
+ function poufQuestReward;
+ function poufQuestFinished;
+ if (BaseLevel < 60)
+ {
+ mesn;
+ mesq l("You are too weak to pass my test.");
+ next;
+ mesn;
+ mesc l("Return when you are stronger.");
+ }
+ else
+ {
+ poufChallenge();
+ }
+ closedialog;
+ close;
+
+function poufChallenge {
+ .@q=getq(LilitQuest_Pouf);
+ if (.@q == 0)
+ {
+ mesn;
+ mesq l("Welcome to my Isles, traveller.");
+ next;
+ mesc l("To show you are worthy of remaining here, you must prove yourself to me! Do you accept my challenge?"), 1;
+ if (askyesno() == ASK_NO)
+ return;
+ poufQuest();
+ }
+ else if (.@q == 1)
+ {
+ poufQuestReport();
+ }
+ else if (.@q == 2)
+ {
+ poufQuestReward();
+ }
+ else
+ {
+ poufQuestFinished();
+ }
+ return;
+}
+
+function poufQuest {
+ mes "";
+ mesn;
+ mesq l("Defeat 10 of my bravest @@ to prove yourself a warrior, brave of heart and strong of arm!", getmonsterlink(PiouKnight));
+ next;
+ select
+ l("Point the way! Little yellow birds can't be that hard."),
+ l("Scary pious with armor? No thank you!");
+ mes "";
+ switch (@menu) {
+ case 1:
+ mesn;
+ mesq l("Excellent. You will find them in the training room beneath this chamber.");
+ next;
+ setq(LilitQuest_Pouf, 1, 0);
+ break;
+ case 2:
+ next;
+ mesq l("You are clearly not brave enough for this test. Leave my sight at once, chicken.");
+ break;
+ }
+ return;
+}
+
+function poufQuestReport {
+ mesn;
+ mesq l("You've only killed @@/10 @@! You must defeat more to win my favor.", getq2(LilitQuest_Pouf),getmonsterlink(PiouKnight));
+ next;
+ return;
+}
+
+function poufQuestReward {
+ mesn;
+ mesq l("You've defeated 10 of my knights without flinching! You are truly a brave warrior.");
+ next;
+ mesn;
+ mesc l("The princess flies off her perch and alights upon your right and left shoulder in succession.");
+ next;
+ mesn;
+ mesq l("I dub thee Honorary Piou Knight @@, with all the rewards and duties of the position.", strcharinfo(0));
+ next;
+ mesn;
+ mesc l("The princess produces a small, shiny bronze feather and pins it to your lapel, then returns to her perch.");
+ next;
+ mesn;
+ mesq l("Make me proud, knight!");
+ inventoryplace BronzePin, 1;
+ getitem BronzePin, 1;
+ getexp(91479, 24989);
+ setq(LilitQuest_Pouf, 3);
+ next;
+ return;
+}
+
+function poufQuestFinished {
+ mesn;
+ .@r = rand2(3);
+ if (.@r == 0)
+ {
+ npctalk3 l("I bid you a good %s, brave knight.", (is_night() ? l("evening") : l("day")));
+ }
+ else if (.@r == 1)
+ {
+ npctalk3 l("Fight bravely for Queen +seeds and our isles, honorable knight!");
+ }
+ else
+ {
+ npctalk3 l("I wish you success on your ventures, Knight @@.", strcharinfo(0));
+ }
+ return;
+}
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 3;
+ end;
+}
diff --git a/npc/006-2-5/reed.txt b/npc/006-2-5/reed.txt
new file mode 100644
index 000000000..03a83bf62
--- /dev/null
+++ b/npc/006-2-5/reed.txt
@@ -0,0 +1,93 @@
+// TMW-2 scripts.
+// Original Authors: Hal9000 & Qwerty Dragon
+// TMW-2 Authors:
+// +seeds
+// dangerduck
+// Description:
+// Piou captain who gives information about shrewboo mounts and the Piou Knights.
+
+006-2-5,40,25,0 script Captain Reed NPC_PIOU_KNIGHT_L,{
+ function reedHello;
+ function reedAboutKnights;
+ function reedAboutShrewboos;
+ .@q=getq(LilitQuest_Pouf);
+
+ if (.@q <= 2)
+ {
+ .@r = rand2(3);
+ if (.@r == 0)
+ {
+ npctalk3 l("This is no place for a weakling like you. I suggest you leave.");
+ }
+ else if (.@r == 1)
+ {
+ npctalk3 l("Allowing you to remain on our Isles is dangerous. Tread carefully, %s.", get_race());
+ }
+ else
+ {
+ npctalk3 l("I'll be keeping an eye on you, %s. Don't make trouble.", strcharinfo(0));
+ }
+ }
+ else if (.@q == 3)
+ {
+ reedHello();
+ }
+ close;
+
+function reedHello {
+ mesn;
+ mesq l("Do you need assistance, Knight %s?", strcharinfo(0));
+ next;
+ select
+ l("What can you tell me about the Piou Knights?"),
+ l("Why do Piou Knights need mounts if they can fly?"),
+ l("I just wanted to say hi.");
+ mes "";
+ switch (@menu) {
+ case 1:
+ reedAboutKnights();
+ break;
+ case 2:
+ reedAboutShrewboos();
+ case 3:
+ // fallthrough
+ break;
+ }
+ return;
+}
+
+function reedAboutKnights {
+ mesn;
+ mesq l("The Order of Piou Knights was originally created as a defense against hunters from the humanoid races.");
+ mesn;
+ mesc l("Our Order stopped the hunters from harming any piou on Piou Isles, but it could not do anything for the pious who refused to live here.");
+ mesn;
+ mesq l("We grew in strength and knowledge over time, and dedicated ourselves to upholding justice and peace on the Isles, and in the world.");
+ mesn;
+ mesq l("When the ducks joined the Moubootaur and created the Duck Side, our convictions and oaths to the Order ensured we would oppose them.");
+ mesn;
+ mesc l("The humanoid races do not consider ducks or pious to be a threat, thus we are the only line of defense against the Duck Side.");
+ mesn;
+ mesq l("Remember that, %s. You dedicated yourself to the Order of Piou Knights, and you are now sworn to oppose the Duck Side.", strcharinfo(0));
+ mesn;
+ reedHello();
+}
+
+function reedAboutShrewboos {
+ mesn;
+ mesq l("Our warriors are burdened with strong, yet heavy, armor.");
+ mesn;
+ mesc l("Due to this detriment to our speed and ability to fly, we started training shrewboos as mounts.");
+ mesn;
+ mesq l("Over time, we improved our training, and our warboos are now extremely efficient fighting steeds.");
+ mesn;
+ mesq l("They also give Piou Knights a much needed speed boost against the ducks, who are naturally fast.");
+ mesn;
+ reedHello();
+}
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 4;
+ end;
+}
diff --git a/npc/006-2-6/hatchling.txt b/npc/006-2-6/hatchling.txt
new file mode 100644
index 000000000..df06409eb
--- /dev/null
+++ b/npc/006-2-6/hatchling.txt
@@ -0,0 +1,136 @@
+// Evol scripts.
+// Author:
+// Travolta
+// +seeds
+// Description:
+// A piou hatchling who escaped his nurse and fled to the castle. He's been terrorizing the staff.
+// Variables:
+// none
+
+function script ArtisFlyingPiouLogic {
+ .@tick = gettimetick(1);
+ .@LastTimeTouched = getvariableofnpc(.LastTimeTouched, strnpcinfo(3));
+ if (.@tick > .@LastTimeTouched + 300)
+ {
+ .speed = 200;
+ set getvariableofnpc(.LastPlayerTouched, strnpcinfo(3)), -1;
+ }
+ .@rnd = rand(5) - 3;
+ if (.@rnd > 0)
+ return execmovecmd("wait " + .@rnd);
+ return 0;
+}
+
+006-2-6,38,28,0 script #Hatchling NPC_FLYING_PIOU,{
+ .@q=getq(LilitQuest_Hatchling);
+ function TryCatchPiou {
+ .@agi = readparam(bAgi);
+ @ArtisQuests_CatchPiouTries += 1;
+ getmapxy(.@map$, .@x1, .@y1, 1);
+ getmapxy(.@map$, .@x2, .@y2, 0);
+ .@distance = distance(.@x1, .@y1, .@x2, .@y2);
+ .@chance = max(ArtisQuests_CatchPiou_Difficulcy,
+ 20 + .@distance * 5 - .@agi/10 -
+ @ArtisQuests_CatchPiouTries);
+ return rand(.@chance);
+ }
+
+ .@charid = getcharid(0);
+ if (.LastPlayerTouched <= 0)
+ {
+ .LastPlayerTouched = .@charid;
+ @ArtisQuests_CatchPiouTries = 0;
+ }
+ else if (.LastPlayerTouched != .@charid)
+ {
+ message strcharinfo(0), l("Looks like somebody else is looking for Chuck. I better leave them to try.");
+ end;
+ }
+
+ .@q = getq(ArtisQuests_CatchPiou);
+ if (.@q != 1)
+ {
+ mesn "Narrator";
+ mesc(l("The hatchling looks at you with big, pleading eyes, and you don't have the heart to take it back to May."), 9);
+ close;
+ }
+
+ .@tick = gettimetick(1);
+ if (.@tick < .LastTimeTouched + min(4, ArtisQuests_CatchPiou_Difficulcy
+ + @ArtisQuests_CatchPiouTries / 3))
+ {
+ mesq l("The hatchling spooked at your attempt to catch it, and zoomed out of sight.");
+ .LastTimeTouched = .@tick;
+ end;
+ }
+
+ .LastTimeTouched = .@tick;
+
+ .@rnd = TryCatchPiou();
+ if (!.@rnd)
+ {
+ npcstop;
+ stopnpctimer;
+ getmapxy(.@map$, .@x, .@y, 1);
+ npcwalkto .@x, .@y;
+ .@trader$ = "Salem#001-1";
+ mesn "Narrator";
+ mesc(l("Finally, you captured the speedy hatchling, but he's trying to squirm away! Hurry back to May before he escapes."), 9);
+ setq LilitQuest_Hatchling, 1;
+ getexp(1000, 500);
+ set getvariableofnpc(.LastPiouHunter$, .@trader$), strcharinfo(0);
+ set getvariableofnpc(.PiouEscapedMessage$, .@trader$), l("The little pipsqueak gave you the slip! You need to catch him again.");
+ set getvariableofnpc(.LastPiouHunterID, .@trader$), .@charid;
+ set getvariableofnpc(.PiouCaught, .@trader$), 1;
+ donpcevent .@trader$ + "::OnPiouFlee";
+ close2;
+ disablenpc strnpcinfo(3);
+ close;
+ }
+ else
+ {
+ setarray .RandomFailureMessages$[0], l("Nearly there!"), l("Like trying to catch a greased shrewboo..."), l("Aw, he got away again!"), l("Slippery little guy!");
+ .@r = rand(getarraysize(.RandomFailureMessages$));
+ message strcharinfo(0), .RandomFailureMessages$[.@r];
+ .speed = max(140, 200 - 10 * (@ArtisQuests_CatchPiouTries +
+ ArtisQuests_CatchPiou_Difficulcy));
+ }
+ end;
+
+OnHour00:
+ .LastTimeTouched = 0;
+ end;
+
+OnTimer1000:
+ dographmovestep;
+
+OnInit:
+ .distance = 5;
+ .walkmask = WALK_WATER;
+
+ initmovegraph "carpet middle", 38, 28,
+ "upper left", 34, 26, 32, 23,
+ "lower right", 41, 31, 44, 34,
+ "upper right", 42, 26, 44, 23,
+ "lower left", 35, 31, 32, 34,
+ "passage left", 32, 28,
+ "passage right", 44, 28,
+ ;
+
+ setmovegraphcmd "carpet middle", "upper left", 1, "wait 1; call ArtisFlyingPiouLogic",
+ "upper left", "lower right", 1, "call ArtisFlyingPiouLogic",
+ "lower right", "upper right", 2, "call ArtisFlyingPiouLogic",
+ "lower right", "lower_left", 1, "call ArtisFlyingPiouLogic",
+ "upper right", "lower left", 1, "call ArtisFlyingPiouLogic",
+ "lower left", "table left", 1, "call ArtisFlyingPiouLogic",
+ "lower left", "table right", 1, "call ArtisFlyingPiouLogic",
+ "passage left", "carpet middle", 1, "wait 2; call ArtisFlyingPiouLogic",
+ "passage right", "carpet middle", 1, "wait 2; call ArtisFlyingPiouLogic",
+ ;
+
+ firstmove "speed 200", "market_start";
+ initnpctimer;
+
+ .LastPlayerTouched = -1;
+ end;
+}