summaryrefslogtreecommitdiff
path: root/npc/001-1
diff options
context:
space:
mode:
Diffstat (limited to 'npc/001-1')
-rw-r--r--npc/001-1/_import.txt45
-rw-r--r--npc/001-1/_mobs.txt32
-rw-r--r--npc/001-1/_warps.txt445
-rw-r--r--npc/001-1/artaxe.txt18
-rw-r--r--npc/001-1/beuss.txt27
-rw-r--r--npc/001-1/calypsan.txt104
-rw-r--r--npc/001-1/carmie.txt68
-rw-r--r--npc/001-1/chelios.txt135
-rw-r--r--npc/001-1/cookiemaster.txt256
-rw-r--r--npc/001-1/devis.txt99
-rw-r--r--npc/001-1/doors.txt61
-rw-r--r--npc/001-1/elmo.txt19
-rw-r--r--npc/001-1/enora.txt461
-rw-r--r--npc/001-1/eugene.txt82
-rw-r--r--npc/001-1/fexil.txt143
-rw-r--r--npc/001-1/flags.txt17
-rw-r--r--npc/001-1/flyingpiou.txt160
-rw-r--r--npc/001-1/harbours.txt84
-rw-r--r--npc/001-1/juscare.txt92
-rw-r--r--npc/001-1/katja.txt128
-rw-r--r--npc/001-1/koga.txt45
-rw-r--r--npc/001-1/lucas.txt18
-rw-r--r--npc/001-1/manhole.txt88
-rw-r--r--npc/001-1/mapflags.txt1
-rw-r--r--npc/001-1/marine.txt17
-rw-r--r--npc/001-1/merlin.txt24
-rw-r--r--npc/001-1/mouboo.txt61
-rw-r--r--npc/001-1/nalkri.txt59
-rw-r--r--npc/001-1/panels.txt57
-rw-r--r--npc/001-1/pious.txt15
-rw-r--r--npc/001-1/qonan.txt113
-rw-r--r--npc/001-1/qpid.txt169
-rw-r--r--npc/001-1/rowboat.txt69
-rw-r--r--npc/001-1/rowboathelper.txt141
-rw-r--r--npc/001-1/rumly.txt225
-rw-r--r--npc/001-1/salem.txt219
-rw-r--r--npc/001-1/shop.txt298
-rw-r--r--npc/001-1/sign.txt168
-rw-r--r--npc/001-1/sophialla.txt88
-rw-r--r--npc/001-1/taree.txt20
-rw-r--r--npc/001-1/treeleaf.txt22
-rw-r--r--npc/001-1/trees.txt220
-rw-r--r--npc/001-1/wateranimation.txt23
-rw-r--r--npc/001-1/xilaxa.txt50
44 files changed, 4686 insertions, 0 deletions
diff --git a/npc/001-1/_import.txt b/npc/001-1/_import.txt
new file mode 100644
index 00000000..18f8e363
--- /dev/null
+++ b/npc/001-1/_import.txt
@@ -0,0 +1,45 @@
+// Map 001-1: Artis
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/001-1/_mobs.txt",
+"npc/001-1/_warps.txt",
+"npc/001-1/artaxe.txt",
+"npc/001-1/beuss.txt",
+"npc/001-1/calypsan.txt",
+"npc/001-1/carmie.txt",
+"npc/001-1/chelios.txt",
+"npc/001-1/cookiemaster.txt",
+"npc/001-1/devis.txt",
+"npc/001-1/doors.txt",
+"npc/001-1/elmo.txt",
+"npc/001-1/enora.txt",
+"npc/001-1/eugene.txt",
+"npc/001-1/fexil.txt",
+"npc/001-1/flags.txt",
+"npc/001-1/flyingpiou.txt",
+"npc/001-1/harbours.txt",
+"npc/001-1/juscare.txt",
+"npc/001-1/katja.txt",
+"npc/001-1/koga.txt",
+"npc/001-1/lucas.txt",
+"npc/001-1/manhole.txt",
+"npc/001-1/mapflags.txt",
+"npc/001-1/marine.txt",
+"npc/001-1/merlin.txt",
+"npc/001-1/mouboo.txt",
+"npc/001-1/nalkri.txt",
+"npc/001-1/panels.txt",
+"npc/001-1/pious.txt",
+"npc/001-1/qonan.txt",
+"npc/001-1/qpid.txt",
+"npc/001-1/rowboat.txt",
+"npc/001-1/rowboathelper.txt",
+"npc/001-1/rumly.txt",
+"npc/001-1/salem.txt",
+"npc/001-1/shop.txt",
+"npc/001-1/sign.txt",
+"npc/001-1/sophialla.txt",
+"npc/001-1/taree.txt",
+"npc/001-1/treeleaf.txt",
+"npc/001-1/trees.txt",
+"npc/001-1/wateranimation.txt",
+"npc/001-1/xilaxa.txt",
diff --git a/npc/001-1/_mobs.txt b/npc/001-1/_mobs.txt
new file mode 100644
index 00000000..a2b6e5f1
--- /dev/null
+++ b/npc/001-1/_mobs.txt
@@ -0,0 +1,32 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 001-1: Artis mobs
+001-1,0,0,0,0 monster Piou 1002,2,15000,60000
+001-1,0,0,0,0 monster Piousse 1003,1,15000,150000
+001-1,174,34,11,15 monster Fluffy 1022,6,18000,100000
+001-1,199,48,2,5 monster Fluffy 1022,4,18000,100000
+001-1,174,34,11,15 monster Piou 1002,1,12000,60000
+001-1,35,62,1,4 monster Pikpik 1013,3,40000,20000
+001-1,26,96,3,2 monster Pikpik 1013,1,40000,20000
+001-1,42,137,4,1 monster Pikpik 1013,2,40000,20000
+001-1,45,136,0,0 monster Crocotree 1010,1,420000,240000
+001-1,70,136,0,0 monster Crocotree 1010,1,420000,240000
+001-1,37,126,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,34,130,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,41,129,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,36,77,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,37,79,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,39,73,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,43,70,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,48,71,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,40,67,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,46,65,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,152,26,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,152,32,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,155,37,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,158,29,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,203,51,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,198,50,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,199,55,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,185,65,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,191,63,0,0 monster Manana Tree 1017,1,420000,240000
+001-1,200,66,0,0 monster Manana Tree 1017,1,420000,240000
diff --git a/npc/001-1/_warps.txt b/npc/001-1/_warps.txt
new file mode 100644
index 00000000..c084792b
--- /dev/null
+++ b/npc/001-1/_warps.txt
@@ -0,0 +1,445 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 001-1: Artis warps
+001-1,51,80,0 script #001-1_51_80_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-4", 48, 40;
+close;
+
+OnUnTouch:
+ doevent "#001-1_51_80::OnUnTouch";
+}
+001-1,51,80,0 script #001-1_51_80 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,70,77,0 script #001-1_70_77_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-2", 38, 38;
+close;
+
+OnUnTouch:
+ doevent "#001-1_70_77::OnUnTouch";
+}
+001-1,70,77,0 script #001-1_70_77 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,51,65,0 script #001-1_51_65_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-0", 30, 34;
+close;
+
+OnUnTouch:
+ doevent "#001-1_51_65::OnUnTouch";
+}
+001-1,51,65,0 script #001-1_51_65 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,55,71,0 script #001-1_55_71_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-0", 37, 45;
+close;
+
+OnUnTouch:
+ doevent "#001-1_55_71::OnUnTouch";
+}
+001-1,55,71,0 script #001-1_55_71 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,168,98,0 script #001-1_168_98_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-16", 32, 35;
+close;
+
+OnUnTouch:
+ doevent "#001-1_168_98::OnUnTouch";
+}
+001-1,168,98,0 script #001-1_168_98 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,194,109,0 warp #001-1_194_109 0,0,001-2-21,20,28
+001-1,100,37,0 warp #001-1_100_37 0,0,001-2-19,32,39
+001-1,104,43,0 warp #001-1_104_43 0,0,001-2-19,41,49
+001-1,134,83,0 warp #001-1_134_83 0,0,001-2-28,60,31
+001-1,118,88,0 script #001-1_118_88_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-28", 29, 41;
+close;
+
+OnUnTouch:
+ doevent "#001-1_118_88::OnUnTouch";
+}
+001-1,118,88,0 script #001-1_118_88 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,182,74,0 script #001-1_182_74_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-18", 39, 35;
+close;
+
+OnUnTouch:
+ doevent "#001-1_182_74::OnUnTouch";
+}
+001-1,182,74,0 script #001-1_182_74 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,163,70,0 script #001-1_163_70_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-26", 28, 42;
+close;
+
+OnUnTouch:
+ doevent "#001-1_163_70::OnUnTouch";
+}
+001-1,163,70,0 script #001-1_163_70 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,132,67,0 script #001-1_132_67_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-15", 34, 45;
+close;
+
+OnUnTouch:
+ doevent "#001-1_132_67::OnUnTouch";
+}
+001-1,132,67,0 script #001-1_132_67 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,101,107,0 script #001-1_101_107_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-27", 35, 34;
+close;
+
+OnUnTouch:
+ doevent "#001-1_101_107::OnUnTouch";
+}
+001-1,101,107,0 script #001-1_101_107 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,89,65,0 script #001-1_89_65_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-7", 36, 45;
+close;
+
+OnUnTouch:
+ doevent "#001-1_89_65::OnUnTouch";
+}
+001-1,89,65,0 script #001-1_89_65 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,57,41,0 warp #001-1_57_41 0,0,001-2-33,34,45
+001-1,142,30,0 script #001-1_142_30_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-12", 34, 35;
+close;
+
+OnUnTouch:
+ doevent "#001-1_142_30::OnUnTouch";
+}
+001-1,142,30,0 script #001-1_142_30 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,128,30,0 script #001-1_128_30_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-1", 37, 40;
+close;
+
+OnUnTouch:
+ doevent "#001-1_128_30::OnUnTouch";
+}
+001-1,128,30,0 script #001-1_128_30 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,104,32,0 script #001-1_104_32_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-19", 41, 30;
+close;
+
+OnUnTouch:
+ doevent "#001-1_104_32::OnUnTouch";
+}
+001-1,104,32,0 script #001-1_104_32 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,107,49,0 script #001-1_107_49_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-20", 33, 34;
+close;
+
+OnUnTouch:
+ doevent "#001-1_107_49::OnUnTouch";
+}
+001-1,107,49,0 script #001-1_107_49 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,148,54,0 script #001-1_148_54_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-11", 46, 45;
+close;
+
+OnUnTouch:
+ doevent "#001-1_148_54::OnUnTouch";
+}
+001-1,148,54,0 script #001-1_148_54 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,135,49,0 script #001-1_135_49_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-10", 51, 44;
+close;
+
+OnUnTouch:
+ doevent "#001-1_135_49::OnUnTouch";
+}
+001-1,135,49,0 script #001-1_135_49 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,118,49,0 script #001-1_118_49_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-10", 27, 44;
+close;
+
+OnUnTouch:
+ doevent "#001-1_118_49::OnUnTouch";
+}
+001-1,118,49,0 script #001-1_118_49 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,49,96,0 script #001-1_49_96_h NPC_HIDDEN,0,0,{
+OnTouch:
+ warp "001-2-31", 32, 39;
+close;
+
+OnUnTouch:
+ doevent "#001-1_49_96::OnUnTouch";
+}
+001-1,49,96,0 script #001-1_49_96 NPC_ARTIS_DOOR,2,3,{
+ close;
+OnTouch:
+ doorTouch;
+
+OnUnTouch:
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
+001-1,198,61,0 warp #001-1_198_61 0,0,001-3-0,198,59
diff --git a/npc/001-1/artaxe.txt b/npc/001-1/artaxe.txt
new file mode 100644
index 00000000..f1d63d46
--- /dev/null
+++ b/npc/001-1/artaxe.txt
@@ -0,0 +1,18 @@
+// Evol scripts.
+// Author:
+// Reid
+// Description:
+// Legion NPC blocking the north road of Artis.
+
+001-1,90,31,0 script Artaxe NPC_ARTAXE,{
+ speech S_LAST_NEXT,
+ l("Sorry buddy, you can't pass by this way, we're moving some furniture."),
+ l("Come back later!");
+
+ closeclientdialog;
+ close;
+
+OnInit:
+ .distance = 2;
+ end;
+}
diff --git a/npc/001-1/beuss.txt b/npc/001-1/beuss.txt
new file mode 100644
index 00000000..fd334392
--- /dev/null
+++ b/npc/001-1/beuss.txt
@@ -0,0 +1,27 @@
+// Evol scripts.
+// Author:
+// Reid
+// Description:
+// Angry member of the Legion of Aemil.
+
+001-1,45,48,0 script Beuss NPC_BEUSS,{
+ stopnpctimer;
+ initnpctimer;
+ .dir = 4;
+ mesn;
+ mesq l("You seem pathetically weak. What is such boneless jelly like you doing around here?");
+
+ goto L_Close;
+
+L_Close:
+ close;
+
+OnTimer10000:
+ .dir = 2;
+ stopnpctimer;
+ end;
+
+OnInit:
+ .distance = 2;
+ end;
+}
diff --git a/npc/001-1/calypsan.txt b/npc/001-1/calypsan.txt
new file mode 100644
index 00000000..46c4b84e
--- /dev/null
+++ b/npc/001-1/calypsan.txt
@@ -0,0 +1,104 @@
+// Evol scripts.
+// Author:
+// Reid
+// Description:
+// Dye seller, she sells and explain how works dye cards.
+// Version:
+// 2016.019 "Under Construction".
+// Variables:
+// ArtisQuests_Fexil
+// Quest states:
+// 0 -- not started
+// 1 -- Lloyd warned about the quest
+// 2 -- Fexil explain what he needs
+// 3 -- Fexil buy every fur that the pc bring to him
+
+001-1,47,126,0 script Calypsan#001-1 NPC_CALYPSAN,{
+
+ function explain_dyes {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Look at your equipment, can you guess what material it is made from?"),
+ l("Seek a colorant for that material:"),
+ l("Cotton, Silk, leather, ..."),
+ l("Zinc-Titanium Oxide, Phthalocyanides, Cadmiums, Lazulite..."),
+ l("Colorant is not the yeying color. Some wear out from light, others look great but inflict itai-itai, and others become spotty or wash-away."),
+ l("What yoiis should know:"),
+ l("1: The type of item yoiis want to dye."),
+ l("2: What material it is made from."),
+ l("3: Which colorants can dye it."),
+ l("4: How many cards your item can contain."),
+ l("Exemple for yoiis:"),
+ l("Take an @@ and a @@, yeye obtains a @@.", getitemlink(ArtisTankTop), getitemlink(RedCottonDye), getitemlink(ArtisTankTop, RedCottonDye)),
+ l("If yoiis wants to see a different use for the cards he can yeye for Resa at the light armor shop for a description of the styling cards.");
+ }
+
+ function sell_dye {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT, l("For what kind of tissue?");
+ .@tissue_type = select(l("Cotton"), l("Silk"));
+
+ closeclientdialog;
+ switch (.@tissue_type)
+ {
+ case 1:
+ shop "Cotton#Dye001-1";
+ break;
+ case 2:
+ shop "Silk#Dye001-1";
+ break;
+ default:
+ consolemes(CONSOLEMES_ERROR, "Calypsan script error, tissue_type is incorrect");
+ break;
+ }
+ close;
+ }
+
+ speech S_LAST_NEXT,
+ l("Yoiis envies a rainbow in the sky?"),
+ l("It is possible to yeye your cloth with my beautiful dyes."),
+ l("What does yoiis want today?");
+
+ .@fexil = getq(ArtisQuests_Fexil);
+
+ do
+ {
+ select
+ rif(.@fexil == 1, l("Have you seen Fexil?")),
+ menuaction(l("Trade")),
+ l("How do these dyes work?"),
+ l("I want to make my own dyes."),
+ menuaction(l("Quit"));
+
+ switch (@menu)
+ {
+ case 1:
+ setcamnpc "Fexil#001-1";
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Oh yeye did, his store is just beside me!"),
+ l("Yoiis should look there.");
+ restorecam;
+
+ break;
+ case 2:
+ sell_dye;
+ close;
+
+ case 3:
+ explain_dyes;
+ break;
+ case 4:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Yoiis is not yet ready to make his own dyes."),
+ l("But in the future I might be able to help you create some of your own.");
+ break;
+ }
+ } while (@menu != 5);
+
+ closeclientdialog;
+ goodbye;
+ close;
+
+OnInit:
+ .distance = 3;
+ end;
+}
+
diff --git a/npc/001-1/carmie.txt b/npc/001-1/carmie.txt
new file mode 100644
index 00000000..e87e7fe6
--- /dev/null
+++ b/npc/001-1/carmie.txt
@@ -0,0 +1,68 @@
+// Evol scripts.
+// Authors:
+// Alige
+// Reid
+// Description:
+// Carmie, walking NPC of the legion of Aemil on the center part of Artis.
+// Variables:
+// .@rand = Random number of sentences.
+
+001-1,86,66,0 script Carmie#001-1 NPC_RAIJIN_FEMALE_LEGION_ARTIS,{
+
+ legiontalk;
+
+ close;
+
+OnTimer1000:
+ domovestep;
+
+OnInit:
+ initpath "move", 89, 68,
+ "move", 89, 77,
+ "move", 84, 81,
+ "dir", LEFT, 0,
+ "wait", 2, 0,
+ "dir", DOWN, 0,
+ "wait", 1, 0,
+ "dir", RIGHT, 0,
+ "wait", 1, 0,
+ "move", 89, 85,
+ "dir", LEFT, 0,
+ "wait", 1, 0,
+ "dir", DOWN, 0,
+ "dir", RIGHT, 0,
+ "wait", 1, 0,
+ "move", 94, 81,
+ "dir", RIGHT, 0,
+ "wait", 2, 0,
+ "dir", DOWN, 0,
+ "wait", 1, 0,
+ "dir", LEFT, 0,
+ "wait", 1, 0,
+ "move", 89, 76,
+ "move", 89, 68,
+ "dir", LEFT, 0,
+ "wait", 2, 0,
+ "dir", DOWN, 0,
+ "wait", 4, 0,
+ "dir", RIGHT, 0,
+ "wait", 2, 0,
+ "move", 92, 66,
+ "dir", RIGHT, 0,
+ "wait", 2, 0,
+ "dir", DOWN, 0,
+ "wait", 1, 0,
+ "dir", LEFT, 0,
+ "wait", 1, 0,
+ "move", 86, 66,
+ "dir", LEFT, 0,
+ "wait", 2, 0,
+ "dir", DOWN, 0,
+ "wait", 1, 0,
+ "dir", RIGHT, 0,
+ "wait", 1, 0;
+
+ initialmove;
+ initnpctimer;
+ .distance = 5;
+}
diff --git a/npc/001-1/chelios.txt b/npc/001-1/chelios.txt
new file mode 100644
index 00000000..84af2de1
--- /dev/null
+++ b/npc/001-1/chelios.txt
@@ -0,0 +1,135 @@
+// Evol scripts.
+// Author:
+// Reid
+// Jesusalva
+// Description:
+// Blacksmith's assistant of Artis
+// Variables:
+// ArtisQuests_Enora
+// Values:
+// 0 Default.
+// 1 BlackSmith quest delivered.
+// 2 Chelios Quest given.
+// 3 Chelios Quest done.
+// 4 BlackSmith gave the sword.
+
+001-1,95,109,0 script Chelios NPC_CHELIOS,{
+ function give_small_quest;
+ function more_info;
+ function quest_completed;
+ function blacksmith_house;
+ function explain_weapons;
+
+ speech S_LAST_NEXT, l("Can I be of any help?");
+
+ do
+ {
+ .@enora = getq(ArtisQuests_Enora);
+ select
+ rif(.@enora == 1, l("I came to retrieve a package for Enora.")),
+ rif(.@enora == 3, l("I have your black iron.")),
+ rif(.@enora >= 2, l("Where is the Merchant Guild?")),
+ l("What is this building?"),
+ l("Why some of my weapons have a plus sign near them?"),
+ menuaction(l("Quit"));
+
+ switch (@menu)
+ {
+ case 1:
+ give_small_quest;
+ break;
+ case 2:
+ quest_completed;
+ break;
+ case 3:
+ more_info;
+ break;
+ case 4:
+ blacksmith_house;
+ break;
+ }
+ } while (@menu != 5);
+
+ closeclientdialog;
+ goodbye;
+ close;
+
+
+function give_small_quest {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Her sword... I'm having some trouble finishing it."),
+ l("You see, Enora asked me to do a black iron sword, unfortunately I ran out of the material needed, and..."),
+ l("Only Don and the Merchant Guild have that kind of material in stock. It's called black iron."),
+ l("It's better to deal with the Merchant Guild than the old man, Don has this ability to hammer down your enthusiasm in sparkling fury!"),
+ l("If Enora wants her sword now, I need to ask for your help.");
+
+ switch (select(l("Let's not keep her waiting."),
+ l("Not now.")))
+ {
+ case 1:
+ break;
+ case 2:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("I'll be here, come back when you'll be ready.");
+
+ return;
+ }
+
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Thank you very much!"),
+ l("Talk with Lloyd the Banker in the Merchant Guild, it's a big building in the northern side of Artis, at the top of the small hill.");
+
+ setq ArtisQuests_Enora, 2;
+
+ return;
+}
+
+function more_info {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("It's the big building in northern Artis, at the top of a small hill."),
+ l("Take the east road that goes to the north and follow it until you are on top of the cliff."),
+ l("That part of the town is called the Gilded Hill, it's also where the Merchant Guild has its headquarters."), //rich hill
+ l("Lloyd still owes me, but beware of those money-grabbers, or they might sell your own teeth to you!");
+
+ return;
+}
+
+function quest_completed {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Oh... Awesome!"),
+ l("You were gone so I thought you let me down."),
+ l("Don gave me some black iron... after I asked him nearly ten times."),
+ l("But thank you anyway! I can refund him now!"),
+ l("Take the sword, and say hi to Enora for me!");
+
+ setq ArtisQuests_Enora, 4;
+
+ return;
+}
+
+function blacksmith_house {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Behind me? It's the Blacksmith House, the most renowned throughout Aemil."),
+ l("There are two shops inside, they are independent from the Merchant Guild of Artis."),
+ l("Now that I think about it, they are the only shops that are independent in Artis..."),
+ l("...it might be because of Don... he is the master blacksmith of this place and a model to me!");
+
+ return;
+}
+
+function explain_weapons {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Weapons do not level up. But the more you use them, the more used to them you become."),
+ l("As you start to wield them better, you will be able to draw better their full potential."),
+ l("Your proeficiency with a certain weapon is noted at the side of it. Naturally, you cannot obtain proeficiency by purchasing someone else's weapon.");
+ mesn;
+ speech S_LAST_NEXT,
+ l("By the way, I'll explain you how crafting works when I become less lazy.");
+ return;
+}
+
+OnInit:
+ .distance = 4;
+ end;
+}
+
diff --git a/npc/001-1/cookiemaster.txt b/npc/001-1/cookiemaster.txt
new file mode 100644
index 00000000..984c02aa
--- /dev/null
+++ b/npc/001-1/cookiemaster.txt
@@ -0,0 +1,256 @@
+// Evol scripts.
+// Authors:
+// Alige
+// Reid
+// Description:
+// Cookie NPC, beware, if you don't take your cookie, she'll keep it!
+// Variables:
+// General_Cookies
+// Values:
+// 0 Default, didn't get a cookie.
+// 1 Get a cookie.
+
+001-1,39,38,0 script Cookie Master NPC_COOKIE_MASTER,{
+ if ((countitem(517) == 0) && (getq(General_Cookies) == 1))
+ goto L_LostCookie;
+ if (getq(General_Cookies) == 1)
+ goto L_GetCookie;
+
+ mesn;
+ mesq l("Hey! Adventurer! Are you enjoying your life on Aemil?");
+ next;
+
+ select
+ l("Well in fact...");
+
+ mes "";
+ mesn;
+ mesq l("Shht shht!");
+ next;
+ mesq l("Don't tell me more, I know what you want...");
+ next;
+ mesq l("A cookie!");
+ next;
+
+ menu
+ l("I'd love one!"), -,
+ l("No thank you, I'm fine. I'll come back later."), L_Bye;
+
+ mes "";
+ mesn;
+ mesq l("Of course you do! Just listen carefully to these words my sweet.");
+ next;
+ mesq l("Cookies are a source of life.");
+ next;
+ mesq l("Cookies provide you strength, health and cuteness.");
+ next;
+ mesq l("Cookies are awesome, so am I.");
+
+ menu
+ l("Uhm... Your story seems..."), L_StorySeems,
+ l("Wait... That's not a proper place for a chef, what are you doing there?"), L_Presentation,
+ l("Exactly! Can I have one now?"), -;
+
+L_Check:
+ mes "";
+ mesn;
+ mesq l("Let me check my cookie list...");
+ next;
+
+// Beta3 Contributors.
+ if (strcharinfo(0) == "4144") goto L_Reward;
+ if (strcharinfo(0) == "Alige") goto L_Reward;
+ if (strcharinfo(0) == "enchilado") goto L_Reward;
+ if (strcharinfo(0) == "hal9000") goto L_Reward;
+ if (strcharinfo(0) == "Reid") goto L_Reward;
+ if (strcharinfo(0) == "Socapex") goto L_Reward;
+ if (strcharinfo(0) == "Kenny690") goto L_Reward;
+ if (strcharinfo(0) == "Nelson6e65") goto L_Reward;
+ if (strcharinfo(0) == "Steel Zenn") goto L_Reward;
+// Aurora1 Contributors.
+
+ mesq l("I'm sorry but I can't see your name anywhere.");
+ next;
+ mesq l("You see, folks around here that get my cookies have the distinction of being...");
+ next;
+
+ menu
+ l("Seriously? It's just a cookie you know... Tell me what I should do to get one."), L_BTaskExpanation,
+ l("Yes, yes I know... Too bad then. See you soon!"), L_Bye;
+
+L_StorySeems:
+ mes "";
+ mesn;
+ mesq l("What about my story?");
+ next;
+
+ menu
+ l("It's interesting and exciting at the same time!"), -,
+ l("Honestly, it's quite far-fetched according to me."), L_Kick;
+
+ mes "";
+ menu
+ l("Too bad. I'm not hungry enough for these cookies of yours. Maybe I'll come back later."), L_Bye,
+ l("How can I get one of these cookies?"), -;
+
+ mes "";
+ mesn;
+ mesq l("It looks like you are curious, am I right?");
+ next;
+ mesq l("Well, if you ever do want to join: 'Ye Merry Club Of Thee Bequeathed With Cookies'...");
+ next;
+
+L_BTaskExpanation:
+ mes "";
+ mesn;
+L_TaskExpanation:
+ mesq l("You'll first need to help my friends.");
+ next;
+ mesq l("It is them, after all, who have the ultimate decision as to those I can give my cookies to.");
+ next;
+
+ menu
+ l("So you're under the control of a dictatorship? That's... reassuring!"), L_Control,
+ l("Who are these friends?"), L_Friends;
+
+L_Friends:
+ mes "";
+ mesn;
+ mesq l("Shht shht!");
+ next;
+ mesq l("Don't say it so loudly, other people could hear us.");
+ next;
+ mesq l("My friends are... Well, you know... The creators.");
+ next;
+ mesq l("I can't give you a cookie for free. But I can give you this hint for how you may be added to my list.");
+ next;
+ mesq l("Now listen to and ponder my words...");
+ next;
+ mesq l("If you see weird things here and there, or things that just shouldn't be, or even in your minds eye, things that you would like to see...");
+ next;
+ mesq l("Simply contact them, by forum or wispers or irc. When you are helpful and kind, they respond in kind. And in time they may surely add you to my cookie list!");
+ next;
+
+ mesn "Narrator";
+ mesc(l("This Cookie Master rewards people who contribute and develop this world."), 9);
+ next;
+ mes col(l("If you want to be rewarded, help us in making this world a better place."), 9);
+ next;
+ mesc(l("When you see something that looks more like a bug than a feature, report it on https://forums.themanaworld.org or try to contact a game contributor."), 9);
+ next;
+ mesc(l("Any contribution to the game (translations, graphics creation/edition, concepts, coding/scripting, etc...) is rewarded!"), 9);
+
+ mes "";
+ mesn;
+ mesq l("So, do you still want a cookie?");
+ next;
+
+ menu
+ l("I wish I helped your friends, because I'd really, really like a cookie."), -,
+ l("You tell me. Do I deserve a cookie?"), L_Check;
+
+ mes "";
+ mesn;
+ mesq l("Don't worry, I'm sure you will help them soon enough!");
+ next;
+
+ goto L_Bye;
+
+L_Presentation:
+ mes "";
+ mesn;
+ mesq l("For a chef? Who said I was a... Oh right, I am.");
+ next;
+ mesq l("I was sent here with a task. I can give you a perfect, wonderful, magnificent, superbly well shaped... Cookie!");
+ next;
+ mesq l("But...");
+ next;
+
+ goto L_TaskExpanation;
+
+L_Reward:
+ mesq l("Yes! @@ is written on my cookie list.", strcharinfo(0));
+ next;
+ mesq l("That's quite surprising... You don't look very helpful.");
+ next;
+ mesq l("Anyway, here, have a cookie!");
+
+ inventoryplace DeliciousCookie, 1;
+
+ setq General_Cookies, 1;
+ getnameditem DeliciousCookie, strcharinfo(0);
+ npctalk3 l("You receive a @@!", getitemlink(DeliciousCookie));
+
+ next;
+ mesq l("I'm sure you'll appreciate its effect, but be careful, these cookies are rare, and you'll need to help the community again before being able to receive another one.");
+ next;
+
+ goto L_Bye;
+
+L_Control:
+ mes "";
+ mesn;
+ mesq l("C'mon, don't be like that and loosen up! Don't you want to know who's behind all of this?!");
+ next;
+
+ menu
+ l("Why not, this might get interesting."), L_Friends,
+ l("Fine, tell me, who are these all important friends of yours?"), -,
+ l("No, and I gotta go, see you."), L_Kick;
+
+ mes "";
+ mesn;
+ mesq l("Don't belittle me, my work is deserving of the highest esteem.");
+ next;
+
+L_Kick:
+ closeclientdialog;
+
+ npctalk3 l("No cookie for you!");
+ warp "001-1", 39, 41;
+
+ close;
+
+L_GetCookie:
+ mesq l("Hey, I'm not a Keebler Elvis! You won't have another one by stalking me like that!");
+ next;
+ mesq l("If you want another cookie, you know what to do!");
+ next;
+ mesq l("Now, move!");
+ next;
+
+ goto L_Bye;
+
+L_LostCookie:
+ mesq l("Hey, how was the...");
+ next;
+ mesq l("Wait a minute, where's the cookie I gave you?");
+ next;
+ mesq l("I'm talking about the cookie inside which I put all my love!");
+ next;
+ mesq l("The best, the wonderful, the most choice cookie among all others, the...");
+ next;
+ // Angry emote
+ mesq l("Grr...");
+ next;
+ mesq l("You're lucky that I'm a generous person, here's another one.");
+ next;
+ mesq l("This is the last one. If you use it again out of clumsiness, I will use your soft moist parts in the concoction of my next cookie batch.");
+ next;
+
+ inventoryplace DeliciousCookie, 1;
+ getnameditem DeliciousCookie, strcharinfo(0);
+
+ npctalk3 l("You receive a @@!", getitemlink(DeliciousCookie));
+
+L_Bye:
+ closeclientdialog;
+
+ npctalk3 l("See you later!");
+
+ close;
+
+OnInit:
+ .distance = 2;
+ end;
+}
diff --git a/npc/001-1/devis.txt b/npc/001-1/devis.txt
new file mode 100644
index 00000000..d3af5956
--- /dev/null
+++ b/npc/001-1/devis.txt
@@ -0,0 +1,99 @@
+// Evol scripts.
+// Authors:
+// Reid
+// Travolta
+// Description:
+// La Johanne crew member.
+
+001-1,193,109,0 script Devis#001-1 NPC_DEVIS_ARTIS,{
+
+ function say_random_greeting {
+ .@enora = getq(ArtisQuests_Enora);
+ if (.@enora == 0)
+ {
+ speech
+ l("Enora, from the Legion of Aemil, has been warned that you were aboard."),
+ l("She is waiting for you on the dock.");
+
+ return;
+ }
+
+ .@rand = rand(5);
+ if (.@rand == 0) goodbye;
+ else if (.@rand == 1)
+ {
+ speech S_LAST_NEXT,
+ l("A sunny and hot day,"),
+ l("a quiet place,"),
+ l("a ground!"),
+ l("What else do you need?");
+ }
+ else if (.@rand == 2) npctalk3 l("A-hoy matey!");
+ else if (.@rand == 3) npctalk3 l("We are glad captain Nard has let you join the crew!");
+ else if (.@rand == 4) npctalk3 l("Howdy?");
+
+ return;
+ }
+
+ function face_to_PC {
+ getmapxy(.@map$, .@cx, .@cy, 0);
+ @Devis_old_dir = .dir;
+ npc_turntoxy(.@cx, .@cy);
+
+ return;
+ }
+
+ function local_close {
+ if (@Devis_old_dir > 0)
+ {
+ .dir = @Devis_old_dir;
+ }
+ npc_resumemove;
+
+ close;
+ }
+
+ @Devis_old_dir = -1;
+
+ npc_pausemove;
+ face_to_PC;
+ say_random_greeting;
+ local_close;
+
+OnTimer1000:
+ dographmovestep;
+
+OnInit:
+ .distance = 5;
+ initmovegraph "start_pos", 193, 109,
+ "dock_ent", 194, 109,
+ "dock_right", 192, 114, 195, 115,
+ "dock_left", 151, 103, 160, 106,
+ "dock_bot", 161, 119, 163, 127,
+ "dock_top", 184, 91, 195, 92,
+ "ship_ent", 19, 28,
+ "ship_sit", 28, 26,
+ "dock_mid", 174, 105;
+
+ setmovegraphcmd "start_pos", "dock_mid", 1, "dir 0; wait 2",
+ "dock_ent", "dock_right", 1, "dir 0; wait 1; dir 2; wait 1; dir 0; wait 1; dir 6; wait 5",
+ "dock_ent", "dock_mid", 2, "moveon",
+ "dock_bot", "dock_left", 1, "dir 6; wait 8",
+ "dock_bot", "dock_mid", 2, "moveon",
+ "dock_left", "dock_bot", 1, "dir 0; wait 1; dir 2; wait 1; dir 0; wait 1; dir 6; wait 5",
+ "dock_left", "dock_mid", 2, "moveon",
+ "dock_right", "dock_ent", 1, "warp 001-2-21 ship_ent",
+ "dock_right", "dock_mid", 2, "moveon",
+ "dock_top", "dock_mid", 1, "moveon",
+ "dock_mid", "dock_bot", 1, "dir 0; wait 1; dir 2; wait 1; dir 0; wait 1; dir 6; wait 5",
+ "dock_mid", "dock_right", 1, "dir 0; wait 1; dir 2; wait 1; dir 0; wait 1; dir 6; wait 5",
+ "dock_mid", "dock_left", 1, "dir 0; wait 1; dir 2; wait 1; dir 0; wait 1; dir 6; wait 5",
+ "dock_mid", "dock_top", 1, "dir 0; wait 1; dir 2; wait 1; dir 0; wait 1; dir 6; wait 5",
+ "dock_mid", "dock_ent", 2, "warp 001-2-21 ship_ent",
+ "ship_ent", "ship_sit", 1, "dir 4; sit; wait 14; stand; wait 1",
+ "ship_sit", "ship_ent", 1, "warp 001-1 dock_ent";
+
+ firstmove "wait 8", "start_pos";
+ initnpctimer;
+}
+
diff --git a/npc/001-1/doors.txt b/npc/001-1/doors.txt
new file mode 100644
index 00000000..c4288328
--- /dev/null
+++ b/npc/001-1/doors.txt
@@ -0,0 +1,61 @@
+// Evol scripts.
+// Authors:
+// 4144
+// Reid
+// Description:
+// Doors warp and animations in map 001-1
+//
+
+001-1,57,41,0 script #Warp20 NPC_HIDDEN,0,0,{
+OnTouch:
+ .@enora = getq(ArtisQuests_Enora);
+
+ if (.@enora < 4)
+ {
+ narrator S_LAST_NEXT,
+ l("The door to the legion building is temporarily closed.");
+ }
+ else
+ {
+ warp "001-2-33", 34, 46;
+ }
+
+ closeclientdialog;
+ close;
+
+OnUnTouch:
+ doevent "#Door20::OnUnTouch";
+}
+
+001-1,57,41,0 script #Door20 NPC_ARTIS_DOOR,2,3,{
+ close;
+
+OnTouch:
+ .@enora = getq(ArtisQuests_Enora);
+ .@legion = getq(Artis_Legion_Progress);
+ .@brotherhood = getq(General_Brotherhood);
+ if (.@enora < 4)
+ {
+ setfakecells 57, 41, 1;
+ end;
+ }
+ if (.@legion == 6 && !.@brotherhood)
+ addtimer 30, "Sophialla#001-1::OnLegionComplete";
+ setfakecells 57, 41, 0;
+ doorTouch;
+
+OnUnTouch:
+ .@enora = getq(ArtisQuests_Enora);
+ if (.@enora < 4)
+ {
+ end;
+ }
+ doorUnTouch;
+
+OnTimer340:
+ doorTimer;
+
+OnInit:
+ doorInit;
+}
+
diff --git a/npc/001-1/elmo.txt b/npc/001-1/elmo.txt
new file mode 100644
index 00000000..a8c3fb3d
--- /dev/null
+++ b/npc/001-1/elmo.txt
@@ -0,0 +1,19 @@
+// Evol scripts.
+// Author:
+// Reid
+// Description:
+// Sailor of Nard's La Johanne ship.
+
+001-1,185,107,0 script Elmo#001-1 NPC_ELMO_ARTIS,{
+ speech
+ l("Oh hey!"),
+ l("If you feel bored or anxious, you can always ask some of the people around Artis if they need your help.");
+ l("It's better than running around in circles doing nothing.");
+
+ close;
+
+OnInit:
+ .distance = 2;
+ end;
+}
+
diff --git a/npc/001-1/enora.txt b/npc/001-1/enora.txt
new file mode 100644
index 00000000..d676407f
--- /dev/null
+++ b/npc/001-1/enora.txt
@@ -0,0 +1,461 @@
+// Evol scripts.
+// Author:
+// Reid
+// Description:
+// Newbie guide for Artis.
+// Variables:
+// ArtisQuests_Enora
+// Values:
+// 0 Default.
+// 1 BlackSmith quest delivered.
+// 2 Chelios Quest given.
+// 3 Chelios Quest done.
+// 4 BlackSmith gave the sword.
+// 5 Light Armor Shop quest delivered.
+// 6 Light Armor Shop gave the cloths.
+// 7 Market quest delivered.
+// 8 Q'Pid merchant.
+// 9 Market gave the potion.
+// 10 Hill quest delivered.
+// 11 Fluffy killed.
+
+001-1,176,113,0 script Enora#001-1 NPC_HUMAN_FEMALE_NOOB,{
+
+ function enora_don {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Don is renowned throughout the entire land of Aemil for his blacksmithing skills, and he is here, in Artis."),
+ l("It's a great honor for us, at the Legion, to hold the security of his business!"),
+ l("If you search for him you should look in the west of the city, it's the first house just after the left bridge, you can't miss it!"),
+ l("Chelios, his apprentice, practices outside, mostly.");
+
+ return;
+ }
+
+ function enora_legion {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("The Legion of Gasaron are a group of warriors who vowed to protect and serve their neighbours."),
+ l("We hold various training sessions, and also have a task board with a heap of things to do for the city and its surroundings."),
+ l("It's a good place to earn money, it can also help you to travel throughout the land!"),
+ l("Each big city hosts a Legion building, Artis' building is located in the north-west.");
+
+ return;
+ }
+
+ function enora_light_armor {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("The light armor shop is ran by Resa, she is part of the Merchant Guild of Artis."),
+ l("She is very skilled when it comes to weaving an ordinary piece of cloth into a wonderful work of art!"),
+ l("Her shop is on the west side of the city, between the Legion building and the library.");
+
+ return;
+ }
+
+ function enora_market {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("The market is located in the south-east of Artis, it is known as Merchant Guild's exhibit."),
+ l("You need to be a member of the Merchant Guild to have a chance there."),
+ l("And I bet you don't know who is in charge of monitoring the security of this place?");
+
+ switch (select(l("The Legion?"), l("I don't know.")))
+ {
+ case 1:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("You hit the nail on the head, it's the Legion of Gasaron!"),
+ l("Our main responsibility in the city is to protect the Merchant Guild.");
+ break;
+ case 2:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Cat got your tongue?"),
+ l("..."),
+ l("Your brain liquified to match the level of a piou! It's the Legion of Gasaron.");
+ break;
+ }
+ return;
+ }
+
+ function enora_hill {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Go north from here until you find the dock warehouse, cross the bridge to the west side of the canal, continue north until you reach another bridge then cross it to the east side of the canal."),
+ l("You should arrive at a park with a hill nearby.");
+
+ return;
+ }
+
+ function enora_memories {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("It's so exciting to meet somebody with amnesia!"),
+ l("Can't you remember anything at all? Or do you have some memories of your past?"),
+ l("What happens when you try to think about it?"),
+ l("Does your mind go all fuzzy or does it feel like your head is going to explode??"),
+ l("Try doing that now!");
+
+ switch (select(l("Okay, but there won't be any explosions."),
+ l("Don't get too excited about it...")))
+ {
+ case 1:
+ narrator S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("You concentrate and try to summon old memories from within your mind."),
+ l("You feel numb and everything around you looks foggy, but you can recall the feeling of the cold hard wood of your raft on a stormy night."),
+ l("A headache hits you and you lose your concentration.");
+
+ speech S_LAST_NEXT,
+ l("So? You haven't exploded yet! Are you getting anything?");
+
+ select(l("Not really. All I got was a headache..."));
+
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("It's like your memories are locked away in your head! Cool!");
+
+ break;
+ case 2:
+ mes "";
+ break;
+ }
+
+ speech S_LAST_NEXT,
+ l("Ok, sorry. Back to our fluffies.");
+
+ return;
+ }
+
+ function enora_reward {
+ .@exp_reward = getarg(0);
+ .@zeny_reward = getarg(1);
+
+ quest_xp(.maxLevel, .@exp_reward);
+ quest_gp(.maxLevel, .@zeny_reward);
+
+ narrator S_LAST_NEXT,
+ l("You received @@ EXP and @@ E.", .@exp_reward, .@zeny_reward);
+
+ // This is silent (can be caught as a string variable)
+ faction_addrep("Legion", 10);
+ return;
+ }
+
+ function enora_first_quest {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("You probably don't have much business in this city as you don't remember who you are."),
+ l("So I was going to ask if maybe you would be interested in giving me a hand with a few errands.");
+
+ switch (select(l("I guess so. What's in it for me?"),
+ l("Of course! What do you need?")))
+ {
+ case 1:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Some tasks will help you become aquainted with Artis. Trust me.");
+ break;
+ case 2:
+ mes "";
+ break;
+ }
+
+ speech S_LAST_NEXT,
+ l("I asked Don our blacksmith to prepare a black iron sword for morning, he should be done by now."),
+ l("Go meet him, and take the package to me, it's an easy task."),
+ l("You will be able to find Don's house in the west of the city, it's the first house just after the bridge on the left, you can't miss it!"),
+ l("A young apprentice called Chelios might be waiting outside, speak to him, and return the package to me.");
+ emotion E_HAPPY;
+
+ setq ArtisQuests_Enora, 1;
+
+ closeclientdialog;
+ goodbye;
+ close;
+ }
+
+ function enora_second_quest {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Thank you for this commission, Chelios is as good as Don when it comes to forging metal."),
+ l("By the way, did you ever talk with Don?"),
+ l("If so, I hope that he didn't give you any hard time, sometimes he can get up on the wrong side of the bed he becomes an embittered and grumpy old man..."),
+ l("Poor Chelios, I don't envy him..."),
+ l("So, everything went fine?");
+
+ switch (select(l("Chelios managed to do excellent work."),
+ l("The old man seemed to be senile.")))
+ {
+ case 1:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT, l("Fine, let's see his work...");
+ narrator S_LAST_NEXT, l("Enora is carefully inspecting the sword.");
+ speech S_LAST_NEXT,
+ l("Excellent!"),
+ l("The detail and craftsmanship that went into this sword can only be accomplished by the most practiced of blacksmiths.");
+
+ break;
+ case 2:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("He may not have all of his wits but keep in mind one thing:"),
+ l("Don is renowned throughout the entire land for his blacksmith skills, and he is here, in Artis."),
+ l("It's a great honor for us, at the Legion, to hold the security of his business!");
+
+ break;
+ }
+
+ speech S_LAST_NEXT,
+ l("After this small overview of Artis, what do you think of our city?"),
+ l("The Legion of Gasaron is in charge of the security of the intramural part of our cities."),
+ l("The control and administration of the cities passes hands sometimes. You may find the Mana Order or the Brotherhood in charge instead of us at some point!"),
+ l("But we are quite lucky here, outside of some tipsy travelers there are no big problems around here, it's not like the capital, Esperia."),
+ l("Now that I think about it, I have another task for you. I asked Resa from the light armor shop to craft me some new clothes, she is a bit far from here, I can't go there because I need to watch the dock."),
+ l("Her shop is on the west side of the city, between the Legion building and the library.");
+
+ setq ArtisQuests_Enora, 5;
+ enora_reward(60, 100);
+
+ closeclientdialog;
+ npctalk3 l("Thank you very much!");
+ close;
+ }
+
+ function enora_third_quest {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Look how splendid this @@ is!", getitemlink(ArtisTankTop, CamelCottonDye)),
+ l("It's nearly as good as one from Esperia, have you ever been there?"),
+ l("Ah... Sorry, I forgot, again."),
+ l("I mean, you forgot... Well."),
+ l("If you ever find the time, pass by Esperia, it's the greatest city in all of Gasaron!"),
+ l("You can find the building of the Legion of Gasaron there, like in any other city, but Esperia is important for us as our headquarters are there.");
+
+ do
+ {
+ .@q = select(l("Do you still need help?"),
+ l("What is this \"legion\"?"));
+ switch (.@q)
+ {
+ case 1:
+ break;
+ case 2:
+ enora_legion;
+ break;
+ }
+ } while (.@q == 2);
+
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Oh yes, I have one last errand for you, Q'Pid in the market sells potions."),
+ l("It has been some days now since I asked her for a box of @@s, but she hasn't delivered anything yet.", getitemlink(PiberriesInfusion)),
+ l("Please try to figure out what went wrong with this order and bring me those potions."),
+ l("You will be able to find her in the market in the south-west of Artis.");
+
+ setq ArtisQuests_Enora, 7;
+ enora_reward(40, 125);
+
+ closeclientdialog;
+ npctalk3 l("Thank you very much!");
+ close;
+ }
+
+ function enora_fourth_quest {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Awesome!");
+
+ speech S_LAST_NEXT,
+ l("I have one more task for you. Trozz, another member of the Legion, sent me a letter earlier today."),
+ l("Some citizens are worried about the growing number of Fluffies on the hill of Artis."),
+ l("Children play there and can be badly hurt if they get too close to a Fluffy's nest."),
+ l("It would have been easy for me to handle it but if you do it, you can earn some respect by killing Fluffies instead of their natural predators!"),
+ l("Besides, I need to be here to watch out for thieves while La Johanne is docked."),
+ l("You look confident. I will give you my old gear as reward and acknowledgment for your time... and take these potions as well!");
+
+ set ArtisFluffyKilled, 0;
+
+ inventoryplace TrainingGladius, 3;
+ getitem TrainingGladius, 1;
+ getitem2 ArtisTankTop, 1, 1, 0, 0, 5005, 0, 0, 0;
+ getitem PiberriesInfusion, 5;
+ setq ArtisQuests_Enora, 10;
+ enora_reward(80, 175);
+
+ speech S_LAST_NEXT,
+ l("Do you know where the hill is?");
+
+ switch (select(l("Yes I do."),
+ l("Please guide me.")))
+ {
+ case 1:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Perfect! I will wait for you here.");
+ break;
+ case 2:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Follow the up-stream and cross the canal twice using the two bridges north from here."),
+ l("The hill is located on the north-east of Artis.");
+ break;
+ }
+
+ closeclientdialog;
+ npctalk3 l("Thank you very much!");
+ close;
+ }
+
+ function enora_hill_cleaned {
+ if (getq2(ArtisQuests_Enora) < 9)
+ {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Oh no, you still have @@ Fluffies to kill.", 10 - getq2(ArtisQuests_Enora));
+
+ return;
+ }
+ else if (getq2(ArtisQuests_Enora) < 10)
+ {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Only one more Fluffy to kill and it's done!");
+
+ return;
+ } else if (getq(ArtisQuests_Enora) == 10) {
+ inventoryplace TreasureKey, 1;
+ }
+
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("I cannot find the words to express my gratitude for your hard work."),
+ l("Keep the sword and the jacket, you deserved them!"),
+ l("You now also have access to the Legion building. Good job, you earned it."),
+ l("We hold various training sessions, and also have a task board with a heap of things to do for the city and its surroundings."),
+ l("It's a very good place if you want to make some more money.");
+ emotion E_WINK;
+
+ if (getq(ArtisQuests_Enora) == 10)
+ {
+ setq ArtisQuests_Enora, 11;
+ enora_reward(140, 500);
+ getitem TreasureKey, 1;
+ mesn;
+ mesq l("Also, here is a %s. If you find a Treasure Chest somewhere, you can open it with this!", getitemlink(TreasureKey));
+ next;
+ }
+
+ return;
+ }
+
+ function enora_quest_complete {
+ switch (getq(ArtisQuests_Enora))
+ {
+ case 4:
+ enora_second_quest;
+ break;
+ case 6:
+ enora_third_quest;
+ break;
+ case 9:
+ enora_fourth_quest;
+ break;
+ default:
+ break;
+ }
+
+ return;
+ }
+
+ function enora_paid_potions {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Are you sure that these are my potions?");
+
+ if (askyesno() == ASK_YES)
+ {
+ delitem PiberriesInfusion, 5;
+ enora_fourth_quest;
+ }
+
+ return;
+ }
+
+ if (getq(ArtisQuests_Enora) == 0)
+ {
+ speech S_LAST_NEXT,
+ l("Hey! You must be @@.", strcharinfo(0)),
+ l("Julia told me how they found you in the sea, on a raft with a logo of..."),
+ l("...I mean log! Made of log!"),
+ l("I also heard you lost all your memories? That's a shame."),
+ l("I'm sure you would have some interesting stories to tell!");
+ }
+ else
+ {
+ speech S_LAST_NEXT,
+ l("Hey @@!", strcharinfo(0)),
+ l("What brings you here today?");
+ }
+
+ do
+ {
+ .@q = getq(ArtisQuests_Enora);
+ select
+ rif(.@q == 0, l("She told me that you had some tasks for me.")),
+ rif(.@q == 4 || .@q == 6 || .@q == 9, l("I have your package.")),
+ rif(.@q == 8 && countitem(PiberriesInfusion) >= 5, l("I have your package.")),
+ rif(.@q >= 10, l("I cleaned up the hill.")),
+ rif(.@q >= 10, l("How many Fluffies did I kill on the hill?")),
+ rif(.@q >= 1, l("Who is Don?")),
+ rif(.@q >= 5, l("Where is the light armor shop?")),
+ rif(.@q >= 7, l("Where is the market?")),
+ rif(.@q >= 10, l("Where is the hill?")),
+ rif(.@q >= 1, l("What is this \"legion\"?")),
+ l("I wish I could remember something..."),
+ rif(.@q != 0, l("Nothing."));
+
+ switch (@menu)
+ {
+ case 1:
+ enora_first_quest;
+ break;
+ case 2:
+ enora_quest_complete;
+ break;
+ case 3:
+ enora_paid_potions;
+ break;
+ case 4:
+ enora_hill_cleaned;
+ break;
+ case 5:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("You killed @@ Fluffies.", getq2(ArtisQuests_Enora));
+ if (getq2(ArtisQuests_Enora) > 8)
+ {
+ mesq l("If you continue there will be none left!");
+ next;
+ }
+ break;
+ case 6:
+ enora_don;
+ case 7:
+ enora_light_armor;
+ break;
+ case 8:
+ enora_market;
+ break;
+ case 9:
+ enora_hill;
+ break;
+ case 10:
+ enora_legion;
+ break;
+ case 11:
+ enora_memories;
+ break;
+ case 12:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Please come back anytime!");
+ }
+ } while (@menu != 12);
+
+ closeclientdialog;
+ goodbye;
+ close;
+
+OnInit:
+ .distance = 5;
+ .maxLevel = 20;
+ end;
+}
+
+function script EnoraKills {
+ if (getq(ArtisQuests_Enora) == 10
+ && killedrid == Fluffy
+ && strcharinfo(PC_MAP) == "001-1"
+ && getq2(ArtisQuests_Enora) < 10)
+ {
+ setq(ArtisQuests_Enora, 10, getq2(ArtisQuests_Enora) + 1);
+ }
+ return;
+}
+
diff --git a/npc/001-1/eugene.txt b/npc/001-1/eugene.txt
new file mode 100644
index 00000000..4f1e25fd
--- /dev/null
+++ b/npc/001-1/eugene.txt
@@ -0,0 +1,82 @@
+// Evol scripts.
+// Authors:
+// Reid
+// Travolta
+// Description:
+// Fishman NPC
+// Quest variable:
+// ArtisQuests_Fishman
+// Quest stages:
+// 0 - not started
+// 1 - Eugene asked for items
+// 2 - completed
+
+001-1,113,120,0 script Eugene NPC_EUGENE,{
+
+ .BaitID = SmallTentacles;
+ .BaitCount = 10;
+
+ narrator S_LAST_NEXT,
+ l("You see a raijin boy, sitting on the edge of the dock."),
+ l("He's holding a fishing rod, while gazing out at the sea.");
+
+ .@q = getq(ArtisQuests_Fishman);
+ if (.@q == 1) goto L_CheckItems;
+ if (.@q == 2) goto L_QuestDone;
+
+ speech S_LAST_BLANK_LINE,
+ l("Ahoi."),
+ l("Hey, check out my brand new fishing rod. I bought it just today."),
+ l("I was so excited, I wanted to try it as soon as possible."),
+ l("So in a hurry, I forgot to take enough bait for fishing."),
+ l("Be a friend and bring me @@ @@.", .BaitCount, getitemlink(.BaitID));
+
+ switch (select(l("I'll be back in no time."),
+ l("Sorry, I'm doing other things at the moment.")))
+ {
+ case 1:
+ setq ArtisQuests_Fishman, 1;
+ speech S_FIRST_BLANK_LINE,
+ l("Thank you. I'll wait here.");
+ close;
+ case 2:
+ speech S_FIRST_BLANK_LINE,
+ l("But I'm almost out of @@...", getitemlink(.BaitID));
+ close;
+ }
+
+L_CheckItems:
+ if (countitem(.BaitID) < .BaitCount)
+ {
+ speech
+ l("Sorry, but you don't have what I need."),
+ l("I need @@ @@.", .BaitCount, getitemlink(.BaitID));
+ close;
+ }
+
+ speech
+ l("That's exactly what I needed!"),
+ l("To thank you, accept my old fishing rod."),
+ l("It's not as good as my new one, but still very useful."),
+ l("Just look at that water! There's a whole bunch of fish down there."),
+ l("Oh, and you will need this book too, it will help you learn the basics of fishing."),
+ l("You might even get lucky, and get a @@.", getitemlink(GrassCarp)),
+ l("Have a good time fishing!");
+
+ delitem .BaitID, .BaitCount;
+ getitembound FishingRod, 1, IBT_ACCOUNT;
+ getitem FishingGuideVolI, 1;
+ setq ArtisQuests_Fishman, 2;
+ close;
+
+L_QuestDone:
+ // Idea for future: Eugene telling fishman jokes.
+ speech
+ l("Ahoy, @@!", strcharinfo(0)),
+ l("Are the fish biting today?");
+ close;
+
+OnInit:
+ .distance = 2;
+ end;
+}
diff --git a/npc/001-1/fexil.txt b/npc/001-1/fexil.txt
new file mode 100644
index 00000000..1122f051
--- /dev/null
+++ b/npc/001-1/fexil.txt
@@ -0,0 +1,143 @@
+// Evol scripts.
+// Author:
+// Reid
+// Description:
+// Newbie merchant.
+// Variables:
+// ArtisQuests_Fexil
+// Quest states:
+// 0 -- not started
+// 1 -- Lloyd warned about the quest
+// 2 -- Fexil explain what he needs
+// 3 -- Fexil buy every fur that the pc bring to him
+
+001-1,47,134,0 script Fexil#001-1 NPC_ELVEN_MAN_TRADER,{
+
+ function fexil_quest {
+ speech S_LAST_NEXT,
+ l("You know, the life of the merchant is hard. I really hope that Artis and the Merchant Guild will help me to succeed."),
+ l("Maybe you too you could help me?"),
+ l("I want to be the first merchant of this square to sell clothes made from @@s!", getitemlink(FluffyFur)),
+ l("I will buy all of the fur that you will bring me at a good price, let's say, 15 E piece."),
+ l("Do we have a deal?");
+
+ switch (select(l("Ok."), l("I don't want to be part of this joke.")))
+ {
+ case 1:
+ setq ArtisQuests_Fexil, 3;
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Awesome! I will wait for you here.");
+ break;
+ case 2:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Oh... Ok, I will be around here if you change your mind.");
+ break;
+ }
+ return;
+ }
+
+ mesn;
+ mesq l("Greetings traveler.");
+ next;
+ mesq l("I have some clothes and other things for you at a fine price!");
+ next;
+ mesq l("What I sell comes from every corner of Gasaron.");
+ next;
+ mesq l("Interested?");
+ next;
+
+ if (getq(ArtisQuests_Fexil) == 1)
+ {
+ select(l("I have your pass from the Merchant Guild."));
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Oh! You saved me, I was too afraid to unpack my stuff without this pass."),
+ l("Hey, I remember you, we were on the same boat, you are the castaway.");
+
+ switch (select(l("Yes I am."),
+ l("You're confusing me with someone else.")))
+ {
+ case 1:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Oh sure I remember you."),
+ l("The travel was fine for you? It was terrible for me, I was sea-sick.");
+ break;
+ case 2:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Ah, I didn't have much sleep, it's possible.");
+ break;
+ }
+ setq ArtisQuests_Fexil, 2;
+ fexil_quest;
+
+ closeclientdialog;
+ goodbye;
+ close;
+ }
+
+ .@fexil = getq(ArtisQuests_Fexil);
+
+ select
+ l("OK, let's trade."),
+ rif(.@fexil == 2, l("Do you still need help?")),
+ rif(.@fexil > 2 && countitem(FluffyFur) > 0, l("I have some fur for you.")),
+ l("No. Sorry.");
+
+ switch (@menu)
+ {
+ case 1:
+ closeclientdialog;
+ shop "Bag#001-1";
+ close;
+
+ case 2:
+ mes "";
+ fexil_quest;
+ break;
+
+ case 3:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Awesome. How many of those do you want to give me?");
+
+ do
+ {
+ input .@amount;
+ if (.@amount < 1)
+ {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Please enter a valid amount.");
+ continue;
+ }
+ if (.@amount > countitem(FluffyFur))
+ {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("You don't have enough @@s on you.", getitemlink(FluffyFur));
+ continue;
+ }
+
+ break;
+ } while (1);
+
+ .@price = 15 * .@amount;
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Deal, I offer you @@ E!", .@price);
+
+ delitem FluffyFur, .@amount;
+ Zeny += .@price;
+
+ break;
+
+ case 4:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Oh... Well, I just started to trade... Thus my technique may not be the best."),
+ l("Anyway, if you ever feel interested, just check my bag!");
+ break;
+ }
+
+ closeclientdialog;
+ goodbye;
+ close;
+
+OnInit:
+ .distance = 2;
+ end;
+}
diff --git a/npc/001-1/flags.txt b/npc/001-1/flags.txt
new file mode 100644
index 00000000..5e70c25a
--- /dev/null
+++ b/npc/001-1/flags.txt
@@ -0,0 +1,17 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Jesusalva
+// Description:
+// The flags supposed to mark Rowboat unmounting spots in Artis
+// THIS IS A PLACEHOLDER!
+
+001-1,200,63,0 script Flag#1 NPC_FLAG_L,{
+ OnTouch:
+ narrator
+ l("You see a suspicious greenish flag. It reminds you of something you seem to have forgotten.");
+ close;
+}
+
+001-1,27,101,0 duplicate(Flag#1) Flag#2 NPC_FLAG_R
+001-1,68,139,0 duplicate(Flag#1) Flag#3 NPC_FLAG_R
diff --git a/npc/001-1/flyingpiou.txt b/npc/001-1/flyingpiou.txt
new file mode 100644
index 00000000..ea48f4dc
--- /dev/null
+++ b/npc/001-1/flyingpiou.txt
@@ -0,0 +1,160 @@
+// Evol scripts.
+// Author:
+// Travolta
+// Description:
+// Pious flying around town
+// 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;
+}
+
+001-1,53,117,0 script #FlyingPiou1 NPC_FLYING_PIOU,{
+
+ 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("Hm, it seems another player is trying to catch the piou, I shouldn't interfere.");
+ end;
+ }
+
+ .@q = getq(ArtisQuests_CatchPiou);
+ if (.@q != 1)
+ {
+ mesn "Narrator";
+ mesc(l("You scare the piou, but let it go."), 9);
+ close;
+ }
+
+ .@tick = gettimetick(1);
+ if (.@tick < .LastTimeTouched + min(4, ArtisQuests_CatchPiou_Difficulcy
+ + @ArtisQuests_CatchPiouTries / 3))
+ {
+ message strcharinfo(0), l("Dang, I scared it! More patience, @@, more patience.", strcharinfo(0));
+ .LastTimeTouched = .@tick;
+ specialeffect(33, SELF);
+ 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("You caught the piou, but it's trying to escape from you. You'd better hurry back to Salem."), 9);
+ set getvariableofnpc(.LastPiouHunter$, .@trader$), strcharinfo(0);
+ set getvariableofnpc(.PiouEscapedMessage$, .@trader$), l("Oh no, the piou escaped!");
+ set getvariableofnpc(.LastPiouHunterID, .@trader$), .@charid;
+ set getvariableofnpc(.PiouCaught, .@trader$), 1;
+ donpcevent .@trader$ + "::OnPiouFlee";
+ specialeffect(26, SELF);
+ close2;
+ disablenpc strnpcinfo(3);
+ close;
+ }
+ else
+ {
+ setarray .RandomFailureMessages$[0], l("So close!"), l("It escaped!"), l("Almost got it!"), l("Oh, the little...");
+ .@r = rand(getarraysize(.RandomFailureMessages$));
+ message strcharinfo(0), .RandomFailureMessages$[.@r];
+ .speed = max(140, 200 - 10 * (@ArtisQuests_CatchPiouTries +
+ ArtisQuests_CatchPiou_Difficulcy));
+ specialeffect(33, SELF);
+ }
+ end;
+
+OnHour00:
+ .LastTimeTouched = 0;
+ end;
+
+OnTimer1000:
+ dographmovestep;
+
+OnInit:
+ .distance = 5;
+ .walkmask = WALK_WATER;
+ // .debug = 1;
+
+ initmovegraph "market_start", 53, 117,
+ "fountain", 79, 75, 102, 91,
+ "river_bank_1", 107, 94, 117, 102,
+ "river_bank_2", 117, 110,
+ "chelios_right", 100, 112, 113, 118,
+ "chelios_left", 80, 95, 93, 111,
+ "market_right", 74, 114, 83, 121,
+ "market_center", 50, 113, 66, 121,
+ "market_left", 36, 120, 42, 128,
+ "batiment_inside", 48, 138, 65, 106,
+ "batiment_behind", 33, 90, 41, 103,
+ "library_front", 42, 82, 63, 90,
+ "taree_yard", 69, 82,
+ "taree_behind", 61, 62, 76, 71,
+ "townhall_behind", 73, 40, 93, 55,
+ "townhall_right", 99, 55, 106, 60,
+ "inn_behind", 107, 63, 123, 76
+ ;
+
+ setmovegraphcmd "fountain", "river_bank_1", 1, "call ArtisFlyingPiouLogic",
+ "river_bank_1", "river_bank_2", 1, "call ArtisFlyingPiouLogic",
+ "river_bank_2", "chelios_right", 2, "call ArtisFlyingPiouLogic",
+ "chelios_right", "chelios_left", 1, "call ArtisFlyingPiouLogic",
+ "chelios_left", "fountain", 1, "wait 1; call ArtisFlyingPiouLogic",
+ "chelios_left", "market_right", 1, "call ArtisFlyingPiouLogic",
+ "chelios_right", "market_right", 1, "call ArtisFlyingPiouLogic",
+ "market_right", "market_center", 1, "call ArtisFlyingPiouLogic",
+ "market_center", "batiment_inside",1, "call ArtisFlyingPiouLogic",
+ "batiment_inside","library_front", 1, "call ArtisFlyingPiouLogic",
+ "library_front", "taree_yard", 1, "call ArtisFlyingPiouLogic",
+ "library_front", "taree_behind", 1, "call ArtisFlyingPiouLogic",
+ "library_front", "batiment_behind",1, "call ArtisFlyingPiouLogic",
+ "batiment_behind","market_left", 1, "wait 3; call ArtisFlyingPiouLogic",
+ "market_left", "market_center", 1, "call ArtisFlyingPiouLogic",
+ "taree_yard", "fountain", 1, "call ArtisFlyingPiouLogic",
+ "taree_behind", "townhall_behind",1, "call ArtisFlyingPiouLogic",
+ "townhall_behind","townhall_right", 1, "call ArtisFlyingPiouLogic",
+ "townhall_right", "inn_behind", 1, "call ArtisFlyingPiouLogic",
+ "inn_behind", "fountain", 1, "wait 2; call ArtisFlyingPiouLogic",
+ "inn_behind", "river_bank_1", 1, "call ArtisFlyingPiouLogic",
+ "market_start", "batiment_inside",1, "call ArtisFlyingPiouLogic"
+ ;
+
+ firstmove "speed 200", "market_start";
+ initnpctimer;
+
+ .LastPlayerTouched = -1;
+ end;
+}
diff --git a/npc/001-1/harbours.txt b/npc/001-1/harbours.txt
new file mode 100644
index 00000000..f1db3fce
--- /dev/null
+++ b/npc/001-1/harbours.txt
@@ -0,0 +1,84 @@
+// Evol scripts.
+// Author:
+// Reid
+// Description:
+// Harbour animated tiles.
+// Animation:
+// Length: 1680
+// Values:
+// 2 Hook moving down.
+// 4 Hook moving up.
+// 6 Hook down.
+// 8 Hook up.
+
+001-1,183,85,0 script #Harbour1 NPC_HARBOUR_WHEEL_BOX,{
+ harbourClic;
+
+OnTimer1670:
+ harbourTimer;
+
+OnInit:
+ .distance = 1;
+ .alwaysVisible = true;
+ end;
+}
+
+001-1,183,89,0 script #Harbour2 NPC_HARBOUR_WHEEL,{
+ harbourClic;
+
+OnTimer1670:
+ harbourTimer;
+
+OnInit:
+ .distance = 1;
+ .alwaysVisible = true;
+ end;
+}
+
+001-1,198,115,0 script #Harbour3 NPC_HARBOUR_WHEEL_BOX,{
+ harbourClic;
+
+OnTimer1670:
+ harbourTimer;
+
+OnInit:
+ .distance = 1;
+ .alwaysVisible = true;
+ end;
+}
+
+001-1,175,119,0 script #Harbour4 NPC_HARBOUR_WHEEL_BOX,{
+ harbourClic;
+
+OnTimer1670:
+ harbourTimer;
+
+OnInit:
+ .distance = 1;
+ .alwaysVisible = true;
+ end;
+}
+
+001-1,198,92,0 script #Harbour5 NPC_HARBOUR_WHEEL_BOX,{
+ harbourClic;
+
+OnTimer1670:
+ harbourTimer;
+
+OnInit:
+ .distance = 1;
+ .alwaysVisible = true;
+ end;
+}
+
+001-1,151,117,0 script #Harbour6 NPC_HARBOUR_WHEEL,{
+ harbourClic;
+
+OnTimer1670:
+ harbourTimer;
+
+OnInit:
+ .distance = 1;
+ .alwaysVisible = true;
+ end;
+}
diff --git a/npc/001-1/juscare.txt b/npc/001-1/juscare.txt
new file mode 100644
index 00000000..b0d6a98e
--- /dev/null
+++ b/npc/001-1/juscare.txt
@@ -0,0 +1,92 @@
+// Evol scripts.
+// Authors:
+// Reid
+// Travolta
+// Description:
+// Juscare, walking NPC of the Legion of Aemil on the right part of the Agora of Artis.
+
+001-1,118,92,0 script Juscare#001-1 NPC_HUMAN_MALE_LEGION_ARTIS,{
+
+ function shouldTurn {
+ .@tree = findmovegraphlabel("inn_tree");
+ .@table = findmovegraphlabel("inter_inn_fav_table");
+ if (.movepos == .@tree || .movepos == .@table)
+ return 0;
+ return 1;
+ }
+
+ function localClose {
+ if (@Juscar_old_dir > 0)
+ .dir = @Juscar_old_dir;
+ npc_resumemove;
+ close;
+ }
+
+ npc_pausemove;
+ @Juscar_old_dir = -1;
+ if (shouldTurn())
+ {
+ getmapxy(.@map$, .@cx, .@cy, 0);
+ @Juscar_old_dir = .dir;
+ npc_turntoxy(.@cx, .@cy);
+ }
+
+ villagertalk();
+
+ localClose;
+
+OnTimer1000:
+ dographmovestep;
+
+OnInit:
+ .distance = 4;
+ // .debug = 1;
+ initmovegraph
+ "inn_front", 112, 90, 119, 93,
+ "inn_tree", 108, 82,
+ "fountain", 87, 85, 91, 86,
+ "chelios", 93, 109,
+ "chelios_road", 89, 107,
+ "chelios", 93, 109,
+ "to_market", 76, 119,
+ "market", 60, 115, 65, 121,
+ "fishing_spot", 109, 127,
+ "river_bank", 113, 105,
+ "eugene", 112, 115,
+ "inn_door", 118, 89,
+ "inn_doorstep", 118, 88,
+ "inter_inn_doorstep", 29, 43,
+ "inter_inn_2tables", 38, 31,
+ "inter_inn_fav_table", 51, 33;
+
+ // this is not very obvious stuff
+ setmovegraphcmd
+ "inn_front", "inn_door", 1, 0x1, "flags_0 2; dir 4; call open_door #001-1_118_88",
+ "inn_front", "inn_tree", 2, "dir 2; wait 1; sit; wait 1; emote 106; wait 20; stand; wait 1",
+ "inn_front", "river_bank",1, "flags_0 8; flags_1 4",
+ "river_bank", "eugene", 1, 0x4, "moveon",
+ "eugene", "fishing_spot", 1, 0x4, "wait 7",
+ "fishing_spot", "chelios", 1, 0x4, "dir 6; wait 1; emote 103; wait 10",
+ "inn_tree", "inn_door", 1, "flags_1 1; flags_0 2; dir 4; call open_door #001-1_118_88",
+ "inn_tree", "fountain", 2, "dir 4; wait 1; emote 122; wait 10; dir 0; wait 1",
+ "fountain", "chelios_road", "moveon",
+ "chelios_road", "chelios", "dir 6; wait 1; emote 103; wait 7",
+ "chelios", "eugene", "flags_1 28; flags_0 4",
+ "chelios", "to_market", 2, 0x20, "flags_1 20; flags_0 10",
+ "to_market", "market", 1, 0x20, "flags_1 10; flags_0 20; wait 20",
+ "market", "to_market", "moveon",
+ "to_market", "chelios", 1, 0x10, "flags_0 10; dir 6; wait 3",
+ "fishing_spot", "eugene", 1, 0x8, "moveon",
+ "eugene", "river_bank",1, 0x8, "moveon",
+ "river_bank", "inn_front", 1, 0x8, "dir 0; wait 5",
+ "inn_door", "inn_doorstep",1, 0x1, "warp 001-2-28 inter_inn_doorstep; call close_door #001-1_118_88",
+ "inter_inn_doorstep", "inter_inn_2tables", 1, 0x1, "moveon",
+ "inter_inn_2tables", "inter_inn_fav_table", 1, 0x1, "flags_1 2; flags_0 1; dir 6; wait 1; sit; wait 15; stand; wait 1",
+ "inter_inn_fav_table", "inter_inn_2tables", 1, 0x2, "moveon",
+ "inter_inn_2tables", "inter_inn_doorstep", 1, 0x2, "call open_door #001-1_118_88; warp 001-1 inn_doorstep",
+ "inn_doorstep", "inn_door", 1, 0x2, "call close_door #001-1_118_88",
+ "inn_door", "inn_front", 1, 0x2, "flags_1 1; flags_0 2; wait 10";
+
+ firstmove "wait 4", "inn_front";
+ initnpctimer;
+}
diff --git a/npc/001-1/katja.txt b/npc/001-1/katja.txt
new file mode 100644
index 00000000..3a3008cb
--- /dev/null
+++ b/npc/001-1/katja.txt
@@ -0,0 +1,128 @@
+// Evol scripts.
+// Authors:
+// Reid
+// Travolta
+// Description:
+// Little girl playing around the hill on top of the port.
+// She wants you to find her brother.
+// Variables:
+// ArtisQuests_LazyBrother = 19 -- quest var
+// LazyBrother_TreesLeft = 15 -- how many trees left to search
+// LazyBrother_TreeSearched[15] -- whether given tree was searched
+// LazyBrother_TreeWithBrother -- the number of tree where he's hiding
+// Quest states:
+// 0 - quest not started
+// 1 - Katja asked help, searching the trees
+// 2 - Bobo is found, "bad" ending
+// 3 - player decided to tell Katja where her brother is
+// 4 - "good" ending, player helped Katja
+
+001-1,164,44,0 script Katja#001-1 NPC_RAIJIN_GIRL,{
+
+ function QuestReminder {
+ setcam 5920, 960;
+ mesq l("Remember, you have to find my brother on the hill east of here.");
+ next;
+ mesq l("He is probably hiding up one of the trees. Go close to each tree and look up, otherwise you won't notice him.");
+ next;
+ restorecam;
+ }
+
+ .@q = getq(ArtisQuests_LazyBrother);
+ mesn;
+ mesq l("Hey");
+ next;
+ switch(.@q)
+ {
+ case 0:
+ mesq l("You look nice, do you want to help me?");
+ break;
+ case 1:
+ mesq l("Hi, how is it going?");
+ next;
+ select l("Remind me, what should I do?");
+ mes "";
+ mesn;
+ QuestReminder;
+ close;
+ case 2:
+ mesq l("I still didn't find my brother...");
+ close;
+ case 3:
+ mesq l("Did you find my brother?");
+ next;
+ select(l("Yes, and he promised to be home soon."));
+ mes "";
+ mesn;
+ mesq l("Oh thank you so much!");
+ next;
+ mesq l("Please take this @@ for your help.", getitemlink(Aquada)); // Need a different reward.
+ setq ArtisQuests_LazyBrother, 4;
+ getitem Aquada, 1;
+ getexp 500, 0;
+ close;
+ case 4:
+ mesq l("Thank you again for your help!");
+ close;
+ }
+ next;
+
+ switch (select(l("Of course!"),
+ l("What kind of help do you need?"),
+ l("I don't have much time right now.")))
+ {
+ case 1:
+ mes "";
+ mesn;
+ mesq l("Great!");
+ emotion E_JOY;
+ next;
+ break;
+ case 2:
+ mes "";
+ mesn;
+ break;
+ case 3:
+ mes "";
+ mesn;
+ mesq l("Okay, I'll be here, if you change your mind.");
+ emotion E_SAD;
+ close;
+ }
+
+L_Story:
+ mesq l("Mommy sent me to find my brother Bobo.");
+ next;
+ mesq l("He said he is going to climb the highest hill in Artis, which is not far from here.");
+ next;
+ mesq l("Our mommy doesn't allow us to go there, because it's dangerous. But he doesn't listen!");
+ next;
+ mesq l("Can you please go there and find him? He is probably hiding in one of those trees, like always.");
+ next;
+ mesq l("Because of the dense foliage, you need to go up close to the trees so you don't miss him.");
+ next;
+
+ switch (select(l("I will find him, don't worry!"),
+ l("Highest hill in Artis you say? Sounds dangerous, I might fall off.")))
+ {
+ case 1:
+ mes "";
+ mesn;
+ mesq l("Thank you!");
+ mes "";
+ QuestReminder;
+ setq ArtisQuests_LazyBrother, 1;
+ LazyBrother_TreesLeft = 15;
+ close;
+ case 2:
+ mes "";
+ mesn;
+ mesq l("Aw, what will I do now?");
+ close;
+ }
+
+OnInit:
+ .distance = 4;
+ end;
+}
+
diff --git a/npc/001-1/koga.txt b/npc/001-1/koga.txt
new file mode 100644
index 00000000..794909f1
--- /dev/null
+++ b/npc/001-1/koga.txt
@@ -0,0 +1,45 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// The Koga in Artis, only accessable via Rowboat.
+// THIS IS A PLACEHOLDER!
+
+/*001-1,225,59,0 script Koga#001-1 NPC_LA_MARINE,{
+ .@q=getq(General_Narrator);
+ speech
+ l("Ah, whom did you bring here?"),
+ l("Isn't that the one Nard found on a raft in the sea, with the sign of the Legion on it?");
+ next;
+ mesc l("Travel to woodlands?");
+ if (askyesno() == ASK_YES)
+ {
+ speech
+ l("I hope they know what they are doing. So, come on board. I am looking forward to go back to Woodland, haven't been there for a while.");
+ next;
+ closeclientdialog;
+ setpcblock(PCBLOCK_MOVE, false);
+ setmount 0;
+ if (.@q == 1) {
+ warp "000-0-1", 26, 28;
+ close;
+ }
+ warp "008-1-1", 33, 63;
+ dispbottom l("After a tiring, yet fast, travel by Koga, you arrive at @@.", l("Woodlands"));
+ }
+ else
+ {
+ // Return you to beach
+ setpcblock(PCBLOCK_MOVE, false);
+ setmount 0;
+ slide 200, 62;
+ }
+
+ close;
+
+OnInit:
+ .distance = 6;
+ //.alwaysVisible = true;
+ end;
+}*/
+
diff --git a/npc/001-1/lucas.txt b/npc/001-1/lucas.txt
new file mode 100644
index 00000000..558889d2
--- /dev/null
+++ b/npc/001-1/lucas.txt
@@ -0,0 +1,18 @@
+// Evol scripts.
+// Author:
+// Reid
+// Description:
+// Legion member.
+
+001-1,59,44,0 script Lucas#001-1 NPC_LUCAS,{
+
+ villagertalk();
+
+ closeclientdialog;
+ close;
+
+OnInit:
+ .distance = 3;
+ end;
+}
+
diff --git a/npc/001-1/manhole.txt b/npc/001-1/manhole.txt
new file mode 100644
index 00000000..086f9070
--- /dev/null
+++ b/npc/001-1/manhole.txt
@@ -0,0 +1,88 @@
+// Evol scripts.
+// Author:
+// Jesusalva
+// Reid
+// Description:
+// A manhole near Mona's house.
+// Variable:
+// ArtisQuests_MonaDad
+// Quest states:
+// 0 - Quest not started
+// 1 - Mona explained that her dad was missing
+
+001-1,152,52,0 script #manhole1-001-1 NPC_NO_SPRITE,{
+
+ .@i=manhole_interact("001-3-0");
+ closeclientdialog();
+ if (.@i == -1) {
+ slide_or_warp("001-3-0", 152, 56);
+ } else if (.@i == TrainingArrow || .@i == WoodenBow) {
+ npctalk3 l("(You hear a faint sound in distance, but can't say what sound it was.)");
+ }
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,196,35,0 script #manhole2-001-1 NPC_NO_SPRITE,{
+
+ .@i=manhole_interact("001-3-0");
+ closeclientdialog();
+ if (.@i == -1) {
+ slide_or_warp("001-3-0", 196, 36);
+ } else if (.@i == TrainingArrow || .@i == WoodenBow) {
+ npctalk3 l("???: Hey! Is someone there? Please, help, it's so dark down here!");
+ }
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,146,123,0 script #manhole3-001-1 NPC_NO_SPRITE,{
+
+ .@i=manhole_interact("001-3-0");
+ closeclientdialog();
+ if (.@i == -1) {
+ // Not a fan of calling strong players as weak, so take STR in account
+ // If you have enough STR, you get an Easter Egg about the engine :)
+ if (readparam(bStr) < 50) {
+ mesc l("The lid is sealed shut, and you are too weak to open it.");
+ } else {
+ mesc l("Even with your Hercules strength, this lid is hopelessly struck.");
+ }
+ } else if (.@i == TrainingArrow || .@i == WoodenBow) {
+ // This is the wrong lid for Mundane Quest
+ npctalk3 l("...");
+ }
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+// This lid can only be used to leave
+001-1,86,131,0 script #manhole4-001-1 NPC_NO_SPRITE,{
+
+ .@i=manhole_interact("001-3-0");
+ closeclientdialog();
+ if (.@i == -1) {
+ mesc l("Strangely enough, this lid can only be open from inside.");
+ } else if (.@i == TrainingArrow || .@i == WoodenBow) {
+ // This is the wrong lid for Mundane Quest
+ npctalk3 l("...");
+ }
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+// To quickly create more sewer mouths we can use:
+//001-1,86,131,0 duplicate(#manhole3-001-1) #manhole4-001-1 NPC_NO_SPRITE
+
diff --git a/npc/001-1/mapflags.txt b/npc/001-1/mapflags.txt
new file mode 100644
index 00000000..3e529501
--- /dev/null
+++ b/npc/001-1/mapflags.txt
@@ -0,0 +1 @@
+001-1 mapflag town
diff --git a/npc/001-1/marine.txt b/npc/001-1/marine.txt
new file mode 100644
index 00000000..b9cd93f9
--- /dev/null
+++ b/npc/001-1/marine.txt
@@ -0,0 +1,17 @@
+// Moubootaur Legends scripts.
+// Authors:
+// Jesusalva
+// Description:
+// This script controls access to Ships, fixing variables.
+
+// Use NPC_LA_MARINE if needed
+001-1,204,85,0 script Gema IV#A NPC_HIDDEN,0,0,{
+ end;
+
+OnTouch:
+ EnterTown("Artis");
+
+ warp "marine@"+LOCATION$, 42, 26;
+ closedialog;
+ close;
+}
diff --git a/npc/001-1/merlin.txt b/npc/001-1/merlin.txt
new file mode 100644
index 00000000..a96e404d
--- /dev/null
+++ b/npc/001-1/merlin.txt
@@ -0,0 +1,24 @@
+// Evol scripts.
+// Author:
+// Reid
+// Description:
+// Fishmonger NPC
+
+001-1,73,128,0 script Merlin NPC_MERLIN,2,2,{
+
+OnTouch:
+ switch(rand(6))
+ {
+ case 0: npctalkonce(l("Fish, come and see my fish!")); break;
+ case 1: npctalkonce(l("They are fresh, they are good!")); break;
+ case 2: npctalkonce(l("Fresh from the sea and cheap!")); break;
+ case 3: npctalkonce(l("Come, come and see!")); break;
+ case 4: npctalkonce(l("They are fresh!")); break;
+ default: npctalkonce(l("Fish is good for the brain!"));
+ }
+ end;
+
+OnInit:
+ .distance = 2;
+ end;
+}
diff --git a/npc/001-1/mouboo.txt b/npc/001-1/mouboo.txt
new file mode 100644
index 00000000..bdc4d517
--- /dev/null
+++ b/npc/001-1/mouboo.txt
@@ -0,0 +1,61 @@
+// Evol scripts.
+// Author:
+// Reid
+// Description:
+// Mouboo on Taree's fence.
+
+001-1,67,79,4 script Mouboo#Artis0 NPC_MOUBOO,{
+
+ moubootalk();
+ close;
+
+OnTimer2000:
+ moubootimer;
+
+OnInit:
+ .distance = 2;
+ .speed = 600;
+ mouboograph;
+}
+
+001-1,67,80,4 script Mouboo#Artis1 NPC_MOUBOO,{
+
+ moubootalk();
+ close;
+
+OnTimer2000:
+ moubootimer;
+
+OnInit:
+ .distance = 2;
+ .speed = 600;
+ mouboograph;
+}
+
+001-1,67,81,4 script Mouboo#Artis2 NPC_MOUBOO,{
+
+ moubootalk();
+ close;
+
+OnTimer2000:
+ moubootimer;
+
+OnInit:
+ .distance = 2;
+ .speed = 600;
+ mouboograph;
+}
+
+001-1,67,82,4 script Mouboo#Artis3 NPC_MOUBOO,{
+
+ moubootalk();
+ close;
+
+OnTimer2000:
+ moubootimer;
+
+OnInit:
+ .distance = 2;
+ .speed = 600;
+ mouboograph;
+}
diff --git a/npc/001-1/nalkri.txt b/npc/001-1/nalkri.txt
new file mode 100644
index 00000000..e155a8a8
--- /dev/null
+++ b/npc/001-1/nalkri.txt
@@ -0,0 +1,59 @@
+// Evol scripts.
+// Author:
+// Reid
+// Description:
+// Nalkri, walking NPC of the Legion of Aemil on the west part of Artis.
+
+001-1,35,84,0 script Nalkri#001-1 NPC_DEMON_MALE_LEGION_ARTIS,{
+ npctalk3 l("Stay clear.");
+ close;
+
+OnTimer1000:
+ domovestep;
+
+OnInit:
+ initpath "move", 56, 84,
+ "move", 60, 93,
+ "move", 68, 98,
+ "dir", DOWN, 0,
+ "wait", 1, 0,
+ "move", 68, 100,
+ "dir", RIGHT, 0,
+ "wait", 1, 0,
+ "dir", DOWN, 0,
+ "wait", 1, 0,
+ "dir", LEFT, 0,
+ "wait", 1, 0,
+ "dir", UP, 0,
+ "move", 67, 98,
+ "dir", RIGHT, 0,
+ "wait", 2, 0,
+ "move", 51, 101,
+ "dir", LEFT, 0,
+ "wait", 1, 0,
+ "dir", DOWN, 0,
+ "wait", 1, 0,
+ "dir", RIGHT, 0,
+ "wait", 1, 0,
+ "dir", UP, 0,
+ "move", 48, 100,
+ "dir", RIGHT, 0,
+ "wait", 1, 0,
+ "dir", DOWN, 0,
+ "wait", 1, 0,
+ "dir", LEFT, 0,
+ "wait", 1, 0,
+ "dir", RIGHT, 0,
+ "move", 55, 96,
+ "move", 43, 88,
+ "move", 35, 84,
+ "dir", LEFT, 0,
+ "wait", 1, 0,
+ "dir", DOWN, 0,
+ "wait", 4, 0,
+ "dir", RIGHT, 0,
+ "wait", 1, 0;
+
+ initialmove;
+ initnpctimer;
+}
diff --git a/npc/001-1/panels.txt b/npc/001-1/panels.txt
new file mode 100644
index 00000000..19d1fb11
--- /dev/null
+++ b/npc/001-1/panels.txt
@@ -0,0 +1,57 @@
+// Evol scripts.
+// Author:
+// Reid
+// Description:
+// Panels to give advice and some random information to players.
+
+001-1,180,25,0 script #ArtisPanel1 NPC_NO_SPRITE,{
+ narrator S_LAST_NEXT,
+ l("You step on something, a panel half overgrown by moss, it has writing on it...");
+
+ mesq l("Don't fall!");
+ next;
+ mesq l("You've reached the highest natural place of Artis, enjoy the view.");
+ next;
+
+ closeclientdialog;
+ close;
+
+OnInit:
+ .distance = 2;
+ end;
+}
+
+001-1,95,51,0 script #ArtisPanel2 NPC_NO_SPRITE,{
+ narrator S_LAST_NEXT,
+ l("You step on something, a shaky and fragile panel with barely visible inscriptions on it...");
+
+ mesq l("Beware of falling stones from the cliff!");
+ next;
+ mesq l("The other part of this sign has been crushed by a rock.");
+ next;
+
+ closeclientdialog;
+ close;
+
+OnInit:
+ .distance = 2;
+ end;
+}
+
+001-1,103,66,0 script #ArtisPanel3 NPC_NO_SPRITE,{
+ narrator S_LAST_NEXT,
+ l("You step on something, a panel with a bitten corner and clear inscriptions on it...");
+
+ mesq l("Warning! Dangerous fish, do not fall into the lake!");
+ next;
+ narrator S_LAST_NEXT,
+ l("Somebody tried to stroke the word \"fish\" and tried to replace it with \"sharkes\".");
+
+ closeclientdialog;
+ close;
+
+OnInit:
+ .distance = 2;
+ end;
+}
+
diff --git a/npc/001-1/pious.txt b/npc/001-1/pious.txt
new file mode 100644
index 00000000..35e65048
--- /dev/null
+++ b/npc/001-1/pious.txt
@@ -0,0 +1,15 @@
+// Evol scripts.
+// Author:
+// Travolta
+// Description:
+// Pious on Market
+// Variables:
+// none
+
+001-1,55,119,0 script #MarketPiou1 NPC_MARKET_PIOU,{
+ end;
+
+OnInit:
+ .distance = 2;
+ end;
+}
diff --git a/npc/001-1/qonan.txt b/npc/001-1/qonan.txt
new file mode 100644
index 00000000..f00a2cf3
--- /dev/null
+++ b/npc/001-1/qonan.txt
@@ -0,0 +1,113 @@
+// Evol scripts.
+// Authors:
+// Reid
+// Travolta
+// Description:
+// Sailor of Nard's La Johanne ship.
+// ArtisQuests_QOnan -- quest variable:
+// 0 - not started
+// 1 - Q'Onan asked to find Chest
+// 2 - Chest found, heading back to Q'Onan
+// 3 - Quest completed
+
+001-1,186,107,0 script Q'Onan#001-1 NPC_QONAN,{
+
+ .@q = getq(ArtisQuests_QOnan);
+ if (.@q == 1) goto L_QuestGiven;
+ if (.@q == 2) goto L_ItemFound;
+ if (.@q == 3) goto L_QuestDone;
+
+ speech S_LAST_BLANK_LINE,
+ l("We haven't met, right?"),
+ l("My name is Q'Onan, I'm a member of Nard's crew."),
+ l("I have a lot of work here, so I don't even have time to go to the town."),
+ l("Could you do a small favor for me?");
+
+ switch (select(l("Go on."), l("I don't have the time sorry.")))
+ {
+ case 2:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("No problem, see you next time.");
+ closeclientdialog;
+ close;
+ }
+
+ speech S_FIRST_BLANK_LINE | S_LAST_BLANK_LINE,
+ l("Before I joined Nard, I used to be a thief."),
+ l("I'm not proud of it, but I had to steal money from others to keep on living."),
+ l("Anyway, the last time I stole something I was almost caught."),
+ l("I robbed a nobleman, took a chest full of coins."),
+ l("But my luck left me, because as soon as I left his house, the guards started chasing me."),
+ l("It was at night, so I could barely escape. I ran to Artis hill."),
+ l("I was afraid to get busted, so I decided to get rid of the evidence."),
+ l("I buried the chest somewhere on that hill. It was dark, so I don't remember where to dig exactly."),
+ l("I'm afraid to go there myself, but if you take the risk, you can have half of the loot."),
+ l("So, what do you say?");
+
+ select
+ l("I like money! Consider it done."),
+ l("Too risky, I might end up in jail. Do it yourself.");
+
+ switch(@menu)
+ {
+ case 1:
+ setq ArtisQuests_QOnan, 1;
+ getrandompoint(178,26,182,29);
+ npcdebug "Chest buriad at (" + .move__rand_x + "," + .move__rand_y + ")";
+ shovel_addquest("001-1", .move__rand_x, .move__rand_y, "QOnanFoundItem");
+ speech S_FIRST_BLANK_LINE | S_LAST_BLANK_LINE,
+ l("Alright, you will need this shovel."),
+ l("You should check on the highest part of the cliff, I was hiding there."),
+ l("I hope to see you soon.");
+ getitem IronShovel, 1;
+ // For questlog
+ setq2 ArtisQuests_QOnan, .move__rand_x+any(-1,1);
+ setq3 ArtisQuests_QOnan, .move__rand_y+any(-1,1);
+ close;
+ case 2:
+ speech S_FIRST_BLANK_LINE | S_LAST_BLANK_LINE,
+ l("Come on, don't be a coward!"),
+ l("Anyway, let me know if you change your mind.");
+ close;
+ }
+
+L_QuestGiven:
+ speech S_LAST_NEXT, l("I asked you to do me a favor, did you forget?");
+ select l("What should I do, again?");
+ speech S_FIRST_BLANK_LINE,
+ l("Please find the small chest, buried somewhere on Artis hill."),
+ l("You should check on the highest part of the cliff, I was hiding there."),
+ l("Bring it to me, and you will get your reward.");
+ close;
+
+L_ItemFound:
+ speech
+ l("After all this time, it was still there!"),
+ l("We are very lucky, my friend."),
+ l("Let me open it with my key."),
+ l("Like I promised, here is your share."),
+ l("I can finally pay off my debts.");
+
+ Zeny += 1800;
+ setq ArtisQuests_QOnan, 3;
+ close;
+
+L_QuestDone:
+ speech l("Howdy, partner in crime?");
+ close;
+
+OnInit:
+ .distance = 2;
+ .debug = 1;
+ end;
+}
+
+function script QOnanFoundItem {
+ setq ArtisQuests_QOnan, 2, 0, 0;
+ // getitem SmallChest, 1;
+ narrator S_FIRST_BLANK_LINE,
+ l("You found a small chest, surprisingly heavy for it's size."),
+ l("It's probably full of coins, but no matter how hard you try to open it, you can't."),
+ l("Better take it back to Q'Onan.");
+ return;
+}
diff --git a/npc/001-1/qpid.txt b/npc/001-1/qpid.txt
new file mode 100644
index 00000000..5976c9cf
--- /dev/null
+++ b/npc/001-1/qpid.txt
@@ -0,0 +1,169 @@
+// Evol scripts.
+// Author:
+// Reid
+// Description:
+// Potion seller, she is part of the Enora's noob quests.
+
+001-1,65,116,0 script Q'Pid#001-1 NPC_QPID,{
+
+ function riddle_enigma {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Ok fine, you have up to 3 tries, here is the riddle:"),
+ l("What is growing and shrinking at the same time?");
+ narrator S_LAST_NEXT,
+ l("You need to type the answer of this riddle in the NPC window."),
+ l("The answer is a single word, without conjugation."),
+ l("You can also answer in your native language or in English.");
+
+ do
+ {
+ input .@answer$;
+ .@i++;
+
+ if (riddlevalidation(.@answer$, "life", l("life")))
+ {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Oh..."),
+ l("You seem more cultivated than you look.");
+
+ if (getq(ArtisQuests_Enora) == 7)
+ {
+ setq(ArtisQuests_Enora, 9);
+ speech S_LAST_NEXT | S_NO_NPC_NAME,
+ l("Fine, take these potions, I will replenish them in the next couple hours anyway.");
+ }
+
+ break;
+ }
+ else if (.@i < 3)
+ {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Too bad, try again.");
+ }
+ else
+ {
+ if (getq(ArtisQuests_Enora) == 7)
+ {
+ setq(ArtisQuests_Enora, 8);
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("You failed!"),
+ l("Ivan is the one you should look for now."),
+ l("He is in a small house between the dock's warehouse and the dojo."),
+ l("Follow the canal to the north-east and you will find it."),
+ l("And get out of here, I'm not a map!");
+ }
+ else
+ {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("You failed!");
+ }
+
+ break;
+ }
+ } while (true);
+
+ return;
+ }
+
+ function enora_quest {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("She wants? What if I don't want?"),
+ l("I'm not a pawn of the Legion, I don't have to obey you!"),
+ l("Oh and guess what! I'm almost out of potions anyway.");
+
+ switch (select(l("And where can I find these potions?"),
+ l("You bored me, see you later.")))
+ {
+ case 1:
+ break;
+ case 2:
+ return;
+ }
+
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("You don't seem to be from the Legion, let's do a game."),
+ l("If you find the correct answer, I will give you these potions..."),
+ l("But if you fail, you will have to get them from the alchemist."),
+ l("Deal?");
+
+ if (askyesno() == ASK_YES)
+ {
+ riddle_enigma;
+ }
+ return;
+ }
+
+ function alchemist_information {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Do? I don't do them."),
+ l("I'm sure that you already knew the answer, didn't you?"),
+ l("You tried to embarrass me, am I right?!"),
+ l("It's Ivan... I'm sure that he sent you to annoy me..."),
+ l("I'm just a merchant, I trade and make deals, yes \"excuse\" me if I'm not as skilled as that stupid alchemist."),
+ l("But rare are those that receive grants from the Legion itself. For anybody else only a hard work can pay your bills!");
+ emotion E_UPSET;
+
+ switch (select(l("Sorry I didn't mean to bother you."),
+ l("You are just sitting on the shadow of your store.")))
+ {
+ case 1:
+ mes "";
+ mesn;
+ break;
+ case 2:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT, l("You are honest, I like it.");
+ break;
+ }
+ mesq l("Is that all you had to say?");
+ next;
+
+ return;
+ }
+
+ speech S_LAST_NEXT,
+ l("What?");
+
+ do
+ {
+ .@enora = getq(ArtisQuests_Enora);
+
+ select
+ rif(.@enora == 7, l("Enora wants her potions.")),
+ menuaction(l("Trade")),
+ rif(.@enora > 7, l("What was your riddle?")),
+ l("How do you do your potions?"),
+ l("What are you reading?"),
+ menuaction(l("Quit"));
+
+ switch (@menu)
+ {
+ case 1:
+ enora_quest;
+ break;
+ case 2:
+ closeclientdialog;
+ shop "Store#Potion001-1";
+ close;
+ case 3:
+ riddle_enigma;
+ break;
+ case 4:
+ alchemist_information;
+ break;
+ case 5:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("It's a poem, about poems... Why are you asking that?"),
+ l("Because I am a Kralog I can't read such things? That's rubbish."),
+ l("I borrowed it from the library, you should try to cultivate yourself more instead of insinuate things about people you don't know!");
+ break;
+ }
+ } while (@menu != 6);
+
+ closeclientdialog;
+ goodbye;
+ close;
+
+OnInit:
+ .distance = 3;
+ end;
+}
diff --git a/npc/001-1/rowboat.txt b/npc/001-1/rowboat.txt
new file mode 100644
index 00000000..ba07a1b0
--- /dev/null
+++ b/npc/001-1/rowboat.txt
@@ -0,0 +1,69 @@
+// Evol scripts.
+// Author:
+// Micksha, Toams
+// Description:
+// The rowboat, picking up the player on small beach in order to bring it to Koga.
+
+001-1,192,25,0 script #Rowboat NPC_ROWBOAT_STAND_WE,{
+ if (.caller != getcharid(3)) {
+ mesn;
+ mesq l("Oh, hello. I am just observing the whales.");
+ next;
+ mesn;
+ mesq l("Nobody told me anything about you, unfortunately.");
+ close;
+ }
+
+ speech S_LAST_BLANK_LINE | S_LAST_NEXT,
+ l("Oh, hi."),
+ l("In case you don't have a commendatory letter from you-know-whom, I am just sitting here and observe the whales."),
+ l("Perhaps, and only perhaps, if you bring me the latter, I can bring you to a ship that will perhaps, and only perhaps, be able to bring you to Woodland."),
+ l("Do you have this commendatory letter?");
+ closeclientdialog();
+ if (askyesno() == ASK_YES) {
+ if (getq(General_Brotherhood) >= 2)
+ {
+ //slide 227, 62;
+ //slide 204, 62;
+ PC_DEST$="Argaes";
+ @timer_navio_running = 1;
+ addtimer 210000, "#MarineShip::OnEvent"; // This route is 30s slower
+ warp "marine-2", 40, 32;
+ dispbottom l("You're smuggled aboard the Legion expedition. ACT NATURALLY!");
+ .caller=0;
+ .clocks=gettimetick(2);
+ movenpc("#Rowboat", 192, 25);
+ //setmount 1;
+ }
+ else
+ {
+ npctalk3 l("You're lying, aren't you? I heard nothing from you-know-whom!");
+ }
+ close;
+ }
+
+OnMoveToBeach:
+ startnpctimer;
+ initialmove;
+end;
+
+OnTimer1000:
+ getmapxy(.@map$, .@cx, .@cy, 1);
+ if (.@cx == 192 && .@cy == 25) stopnpctimer;
+ else domovestep;
+
+OnInit:
+ .distance = 3;
+ .speed = 175;
+ .caller = 0;
+ .clocks = 0;
+
+ initpath "move", 202, 27,
+ "move", 213, 58,
+ "move", 203, 64,
+ "wait", 15, 0,
+ "move", 213, 58,
+ "move", 202, 27,
+ "move", 192, 25;
+ initnpctimer;
+}
diff --git a/npc/001-1/rowboathelper.txt b/npc/001-1/rowboathelper.txt
new file mode 100644
index 00000000..d7809bf0
--- /dev/null
+++ b/npc/001-1/rowboathelper.txt
@@ -0,0 +1,141 @@
+// Evol scripts.
+// Author:
+// Toams
+// Description:
+// helper scripts for rowboat usage
+// Notes:
+// Curious Hole bypass the cutscenes
+
+// calling the Rowboat
+001-1,200,60,0 script Curious Hole NPC_NO_SPRITE,{
+
+ .@q = getq(General_Narrator);
+
+ mesc l("You see a curious hole behind some rocks.");
+ next;
+ mesn strcharinfo(0);
+ mesq l("Hey, anyone there?");
+ next;
+ mesc l("...");
+ next;
+ if (.@q < 2)
+ {
+ mesc l("Altough you can't get rid of the feeling someone is listening on the other side, you don't get any replies.");
+ close;
+ }
+ else
+ {
+ narrator(S_LAST_BLANK_LINE | S_LAST_NEXT,
+ l("Suddenly you remember the strange phrase Mona overheard Sophialla saying"),
+ l("Maybe you should try this phrase?"));
+ if (askyesno() == ASK_YES)
+ {
+ mesn strcharinfo(0);
+ mesc l("Sagratha is great.");
+ next;
+
+ if (getvariableofnpc(.caller, "#Rowboat")) {
+ // Can you use it, or is it in grace time?
+ if (getvariableofnpc(.clocks, "#Rowboat") > gettimetick(2)) {
+ mesn;
+ mesq l("Please be patient. Someone else is using the rowboat right now.");
+ close;
+ }
+ // Rowboat already there, so change owner
+ mesn;
+ mesq l("Hello, a rowboat is already on the beach. You can use it.");
+ set(getvariableofnpc(.caller, "#Rowboat"), getcharid(3));
+ set(getvariableofnpc(.clocks, "#Rowboat"), gettimetick(2)+15);
+ close;
+ }
+ // Rowboat is at hideout, send it to you
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Hello, a rowboat is on his way to the beach. Please wait for a while for it to arrive.");
+
+ set(getvariableofnpc(.caller, "#Rowboat"), getcharid(3));
+ set(getvariableofnpc(.clocks, "#Rowboat"), gettimetick(2)+30);
+ doevent("#Rowboat::OnMoveToBeach");
+ close;
+ }
+ else
+ close;
+ }
+
+OnInit:
+ .distance = 1;
+}
+
+// UNUSED
+//unmounting the rowboat at eastern beach
+001-1,202,62,0 script unmountrowboateast NPC_HIDDEN,1,1,{
+
+ function UnMount {
+ narrator(S_LAST_BLANK_LINE | S_LAST_NEXT,
+ l("Do you want to leave the boat?"));
+ if (askyesno() == ASK_YES)
+ {
+ slide_or_warp("001-1", 199, 62);
+ setmount 0;
+ close;
+ }
+}
+
+OnTouch:
+ UnMount;
+ end;
+
+OnInit:
+ .distance = 1;
+}
+
+
+//unmounting the rowboat at southern beach
+001-1,68,143,0 script unmountrowboatsouth NPC_HIDDEN,1,1,{
+
+ function UnMount {
+ narrator(S_LAST_BLANK_LINE | S_LAST_NEXT,
+ l("Do you want to leave the boat?"));
+ if (askyesno() == ASK_YES)
+ {
+ slide_or_warp("001-1", 68, 138);
+ setmount 0;
+ close;
+ }
+}
+
+OnTouch:
+ UnMount;
+ end;
+
+OnInit:
+ .distance = 1;
+}
+
+
+//unmounting the rowboat at western beach
+001-1,25,101,0 script unmountrowboatwest NPC_HIDDEN,1,1,{
+
+ function UnMount {
+ narrator(S_LAST_BLANK_LINE | S_LAST_NEXT,
+ l("Do you want to leave the boat?"));
+ if (askyesno() == ASK_YES)
+ {
+ slide_or_warp("001-1", 27, 101);
+ setmount 0;
+ close;
+ }
+}
+
+OnTouch:
+ UnMount;
+ end;
+
+OnInit:
+ .distance = 1;
+}
+
+function script ForcedUnmount {
+ setmount 0;
+ return;
+}
+
diff --git a/npc/001-1/rumly.txt b/npc/001-1/rumly.txt
new file mode 100644
index 00000000..6cc625ff
--- /dev/null
+++ b/npc/001-1/rumly.txt
@@ -0,0 +1,225 @@
+// Evol scripts.
+// Author:
+// Vasily_Makarov
+// Description:
+// Stat resetter.
+// Variables:
+// General_Rumly
+// Values:
+// 0 Player hasn't met Rumly
+// 1 Last time player has told that he will never come back
+// 2 Last time player has told that he will come back later
+// 3 Player has already reset his stat
+// Others:
+// .@visited - Rumly actual variable
+// .@wasSP - free status points before reset
+
+001-1,35,125,0 script Rumly#001-1 NPC_RUMLY,{
+
+ setnpcdir "Rumly#001-1", 2;
+ stopnpctimer;
+ initnpctimer;
+
+ speech S_LAST_NEXT,
+ l("Hey you, do you have any @@s?", getitemlink(Plushroom));
+
+L_Menu:
+ .@visited = getq(General_Rumly);
+ .@plush_count = lognbaselvl(1, 10);
+
+ select
+ l("Plushrooms you say?"),
+ l("Who are you?"),
+ rif(.@visited > 0, l("Can you reset my stats please?")),
+ l("You are weird, I have to go sorry.");
+
+ switch (@menu)
+ {
+ case 1:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Wind and grass is nice and cool, so juicy sweet..."),
+ l("Our only wish to eat a plush, so juicy sweet...");
+ goto L_Menu;
+ case 2:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Why are you asking? And who are you too? I've never seen you around before..."),
+ l("Wait, are you one of those from the Legion of Gasaron? I didn't do anything wrong, I promise!"),
+ l("I... I just like to eat the purple and delightful... And natural, and...");
+
+ switch (select(l("Chill out I won't say anything."),
+ l("Yes I am and you are going to face justice!")))
+ {
+ case 1: break;
+ case 2:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("No! No, no, my precious plushrooms! Don’t take me to them, they wants my precious.");
+ goto L_Quit;
+ }
+
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("I won't forget it, I swear on my precious plushrooms!"),
+ l("There is an unknown side effect to these plushrooms, they can free you from your past mistakes."),
+ l("You can use it to clear your stats, to start freshly if you see what I mean..."),
+ l("Bring me some of these plushrooms and I will show you how it works!"),
+ l("Although the more powerful you are, the more plushrooms you will need.");
+
+ select
+ l("Sounds good!"),
+ rif(countitem(Plushroom) >= .@plush_count, l("I think I have enough plushrooms on me.")),
+ l("We will talk about it later."),
+ l("My stats are too good, I won't need it.");
+
+ switch (@menu)
+ {
+ case 1:
+ if (.@visited < 2)
+ {
+ setq General_Rumly, 2;
+ }
+
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Great! Can't wait for some tasty mushrooms!");
+
+ goto L_Menu;
+ case 2:
+ goto L_ResetStats;
+ case 3:
+ goto L_Later;
+ case 4:
+ goto L_Never;
+ }
+
+ case 3:
+ goto L_ResetStats;
+ case 4:
+ if (.@visited < 2) goto L_Quit;
+
+ .@rand = rand(2);
+
+ if (.@rand)
+ {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("See you! And come back with the plushrooms!");
+ }
+ else
+ {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Oh noes!"),
+ l("A rabbit!"),
+ l("He has a guns!"),
+ l("*Bang bang*");
+ narrator S_LAST_NEXT,
+ l("Rumly is hiding behind the tree.");
+ }
+
+ goto L_Quit;
+ }
+
+L_ResetStats:
+ if (.@visited == 1)
+ {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Changed your mind, uh?"),
+ l("Very good."),
+ l("Status point reset can't be undone. Do you really want this?"),
+ l("Are you sure about this?");
+ }
+ else
+ {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Are you sure about this?");
+ }
+
+L_ConfirmReset:
+ switch (select(l("Yes, I am sure."),
+ l("I need to think about it..."),
+ l("I won't need it, thank you.")))
+ {
+ case 1:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Let me just have a quick look at you. Hm... I will need @@ @@s to reset your stats.", .@plush_count, getitemlink(Plushroom));
+
+ select
+ rif(countitem(Plushroom) >= .@plush_count, l("Here, take as many as you need, I have plenty!")),
+ rif(countitem(Plushroom) > 0 && countitem(Plushroom) < .@plush_count, l("I don't have enough plushrooms...")),
+ rif(countitem(Plushroom) == 0, l("Oh no, I don't have any plushroom on me right now.")),
+ l("I have to go, sorry.");
+
+ if (@menu > 1)
+ {
+ goto L_Later;
+ }
+
+ delitem Plushroom, .@plush_count;
+
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Thank you."),
+ l("Now stand still... It should not take much time...");
+
+ .@wasSP = StatusPoint;
+ resetstatus;
+ if (.@visited < 3)
+ {
+ setq General_Rumly, 3;
+ }
+ if (StatusPoint == .@wasSP)
+ {
+ speech S_LAST_NEXT,
+ l("It seems that you have no status points to reset!"),
+ l("But the plushroom you brought was really awesome you know."),
+ l("Come back when you will really need me. And bring more plushrooms with you!");
+ }
+ else
+ {
+ speech S_LAST_NEXT,
+ l("Let's see... @@ of your status points have just been reset!", StatusPoint - .@wasSP),
+ l("Spend it wisely this time."),
+ l("But you are welcome to reset your stats again if you bring me some more plushrooms!");
+ }
+ goto L_Quit;
+
+ case 2:
+ goto L_Later;
+ case 3:
+ goto L_Never;
+ }
+
+L_Later:
+ if (.@visited < 2)
+ {
+ setq General_Rumly, 2;
+ }
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Come back soon, and bring @@s!", getitemlink(Plushroom));
+
+ goto L_Quit;
+
+L_Never:
+ if (.@visited < 2)
+ {
+ setq General_Rumly, 1;
+ }
+
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("I am sure that you will change your mind.");
+
+ goto L_Quit;
+
+L_Quit:
+ setnpcdir "Rumly#001-1", 4;
+ stopnpctimer;
+ initnpctimer;
+
+ goodbye;
+
+OnTimer1800:
+ stopnpctimer;
+
+ if (getnpcdir("Rumly#001-1") == 2) setnpcdir "Rumly#001-1", 6;
+ if (getnpcdir("Rumly#001-1") == 4) setnpcdir "Rumly#001-1", 8;
+
+ end;
+
+OnInit:
+ end;
+}
diff --git a/npc/001-1/salem.txt b/npc/001-1/salem.txt
new file mode 100644
index 00000000..913db476
--- /dev/null
+++ b/npc/001-1/salem.txt
@@ -0,0 +1,219 @@
+// Evol scripts.
+// Author:
+// Travolta
+// Description:
+// Trader on the market. One of his pious escaped and
+// flies around the town.
+// Variables:
+// ArtisQuests_CatchPiou -- quest variable
+// Quest states:
+// 0 -- not started
+// 1 -- trader asked to catch piou
+// 2 -- quest finished
+// Note: this script is ugly like hell
+
+001-1,57,118,0 script Salem#001-1 NPC_SALEM,{
+
+ function BuyPiou {
+ .@price = getarg(0);
+ mesq l("The piou costs @@ E.", .@price);
+ next;
+ select
+ l("Alright, I'll take one."),
+ l("I changed my mind.");
+
+ mes "";
+ mesn;
+ if (@menu == 2)
+ return 4;
+ if (Zeny < .@price)
+ {
+ mesq l("Don't you try to cheat an old merchant! You don't have enough money, you need @@ E.", .@price);
+ next;
+
+ return 1;
+ }
+ if (!checkweight(PiouEgg, 1))
+ {
+ mesq l("You can't carry another @@? What a shame.", PiouEgg);
+ next;
+
+ return 2;
+ }
+ getinventorylist;
+ if (.@inventorylist_count >= 100)
+ {
+ mesq l("You don't have enough room in your backpack for a @@. Go stow some of your junk and come back.", PiouEgg);
+ next;
+
+ return 3;
+ }
+ Zeny -= .@price;
+ getitem PiouEgg, 1;
+ ArtisQuests_PiousBought += 1;
+ mesq l("You take good care of your piou. Remember to feed it every day.");
+
+ return 0;
+ }
+
+// if (2 == select("[debug]continue quest:[debug] start over"))
+// {
+// debugmes "Starting quest CatchPiou over";
+// setq ArtisQuests_CatchPiou, 0;
+// }
+
+ .@q = getq(ArtisQuests_CatchPiou);
+ @ArtisQuests_PiouPrice = 30000;
+
+ if (.@q == 1)
+ {
+ if (.PiouCaught)
+ {
+ speech
+ l("Look who is back..."),
+ l("And with my piou. That's wonderful. I can only imagine how hard that little bugger was to catch!"),
+ l("Great, and as I promised, I give you a 90% discount on the @@ of your choice.", getitemlink(PiouEgg));
+ next;
+
+ @ArtisQuests_PiouPrice = 3000;
+ ArtisQuests_PiouDiscount = 1;
+ donpcevent strnpcinfo(3) + "::OnPiouFlee";
+ setq ArtisQuests_CatchPiou, 2;
+ .@q = getq(ArtisQuests_CatchPiou);
+
+ .LastPiouHunter$ = "";
+ ArtisQuests_CatchPiou_Difficulcy = 0;
+ .@BoughtPiou = BuyPiou(@ArtisQuests_PiouPrice);
+ if (.@BoughtPiou == 0)
+ ArtisQuests_PiouDiscount = 0;
+ else if (.@BoughtPiou == 4)
+ speech S_FIRST_BLANK_LINE, l("See you next time!");
+
+ close;
+ }
+ else
+ {
+ speech
+ l("Look who is back..."),
+ l("So, where is my piou? You should not keep an old man waiting. Go and catch it like you said you would.");
+ next;
+ goto L_SalemMenuShop;
+ }
+ }
+
+ speech S_LAST_NEXT,
+ l("Good day, my friend, come closer, come closer!");
+ l("Just look at my goods for sale! Fresh fruits and vegetables were shipped only this morning. And for reasonable price, of course.");
+
+L_SalemMenuShop:
+ .@fexil = getq(ArtisQuests_Fexil);
+
+ select
+ l("What about those pious? They look so cute."),
+ l("Let's trade."),
+ rif(.@q != 0, l("I'd like to buy a piou.")),
+ rif(.@fexil == 1, l("I'm looking for somebody named Fexil.")),
+ menuaction(l("Quit"));
+
+ switch (@menu)
+ {
+ case 1:
+ goto L_AboutPious;
+ break;
+ case 2:
+ closeclientdialog;
+ shop "Store#General001-1";
+ close;
+ case 3:
+ if (.@q == 2 && ArtisQuests_PiouDiscount)
+ {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("You still have a 90% discount on one piou.");
+ @ArtisQuests_PiouPrice = 3000;
+ }
+ if (!BuyPiou(@ArtisQuests_PiouPrice))
+ ArtisQuests_PiouDiscount = 0;
+ break;
+ case 4:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("I think that I've seen this weakling wandering around the beach south from here this morning.");
+ break;
+ }
+
+ closeclientdialog;
+ goodbye;
+ close;
+
+L_AboutPious:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Ah, the locals like keeping them as pets."),
+ l("With proper training, a piou can become a good friend and faithful companion in your adventures.");
+
+ if (getq(ArtisQuests_CatchPiou) >= 2)
+ {
+ goto L_SalemMenuShop;
+ }
+
+ mesq l("Their price is usually high, but you know what? I have a bargain offer for you.");
+ next;
+ mesq l("These little pious here can't fly. At least that's what I thought.");
+ next;
+ mesq l("One of these little boogers started flying early, and escaped from me.");
+ next;
+ mesq l("It's still too young to fly too far away, so it just circles nearby.");
+ next;
+ mesq l("But I can't leave to catch it, so I'm asking you.");
+ next;
+ mesq l("If you catch the escaped piou and bring it back, I will give you a 90% discount on a piou.");
+ next;
+
+ select
+ rif(.@q == 0, l("Sounds like a good deal to me. I'll do it.")),
+ rif(.@q == 1, l("I'm on my way! I will bring it back to you.")),
+ l("I don't really have time to go chasing pious, let me just buy one at the regular price (30000 E)."),
+ l("I don't want to buy a piou right now.");
+
+ mes "";
+ mesn;
+
+ switch (@menu)
+ {
+ case 1:
+ goto L_QuestInfo;
+ case 3:
+ BuyPiou @ArtisQuests_PiouPrice;
+ }
+ closeclientdialog;
+ goodbye;
+ close;
+
+L_QuestInfo:
+ mesq l("The little piou is flying nearby, all you need is to catch it and bring back to me.");
+ next;
+ setq ArtisQuests_CatchPiou, 1;
+ ArtisQuests_CatchPiou_Difficulcy = 2;
+ mesq l("Good luck!");
+ close;
+
+OnPiouFlee:
+ sleep 120000;
+ if (!.PiouCaught)
+ end;
+ .PiouCaught = 0;
+ .@piou$ = "#FlyingPiou1";
+ if (getstrlen(.LastPiouHunter$) > 0)
+ {
+ message .LastPiouHunter$, .PiouEscapedMessage$;
+ .LastPiouHunter$ = "";
+ }
+ // debugmes "The piou escaped from " + .LastPiouHunter$;
+ sleep 60000;
+ enablenpc .@piou$;
+ movenpc .@piou$, 53, 117;
+ donpcevent .@piou$ + "::OnInit";
+ end;
+
+OnInit:
+ .distance = 5;
+ end;
+}
diff --git a/npc/001-1/shop.txt b/npc/001-1/shop.txt
new file mode 100644
index 00000000..f33ee4ac
--- /dev/null
+++ b/npc/001-1/shop.txt
@@ -0,0 +1,298 @@
+// Evol scripts.
+// Authors:
+// 4144
+// Reid
+// Description:
+// Market shops.
+
+001-1,46,135,0 trader Bag#001-1 NPC_SHOP_BAG,{
+
+OnInit:
+ tradertype(NST_MARKET);
+
+ sellitem PiouLegs, -1, 15;
+ sellitem Bread, -1, 15;
+ sellitem Croconut, -1, 50;
+ sellitem Aquada, -1, 50;
+ sellitem Armbands, -1, 20;
+ sellitem LousyMoccasins, -1, 20;
+ sellitem PiouSlayer, -1, 15;
+
+ .distance = 3;
+ end;
+
+OnClock0000:
+ restoreshopitem PiouLegs, 15;
+ restoreshopitem Bread, 15;
+ restoreshopitem Croconut, 50;
+ restoreshopitem Aquada, 50;
+ restoreshopitem Armbands, 20;
+ restoreshopitem LousyMoccasins, 20;
+ restoreshopitem PiouSlayer, 15;
+}
+
+001-1,46,125,0 trader Cotton#Dye001-1 NPC_NO_SPRITE,{
+
+OnInit:
+ tradertype(NST_MARKET);
+
+ sellitem BlackCottonDye, -1, 10;
+ sellitem SilverCottonDye, -1, 10;
+ sellitem CamelCottonDye, -1, 10;
+ sellitem BrownCottonDye, -1, 10;
+ sellitem OrangeCottonDye, -1, 10;
+ sellitem DarkRedCottonDye, -1, 10;
+ sellitem RedCottonDye, -1, 10;
+ sellitem FuschiaCottonDye, -1, 10;
+ sellitem PinkCottonDye, -1, 10;
+ sellitem MauveCottonDye, -1, 10;
+ sellitem PurpleCottonDye, -1, 10;
+ sellitem NavyBlueCottonDye, -1, 10;
+ sellitem BlueGrayCottonDye, -1, 10;
+ sellitem BlueCottonDye, -1, 10;
+ sellitem TealCottonDye, -1, 10;
+ sellitem GreenCottonDye, -1, 10;
+ sellitem LimeCottonDye, -1, 10;
+ sellitem KhakiCottonDye, -1, 10;
+ sellitem YellowCottonDye, -1, 10;
+
+ .distance = 4;
+ end;
+
+OnClock0000:
+ restoreshopitem BlackCottonDye, 10;
+ restoreshopitem SilverCottonDye, 10;
+ restoreshopitem CamelCottonDye, 10;
+ restoreshopitem BrownCottonDye, 10;
+ restoreshopitem OrangeCottonDye, 10;
+ restoreshopitem DarkRedCottonDye, 10;
+ restoreshopitem RedCottonDye, 10;
+ restoreshopitem FuschiaCottonDye, 10;
+ restoreshopitem PinkCottonDye, 10;
+ restoreshopitem MauveCottonDye, 10;
+ restoreshopitem PurpleCottonDye, 10;
+ restoreshopitem NavyBlueCottonDye, 10;
+ restoreshopitem BlueGrayCottonDye, 10;
+ restoreshopitem BlueCottonDye, 10;
+ restoreshopitem TealCottonDye, 10;
+ restoreshopitem GreenCottonDye, 10;
+ restoreshopitem LimeCottonDye, 10;
+ restoreshopitem KhakiCottonDye, 10;
+ restoreshopitem YellowCottonDye, 10;
+}
+
+001-1,48,125,0 trader Silk#Dye001-1 NPC_NO_SPRITE,{
+
+OnInit:
+ tradertype(NST_MARKET);
+
+ sellitem PitchBlackSilkDye, -1, 7;
+ sellitem ChocolateSilkDye, -1, 7;
+ sellitem CrimsonSilkDye, -1, 7;
+ sellitem TomatoSilkDye, -1, 7;
+ sellitem GoldenrodSilkDye, -1, 7;
+ sellitem SunflowerSilkDye, -1, 7;
+ sellitem OliveSilkDye, -1, 7;
+ sellitem SeaGreenSilkDye, -1, 7;
+ sellitem MintSilkDye, -1, 7;
+ sellitem MidnightBlueSilkDye, -1, 7;
+ sellitem SlatBlueSilkDye, -1, 7;
+ sellitem OrchidSilkDye, -1, 7;
+ sellitem PinkiePinkSilkDye, -1, 7;
+
+ .distance = 4;
+ end;
+
+OnClock0000:
+ restoreshopitem PitchBlackSilkDye, -1, 7;
+ restoreshopitem ChocolateSilkDye, -1, 7;
+ restoreshopitem CrimsonSilkDye, -1, 7;
+ restoreshopitem TomatoSilkDye, -1, 7;
+ restoreshopitem GoldenrodSilkDye, -1, 7;
+ restoreshopitem SunflowerSilkDye, -1, 7;
+ restoreshopitem OliveSilkDye, -1, 7;
+ restoreshopitem SeaGreenSilkDye, -1, 7;
+ restoreshopitem MintSilkDye, -1, 7;
+ restoreshopitem MidnightBlueSilkDye, -1, 7;
+ restoreshopitem SlatBlueSilkDye, -1, 7;
+ restoreshopitem OrchidSilkDye, -1, 7;
+ restoreshopitem PinkiePinkSilkDye, -1, 7;
+}
+
+001-1,64,114,0 trader Store#Aquada001-1 NPC_NO_SPRITE,{
+
+OnInit:
+ tradertype(NST_MARKET);
+
+ sellitem Aquada, -1, 50;
+
+ .distance = 4;
+ end;
+
+OnClock0000:
+ restoreshopitem Aquada, 20;
+OnClock0800:
+ restoreshopitem Aquada, 20;
+OnClock1600:
+ restoreshopitem Aquada, 20;
+}
+
+001-1,72,126,0 trader Store#SeaStore001-1 NPC_NO_SPRITE,{
+
+OnInit:
+ tradertype(NST_MARKET);
+
+ sellitem Aquada, -1, 10;
+ sellitem UrchinMeat, -1, 20;
+ sellitem SmallTentacles, -1, 30;
+ sellitem Tentacles, -1, 15;
+
+ .distance = 4;
+ end;
+
+OnClock0000:
+ restoreshopitem Aquada, 3;
+ restoreshopitem UrchinMeat, 12;
+ restoreshopitem SmallTentacles, 4;
+OnClock0800:
+ restoreshopitem Aquada, 6;
+ restoreshopitem UrchinMeat, 8;
+ restoreshopitem Tentacles, 8;
+ restoreshopitem SmallTentacles, 2;
+OnClock1600:
+ restoreshopitem Aquada, 5;
+ restoreshopitem UrchinMeat, 10;
+ restoreshopitem SmallTentacles, 7;
+}
+
+001-1,72,129,0 trader Store#FishStore001-1 NPC_NO_SPRITE,{
+
+OnInit:
+ tradertype(NST_MARKET);
+
+ sellitem CommonCarp, -1, 8;
+ sellitem GrassCarp, -1, 7;
+
+ .distance = 4;
+ end;
+
+OnClock0000:
+ restoreshopitem CommonCarp, 3;
+ restoreshopitem GrassCarp, 2;
+OnClock0800:
+ restoreshopitem CommonCarp, 2;
+ restoreshopitem GrassCarp, 3;
+OnClock1600:
+ restoreshopitem CommonCarp, 3;
+ restoreshopitem GrassCarp, 4;
+}
+
+001-1,48,116,0 trader Store#Manana001-1 NPC_NO_SPRITE,{
+
+OnInit:
+ tradertype(NST_MARKET);
+
+ sellitem Manana, -1, 60;
+
+ .distance = 4;
+ end;
+
+OnClock0000:
+ restoreshopitem Manana, 20;
+OnClock0800:
+ restoreshopitem Manana, 15;
+OnClock1600:
+ restoreshopitem Manana, 20;
+}
+
+001-1,53,123,0 trader Store#Various001-1 NPC_NO_SPRITE,{
+
+OnInit:
+ tradertype(NST_MARKET);
+
+ sellitem Manana, -1, 30;
+// Add soft drinks.
+
+ .distance = 4;
+ end;
+
+OnClock0000:
+ restoreshopitem Manana, 10;
+OnClock0800:
+ restoreshopitem Manana, 15;
+OnClock1600:
+ restoreshopitem Manana, 6;
+}
+
+001-1,67,116,0 trader Store#Potion001-1 NPC_NO_SPRITE,{
+
+OnInit:
+ tradertype(NST_MARKET);
+
+ sellitem PiberriesInfusion, -1, 200;
+ sellitem FatesPotion, -1, 100;
+ sellitem ClothoLiquor, -1, 50;
+ sellitem LachesisBrew, -1, 30;
+ sellitem AtroposMixture, -1, 10;
+ sellitem ElixirOfLife, -1, 1;
+
+ .distance = 4;
+ end;
+
+OnClock0000:
+ restoreshopitem PiberriesInfusion, 150;
+ restoreshopitem FatesPotion, 80;
+ restoreshopitem ClothoLiquor, 40;
+ restoreshopitem LachesisBrew, 20;
+ restoreshopitem AtroposMixture, 7;
+ restoreshopitem ElixirOfLife, 1;
+OnClock1200:
+ restoreshopitem PiberriesInfusion, 80;
+ restoreshopitem FatesPotion, 40;
+ restoreshopitem ClothoLiquor, 20;
+ restoreshopitem LachesisBrew, 10;
+ restoreshopitem AtroposMixture, 4;
+}
+
+001-1,58,119,0 trader Store#General001-1 NPC_NO_SPRITE,{
+
+OnInit:
+ tradertype(NST_MARKET);
+
+ sellitem Manana, -1, 100;
+ sellitem Carrot, -1, 80;
+ sellitem Aquada, -1, 50;
+ sellitem Plushroom, -1, 100;
+ sellitem Curshroom, -1, 80;
+ sellitem Piberries, -1, 150;
+ sellitem PiouEgg, -1, 25;
+// Add soft drinks.
+
+ .distance = 4;
+ end;
+
+OnClock0000:
+ restoreshopitem Manana, 50;
+ restoreshopitem Carrot, 40;
+ restoreshopitem Aquada, 30;
+ restoreshopitem Plushroom, 40;
+ restoreshopitem Curshroom, 30;
+ restoreshopitem Piberries, 40;
+ restoreshopitem PiouEgg, 10;
+OnClock0800:
+ restoreshopitem Manana, 30;
+ restoreshopitem Carrot, 30;
+ restoreshopitem Aquada, 30;
+ restoreshopitem Plushroom, 40;
+ restoreshopitem Curshroom, 30;
+ restoreshopitem Piberries, 70;
+ restoreshopitem PiouEgg, 10;
+OnClock1600:
+ restoreshopitem Manana, 40;
+ restoreshopitem Carrot, 40;
+ restoreshopitem Aquada, 20;
+ restoreshopitem Plushroom, 20;
+ restoreshopitem Curshroom, 20;
+ restoreshopitem Piberries, 30;
+ restoreshopitem PiouEgg, 5;
+}
diff --git a/npc/001-1/sign.txt b/npc/001-1/sign.txt
new file mode 100644
index 00000000..ecd115be
--- /dev/null
+++ b/npc/001-1/sign.txt
@@ -0,0 +1,168 @@
+// Evol scripts.
+// Authors:
+// Ablu
+// Reid
+// Description:
+// Sign pillars aside Artis houses.
+
+001-1,73,119,0 script Sign#001-1-s-market NPC_NO_SPRITE,{
+ npctalkonce l("Market Place");
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,48,122,0 script Sign#001-1-s-marketright NPC_NO_SPRITE,{
+ npctalkonce l("Market Place");
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,57,88,0 script Sign#001-1-s-marketdir NPC_NO_SPRITE,{
+ npctalkonce l("↓ Market Place");
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,55,86,0 script Sign#001-1-s-exit-l-dir NPC_NO_SPRITE,{
+ npctalkonce l("← Exit");
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,59,85,0 script Sign#001-1-s-legiondir NPC_NO_SPRITE,{
+ npctalkonce l("↑ Legion");
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,57,80,0 script Sign#001-1-s-library NPC_NO_SPRITE,{
+ npctalkonce l("Library");
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,57,71,0 script Sign#001-1-s-lightarmor NPC_NO_SPRITE,{
+ npctalkonce l("Light Armor Shop");
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,53,56,0 script Sign#001-1-s-legion NPC_OFFSET_NO_SPRITE,{
+ npctalkonce l("Legion of Aemil");
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,60,56,0 script Sign#001-1-s-legionright NPC_OFFSET_NO_SPRITE,{
+ npctalkonce l("Legion of Aemil");
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,91,66,0 script Sign#001-1-s-cityhall NPC_NO_SPRITE,{
+ npctalkonce l("City Hall");
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,95,111,0 script Sign#001-1-s-blacksmith NPC_NO_SPRITE,{
+ npctalkonce l("Blacksmith");
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,115,88,0 script Sign#001-1-s-inn NPC_NO_SPRITE,{
+ npctalkonce l("Inn");
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,134,85,0 script Sign#001-1-s-innright NPC_OFFSET_NO_SPRITE,{
+ npctalkonce l("Inn");
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,118,36,0 script Sign#001-1-s-merchantg NPC_NO_SPRITE,{
+ npctalkonce l("Merchant Guild");
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,171,48,0 script Sign#001-1-s-hill NPC_OFFSET_NO_SPRITE,{
+ npctalkonce l("Hill & Cliff");
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,161,72,0 script Sign#001-1-s-alchemist NPC_NO_SPRITE,{
+ npctalkonce l("Alchemist's Laboratory");
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,175,76,0 script Sign#001-1-s-warehouse NPC_NO_SPRITE,{
+ npctalkonce l("Docks Warehouse");
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,47,97,0 script Sign#001-1-s-barber NPC_NO_SPRITE,{
+ npctalkonce l("Barber");
+ close;
+
+OnInit:
+ .distance = 1;
+ end;
+}
diff --git a/npc/001-1/sophialla.txt b/npc/001-1/sophialla.txt
new file mode 100644
index 00000000..f44ef218
--- /dev/null
+++ b/npc/001-1/sophialla.txt
@@ -0,0 +1,88 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Sophialla, the connection between Artis and the Brotherhood in Hurns.
+// THIS IS A PLACEHOLDER!
+
+001-1,73,40,0 script Sophialla#001-1 NPC_SOPHIALLA,{
+ .@q=getq(General_Brotherhood);
+ if (!.@q)
+ {
+ speech
+ l("Hello."),
+ l("Can't you see I am reading? Please go, please.");
+ // Please go, please? What?
+ close;
+ }
+ speech
+ l("Hello."),
+ l("Can't you see I am reading? If you need something, tell me the secret password.");
+ // TODO: Use a token to know password or whatever
+ // PS. "Sagratha" is not a typo.
+ select
+ l("Sorry to disturb you."),
+ rif(getq(ArtisQuests_MonaDad) == 3, l("Sagratha is great.")),
+ l("I don't know the password");
+ mes "";
+ if (@menu == 2)
+ {
+ speech
+ l("If you visit the sewers again... You'll find secret passages..."),
+ l("Look for the hideout, but tell no one about this. Then, say the password again.");
+ compareandsetq General_Brotherhood, 1, 2;
+ }
+ else if (@menu == 3)
+ {
+ mesn;
+ mesq l("If I just told you, it would not be a password anymore, right?");
+ next;
+ mesn;
+ mesq l("I'm afraid you'll need to figure that out on your own.");
+ next;
+ mesn;
+ mesq l("This password is very secret. I don't think you would learn it even if you rescued someone missing for weeks.");
+ // Extra hint (TODO: Logic is crappy)
+ if (@sophiahalla_needhelp) {
+ next;
+ mesn;
+ mesq l("Actually, there is an ex-legion member whose daughter used to play nearby... How was she called? Mona I think?");
+ next;
+ mesn;
+ mesq l("...Ah! Nevermind, I was talking to myself.");
+ }
+ @sophiahalla_needhelp=true;
+ next;
+ mesc l("%s sighs.", .name$);
+ }
+
+ speech
+ l("If you don't know it, just go, please.");
+ close;
+
+OnLegionComplete:
+ restorecam;
+ mesn "???";
+ mesc l("A strange voice seems to be calling out your name.");
+ next;
+ // NOTE: Sophialla is more than 15 tiles of distance from player
+ // Server refuses to send client data about where she is and that makes
+ // setcamnpc fail. This is why I set .alwaysVisible attribute to true.
+ // Note: you can work around with coordinates, but she won't be drawn.
+ setcamnpc "Sophialla#001-1";
+ mesn;
+ mesq l("Hey. ppst. I have something important to tell you.");
+ next;
+ mesn;
+ mesq l("I just can't remember what. But come talk to me later once devs becomes less lazy.");
+ setq General_Brotherhood, 1;
+ next;
+ restorecam;
+ closeclientdialog;
+ close;
+
+OnInit:
+ .distance = 2;
+ .alwaysVisible = true;
+ end;
+}
diff --git a/npc/001-1/taree.txt b/npc/001-1/taree.txt
new file mode 100644
index 00000000..676a855a
--- /dev/null
+++ b/npc/001-1/taree.txt
@@ -0,0 +1,20 @@
+// Evol scripts.
+// Author:
+// Reid
+// Description:
+// Mouboo farmer.
+
+001-1,68,79,0 script Taree NPC_ELVEN_MAN_MOUBOO_SHOP,{
+ mesn;
+ mesq l("Moo!");
+
+ goto L_Close;
+
+L_Close:
+ close;
+
+OnInit:
+ .distance = 3;
+ end;
+}
+
diff --git a/npc/001-1/treeleaf.txt b/npc/001-1/treeleaf.txt
new file mode 100644
index 00000000..dd1280a6
--- /dev/null
+++ b/npc/001-1/treeleaf.txt
@@ -0,0 +1,22 @@
+// Evol scripts.
+// Authors:
+// Ablu
+// Reid
+// Description:
+// Falling tree leaf
+
+001-1,39,54,4 script #treeleaf0 NPC_TREE_LEAF,{
+ .dir = 2;
+ stopnpctimer;
+ initnpctimer;
+ close;
+
+OnTimer2800:
+ .dir = 4;
+ stopnpctimer;
+ end;
+
+OnInit:
+ .distance = 1;
+ end;
+}
diff --git a/npc/001-1/trees.txt b/npc/001-1/trees.txt
new file mode 100644
index 00000000..8e090218
--- /dev/null
+++ b/npc/001-1/trees.txt
@@ -0,0 +1,220 @@
+// Evol scripts.
+// Author:
+// Travolta
+// Description:
+// Invisible tree NPCs for "Lazy Brother" quest
+// Variables:
+// ArtisQuests_LazyBrother = 19 -- quest var
+// LazyBrother_TreesLeft = 15 -- how many trees left to search
+// LazyBrother_TreeSearched[15] -- whether given tree was searched
+// LazyBrother_TreeWithBrother -- the number of tree where he's hiding
+// Quest states:
+// 0 - quest not started
+// 1 - Katja asked help, searching the trees
+// 2 - Bobo is found, "bad" ending
+// 3 - player decided to tell Katja where her brother is
+// 4 - "good" ending, player helped Katja
+
+function script LazyBrotherTreeFunc {
+ .@q = getq(ArtisQuests_LazyBrother);
+ if (.@q == 0 || .@q >= 2)
+ return;
+ .@TreeNum = getarg(0);
+ if (LazyBrother_TreeWithBrother == .@TreeNum)
+ goto L_FoundHim;
+ if (LazyBrother_TreeWithBrother > 0)
+ {
+ mes l("You search the tree but don't find anybody.");
+ close2;
+ return;
+ }
+ if (LazyBrother_TreeSearched[.@TreeNum] == 1)
+ {
+ mes l("You already looked here.");
+ close2;
+ return;
+ }
+ else
+ {
+ LazyBrother_TreeSearched[.@TreeNum] = 1;
+ }
+ .@found = rand(1, LazyBrother_TreesLeft--);
+ if (.@found == 1)
+ {
+ mes l("You found him!");
+ LazyBrother_TreeWithBrother = .@TreeNum;
+ next;
+ }
+ else
+ {
+ mes l("You search the tree but don't find anybody.");
+ close2;
+ return;
+ }
+
+L_FoundHim:
+ mes l("You notice a young boy sitting on one of the highest branches of the tree.");
+ next;
+ mes l("He is eating an apple, thoroughly enjoying it.");
+ next;
+ select(l("Hey there, are you Bobo, Katja's brother?"));
+ mes "";
+ mesn "Bobo";
+ mesq l("Yes, it's me. It's such a fine view from here!");
+ next;
+ select(l("Your sister sent me to find you. Your mother is worried."));
+ mes "";
+ mesn "Bobo";
+ mesq l("Oh, nooooo... If I go home now, my mum will give me chores.");
+ next;
+ mesq l("But if you tell my sister, that you didn't find me, I can stay here all day, eating apples and enjoying the view.");
+ next;
+ mesq l("I will give you my pocket money if you do.");
+ next;
+ switch (select(l("A small lie is really just a fib, and I could really use some cash..."),
+ l("I will not lie to a little girl! And your mother needs your help.")))
+ {
+ case 1:
+ mes "";
+ mesn "Bobo";
+ mesq l("Here you go.");
+ next;
+ mesn "Narrator";
+ mes l("Somehow you don't feel good about your deed.");
+ // Karma -= 2;
+ setq ArtisQuests_LazyBrother, 2;
+ Zeny += 100;
+ getexp 500, 0;
+ break;
+ case 2:
+ mes "";
+ mesn "Bobo";
+ mesq l("Okay... Tell my sister I'll go home soon.");
+ setq ArtisQuests_LazyBrother, 3;
+ break;
+ }
+ LazyBrother_TreesLeft = 0;
+ LazyBrother_TreeWithBrother = 0;
+ cleararray LazyBrother_TreeSearched,0,15;
+ close;
+}
+
+001-1,179,30,0 script #ArtisTree1 NPC_KATJA_TREE,{
+ LazyBrotherTreeFunc(1);
+ end;
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,177,29,0 script #ArtisTree2 NPC_KATJA_TREE,{
+ LazyBrotherTreeFunc(2);
+ end;
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,183,28,0 script #ArtisTree3 NPC_KATJA_TREE,{
+ LazyBrotherTreeFunc(3);
+ end;
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,182,25,0 script #ArtisTree4 NPC_KATJA_TREE,{
+ LazyBrotherTreeFunc(4);
+ end;
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,187,26,0 script #ArtisTree5 NPC_KATJA_TREE,{
+ LazyBrotherTreeFunc(5);
+ end;
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,189,28,0 script #ArtisTree6 NPC_KATJA_TREE,{
+ LazyBrotherTreeFunc(6);
+ end;
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,184,30,0 script #ArtisTree7 NPC_KATJA_TREE,{
+ LazyBrotherTreeFunc(7);
+ end;
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,189,31,0 script #ArtisTree8 NPC_KATJA_TREE,{
+ LazyBrotherTreeFunc(8);
+ end;
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,191,30,0 script #ArtisTree9 NPC_KATJA_TREE,{
+ LazyBrotherTreeFunc(9);
+ end;
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,191,33,0 script #ArtisTree10 NPC_KATJA_TREE,{
+ LazyBrotherTreeFunc(10);
+ end;
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,187,34,0 script #ArtisTree11 NPC_KATJA_TREE,{
+ LazyBrotherTreeFunc(11);
+ end;
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,185,35,0 script #ArtisTree12 NPC_KATJA_TREE,{
+ LazyBrotherTreeFunc(12);
+ end;
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,182,34,0 script #ArtisTree13 NPC_KATJA_TREE,{
+ LazyBrotherTreeFunc(13);
+ end;
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,180,33,0 script #ArtisTree14 NPC_KATJA_TREE,{
+ LazyBrotherTreeFunc(14);
+ end;
+OnInit:
+ .distance = 1;
+ end;
+}
+
+001-1,181,32,0 script #ArtisTree15 NPC_KATJA_TREE,{
+ LazyBrotherTreeFunc(15);
+ end;
+OnInit:
+ .distance = 1;
+ end;
+}
diff --git a/npc/001-1/wateranimation.txt b/npc/001-1/wateranimation.txt
new file mode 100644
index 00000000..eb9acc9d
--- /dev/null
+++ b/npc/001-1/wateranimation.txt
@@ -0,0 +1,23 @@
+// Evol scripts.
+// Author:
+// gumi
+// Reid
+// Description:
+// Water animations, splash, fishes, etc...
+
+001-1,116,123,0 duplicate(#fish_basic) #water_animation0 NPC_WATER_SPLASH
+001-1,119,102,0 duplicate(#fish_basic) #water_animation1 NPC_WATER_SPLASH
+001-1,167,82,0 duplicate(#fish_basic) #water_animation2 NPC_WATER_SPLASH
+001-1,167,40,0 duplicate(#fish_basic) #water_animation3 NPC_WATER_SPLASH
+001-1,104,127,0 duplicate(#fish_basic) #water_animation4 NPC_WATER_SPLASH
+001-1,166,123,0 duplicate(#fish_basic) #water_animation5 NPC_WATER_SPLASH
+001-1,181,119,0 duplicate(#fish_basic) #water_animation6 NPC_WATER_SPLASH
+001-1,202,114,0 duplicate(#fish_basic) #water_animation7 NPC_WATER_SPLASH
+001-1,187,86,0 duplicate(#fish_basic) #water_animation8 NPC_WATER_SPLASH
+001-1,32,57,0 duplicate(#fish_basic) #water_animation9 NPC_WATER_SPLASH
+001-1,40,144,0 duplicate(#fish_basic) #water_animation10 NPC_WATER_SPLASH
+001-1,58,131,0 duplicate(#fish_basic) #water_animation11 NPC_WATER_SPLASH
+001-1,76,137,0 duplicate(#fish_basic) #water_animation12 NPC_WATER_SPLASH
+001-1,109,132,0 duplicate(#fish_basic) #water_animation13 NPC_WATER_SPLASH
+001-1,141,93,0 duplicate(#fish_basic) #water_animation14 NPC_WATER_SPLASH
+001-1,168,57,0 duplicate(#fish_basic) #water_animation15 NPC_WATER_SPLASH
diff --git a/npc/001-1/xilaxa.txt b/npc/001-1/xilaxa.txt
new file mode 100644
index 00000000..e1e66e91
--- /dev/null
+++ b/npc/001-1/xilaxa.txt
@@ -0,0 +1,50 @@
+// Evol scripts.
+// Author:
+// Reid
+// Description:
+// Moon, main NPC for the urchin quest.
+
+001-1,52,44,0 script Xilaxa#001-1 NPC_UKAR_MALE_LEGION_ARTIS,{
+
+ npc_pausemove();
+ getmapxy(.@map$, .@cx, .@cy, 0);
+ npc_turntoxy(.@cx, .@cy);
+ npctalkonce("Hello.");
+ npc_resumemove();
+ close;
+
+OnTimer1000:
+ dographmovestep;
+
+OnInit:
+ .distance = 5;
+ initmovegraph "mid", 54, 43, 60, 46,
+ "left", 47, 50, 52, 55,
+ "right", 62, 50, 67, 55;
+
+ setmovegraphcmd "mid", "left", 1, "dir 0; wait 4",
+ "mid", "left", 4, "dir 2; wait 3; dir 0; wait 2; dir 6; wait 1; dir 0",
+ "mid", "left", 2, "dir 4; wait 5; dir 0; wait 2",
+ "mid", "left", 3, "dir 6; wait 1; dir 0; wait 3; dir 2; wait 3; dir 0",
+ "mid", "left", 1, "dir 0; wait 1; dir 2; wait 1; dir 0; wait 1; dir 6; wait 5",
+ "mid", "right", 3, "dir 0; wait 4",
+ "mid", "right", 4, "dir 2; wait 3; dir 0; wait 2; dir 6; wait 1; dir 0",
+ "mid", "right", 2, "dir 4; wait 5; dir 0; wait 2",
+ "mid", "right", 1, "dir 6; wait 1; dir 0; wait 3; dir 2; wait 3; dir 0",
+ "mid", "right", 2, "dir 0; wait 1; dir 2; wait 1; dir 0; wait 1; dir 6; wait 5",
+
+ "left", "mid", 2, "dir 0; wait 4",
+ "left", "mid", 1, "dir 2; wait 3; dir 0; wait 2; dir 6; wait 1; dir 0",
+ "left", "mid", 3, "dir 4; wait 5; dir 0; wait 2",
+ "left", "mid", 2, "dir 6; wait 1; dir 0; wait 3; dir 2; wait 3; dir 0",
+ "left", "mid", 3, "dir 0; wait 1; dir 2; wait 1; dir 0; wait 1; dir 6; wait 5",
+
+ "right", "mid", 3, "dir 0; wait 4",
+ "right", "mid", 2, "dir 2; wait 3; dir 0; wait 2; dir 6; wait 1; dir 0",
+ "right", "mid", 1, "dir 4; wait 5; dir 0; wait 2",
+ "right", "mid", 1, "dir 6; wait 1; dir 0; wait 3; dir 2; wait 3; dir 0",
+ "right", "mid", 2, "dir 0; wait 1; dir 2; wait 1; dir 0; wait 1; dir 6; wait 5";
+
+ firstmove "wait 5", "mid";
+ initnpctimer;
+}