summaryrefslogtreecommitdiff
path: root/npc
diff options
context:
space:
mode:
authorgumi <mekolat@users.noreply.github.com>2017-04-13 13:02:59 -0400
committerMicksha <Micksha@users.noreply.github.com>2018-11-05 21:34:37 +0100
commit7330d282726f62cdb63dcca5b49c4607cbbdc199 (patch)
tree8d46ba4a0a43f08403ad8456c60ff22b16dac189 /npc
parente34d012804b9a10283c3b2ced98c73542833a731 (diff)
downloadserverdata-7330d282726f62cdb63dcca5b49c4607cbbdc199.tar.gz
serverdata-7330d282726f62cdb63dcca5b49c4607cbbdc199.tar.bz2
serverdata-7330d282726f62cdb63dcca5b49c4607cbbdc199.tar.xz
serverdata-7330d282726f62cdb63dcca5b49c4607cbbdc199.zip
Hurnscald mega-commit
Diffstat (limited to 'npc')
-rw-r--r--npc/001-2-33/_mobs.txt0
-rw-r--r--npc/001-2-33/_savepoints.txt0
-rw-r--r--npc/008-1/doors.txt6
-rw-r--r--npc/008-1/wateranimation.txt4
-rw-r--r--npc/commands/debug-quest.txt31
-rw-r--r--npc/functions/generic-text.txt120
-rw-r--r--npc/functions/quest-debug/036-HurnscaldQuests_Hinnak.txt32
-rw-r--r--npc/functions/quest-debug/037-HurnscaldQuests_Soup.txt32
-rw-r--r--npc/functions/quest-debug/038-HurnscaldQuests_Inspector.txt41
-rw-r--r--npc/functions/quest-debug/039-HurnscaldQuests_ForestBow.txt42
-rw-r--r--npc/functions/quest-debug/040-HurnscaldQuests_WoodenShield.txt37
-rw-r--r--npc/placeholder/alan.txt323
-rw-r--r--npc/placeholder/bernard.txt230
-rw-r--r--npc/placeholder/books.txt60
-rw-r--r--npc/placeholder/doctor.txt80
-rw-r--r--npc/placeholder/hinnak.txt352
-rw-r--r--npc/placeholder/inspector.txt190
-rw-r--r--npc/placeholder/jack.txt313
-rw-r--r--npc/placeholder/ledmitz.txt55
-rw-r--r--npc/placeholder/macgowan.txt21
-rw-r--r--npc/placeholder/malek.txt65
-rw-r--r--npc/placeholder/mikhail.txt131
-rw-r--r--npc/placeholder/milly.txt109
-rw-r--r--npc/placeholder/nicholas.txt26
-rw-r--r--npc/placeholder/note.txt28
-rw-r--r--npc/placeholder/nurse.txt101
-rw-r--r--npc/placeholder/old-man.txt90
-rw-r--r--npc/placeholder/old-woman.txt137
-rw-r--r--npc/placeholder/sabine.txt64
-rw-r--r--npc/placeholder/soul-menhir.txt58
-rw-r--r--npc/placeholder/troupe-leader.txt119
-rw-r--r--npc/scripts.conf38
32 files changed, 2923 insertions, 12 deletions
diff --git a/npc/001-2-33/_mobs.txt b/npc/001-2-33/_mobs.txt
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/npc/001-2-33/_mobs.txt
diff --git a/npc/001-2-33/_savepoints.txt b/npc/001-2-33/_savepoints.txt
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/npc/001-2-33/_savepoints.txt
diff --git a/npc/008-1/doors.txt b/npc/008-1/doors.txt
deleted file mode 100644
index de8ed1d8..00000000
--- a/npc/008-1/doors.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-008-1,104,27,0 script CottageDoor NPC_WARP,0,0,{
- end;
-
-OnTouch:
- dispbottom(l("Locked."));
-}
diff --git a/npc/008-1/wateranimation.txt b/npc/008-1/wateranimation.txt
index 8b66f637..74ff5fd9 100644
--- a/npc/008-1/wateranimation.txt
+++ b/npc/008-1/wateranimation.txt
@@ -5,5 +5,5 @@
// Description:
// Water animations, splash, fishes, etc...
-008-1,139,32,0 duplicate(#water_animation0) #water_animation16 NPC_WATER_SPLASH
-008-1,140,40,0 duplicate(#water_animation0) #water_animation17 NPC_WATER_SPLASH
+008-1,311,97,0 duplicate(#water_animation0) #water_animation16 NPC_WATER_SPLASH
+008-1,314,139,0 duplicate(#water_animation0) #water_animation17 NPC_WATER_SPLASH
diff --git a/npc/commands/debug-quest.txt b/npc/commands/debug-quest.txt
index 2c590a2d..468e5af2 100644
--- a/npc/commands/debug-quest.txt
+++ b/npc/commands/debug-quest.txt
@@ -90,6 +90,31 @@ function script GlobalQuestDebug {
} while (1);
}
+ function qDebugHurnscald {
+ do
+ {
+ clear;
+ setnpcdialogtitle l("Quest debug") + " - Hurnscald";
+ mes l("This menu gives access to quest debug menus for @@ quests.", "Hurnscald");
+ next;
+ mes l("Please select a quest:");
+
+ menuint
+ menuimage("actions/back", l("Go back")), -1,
+ "Hinnak", HurnscaldQuests_Hinnak,
+ l("Maggot soup"), HurnscaldQuests_Soup,
+ l("Inspector"), HurnscaldQuests_Inspector,
+ l("Forest bow"), HurnscaldQuests_ForestBow,
+ l("Wooden shield"), HurnscaldQuests_WoodenShield;
+
+ switch (@menuret)
+ {
+ case -1: return;
+ default: callfunc "QuestDebug" + @menuret;
+ }
+ } while (1);
+ }
+
function qDebugGeneral {
do
{
@@ -125,6 +150,7 @@ function script GlobalQuestDebug {
select
l("Prologue"),
"Artis",
+ "Hurnscald",
l("Other"),
rif(getarg(0,0), menuimage("actions/back", l("Return to Debug menu")));
@@ -132,8 +158,9 @@ function script GlobalQuestDebug {
{
case 1: qDebugShip; break;
case 2: qDebugArtis; break;
- case 3: qDebugGeneral; break;
- case 4: return;
+ case 3: qDebugHurnscald; break;
+ case 4: qDebugGeneral; break;
+ case 5: return;
}
} while (1);
}
diff --git a/npc/functions/generic-text.txt b/npc/functions/generic-text.txt
new file mode 100644
index 00000000..ede6e954
--- /dev/null
+++ b/npc/functions/generic-text.txt
@@ -0,0 +1,120 @@
+// Evol functions.
+// Authors:
+// gumi
+// Description:
+// text register
+
+function script generic {
+ .@flags = getarg(0, 1);
+
+ .@villager = (1 << 0);
+ .@old = (1 << 1);
+ .@kid = (1 << 2);
+ .@sailor = (1 << 3);
+ .@busy = (1 << 4);
+ .@tired = (1 << 5);
+ .@angry = (1 << 6);
+ .@legion = (1 << 7);
+ .@crazy = (1 << 8);
+
+ if (.@flags == 0)
+ return l("I'm sorry, I can't talk right now.");
+
+ if (.@flags & .@villager)
+ {
+ setarray(.@array$[.@count],
+ l("It is a sunny day, don't you think?"),
+ l("I just want to live my life in peace."),
+ l("Isn't this place pretty? I love hanging out here!"));
+
+ .@count += 3;
+ }
+
+ if (.@flags & .@old)
+ {
+ setarray(.@array$[.@count],
+ l("Come closer dear, I can't hear you."),
+ l("Hmm... where did I put it again?"),
+ l("I miss the good old days."));
+
+ .@count += 3;
+ }
+
+ if (.@flags & .@kid)
+ {
+ setarray(.@array$[.@count],
+ l("Mommy doesn't want me to talk to strangers."));
+
+ .@count += 1;
+ }
+
+ if (.@flags & .@sailor)
+ {
+ setarray(.@array$[.@count],
+ l("So finally someone has came to visit me?"),
+ l("A-hoy matey!"));
+
+ .@count += 2;
+ }
+
+ if (.@flags & .@busy)
+ {
+ setarray(.@array$[.@count],
+ l("Can't talk right now."),
+ l("Can't you see I'm busy?"),
+ l("Come back later."),
+ l("I'm a little busy right now."));
+
+ .@count += 4;
+ }
+
+ if (.@flags & .@tired)
+ {
+ setarray(.@array$[.@count],
+ l("I had a long day, come back tomorrow."),
+ l("I need to rest."),
+ l("*snores*"));
+
+ .@count += 3;
+ }
+
+ if (.@flags & .@angry)
+ {
+ setarray(.@array$[.@count],
+ l("Go pester someone else."),
+ l("I don't feel like talking to you."),
+ l("Stop wasting my time."),
+ l("Go fly a kite"),
+ l("Not in the mood to chat."),
+ l("Give me some space."),
+ l("Can you please go away?"));
+
+ .@count += 7;
+ }
+
+ if (.@flags & .@legion)
+ {
+ setarray(.@array$[.@count],
+ l("My breath smells bad."),
+ l("Don't distract me, I have to stay alert."),
+ l("Can't talk right now, I'm on patrol duty."),
+ l("I can't stay here and talk all day. I have a job to do."),
+ l("Keep moving."),
+ l("So you think you're tough? A warrior must also be loyal and patient."),
+ l("Practice! There are no secrets to becoming a warrior."),
+ l("There is no honor in fighting a weak opponent."));
+
+ .@count += 8;
+ }
+
+ if (.@flags & .@crazy)
+ {
+ setarray(.@array$[.@count],
+ l("Do I look like a tree? I feel like one."),
+ l("What're you looking at?!"));
+
+ .@count += 2;
+ }
+
+ return .@array$[rand(.@count)];
+}
diff --git a/npc/functions/quest-debug/036-HurnscaldQuests_Hinnak.txt b/npc/functions/quest-debug/036-HurnscaldQuests_Hinnak.txt
new file mode 100644
index 00000000..61dc294e
--- /dev/null
+++ b/npc/functions/quest-debug/036-HurnscaldQuests_Hinnak.txt
@@ -0,0 +1,32 @@
+// Hinnak quest debug
+// Author:
+// gumi
+
+function script QuestDebug36 {
+ do
+ {
+ clear;
+ setnpcdialogtitle l("Quest debug");
+ mes "HurnscaldQuests_Hinnak";
+ mes "---";
+ mes l("Quest state: @@, @@",
+ getq(HurnscaldQuests_Hinnak),
+ getq2(HurnscaldQuests_Hinnak));
+ next;
+
+ GenericQuestDebug HurnscaldQuests_Hinnak,
+ l("Cannot do the quest"), 0,
+ l("Can do the quest"), 1,
+ l("Hinnak asked for help"), 2,
+ l("Helped Hinnak"), 3;
+
+ switch (@menuret)
+ {
+ case 0:
+ case 1:
+ case 2: setq HurnscaldQuests_Hinnak, getq(HurnscaldQuests_Hinnak), 0; break;
+ default: if (@menuret < 0) return;
+ }
+
+ } while (1);
+}
diff --git a/npc/functions/quest-debug/037-HurnscaldQuests_Soup.txt b/npc/functions/quest-debug/037-HurnscaldQuests_Soup.txt
new file mode 100644
index 00000000..43eba0d6
--- /dev/null
+++ b/npc/functions/quest-debug/037-HurnscaldQuests_Soup.txt
@@ -0,0 +1,32 @@
+// Mikhail & Bernard quest debug
+// Author:
+// gumi
+
+function script QuestDebug37 {
+ do
+ {
+ clear;
+ setnpcdialogtitle l("Quest debug");
+ mes "HurnscaldQuests_Soup";
+ mes "---";
+ mes l("Quest state: @@",
+ getq(HurnscaldQuests_Soup));
+ next;
+
+ GenericQuestDebug HurnscaldQuests_Soup,
+ l("Cannot do the quest"), 0,
+ l("Can do the quest"), 1,
+ l("Bernard wants roasted maggot"), 2,
+ l("brought maggot"), 3,
+ l("Bernard wants maggot slime"), 4,
+ l("brought maggot slime"), 5,
+ l("Mikhail needs maggot slime"), 6,
+ l("brought maggot slime"), 7;
+
+ if (@menuret < 0)
+ {
+ return;
+ }
+
+ } while (1);
+}
diff --git a/npc/functions/quest-debug/038-HurnscaldQuests_Inspector.txt b/npc/functions/quest-debug/038-HurnscaldQuests_Inspector.txt
new file mode 100644
index 00000000..053f085e
--- /dev/null
+++ b/npc/functions/quest-debug/038-HurnscaldQuests_Inspector.txt
@@ -0,0 +1,41 @@
+// Inspector quest debug
+// Author:
+// gumi
+
+function script QuestDebug38 {
+ do
+ {
+ clear;
+ setnpcdialogtitle l("Quest debug");
+ mes "HurnscaldQuests_Inspector";
+ mes "---";
+ mes l("Quest state: @@",
+ getq(HurnscaldQuests_Inspector));
+ next;
+
+ GenericQuestDebug HurnscaldQuests_Inspector,
+ l("Cannot do the quest"), 0,
+ l("Can do the quest"), 1,
+ l("Talked to Inspector (1)"), 2,
+ l("Talked to Old Woman (1)"), 3,
+ l("Talked to Old Woman (2)"), 4,
+ l("Talked to Inspector (2)"), 5,
+ l("Talked to Troupe Leader (1)"), 6,
+ l("Talked to Inspector (3)"), 7,
+ l("Talked to Old Man"), 8,
+ l("Talked to Old Woman (3)"), 9,
+ l("Talked to Inspector (4)"), 10,
+ l("Talked to Old Woman (4)"), 11,
+ l("Talked to Malek"), 12,
+ l("Searched the bookcase"), 13,
+ l("Talked to Inspector (5)"), 14,
+ l("Talked to Troupe Leader (2)"), 15,
+ l("Talked to Inspector (6)"), 16;
+
+ if (@menuret < 0)
+ {
+ return;
+ }
+
+ } while (1);
+}
diff --git a/npc/functions/quest-debug/039-HurnscaldQuests_ForestBow.txt b/npc/functions/quest-debug/039-HurnscaldQuests_ForestBow.txt
new file mode 100644
index 00000000..c6a61a1b
--- /dev/null
+++ b/npc/functions/quest-debug/039-HurnscaldQuests_ForestBow.txt
@@ -0,0 +1,42 @@
+// Jack Lumber quest debug
+// Author:
+// gumi
+
+function script QuestDebug39 {
+ do
+ {
+ clear;
+ setnpcdialogtitle l("Quest debug");
+ mes "HurnscaldQuests_ForestBow";
+ mes "---";
+ mes l("Quest state: @@", getq(HurnscaldQuests_ForestBow));
+ mes "---";
+ mes l("Related quests:");
+ mes "HurnscaldQuests_WoodenShield: " + getq(HurnscaldQuests_WoodenShield);
+ next;
+
+ GenericQuestDebug HurnscaldQuests_ForestBow,
+ menuimage("actions/manage", l("Debug Wooden Shield")), -1,
+ l("Cannot do the quest"), 0,
+ l("Can do the quest"), 1,
+ l("Alan wants to ask Jack"), 2,
+ l("Jack explained problem"), 3,
+ l("Alan asks to find wood"), 4,
+ l("Found perfect wood"), 5,
+ l("Got the bow"), 6;
+
+ switch (@menuret)
+ {
+ case -1: callfunc "QuestDebug40"; break;
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4: setq(HurnscaldQuests_WoodenShield, 0); break;
+ case 5:
+ case 6: setq(HurnscaldQuests_WoodenShield, max(1, getq(HurnscaldQuests_WoodenShield))); break;
+ default: if (@menuret < 0) return;
+ }
+
+ } while (1);
+}
diff --git a/npc/functions/quest-debug/040-HurnscaldQuests_WoodenShield.txt b/npc/functions/quest-debug/040-HurnscaldQuests_WoodenShield.txt
new file mode 100644
index 00000000..05d08130
--- /dev/null
+++ b/npc/functions/quest-debug/040-HurnscaldQuests_WoodenShield.txt
@@ -0,0 +1,37 @@
+// Jack Lumber quest debug
+// Author:
+// gumi
+
+function script QuestDebug40 {
+ do
+ {
+ clear;
+ setnpcdialogtitle l("Quest debug");
+ mes "HurnscaldQuests_WoodenShield";
+ mes "---";
+ mes l("Quest state: @@", getq(HurnscaldQuests_WoodenShield));
+ mes "---";
+ mes l("Related quests:");
+ mes "HurnscaldQuests_ForestBow: " + getq(HurnscaldQuests_ForestBow);
+ next;
+
+ GenericQuestDebug HurnscaldQuests_WoodenShield,
+ menuimage("actions/manage", l("Debug Forest Bow")), -1,
+ l("Cannot do the quest"), 0,
+ l("Can do the quest"), 1,
+ l("Jack proposes shield"), 2,
+ l("Accepted the quest"), 3,
+ l("Got the shield"), 4;
+
+ switch (@menuret)
+ {
+ case -1: callfunc "QuestDebug39"; break;
+ case 1:
+ case 2:
+ case 3:
+ case 4: setq(HurnscaldQuests_ForestBow, max(5, getq(HurnscaldQuests_ForestBow))); break;
+ default: if (@menuret < 0) return;
+ }
+
+ } while (1);
+}
diff --git a/npc/placeholder/alan.txt b/npc/placeholder/alan.txt
new file mode 100644
index 00000000..8e8e42b7
--- /dev/null
+++ b/npc/placeholder/alan.txt
@@ -0,0 +1,323 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states (forest bow):
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - alan wants to ask jack
+// [1] 3 - jack explained problem
+// [1] 4 - alan asks to find wood
+// [1] 5 - found perfect wood
+// [1] 6 - got the bow
+// [2] unused
+// [3] unused
+// [t] unused
+// Quest states (wooden shield):
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - jack proposes shield
+// [1] 3 - player accepted quest
+// [1] 4 - got the shield
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// Jack Lumber, the handsome lumberjack
+
+008-2-6,31,26,0 script Alan NPC_HUMAN_M_ARTIS,{
+
+ function bow_intro {
+ speech(4,
+ l("When you want to buy something then please speak to my apprentice."),
+ l("I am only doing special requests."));
+
+ selectd(
+ l("OK, thanks."),
+ rif(BaseLevel >= .min_level, l("Can you make me a really good bow?")),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything strange recently that might be connected to the robberies?")));
+
+ switch (@menu)
+ {
+ case 1: closeclientdialog(); close;
+ case 3: speech(l("No.")); close;
+ }
+
+ speech(4,
+ l("You mean like one of my legendary forest bows?"));
+
+ selectd(
+ l("Yes, that would be nice."));
+
+ speech(4,
+ l("Sorry, I am not making these anymore."));
+
+ selectd(
+ l("Oh, too bad."),
+ l("What? Why not?"));
+
+ if (@menu == 1) {
+ closeclientdialog();
+ close;
+ }
+
+ speech(4,
+ l("The problem is that I am short of material."),
+ l("My forestbows are not made of regular wood, you know."),
+ l("They are made of special living wood."),
+ l("And only the best logs of living wood are good enough for them."),
+ l("I used to get these logs from Jack, the handsome lumberjack."),
+ l("But the last time I asked him for a new delivery he said that he would never again get any for me."));
+
+ selectd(
+ l("Too bad."),
+ l("Did you ask him why?"));
+
+ if (@menu == 1) {
+ closeclientdialog();
+ close;
+ }
+
+ speech(4,
+ l("Sure I did."),
+ l("But he just told me to leave him alone."),
+ l("Maybe you could ask him what's wrong?"));
+
+ selectd(
+ l("OK, I'll ask him."),
+ l("I am sure he got his reasons."));
+
+ setq(.quest_bow, 2);
+ closeclientdialog();
+ close;
+ }
+
+ function bow_reminder {
+ if (getq(.quest_inspector) == 2)
+ {
+ speech(4,
+ l("Did you already ask Jack why he won't deliver me any more living wood?"));
+
+ selectd(
+ l("Have you seen anything strange recently that might be connected to the robberies?"));
+
+ speech(l("No."));
+ close;
+ }
+
+ npctalk3(l("Did you already ask Jack why he won't deliver me any more living wood?"));
+ end;
+ }
+
+ function bow_explain {
+ speech(4,
+ l("Did you already ask Jack why he won't deliver me any more living wood?"));
+
+ selectd(
+ l("Yes, I did. He said that the trees turned into dangerous monsters."),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything strange recently that might be connected to the robberies?")));
+
+ if (@menu != 1)
+ {
+ speech(l("No."));
+ close;
+ }
+
+ speech(
+ l("Oh, that's really bad news."),
+ l("Maybe you can do his job?"),
+ l("If you kill some of these tree monsters and bring me their wood I could take a look at them."),
+ l("Maybe you will find a piece of wood that is strong enough to become one of my forest bows."));
+
+ close2;
+ setq(.quest_bow, 4);
+ end;
+ }
+
+ function bow_make {
+ speech(4,
+ l("I can make you a really nice forest bow out of this."),
+ l("I just need %s E for material and work time.",
+ format_number(.req_esp)));
+
+ selectd(
+ l("%s??? What a ripoff!", format_number(.req_esp)),
+ rif(Zeny >= .req_esp, l("Sure, here you go!")),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything strange recently that might be connected to the robberies?")));
+
+ switch (@menu)
+ {
+ case 1: speech(l("Fine, I'll just hold on to this log should you ever change your mind.")); close;
+ case 3: speech(l("No.")); close;
+ }
+
+ // XXX: maybe here we could make the player wait real-world hours for Alan to finish?
+
+ if (checkweight(.reward_item, 1) != true)
+ {
+ speech(
+ l("It seems you can't carry the bow right now."),
+ l("Go clean up your inventory and come back."));
+ close;
+ }
+
+ if (Zeny < .req_esp)
+ close; // double-check
+
+ setq(.quest_bow, 6);
+ Zeny -= .req_esp;
+ getitem(.reward_item, 1);
+ getexp(.reward_exp, 0);
+
+ speech(
+ l("Here you go - have fun with it."));
+ close;
+ }
+
+ function bow_check_wood {
+ speech(4,
+ l("How is the hunt going?"),
+ l("Did you bring me any wood?"));
+
+ selectd(
+ l("No, sorry."),
+ rif(countitem(.req_item) >= 1, l("Here, take a look!")),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything strange recently that might be connected to the robberies?")));
+
+ switch (@menu)
+ {
+ case 1: closeclientdialog(); close;
+ case 3: speech(l("No.")); close;
+ }
+
+ .@first = true;
+
+ do {
+ if (countitem(.req_item) < 1)
+ break;
+
+ if (.@first == false)
+ {
+ narrator(4,
+ l("You hand him another log."));
+ }
+
+ delitem(.req_item, 1);
+ .@first = false;
+
+ speech(4,
+ l("Hmmm... looks ok, but is it strong enough?"));
+
+ narrator(4,
+ l("Alan bends the log over his knee."));
+
+ if (rand(.success_rate) == 0)
+ {
+ narrator(4 | 8,
+ l("Alan tries as hard as he can but the log won't bend."));
+
+ speech(4,
+ l("Aaah!"),
+ l("Yes!"),
+ l("That is a really fine piece of wood you brought me."),
+ l("It will make an excellent bow!"));
+
+ setq(.quest_bow, 5);
+ setq(.quest_shield, 1);
+
+ narrator(4,
+ l("He proceeds to further scrutinize the log."));
+
+ bow_make;
+ end;
+ }
+
+ narrator(4 | 8,
+ l("The log breaks with a loud crack."));
+
+ speech(4,
+ l("Sorry, this log was too weak for one of my forest bows."),
+ l("Now it is junk."),
+ l("Do you wish to try again?"));
+
+ selectd(
+ l("Sure, here you go."),
+ l("Hey! Stop breaking my stuff!"));
+
+ if (@menu != 1) {
+ closeclientdialog();
+ close;
+ }
+
+ } while (true);
+
+ speech(l("It seems you have no wood left."));
+ close;
+ }
+
+ function bow_done {
+ speech(4,
+ l("I hope you are satisfied with your forest bow."),
+ l("It is one of my best works."));
+
+ selectd(
+ l("I am!"),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything strange recently that might be connected to the robberies?")));
+
+ switch (@menu)
+ {
+ case 2: speech(l("No.")); close;
+ default: closeclientdialog(); close;
+ }
+ }
+
+ // OnTalk:
+ switch (getq(.quest_bow))
+ {
+ case 0:
+ case 1: bow_intro; break;
+ case 2: bow_reminder; break;
+ case 3: bow_explain; break;
+ case 4: bow_check_wood; break;
+ case 5: bow_make; break;
+ default: bow_done; break;
+ }
+
+ closeclientdialog();
+ close;
+
+OnPCLoginEvent:
+OnPCBaseLvUpEvent:
+ if (BaseLevel >= .min_level && getq(.quest_bow) < 1)
+ {
+ setq(.quest_bow, 1); // allow the player to do the quest
+ dispbottom(l("New quest available: %s (level %d+)",
+ getquestlink(.quest_bow), .min_level)); // XXX: requires new manaplus versions, maybe show a different message for old versions?
+ }
+ end;
+
+OnInit:
+ .min_level = 25; // min level to do the quest
+
+ .req_item = RawLog; // item required to make the bow
+ .req_esp = 10000; // amount of Esperin required to make the bow
+ .reward_item = ForestBow; // quest reward (item)
+ .reward_exp = 0; // quest reward (exp)
+ .success_rate = 20; // one in X chances to get a perfect log
+
+ .quest_bow = HurnscaldQuests_ForestBow;
+ .quest_shield = HurnscaldQuests_WoodenShield;
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_bow;
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/bernard.txt b/npc/placeholder/bernard.txt
new file mode 100644
index 00000000..5c3f25ff
--- /dev/null
+++ b/npc/placeholder/bernard.txt
@@ -0,0 +1,230 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - bernard wants roasted maggot
+// [1] 3 - brought maggot
+// [1] 4 - bernard wants maggot slime
+// [1] 5 - brought maggot slime
+// [1] 6 - mikhail needs maggot slime
+// [1] 7 - brought maggot slime
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// Bernard wants to make a maggot slime soup
+
+008-2-4,34,29,0 script Bernard NPC_HUMAN_M_ARTIS,{
+
+ if (BaseLevel < .min_level)
+ {
+ npctalk3 generic(16 | 32);
+ end;
+ }
+
+ function soup_intro {
+ if (rand(2) == 1)
+ {
+ speech 4,
+ l("The fields are crawling with maggots."),
+ l("Where is Mikhail?"),
+ l("What is taking them so long?"),
+ l("Could I ask a favor of you?");
+ }
+ else
+ {
+ speech 4,
+ l("The taste of maggots in soup is... unforgettable."),
+ l("They taste simply divine!"),
+ l("I sent someone to kill me some maggots and they have yet to return."),
+ l("Would you help me kill some?");
+ }
+
+ if (selectd(l("Yes."), l("No.")) == 2)
+ {
+ return;
+ }
+
+ if (rand(2) == 1)
+ {
+ speech 4,
+ l("Great!"),
+ l("I need a %s for my soup.", getitemlink(.first_item));
+ }
+ else
+ {
+ speech 4,
+ l("Bring me a %s.", getitemlink(.first_item)),
+ l("I'll give you something if you do.");
+ }
+
+ speech 8,
+ l("Please bring it to me!");
+
+ setq .quest, 2;
+ close;
+ }
+
+ function soup_reminder_roasted {
+ speech
+ l("Oh, please hurry and bring me a %s.", getitemlink(.first_item)),
+ l("I'm yearning for maggot soup!");
+ close;
+ }
+
+ function soup_no_room {
+ speech 1 | 8,
+ "...",
+ l("It seems you don't have room for my reward."),
+ l("I'll wait until you do.");
+ close;
+ }
+
+ function soup_reward_roasted {
+ speech 4,
+ l("Oooh, perfect! It's perfect!"),
+ l("You brought me my %s!", getitemlink(.first_item)),
+ l("Here, have some %s for your troubles.",
+ getitemlink(.first_reward_item));
+
+ if (checkweight(.first_reward_item, .first_reward_amount) != true)
+ soup_no_room;
+
+ if (countitem(.first_item) < 1)
+ close;
+
+ delitem .first_item, 1;
+ getitem .first_reward_item, .first_reward_amount;
+ getexp .first_reward_exp, 0;
+ setq .quest, 3;
+
+ speech 8,
+ l("Now let's see...");
+ close;
+ }
+
+ function soup_ask_slime {
+ speech
+ l("Thank you so much!"),
+ l("But... something is missing to make the soup creamy."),
+ l("I need %d %s for that.",
+ .second_item_qty, getitemlink(.second_item)),
+ l("Bring them to me, and I'll give you something nice.");
+
+ setq .quest, 4;
+ close;
+ }
+
+ function soup_reminder_slime {
+ speech
+ l("Please do hurry and bring me %d %s, so I can finish my soup!",
+ .second_item_qty, getitemlink(.second_item));
+ close;
+ }
+
+ function soup_reward_slime {
+ speech
+ l("Nice!"),
+ l("They're perfect, just perfect!"),
+ l("You brought me the %d %s!",
+ .second_item_qty, getitemlink(.second_item)),
+ l("Here, have some %s as reward.",
+ getitemlink(.second_reward_item));
+
+ if (checkweight(.second_reward_item, .second_reward_amount) != true)
+ soup_no_room;
+
+ if (countitem(.second_item) < .second_item_qty)
+ close;
+
+ delitem .second_item, .second_item_qty;
+ getitem .second_reward_item, .second_reward_amount;
+ getexp .second_reward_exp, 0;
+ setq .quest, 5;
+
+ close;
+ }
+
+ function soup_thanks_slime {
+ speech
+ l("I didn't mention it before, but I also put beer in my soup."),
+ l("I hope you like beer as much as I do, because, you see..."),
+ l("Beer is life!");
+ close;
+ }
+
+ function soup_thanks_mikhail {
+ speech
+ l("My help, Mikhail, finally returned with the slimes I needed."),
+ l("I wonder what took him so long?");
+ close;
+ }
+
+
+ // OnTalk:
+ switch (getq(.quest))
+ {
+ case 0:
+ case 1: soup_intro; break;
+ case 2:
+ if (countitem(.first_item) < 1)
+ soup_reminder_roasted;
+ else
+ soup_reward_roasted;
+ break;
+ case 3: soup_ask_slime; break;
+ case 4:
+ if (countitem(.second_item) < .second_item_qty)
+ soup_reminder_slime;
+ else
+ soup_reward_slime;
+ break;
+ case 5:
+ case 6: soup_thanks_slime; break;
+ default: soup_thanks_mikhail;
+ }
+
+ closeclientdialog();
+ close;
+
+OnPCLoginEvent:
+OnPCBaseLvUpEvent:
+ if (BaseLevel >= .min_level && getq(.quest) < 1)
+ {
+ setq .quest, 1; // allow the player to do the quest
+ dispbottom l("New quest available: %s (level %d+)",
+ getquestlink(.quest), .min_level); // XXX: requires new manaplus versions, maybe show a different message for old versions?
+ }
+ end;
+
+OnInit:
+ .min_level = 10; // min level to do the quest
+
+ .first_item = Aquada; // FIXE: change this when we have RoastedMaggot
+ .first_reward_item = Aquada; // reward item // FIXME: change this when we have CherryCake
+ .first_reward_amount = 5;
+ .first_reward_exp = 100;
+
+ .second_item = Aquada; // FIXE: change this when we have MaggotSlime
+ .second_item_qty = 3;
+ .second_reward_item = Aquada; // reward item // FIXME: change this when we have Beer
+ .second_reward_amount = 3;
+ .second_reward_exp = 100;
+
+ .quest = HurnscaldQuests_Soup;
+ .quest_debug = .quest;
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/books.txt b/npc/placeholder/books.txt
new file mode 100644
index 00000000..3407e0cd
--- /dev/null
+++ b/npc/placeholder/books.txt
@@ -0,0 +1,60 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// robberies in hurnscald
+
+008-1,247,40,0 script bookcase NPC_HUMAN_M_ARTIS,{
+
+ if (getq(.quest_inspector) != 12)
+ {
+ dispbottom(l("You see an ordinary bookcase."));
+ end;
+ }
+
+ narrator(
+ l("You see an ordinary bookcase."),
+ l("Looking over closely, you find a book that is upside down."),
+ l("The book has been hollowed out."),
+ l("Inside is a theater mask and a note that you cannot even begin to read."));
+
+ close2;
+ setq(.quest_inspector, 13);
+ end;
+
+OnInit:
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_inspector;
+ .distance = 1;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/doctor.txt b/npc/placeholder/doctor.txt
new file mode 100644
index 00000000..af36d1e2
--- /dev/null
+++ b/npc/placeholder/doctor.txt
@@ -0,0 +1,80 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// robberies in hurnscald
+
+008-2-14,29,30,0 script Doctor NPC_HUMAN_M_ARTIS,{
+
+ speech(4,
+ l("Hello, can I help you?"));
+
+ // TODO: check for AxeHat when we get it
+ // TODO: check for EyePatch when we get it
+
+ selectd(
+ l("I think I am sick!"),
+ l("No, I feel fine."),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything strange in town? Anything that might have to do with the robberies?")));
+
+ switch (@menu)
+ {
+ case 1:
+ narrator(4,
+ l("The doctor examines you briefly."));
+ // TODO: check for poison or other status conditions currently in use
+ speech(
+ l("Nonsense!"),
+ l("You look fine and dandy to me."),
+ l("All you need is a bit more exercise and fresh fruit in your diet!"));
+ close;
+ case 2:
+ speech(
+ l("Then please stop wasting my precious time."));
+ close;
+ case 3:
+ speech(
+ l("No, I haven't seen anything."));
+ close;
+ }
+
+
+ end;
+
+OnInit:
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_inspector;
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/hinnak.txt b/npc/placeholder/hinnak.txt
new file mode 100644
index 00000000..f4937f4b
--- /dev/null
+++ b/npc/placeholder/hinnak.txt
@@ -0,0 +1,352 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - hinnak asked for help
+// [1] 3 - helped hinnak
+// [2] kill counter
+// Description:
+// Hinnak needs help to get rid of {mobname}
+
+008-1,270,77,0 script Hinnak NPC_HUMAN_M_ARTIS,{
+
+ if (BaseLevel < .min_level)
+ {
+ npctalk3 generic(1 | 16 | 64);
+ end;
+ }
+
+ function hinn_new_player
+ {
+ if(getequipid(EQI_HEAD_TOP) == .bad_hat)
+ {
+ narrator 4,
+ l("The farmer lunges at you with a farming implement.");
+ heal -50, 0;
+
+ selectd
+ l("I'm out of here."),
+ l("Whoa, what are you doing?");
+
+ if (@menu == 1)
+ {
+ return;
+ }
+
+ speech 4 | 1,
+ l("Sorry, you look like a pinkie."),
+ l("They've been destroying my fields, and I guess I got a bit worked up.");
+ }
+
+ else
+ {
+ speech 4,
+ l("Argh!"),
+ l("I hate them!"),
+ l("I @#$% hate them!"),
+ l("I @#$% hate these @#$% pinkies!");
+
+ selectd
+ l("You need some anger control therapy."),
+ l("Why do you hate them?");
+
+ if (@menu == 1)
+ {
+ return;
+ }
+
+ speech 4 | 1,
+ l("These @#$% beasts are jumping around in my fields destroying all my harvest."),
+ l("But they are too fast."),
+ l("I can't catch them.");
+ }
+
+ selectd
+ l("Want me to help you?");
+
+ speech 4 | 1,
+ l("Yes, you look quite fast."),
+ l("Maybe you can catch some of them."),
+ l("That will pay them a lesson."),
+ l("Slay some of them and bring me %d of their antennae.", .drop_count);
+
+ setq .quest, 2, 0;
+
+ selectd
+ l("How much is this worth to you?");
+
+ speech 1,
+ l("Well, I can't offer you much."),
+ l("But I got an old scythe laying around."),
+ l("Maybe you can use it as a weapon.");
+
+ close;
+ }
+
+ function hinn_help
+ {
+ if (getequipid(EQI_HEAD_TOP) == .bad_hat)
+ {
+ narrator 4,
+ l("The farmer glares at your hat.");
+ }
+
+ speech 4,
+ l("Have you got the %d antennae?", .drop_count);
+
+ selectd
+ l("Not yet, but I am working on it."),
+ rif(countitem(.monster_drop) >= .drop_count, l("Sure, here they are!"));
+
+ if (@menu == 1)
+ {
+ return;
+ }
+
+ if (getq2(.quest) < .kill_count)
+ {
+ speech 1,
+ l("Don't try to fool me!"),
+ l("I know you didn't kill them yourself!"),
+ l("Kill at least %d pinkies and come back.", .kill_count);
+ close;
+ }
+
+ speech 1,
+ l("Thank you very much"),
+ l("As promised, here's my old scythe."),
+ l("Maybe you can use it as a weapon."),
+ l("It is a bit cumbersome but its strikes are deadly.");
+
+ if (countitem(.monster_drop) >= .drop_count)
+ {
+ delitem .monster_drop, .drop_count;
+ getitem .reward_item, 1;
+ Zeny += .reward_money;
+ //getexp .reward_exp, 0;
+ setq .quest, 3;
+ }
+ close;
+ }
+
+ function hinn_thanks
+ {
+ if (getequipid(EQI_HEAD_TOP) == .bad_hat)
+ {
+ speech 4,
+ l("That better be a trophy on your head.");
+
+ selectd
+ l("It is.");
+
+ speech 4 | 1,
+ l("Good then."),
+ l("Thanks for your help with the pinkies.");
+ }
+
+ else
+ {
+ speech 4,
+ l("Good to see you again."),
+ l("Thanks again for helping me with the pinkies!");
+ }
+
+ selectd
+ l("Sure, any time!"),
+ l("Anything else you want me to do?"),
+ l("You're welcome. Bye!");
+
+ if (@menu == 3)
+ {
+ return;
+ }
+
+ speech 4 | 1,
+ l("Actually, it's been a long day."),
+ l("If it's no trouble, could you get me a %s?",
+ getitemlink(.drink_item));
+
+ selectd
+ rif(countitem(.drink_item) >= 1, l("Here you are.")),
+ l("Sure, I'll go get one. Bye!"),
+ l("You shouldn't drink while working!");
+
+ do
+ {
+ switch (@menu)
+ {
+ case 2: return;
+ case 3:
+ speech 1,
+ l("Well, I'm done for the day, and I'm quite old enough to decide when I can have a %s, thank you!",
+ getitemname(.drink_item));
+ selectd
+ rif(countitem(.drink_item) >= 1, l("Sorry... here you are.")),
+ l("I don't have any.");
+ break;
+ default:
+ if (countitem(.drink_item) < 1)
+ {
+ return;
+ }
+ delitem .drink_item, 1;
+
+ narrator 4 | 8 | 2 | 1,
+ l("%s takes a sip.", .name$);
+
+ speech 4,
+ l("Aaah!"),
+ l("Nothing like a well-deserved %s after a long day of tending the crops!",
+ getitemname(.drink_item)),
+ l("Thanks, that was very kind of you!");
+
+ narrator 4 | 8 | 1 | 2,
+ l("He takes another sip.");
+
+ speech 4,
+ l("Thanks!"),
+ l("You know, I had the strangest thing happen to me."),
+ l("I had this patch of ground that was really clumpy; lots of clay, you see."),
+ l("Right over there."),
+ // TODO: move cam to the spot
+ l("Looks much better now, doesn't it?"),
+ // TODO: restore cam
+ l("But how I got there is kind of scary..."),
+ l("I'd been trying to break it up for a while, but that kind of work is a pain."),
+ l("So my wife said that I should go and see the witch, just in case she knows something."),
+ l("And sure enough I ask the witch, and she has a look at it."),
+ l("“Nothing I can do”, she says, “but I can ask a friend”."),
+ l("So the next day another witch shows up."),
+ l("Gorgeous woman, but when she looked at me, the scares went scuttling down my spine..."),
+ l("First thing she asked was if I'm a farmer."),
+ l("Said her friend had told her that I needed help."),
+ l("I show her what the problem is, and she tells me to go inside and wait.");
+
+ narrator 4 | 8 | 1 | 2,
+ l("%s drains his mug in one long sip, then hesitates.", .name$);
+
+ speech 4,
+ l("So I go inside."),
+ l("I'm barely in when it starts raining outside, pouring cats and mouboos!"),
+ l("Not so weird, perhaps, except that it was been bright and sunny just a second before!"),
+ l("So I rush out, my wife telling me to leave the witch alone, and I see her standing there in the middle of the rain..."),
+ l("None of the raindrops touched her, as if they were afraid!"),
+ l("Then she yells out some gobbledygook word, and out of the ground there comes a swarm of maggots, crawling and digging and climbing over each other's backs..."),
+ // XXX: maybe here insert a reference to SUSAN?
+ l("And then she turns to me!"),
+ l("Seeing her gaze, for a moment there I thought she would turn me into a pinkie, for sure..."),
+ l("But all she says is, “had you stayed inside, you wouldn't be wet now”.");
+
+ selectd
+ l("Hahaha!"),
+ l("Whoah, scary..."),
+ l("What was that gobbledygook word?"),
+ l("I better go now. Bye.");
+
+ switch (@menu)
+ {
+ case 1:
+ speech 1,
+ l("Yeah, funny now..."),
+ l("But you should've seen that gaze!"),
+ l("Ah, well, never mind.");
+ close;
+ case 2:
+ speech 1,
+ l("Yeah, you could say that...");
+ close;
+ case 3:
+ speech 1,
+ l("Oh, I can't be sure..."),
+ l("But something like “Nanaj princino”, I think."); // this is "Dwarven Princess" translated to Esperanto
+ close;
+ }
+ return;
+ }
+ } while(true);
+ }
+
+ // OnTalk:
+
+ if (getq(.quest_inspector) == 11)
+ {
+ selectd
+ l("Did you see anyone in a mask come by here at night?"),
+ l("Did you see anyone with a large satchel come by here at night?"),
+ l("Hello.");
+
+ switch (@menu)
+ {
+ case 1:
+ speech
+ l("No."),
+ l("It tends to be too dark to see a mask.");
+ close;
+
+ case 2:
+ speech
+ l("Yes, I saw someone with a large sack on their back go to the mining camp.");
+ close;
+ }
+ }
+
+ switch (getq(.quest))
+ {
+ case 0:
+ case 1: hinn_new_player; break;
+ case 2: hinn_help; break;
+ default: hinn_thanks;
+ }
+
+ closeclientdialog();
+ close;
+
+OnNPCKillEvent:
+ // XXX: maybe have a OnTakeScript on the pinky antena item so we count pickups instead of kills
+ if (killedrid == .monster_id && getq(.quest) == 2 &&
+ getq2(.quest) < .kill_count && strcharinfo(PC_MAP) == .map$)
+ {
+ setq .quest, 2, getq2(.quest) + 1;
+ }
+ end;
+
+OnPCLoginEvent:
+OnPCBaseLvUpEvent:
+ if (BaseLevel >= .min_level && getq(.quest) < 1)
+ {
+ setq .quest, 1; // allow the player to do the quest
+ dispbottom l("New quest available: %s (level %d+)",
+ getquestlink(.quest), .min_level); // XXX: requires new manaplus versions, maybe show a different message for old versions?
+ }
+ end;
+
+OnInit:
+ .min_level = 15; // min level to do the quest
+ .monster_id = Fluffy; // monster to kill // FIXME: change this when we have pinkies
+ .monster_drop = FluffyFur; // monster drop to collect // FIXME: change this when we have pinkies
+ .drop_count = 10; // amount of that drop needed
+ .kill_count = 10; // min number of kills
+ .reward_item = WoodenSword; // reward item // FIXME: change this when we have he Scythe
+ .reward_money = 0; // reward money
+ .reward_exp = 0; // reward exp
+ .bad_hat = BrimmedFlowerHat; // hinnak attacks you when you wear this hat // FIXME: make this pinky hat when we get it
+ .drink_item = PumpkishJuice; // the item hinnak asks to drink // FIXME: make this beer when we have it
+
+ .quest = HurnscaldQuests_Hinnak;
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest;
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/inspector.txt b/npc/placeholder/inspector.txt
new file mode 100644
index 00000000..f25ef1dd
--- /dev/null
+++ b/npc/placeholder/inspector.txt
@@ -0,0 +1,190 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// robberies in hurnscald
+
+008-2-1,30,35,0 script Inspector NPC_HUMAN_M_ARTIS,{
+
+ if (BaseLevel < .min_level)
+ {
+ npctalk3(l("I'm sorry, but I'm busy looking into this string of robberies."));
+ end;
+ }
+
+ // OnTalk:
+ switch (getq(.quest))
+ {
+ case 0:
+ case 1:
+ speech(4,
+ l("Hmm... what to do."));
+ narrator(4,
+ l("He looks up and into your face."));
+ speech(4,
+ l("You look capable, will you help me solve these robberies?"),
+ l("I would go myself, but for some reason I'm a non-walking NPC."));
+
+ if (selectd("Yes", "No") == 2) {
+ closeclientdialog();
+ close;
+ }
+
+ speech(
+ l("Ok then."),
+ l("I'd like you to ask the villagers about the recent string of robberies."));
+
+ close2;
+ setq(.quest, 2);
+ end;
+
+ case 2:
+ npctalk3(l("Please continue talking to the villagers."));
+ end;
+
+ case 3:
+ speech(
+ l("Hm..."),
+ l("I don't know if I trust her eyesight or memory."),
+ l("See if someone else knows anything."));
+ close;
+
+ case 4:
+ speech(
+ l("Someone in a theater mask, eh?"),
+ l("There was a traveling theater troupe in town recently, but they've moved on to Tulimshar."),
+ l("Please go talk to their leader about this."));
+
+ close2;
+ setq(.quest, 5);
+ end;
+
+ case 5:
+ npctalk3(l("Please go talk to the leader of the traveling troupe about the theater mask."));
+ end;
+
+ case 6:
+ speech(
+ l("Hm... an old man?"),
+ l("Could you interrogate him for me?"));
+
+ close2;
+ setq(.quest, 7);
+ end;
+
+ case 7:
+ npctalk3(l("Have you talked with the old man yet?"));
+ end;
+
+ case 8:
+ npctalk3(l("Can you verify that with his wife?"));
+ end;
+
+ case 9:
+ speech(
+ l("Hm... then it couldn't be him."),
+ l("I'm not sure where to go from here, maybe you can find something else."),
+ l("Try talking to everyone again."));
+
+ close2;
+ setq(.quest, 10);
+ end;
+
+ case 10:
+ npctalk3(l("Made any progress yet?"));
+ end;
+
+ case 11:
+ npctalk3(l("Then go north and investigate!"));
+ end;
+
+ case 12:
+ npctalk3(l("Did you look over the basement?"));
+ end;
+
+ case 13:
+ speech(
+ l("What a strange note."),
+ l("I'll keep track of this, while you return the mask to the troupe."),
+ l("I would go myself, but the developers were too lazy to make me walk."),
+ "...",
+ l("By the way, stay sharp! I may call upon you again."));
+
+ close2;
+ setq(.quest, 14);
+ end;
+
+ case 14:
+ npctalk3(l("Please return the mask to the traveling troupe."));
+ end;
+
+ case 15:
+ speech(
+ l("My men have found all of the stolen items."),
+ l("They were all in the mining camp."),
+ l("We still don't know who did it.")); // XXX: feel free to extend this quest beyond this point
+
+ close2;
+ setq(.quest, 16);
+ getexp(.reward_exp, 0);
+ end;
+
+ case 16:
+ npctalk3(l("Remember to stay sharp. I might need your help on another case."));
+ end;
+ }
+
+ closeclientdialog();
+ close;
+
+OnPCLoginEvent:
+OnPCBaseLvUpEvent:
+ if (BaseLevel >= .min_level && getq(.quest) < 1)
+ {
+ setq(.quest, 1); // allow the player to do the quest
+ dispbottom(l("New quest available: %s (level %d+)",
+ getquestlink(.quest), .min_level)); // XXX: requires new manaplus versions, maybe show a different message for old versions?
+ }
+ end;
+
+OnInit:
+ .min_level = 30; // min level to do the quest
+
+ .reward_exp = 2500;
+
+ .quest = HurnscaldQuests_Inspector;
+ .quest_debug = .quest;
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/jack.txt b/npc/placeholder/jack.txt
new file mode 100644
index 00000000..1f205a59
--- /dev/null
+++ b/npc/placeholder/jack.txt
@@ -0,0 +1,313 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states (forest bow):
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - alan wants to ask jack
+// [1] 3 - jack explained problem
+// [1] 4 - alan asks to find wood
+// [1] 5 - found perfect wood
+// [1] 6 - got the bow
+// [2] unused
+// [3] unused
+// [t] unused
+// Quest states (wooden shield):
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - jack proposes shield
+// [1] 3 - player accepted quest
+// [1] 4 - got the shield
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// Jack Lumber, the handsome lumberjack
+
+008-1,242,117,0 script Jack NPC_HUMAN_M_ARTIS,{
+
+ function bow_intro {
+ speech(4,
+ l("Why not?!"),
+ l("I value my life, that's why!"));
+
+ selectd(l("What do you mean?"));
+
+ speech(4,
+ l("A week ago, I was going to chop down one of those twigleaf trees in the forest to the southwest."),
+ l("These twigleafs are the trees that give me the living wood you speak of."), // XXX: were Log Heads named "Twigleaf" at some point in the past?
+ l("I was just chopping away with my axe, and guess what happened?"),
+ l("One of its branches hit me!"),
+ l("At first, I thought it fell down or the wind blew it, but it hurt!"),
+ l("After I shook it off and struck the tree again with my axe, another branch hit me!"),
+ l("I got angry and started to chop off all the low-hanging branches so this couldn't happen anymore."),
+ l("Even after all that though, I still can't believe what happened next."));
+
+ selectd(l("What happened?"));
+
+ speech(4,
+ l("You'll think I'm insane if I tell you..."));
+
+ selectd(l("I won't. I promise."));
+
+ speech(4,
+ l("Alright, well..."),
+ l("After I chopped off a few branches, the whole tree started to move!"),
+ l("Its roots tore out of the earth, all the branches started to wave around, and a face appeared on the trunk."),
+ l("The whole tree CAME TO LIFE! It was mad!"));
+
+ selectd(l("Did you run away?"), l("Did you fight it?"));
+
+ speech(4,
+ l("I fought it, of course!"),
+ l("I took my axe and attacked the beast!"),
+ l("It hit me here *points at a bruise on his shoulder*, here *lifts his trouser leg to show another bruise*, and here *lifts his shirt and reveals even worse bruises*."), // XXX: that's kinda dirty imho... maybe we could use the narrator?
+ l("But I didn't give up!"),
+ l("I chopped away at it, branch after branch, and in the end I chopped off its roots, and it fell to the ground, motionless."));
+
+ selectd(l("So you beat the monster? Then why are you so scared?"));
+
+ speech(4,
+ l("Well, I was exhausted and had to rest."),
+ l("A few minutes passed, and suddenly I was practically surrounded by a dozen or more of these living trees!"));
+
+ selectd(l("Did you fight them too?"));
+
+ speech(4,
+ l("Are you crazy?"),
+ l("I barely destroyed one of those beasts."),
+ l("I was in no shape to fight again!"),
+ l("I ran away as fast as I could, and lucky for me the monsters aren't that fast on their tiny root legs, Ha!"));
+
+ selectd(l("So, I guess you aren't chopping down trees anymore?"));
+
+ speech(4,
+ l("I still do; it's my job."),
+ l("But I'll no longer chop those twigleafs, I'll tell you that."),
+ l("I know the bow master wants some twigleaf wood, but I don't care."),
+ l("I won't risk MY life for a few gold pieces!"),
+ l("If you really want to, just go to the southwest, but I can't help you."),
+ l("I won't go there ever again."));
+
+ selectd(l("Southwest you say? OK, thank you."));
+
+ speech(l("Don't say I didn't warn you!"));
+
+ // What a huge text wall, I feel sorry for the players
+
+ close2;
+ setq(.quest_bow, 3);
+ end;
+ }
+
+ function bow_good_luck {
+ if (getq(.quest_inspector) == 2)
+ {
+ speech(4,
+ l("Good luck hunting those tree monsters – you'll need it."));
+
+ selectd(l("Have you seen anything that might be connected to the recent robberies in town?"));
+
+ speech(l("Sorry, no."));
+ close;
+ }
+
+ npctalk3(l("Good luck hunting those tree monsters – you'll need it."));
+ end;
+ }
+
+ function shield_intro {
+ speech(4,
+ l("I have an idea."),
+ l("What would you say about a new shield?"));
+
+ setq(.quest_shield, 2);
+
+ selectd(
+ l("No thanks."),
+ l("Yes, please!"),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything that might be connected to the recent robberies in town?")));
+
+ switch (@menu)
+ {
+ case 1: closeclientdialog(); close;
+ case 2:
+ speech(
+ l("All I need is %d %s.", .logs_amount, getitemlink(.logs_item)),
+ l("This needn't be high quality wood; pretty much any log you can find should work."),
+ l("Oh, and I'll also need %s E for other materials.", format_number(.shield_cost)));
+
+ close2;
+ setq(.quest_shield, 3);
+ end;
+ case 3: speech(l("Sorry, no.")); close;
+ }
+ }
+
+ function bow_congrats {
+ speech(4,
+ l("You've finally found that perfect piece of living wood that Alan needs to make a Forest Bow, haven't you?"));
+
+ selectd(
+ l("I couldn't afford the bow, though..."),
+ l("No, I'm still looking."),
+ l("Yes, I've got the Forest bow now."),
+ l("I'm a melee warrior, I don't need bows."),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything that might be connected to the recent robberies in town?")));
+
+ switch (@menu)
+ {
+ case 3:
+ if (getq(.quest_bow) <= 5)
+ {
+ speech(4,
+ l("Hrmph."),
+ l("I'm someone who respects those speaking the truth."));
+ }
+ // fallthrough
+ case 1:
+ case 4:
+ speech(4,
+ l("You no doubt remember how I struggled with those beasts, fighting for my life."),
+ l("Scared me, those seven-branched little stumps did!"),
+ l("Never since that day have I strayed near them, and yet there you are, cutting them down one by one."),
+ l("I'm proud of you – to dare to fight those trunks is admirable indeed."),
+ l("You're as strong as if you were my own child!"));
+
+ shield_intro;
+ break;
+ case 2: speech(l("You should go talk to Alan again.")); close;
+ case 5: speech(l("Sorry, no.")); close;
+ }
+ }
+
+ function shield_make {
+ speech(4,
+ l("Do you have the %d %s and %s E for the shield?",
+ .logs_amount, getitemlink(.logs_item), format_number(.shield_cost)));
+
+ selectd(
+ rif(countitem(.logs_item) >= .logs_amount && Zeny >= .shield_cost,
+ l("Here it is.")),
+ l("I'll come back later."));
+
+ if (@menu != 1) {
+ closeclientdialog();
+ close;
+ }
+
+ speech(4,
+ l("Have a seat."));
+
+ narrator(4,
+ l("Jack saws the logs into pieces and then sands them until they are smooth to the touch."),
+ l("Applying some strong-smelling liquid, he tans them to a darker hue."),
+ l("Grabbing one of two leftover pieces, he begins to carve it into a round shape, then repeats this with the second piece – shield handles from what you can tell."),
+ l("Meanwhile, the sun has dried the other pieces."),
+ l("Jack places them next to each other, adds a frame, and nails everything together."),
+ l("The resulting shield looks usable already, but Jack applies another liquid to it and leaves it to dry for a few moments."),
+ l("Finally, he hands the shield to you."));
+
+ if (checkweight(.shield_item, 1) != true)
+ {
+ speech(
+ l("It seems you can't carry the %s.", getitemlink(.shield_item)),
+ l("Come back when you do."));
+ close;
+ }
+
+ if (Zeny < .shield_cost || countitem(.logs_item) < .logs_amount)
+ close; // double-check
+
+ setq(.quest_shield, 4);
+ delitem(.logs_item, .logs_amount);
+ getitem(.shield_item, 1);
+ Zeny -= .shield_cost;
+ getexp(.shield_exp, 0);
+
+ speech(
+ l("Enjoy your new shield!"));
+
+ close;
+ }
+
+ function wood_daily {
+ speech(4,
+ l("I hope that my shield will serve you well!"));
+
+ selectd(
+ l("Me too."),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything that might be connected to the recent robberies in town?")));
+
+ switch (@menu)
+ {
+ case 2: speech(l("Sorry, no.")); close;
+ }
+
+ closeclientdialog(); // TODO: daily quest (needs the generic daily quest script)
+ close;
+ }
+
+ // OnTalk:
+ switch (getq(.quest_shield))
+ {
+ case 2: shield_intro; break;
+ case 3: shield_make; break;
+ case 4: wood_daily; break;
+ }
+
+ switch (getq(.quest_bow))
+ {
+ case 3:
+ case 4: bow_good_luck; break;
+ case 5:
+ case 6: bow_congrats; break;
+ }
+
+ // initial intro
+ {
+ speech(4,
+ l("Hello there!"),
+ l("My name is Jack Lumber, the enemy of all trees."),
+ l("If you need some firewood, just let me know."));
+
+ selectd(
+ l("I'll keep that in mind."),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything that might be connected to the recent robberies in town?")),
+ rif(getq(.quest_bow) == 2, l("I heard you aren't delivering any more living wood. Why not?")));
+
+ switch (@menu)
+ {
+ case 2: speech(l("Sorry, no.")); close;
+ case 3: bow_intro; break;
+ }
+
+ }
+
+ closeclientdialog();
+ close;
+
+OnInit:
+ .logs_item = Aquada; // FIXME: change this when we get RawLog
+ .logs_amount = 40; // XXX: maybe nlogn?
+ .shield_cost = 5000; // XXX: maybe nlogn?
+ .shield_exp = 2500;
+ .shield_item = Aquada; // FIXME: change this when we get WoodenShield
+
+ .quest_bow = HurnscaldQuests_ForestBow;
+ .quest_shield = HurnscaldQuests_WoodenShield;
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_bow;
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/ledmitz.txt b/npc/placeholder/ledmitz.txt
new file mode 100644
index 00000000..df7b8d8e
--- /dev/null
+++ b/npc/placeholder/ledmitz.txt
@@ -0,0 +1,55 @@
+// Evol scripts.
+// Author:
+// gumi
+
+008-2-2,43,34,0 script Ledd NPC_HUMAN_M_ARTIS,{
+ // XXX: ^ I know it should be Led and Mitz but 4144 made names
+ // shorter than 4 characters illegal
+
+ deltimer("Mitz::OnTalk");
+ addtimer(rand(500, 900), "Mitz::OnTalk");
+OnTalk:
+ npctalk3(l("Ha! I'll drink muuuch mo.. more than you! Im not ooone biiit dr...dr..unk!"));
+ // TODO: add more sentences
+ // XXX: maybe instead of making them respond to a click they should just
+ // shout at each other at regular intervals?
+ end;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
+
+008-2-2,46,34,0 script Mitz NPC_HUMAN_M_ARTIS,{
+
+ deltimer("Ledd::OnTalk");
+ addtimer(rand(500, 900), "Ledd::OnTalk");
+OnTalk:
+ npctalk3(l("I can still drink more! Better give up you... you... teelotaler! MORE BEER MELINDA!"));
+ // TODO: add more sentences
+ end;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/macgowan.txt b/npc/placeholder/macgowan.txt
new file mode 100644
index 00000000..2f65b9fe
--- /dev/null
+++ b/npc/placeholder/macgowan.txt
@@ -0,0 +1,21 @@
+// Evol scripts.
+// Author:
+// gumi
+
+008-2-8,38,29,0 script Macgowan NPC_HUMAN_M_ARTIS,{
+ npctalk3(l("Hello, I am Macgowan, apprentice to Nicholas."));
+ end;
+
+OnInit:
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/malek.txt b/npc/placeholder/malek.txt
new file mode 100644
index 00000000..219a059a
--- /dev/null
+++ b/npc/placeholder/malek.txt
@@ -0,0 +1,65 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// robberies in hurnscald
+
+008-1,233,42,0 script Malek NPC_HUMAN_M_ARTIS,{
+
+ if (getq(.quest_inspector) == 11)
+ {
+ speech(4,
+ l("Hi, can I help you at all?"));
+
+ selectd(
+ l("The inspector sent me here to investigate."));
+
+ speech(4,
+ l("Yeah, we did hear a commotion."),
+ l("We thought we heard someone go down to the basement, but we checked the whole place over and didn't see anything out of the ordinary."));
+
+ close2;
+ setq(.quest_inspector, 12);
+ end;
+ }
+
+ npctalk3(generic(32 | 256));
+ end;
+
+OnInit:
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_inspector;
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/mikhail.txt b/npc/placeholder/mikhail.txt
new file mode 100644
index 00000000..e071e914
--- /dev/null
+++ b/npc/placeholder/mikhail.txt
@@ -0,0 +1,131 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - bernard wants roasted maggot
+// [1] 3 - brought maggot
+// [1] 4 - bernard wants maggot slime
+// [1] 5 - brought maggot slime
+// [1] 6 - mikhail needs maggot slime
+// [1] 7 - brought maggot slime
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// takes part in the slime soup quest (Bernard)
+
+008-1,308,72,0 script Mikhail NPC_HUMAN_M_ARTIS,{
+
+ function soup_scared {
+ speech 4,
+ l("Hello..."),
+ l("I'm supposed to be helping Bernard from the Inn but...");
+
+ narrator 4,
+ l("His eyes grow wide");
+
+ speech 4,
+ l("Eeekkk another one.");
+
+ narrator
+ l("It seems that the boy would like to say more, but seems too terrified at the moment."),
+ l("Maybe you should help someone else first, so that he sees your intentions are good.");
+
+ close;
+ }
+
+ function soup_intro2 {
+ speech 4,
+ l("Bernard sent me to get %d %s from the %s in the fields, but they scare me so bad!",
+ .third_item_qty, getitemlink(.third_item), getmonsterlink(.third_item_mob)),
+ l("You look like a nice person."),
+ l("Would you go get them for me?");
+
+ selectd
+ l("Of course, I'll go get them for you.");
+
+ speech
+ l("Thank you so much!"),
+ l("I'll wait for you here.");
+
+ setq .quest, 6;
+ close;
+ }
+
+ function soup_reminder_slime2 {
+ speech
+ l("Did you bring me the %d %s I need?",
+ .third_item_qty, getitemlink(.third_item)),
+ l("It doesn't look like you have them all...");
+ close;
+ }
+
+ function soup_reward_slime2 {
+ speech
+ l("Did you bring me the %d %s I need?",
+ .third_item_qty, getitemlink(.third_item)),
+ l("Ooh!"),
+ l("Thank you so much!"),
+ l("I can get back to Bernard now!");
+
+ if (countitem(.third_item) < .third_item_qty)
+ close; // double-check
+
+ delitem .third_item, .third_item_qty;
+ setq .quest, 7;
+ getexp .third_reward_exp, 0;
+ close;
+ }
+
+ function soup_thanks_slime2 {
+ speech
+ l("Thanks again for helping me!") + " %%Q";
+
+ close;
+ }
+
+ switch(getq(.quest))
+ {
+
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4: soup_scared; break;
+ case 5: soup_intro2; break;
+ case 6:
+ if (countitem(.third_item) < .third_item_qty)
+ soup_reminder_slime2;
+ else
+ soup_reward_slime2;
+ break;
+ default: soup_thanks_slime2;
+ }
+
+ closeclientdialog();
+ close;
+
+OnInit:
+ .third_item = Aquada; // FIXME: change this when we have MaggotSlime
+ .third_item_qty = 5;
+ .third_item_mob = Fluffy; // FIXME: change this when we have Maggot
+
+ .third_reward_exp = 100;
+
+ .quest = HurnscaldQuests_Soup;
+ .quest_debug = .quest;
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/milly.txt b/npc/placeholder/milly.txt
new file mode 100644
index 00000000..03c39d42
--- /dev/null
+++ b/npc/placeholder/milly.txt
@@ -0,0 +1,109 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states (inspector):
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// robberies in hurnscald
+
+008-1,282,112,0 script Milly NPC_HUMAN_M_ARTIS,{
+
+ // TODO: make the actual beanie copter quest after those are finished:
+ // [X] Inspector quest
+ // [ ] Bone knife quest
+ // [ ] Setzer quest
+ // [ ] Rossy quest
+ // [ ] Cindy quest
+
+ .@q_inspector = getq(.quest_inspector);
+
+ speech(4,
+ l("Hello traveler, welcome to Hurnscald."),
+ l("Have you met Kfahr yet?"),
+ l("He is the greatest hero that ever walked the land of Hurnscald!"));
+
+ selectd(
+ l("Hi! No, I haven't seen him yet."),
+ l("Where can I find him?"),
+ l("Mh, I don't care for heroes."),
+ l("Hello, yes I have met him."),
+ rif(.@q_inspector == 2, l("Have you seen anything strange lately?")),
+ rif(.@q_inspector == 2, l("Do you know anything about the recent robberies?")));
+
+ switch (@menu)
+ {
+ case 3:
+ speech(4,
+ l("What?"),
+ l("Surely you do not appreciate what a hero he is!"),
+ l("Mh, or perhaps honor is dead in you; for you to be so slow to comprehend the good that his exploits have wrought for us."), // XXX: this sentence seems too complicated to come from a child's mouth
+ l("Put on your thinking cap and be propelled into high adventure!"),
+ l("Go to Kfahr, and listen to his stories."),
+ l("You can't have met him."),
+ l("No one who has met him would say such silly things."));
+ // fallthrough
+
+ case 1:
+ speech(4,
+ l("I highly recommend you seek him out!"));
+ // fallthrough
+
+ case 2:
+ speech(
+ l("He is a regular at the inn, located in the north-west part of town."),
+ l("If you are lucky he might tell you a story about his adventures."));
+ break;
+
+ case 4:
+ speech(
+ l("Oh, I hope you stayed and listened to his stories about his adventures."));
+ break;
+
+ case 5:
+ speech(
+ l("I haven't seen anything strange."));
+ break;
+
+ case 6:
+ speech(
+ l("No, sorry."));
+ break;
+ }
+
+ close;
+
+OnInit:
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_inspector; // TODO: change this to the milly quest debug when it exists
+ .sex = G_FEMALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/nicholas.txt b/npc/placeholder/nicholas.txt
new file mode 100644
index 00000000..17f44d19
--- /dev/null
+++ b/npc/placeholder/nicholas.txt
@@ -0,0 +1,26 @@
+// Evol scripts.
+// Author:
+// gumi
+
+008-2-8,40,27,0 script Nicholas NPC_HUMAN_M_ARTIS,{
+ speech(
+ l("Hello, there!"),
+ l("I'm an expert blacksmith."),
+ l("If you get me some Coal and Iron Ingots, I could make you a very valuable shield or helmet."));
+
+ // TODO: setzer quest
+ close;
+
+OnInit:
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/note.txt b/npc/placeholder/note.txt
new file mode 100644
index 00000000..f449ac89
--- /dev/null
+++ b/npc/placeholder/note.txt
@@ -0,0 +1,28 @@
+// Evol scripts.
+// Author:
+// gumi
+
+008-2-2,32,28,0 script Note#Hurnscald:pub NPC_PAPER_NOTE,{
+ narrator(8,
+ l("We refuse service to anyone who:"),
+ l("• Has a bubblehead"),
+ l("• Is not properly shaded"),
+ l("• Can't walk without stopping after every step"));
+
+ // In case you don't get the joke, know that it's a parody on Illutia.
+
+ close;
+
+OnInit:
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/nurse.txt b/npc/placeholder/nurse.txt
new file mode 100644
index 00000000..ee14cd9f
--- /dev/null
+++ b/npc/placeholder/nurse.txt
@@ -0,0 +1,101 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// robberies in hurnscald
+
+008-2-12,28,30,0 script Nurse NPC_HUMAN_M_ARTIS,{
+
+ speech(4,
+ l("How can I help you?"));
+
+ // TODO: check for AxeHat when we get it
+ // XXX: this npc used to teach the resist poison skill, do we still want that?
+
+ selectd(
+ l("Oooh, these wounds! They hurt so much!"),
+ l("I don't feel so well, I might be sick."),
+ l("No, I'm fine."),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything out of the ordinary?")));
+
+ switch (@menu)
+ {
+ case 1:
+ if (BaseLevel > .heal_max_level)
+ {
+ speech(
+ l("I'm sorry but I'm here only to help young people."), // XXX: this sounds cruel towards elderly people
+ l("Your level is already higher than %d.", .heal_max_level),
+ l("You can get some rest at the inn near here."));
+ close;
+ }
+ speech(4,
+ l("Here, let me heal you."));
+
+ npcskill(AL_HEAL, .heal_skill_level, .heal_npc_stats, .heal_npc_level);
+
+ speech(
+ l("There you go, like new."));
+ close;
+ case 2:
+ speech(
+ l("Then you should better see the doctor."),
+ l("He is usually in his office on the 3rd floor."));
+ close;
+ case 3:
+ speech(
+ l("Then I would ask you to leave."),
+ l("There are people who really need our help."));
+ close;
+ case 4:
+ speech(
+ l("I'm too busy here to observe the town."));
+ close;
+ }
+
+
+ end;
+
+OnInit:
+ .heal_max_level = 20; // she will only heal low level players
+
+ .heal_skill_level = 10; // what level of the healing skill to use
+ .heal_npc_stats = 99; // what stat points the NPC has
+ .heal_npc_level = 60; // what level the npc has
+
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_inspector;
+ .sex = G_FEMALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/old-man.txt b/npc/placeholder/old-man.txt
new file mode 100644
index 00000000..6914e50c
--- /dev/null
+++ b/npc/placeholder/old-man.txt
@@ -0,0 +1,90 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// robberies in hurnscald
+
+008-1,293,124,0 script Old Man NPC_HUMAN_M_ARTIS,{
+
+ function oldman_ask {
+ speech(4,
+ l("Hi there, need something?"));
+
+ selectd(
+ l("Have you seen anything strange lately?"),
+ l("Do you know anything about the recent robberies?"));
+
+ speech(
+ l("I'm sorry, but I didn't see anything."),
+ l("You should ask my old woman."));
+ close;
+ }
+
+ function oldman_accuse {
+ speech(4,
+ l("Found anything new?"));
+
+ selectd(
+ l("The leader of the troupe said you hung around them a lot while they were in town."));
+
+ speech(
+ l("Yes, I hung around the theater a lot."),
+ l("I was an actor when I was younger."),
+ l("But I wasn't there that night."),
+ l("Me and the wife were at home all night."));
+
+ close2;
+ setq(.quest_inspector, 8);
+ end;
+ }
+
+ // OnTalk:
+ switch (getq(.quest_inspector))
+ {
+ case 2: oldman_ask; break;
+ case 7: oldman_accuse; break;
+ }
+
+ // initial intro
+ npctalk3(l("Don't let those monsters get to you."));
+ end;
+
+OnInit:
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_inspector;
+ .sex = G_MALE;
+ .distance = 1; // this npc has bad hearing
+ .speed = 2000; // this npc is very old
+ // TODO: move graph (after the Hurnscald map is finalized)
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/old-woman.txt b/npc/placeholder/old-woman.txt
new file mode 100644
index 00000000..2a2591b4
--- /dev/null
+++ b/npc/placeholder/old-woman.txt
@@ -0,0 +1,137 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// robberies in hurnscald
+
+008-1,230,113,0 script Old Woman NPC_HUMAN_M_ARTIS,{
+
+ function is_inspector {
+ return (getequipcardid(EQI_HEAD_MID, 0) == NavyBlueCottonDye /*&&
+ getequipcardid(EQI_HEAD_LOW, 0) == NavyBlueCottonDye*/); // TODO / FIXME: remove the /* */ whenever we have cotton pants
+ }
+
+ function oldwoman_ask {
+ speech(4,
+ l("Hello deary."));
+
+ selectd(
+ l("Have you seen anything strange lately?"),
+ l("Do you know anything about the recent robberies?"));
+
+ .@q = getq(.quest_inspector);
+
+ if (!is_inspector())
+ {
+ speech(l("Yes, but I'm only talking to the inspector himself!"));
+
+ close2;
+ if (.@q < 3)
+ setq(.quest_inspector, 3);
+ end;
+ }
+
+ if (.@q == 2 || .@q == 3)
+ {
+ speech(
+ l("I saw someone sneaking around town wearing a theater mask."),
+ l("It looked like one of the masks used by the troupe that was in town recently."));
+
+ close2;
+ setq(.quest_inspector, 4);
+ }
+
+ else if (.@q == 10)
+ {
+ speech(
+ l("I've remembered something else."),
+ l("The night the troupe left, I saw someone with a theater mask take a large satchel out of town."),
+ l("He was heading north."));
+
+ close2;
+ setq(.quest_inspector, 11);
+ }
+
+ end;
+ }
+
+ function oldwoman_alibi {
+ speech(4,
+ l("Hello deary."));
+
+ selectd(
+ l("Was your husband with you at home all night the last night that the troupe was in town?"));
+
+ speech(
+ l("Yes, we were both at home all night."));
+
+ close2;
+ setq(.quest_inspector, 9);
+ end;
+ }
+
+ function oldwoman_filler {
+ npctalk3(l("I hope you catch that naughty person!"));
+ end;
+ }
+
+ // OnTalk:
+ switch (getq(.quest_inspector))
+ {
+ case 2:
+ case 3: oldwoman_ask; break;
+ case 4:
+ case 5:
+ case 6:
+ case 7: oldwoman_filler; break;
+ case 8:
+ case 9: oldwoman_alibi; break;
+ case 10: oldwoman_ask; break;
+ }
+
+ // initial intro
+ if (BaseLevel < 40)
+ npctalk3(l("Watch out for these flowers. They don't like to be messed with."));
+ else
+ npctalk3(l("Hello deary."));
+ end;
+
+OnInit:
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_inspector;
+ .sex = G_FEMALE;
+ .distance = 1; // this npc has bad hearing
+ .speed = 2000; // this npc is very old
+ // TODO: move graph (after the Hurnscald map is finalized)
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/sabine.txt b/npc/placeholder/sabine.txt
new file mode 100644
index 00000000..1d0cc38a
--- /dev/null
+++ b/npc/placeholder/sabine.txt
@@ -0,0 +1,64 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// robberies in hurnscald
+
+008-1,291,97,0 script Sabine NPC_HUMAN_M_ARTIS,{
+
+ if (getq(.quest_inspector) != 2)
+ {
+ npctalk3(generic(1 | 16));
+ end;
+ }
+
+ speech(4,
+ l("Isn't this place pretty?"),
+ l("I love hanging out here!"));
+
+ selectd(
+ l("Have you seen anything strange lately?"),
+ l("Do you know anything about the recent robberies?"));
+
+ speech(
+ l("No, sorry."));
+
+ close;
+
+OnInit:
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_inspector;
+ .sex = G_FEMALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/soul-menhir.txt b/npc/placeholder/soul-menhir.txt
new file mode 100644
index 00000000..0b2d177d
--- /dev/null
+++ b/npc/placeholder/soul-menhir.txt
@@ -0,0 +1,58 @@
+// Evol scripts.
+// Author:
+// gumi
+// Description:
+// place of power, mana refills faster when sitting nearby
+
+008-1,253,112,0 script Soul Menhir#hurnscald NPC_HUMAN_M_ARTIS,{
+
+ end;
+
+OnRefill:
+ @menhir_lock = false;
+ getmapxy(.@map$, .@x, .@y, UNITTYPE_PC);
+
+ if (.@map$ != .map$ || distance(.x, .y, .@x, .@y) > .refill_distance ||
+ !(issit()))
+ end;
+
+ heal(0, .refill_rate);
+ end;
+
+
+OnTimer500:
+ .@count = getunits(BL_PC, .@units[0], false, .map$, (.x - .refill_distance),
+ (.y - .refill_distance), (.x + .refill_distance), (.y + .refill_distance));
+
+ for (.@i = 0; .@i < .@count; ++.@i)
+ {
+ if (.@units[.@i] < 0) continue; // pre-check, just in case
+ deltimer(.name$ + "::OnRefill", .@units[.@i]);
+ if (gettimer(TIMER_COUNT, .@units[.@i], .name$ + "::OnRefill") > 0 ||
+ getvariableofpc(@menhir_lock, .@units[.@i])) {
+ continue;
+ }
+ set(getvariableofpc(@menhir_lock, .@units[.@i]), true);
+ addtimer(rand(.refill_timer), .name$ + "::OnRefill", .@units[.@i]);
+ }
+
+ initnpctimer();
+ end;
+
+OnInit:
+
+ .refill_rate = 1; // number of SP to give every refill
+ .refill_distance = 7; // max distance
+ .refill_timer = 200; // wait rand(X) ms before refill
+ initnpctimer();
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/placeholder/troupe-leader.txt b/npc/placeholder/troupe-leader.txt
new file mode 100644
index 00000000..05f20e6a
--- /dev/null
+++ b/npc/placeholder/troupe-leader.txt
@@ -0,0 +1,119 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// robberies in hurnscald
+
+008-1,306,115,0 script Troupe Leader NPC_HUMAN_M_ARTIS,{
+
+ function nohmask_question {
+ // XXX: shouldn't the player ask a question before she replies Yes? this feels too abrupt
+ speech(4,
+ l("Yes, a mask was stolen from us the last night we were in Hurnscald."));
+
+ selectd(
+ l("Any ideas on who might have taken it?"),
+ l("Are you sure one of your troupe members didn't hide it and commit those robberies?"),
+ l("Hmm..."));
+
+ switch (@menu)
+ {
+ case 1:
+ speech(
+ l("Hm..."),
+ l("I did see an old man hang out near the theater after our last show."));
+ close2;
+ setq(.quest_inspector, 6);
+ close;
+
+ case 2:
+ speech(
+ l("I am absolutely positive."),
+ l("None of my troupe have left the city since we got here."),
+ l("Good day!"));
+ close;
+ }
+
+ closeclientdialog();
+ close;
+ }
+
+ function nohmask_found {
+ // XXX: shouldn't the player say "I found your mask" before the npc says thanks?
+ speech(4,
+ l("Thank you for finding the mask."),
+ l("You did such a good job, you should keep it."));
+
+ if (checkweight(.reward_item, 1) != true)
+ {
+ speech(8,
+ l("It seems you can't carry it right now..."));
+ close;
+ }
+
+ setq(.quest_inspector, 15);
+ getexp(.reward_exp, 0);
+ getitem(.reward_item, 1);
+
+ speech(
+ l("We don't need it anymore."),
+ l("We're doing different shows here."));
+ close;
+ }
+
+ // OnTalk:
+ switch (getq(.quest_inspector))
+ {
+ case 5: nohmask_question; break;
+ // XXX: shouldn't it have an in-between state where it says good luck or something?
+ case 14: nohmask_found; break;
+ // XXX: shouldn't it have a "completed" state where it says thanks, come back any time?
+ }
+
+ // initial intro
+ speech(
+ l("Hello."),
+ l("I'm the leader of a traveling theater troupe."),
+ l("We'll be staying here in Tulimshar for a while."));
+ close;
+
+OnInit:
+ .reward_item = Aquada; // FIXME: change this when we get NohMask
+ .reward_exp = 1500;
+
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_inspector;
+ .sex = G_FEMALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/scripts.conf b/npc/scripts.conf
index 3bb929a9..a5ed16ba 100644
--- a/npc/scripts.conf
+++ b/npc/scripts.conf
@@ -39,6 +39,7 @@
"npc/functions/npcmovegraph.txt",
"npc/functions/fishing.txt",
"npc/functions/mouboofunc.txt",
+"npc/functions/generic-text.txt",
"npc/functions/asklanguage.txt",
"npc/functions/game-rules.txt",
"npc/functions/riddle.txt",
@@ -56,6 +57,7 @@
"npc/functions/quest-debug/005-ShipQuests_Knife.txt",
"npc/functions/quest-debug/006-ShipQuests_ArpanMoney.txt",
"npc/functions/quest-debug/007-ShipQuests_Door.txt",
+// 008: ???
"npc/functions/quest-debug/009-ShipQuests_TreasureChest.txt",
"npc/functions/quest-debug/010-ShipQuests_Ale.txt",
"npc/functions/quest-debug/011-ShipQuests_Astapolos.txt",
@@ -71,8 +73,8 @@
"npc/functions/quest-debug/021-ArtisQuests_CatchPiou.txt",
"npc/functions/quest-debug/022-ArtisQuests_Fishman.txt",
"npc/functions/quest-debug/023-ArtisQuests_QOnan.txt",
-// 24: quest removed (Halloween_VisitArtis)
-// 25: quest removed (Halloween_BarrelQuest)
+// 024: removed quest (Halloween_VisitArtis)
+// 025: removed quest (Halloween_BarrelQuest)
"npc/functions/quest-debug/026-General_Rumly.txt",
"npc/functions/quest-debug/027-ArtisQuests_Enora.txt",
"npc/functions/quest-debug/028-General_Narrator.txt",
@@ -81,6 +83,13 @@
"npc/functions/quest-debug/031-General_Janus.txt",
"npc/functions/quest-debug/032-ArtisQuests_MonaDad.txt",
"npc/functions/quest-debug/033-Artis_Legion_Progress.txt",
+// 034: ???
+// 035: ???
+"npc/functions/quest-debug/036-HurnscaldQuests_Hinnak.txt",
+"npc/functions/quest-debug/037-HurnscaldQuests_Soup.txt",
+"npc/functions/quest-debug/038-HurnscaldQuests_Inspector.txt",
+"npc/functions/quest-debug/039-HurnscaldQuests_ForestBow.txt",
+"npc/functions/quest-debug/040-HurnscaldQuests_WoodenShield.txt",
// Item functions
"npc/items/croconut.txt",
@@ -106,5 +115,30 @@
// config script
"npc/config/hairstyle_config.txt",
+// placeholder scripts
+"npc/placeholder/hinnak.txt",
+"npc/placeholder/mikhail.txt",
+"npc/placeholder/bernard.txt",
+"npc/placeholder/ledmitz.txt",
+"npc/placeholder/jack.txt",
+"npc/placeholder/inspector.txt",
+"npc/placeholder/alan.txt",
+"npc/placeholder/troupe-leader.txt",
+"npc/placeholder/old-man.txt",
+"npc/placeholder/old-woman.txt",
+"npc/placeholder/books.txt",
+"npc/placeholder/malek.txt",
+"npc/placeholder/milly.txt",
+"npc/placeholder/sabine.txt",
+"npc/placeholder/doctor.txt",
+"npc/placeholder/nurse.txt",
+"npc/placeholder/soul-menhir.txt",
+"npc/placeholder/note.txt",
+"npc/placeholder/macgowan.txt",
+"npc/placeholder/nicholas.txt",
+//"npc/placeholder/angus.txt",
+//"npc/placeholder/caul.txt",
+//"npc/placeholder/receptionist.txt",
+
// Maps specific scripts
@include "npc/_import.txt"