summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMicksha <ms-shaman@gmx.de>2018-11-06 13:22:49 +0000
committerMicksha <ms-shaman@gmx.de>2018-11-06 13:22:49 +0000
commitbd89e48964bac42e63cdd40cb39b40caa0008a2f (patch)
tree804473e915318f689c7071f26e248482c0d252af
parent875df1ca15b5fa752064524717051ccedb3c3474 (diff)
parent113c287aa53303deb2b4701fc02783f3bb9bcfd3 (diff)
downloadserverdata-bd89e48964bac42e63cdd40cb39b40caa0008a2f.tar.gz
serverdata-bd89e48964bac42e63cdd40cb39b40caa0008a2f.tar.bz2
serverdata-bd89e48964bac42e63cdd40cb39b40caa0008a2f.tar.xz
serverdata-bd89e48964bac42e63cdd40cb39b40caa0008a2f.zip
Merge branch 'Gumicommit' into 'master'
Gumicommit See merge request evol/serverdata!136
-rw-r--r--db/constants.conf46
-rw-r--r--db/quest_db.conf20
-rw-r--r--db/re/item_db.conf1127
-rw-r--r--maps/re/001-3-0.mcachebin1263 -> 1261 bytes
-rw-r--r--maps/re/008-1-1.mcachebin358 -> 1501 bytes
-rw-r--r--maps/re/008-1.mcachebin6866 -> 6872 bytes
-rw-r--r--maps/re/008-2-2.mcachebin117 -> 117 bytes
-rw-r--r--npc/001-1/_import.txt3
-rw-r--r--npc/001-1/koga.txt20
-rw-r--r--npc/001-1/rowboat.txt20
-rw-r--r--npc/001-1/sophialla.txt20
-rw-r--r--npc/001-3-0/_import.txt1
-rw-r--r--npc/001-3-0/_mobs.txt2
-rw-r--r--npc/001-3-0/_warps.txt2
-rw-r--r--npc/001-3-0/mundane.txt20
-rw-r--r--npc/008-1-1/_import.txt1
-rw-r--r--npc/008-1-1/_warps.txt3
-rw-r--r--npc/008-1/_import.txt14
-rw-r--r--npc/008-1/_warps.txt1
-rw-r--r--npc/008-1/auldsbel.txt20
-rw-r--r--npc/008-1/banu.txt21
-rw-r--r--npc/008-1/doors.txt6
-rw-r--r--npc/008-1/hinnak.txt354
-rw-r--r--npc/008-1/jack.txt314
-rw-r--r--npc/008-1/mikhail.txt131
-rw-r--r--npc/008-1/milly.txt109
-rw-r--r--npc/008-1/old-man.txt90
-rw-r--r--npc/008-1/old-woman.txt137
-rw-r--r--npc/008-1/oscar.txt20
-rw-r--r--npc/008-1/sabine.txt64
-rw-r--r--npc/008-1/snarfles.txt20
-rw-r--r--npc/008-1/soul-menhir.txt58
-rw-r--r--npc/008-1/voltain.txt19
-rw-r--r--npc/008-1/wateranimation.txt4
-rw-r--r--npc/008-2-0/_import.txt1
-rw-r--r--npc/008-2-0/celestia.txt20
-rw-r--r--npc/008-2-1/_import.txt4
-rw-r--r--npc/008-2-1/generalstore.txt20
-rw-r--r--npc/008-2-1/inspector.txt190
-rw-r--r--npc/008-2-1/richard.txt20
-rw-r--r--npc/008-2-1/selim.txt19
-rw-r--r--npc/008-2-10/_import.txt1
-rw-r--r--npc/008-2-10/airlia.txt20
-rw-r--r--npc/008-2-12/_import.txt1
-rw-r--r--npc/008-2-12/nurse.txt101
-rw-r--r--npc/008-2-13/_import.txt1
-rw-r--r--npc/008-2-13/lena.txt20
-rw-r--r--npc/008-2-14/_import.txt1
-rw-r--r--npc/008-2-14/doctor.txt80
-rw-r--r--npc/008-2-17/_import.txt2
-rw-r--r--npc/008-2-17/angus.txt20
-rw-r--r--npc/008-2-17/caul.txt20
-rw-r--r--npc/008-2-18/_import.txt1
-rw-r--r--npc/008-2-18/malik.txt65
-rw-r--r--npc/008-2-19/_import.txt1
-rw-r--r--npc/008-2-19/books.txt60
-rw-r--r--npc/008-2-2/_import.txt7
-rw-r--r--npc/008-2-2/barron.txt32
-rw-r--r--npc/008-2-2/kfahr.txt20
-rw-r--r--npc/008-2-2/ledmitz.txt55
-rw-r--r--npc/008-2-2/melania.txt21
-rw-r--r--npc/008-2-2/melinda.txt156
-rw-r--r--npc/008-2-2/note.txt28
-rw-r--r--npc/008-2-2/shop.txt25
-rw-r--r--npc/008-2-24/_import.txt1
-rw-r--r--npc/008-2-24/troupe-leader.txt119
-rw-r--r--npc/008-2-4/_import.txt2
-rw-r--r--npc/008-2-4/bernard.txt230
-rw-r--r--npc/008-2-4/olana.txt21
-rw-r--r--npc/008-2-6/_import.txt2
-rw-r--r--npc/008-2-6/alan.txt303
-rw-r--r--npc/008-2-6/donald.txt20
-rw-r--r--npc/008-2-7/_import.txt1
-rw-r--r--npc/008-2-7/wyara.txt20
-rw-r--r--npc/008-2-8/_import.txt2
-rw-r--r--npc/008-2-8/macgowan.txt24
-rw-r--r--npc/008-2-8/nicholas.txt28
-rw-r--r--npc/_anchors.txt1
-rw-r--r--npc/commands/debug-quest.txt31
-rw-r--r--npc/functions/generic-text.txt120
-rw-r--r--npc/functions/quest-debug/036-HurnscaldQuests_Hinnak.txt32
-rw-r--r--npc/functions/quest-debug/037-HurnscaldQuests_Soup.txt32
-rw-r--r--npc/functions/quest-debug/038-HurnscaldQuests_Inspector.txt41
-rw-r--r--npc/functions/quest-debug/039-HurnscaldQuests_ForestBow.txt42
-rw-r--r--npc/functions/quest-debug/040-HurnscaldQuests_WoodenShield.txt37
-rw-r--r--npc/scripts.conf18
86 files changed, 4753 insertions, 53 deletions
diff --git a/db/constants.conf b/db/constants.conf
index c29903db..2da38e3c 100644
--- a/db/constants.conf
+++ b/db/constants.conf
@@ -4028,6 +4028,45 @@ constants_db: {
NPC_OSCAR: 145
NPC_SHOP_BAG_TEST: 146
NPC_RED: 147
+ NPC_KOGA: 148
+ NPC_OLD_LADY: 149
+ NPC_ARKIM: 150
+ NPC_YOUNG_MAN_APPRENTICE: 151
+ NPC_YOUNG_MAN_KFAHR: 152
+ NPC_INSPECTOR: 153
+ NPC_SUSPICIOUS_TRADER: 154
+ NPC_GENERAL_STORE: 155
+ NPC_DARK_DRUID: 156
+ NPC_AIRLIA: 157
+ NPC_NICHOLAS: 158
+ NPC_BLONDE_APPRENTICE: 159
+ NPC_GIRL_MILLY: 160
+ NPC_OLANA: 161
+ NPC_DESERT_HAT_MAN: 162
+ NPC_ANGUS_THE_SMITH: 163
+ NPC_YOUNG_MAN_IN_PINK: 164
+ NPC_WAITRESS_LEGACY: 165
+ NPC_WIZARD: 166
+ NPC_LORA_TAY: 167
+ NPC_DOCTOR_LEGACY: 168
+ NPC_BOY_MIKE: 169
+ NPC_CELESTIA: 170
+ NPC_GUMI_THE_DYER: 171
+ NPC_DIMOND: 172
+ NPC_CHEF_LEGACY: 173
+ NPC_DIMONDS_WAITRESS: 174
+ NPC_DRINKER_ROAMINGO: 175
+ NPC_DRINKER_MICKSHA: 176
+ NPC_NURSE_LEGACY: 177
+ NPC_LENA: 178
+ NPC_CAUL: 179
+ NPC_MALIK: 180
+ NPC_SNARFLES: 181
+ NPC_OLD_MAN_HURNS: 182
+ NPC_BERNARD: 183
+ NPC_SABINE: 184
+ NPC_MIKHAIL: 185
+ NPC_TROUPE_LEADER: 186
NPC_CONFUSED_TREE: 400
NPC_ALIGE: 401
@@ -4078,6 +4117,13 @@ constants_db: {
NPC_DEVIS_ARTIS: 448
NPC_MOUBOO: 449
NPC_MONA: 450
+ NPC_MELINDA: 451
+ NPC_LUMBERJACK: 452
+ NPC_HINNAK: 453
+ NPC_RICHARD_LEGACY: 454
+ NPC_SOPHIALLA: 455
+ NPC_MUNDANE: 456
+ NPC_ROWBOAT_STAND_WE: 457
NPC_TEST1: 800
NPC_PLAYER: 801
diff --git a/db/quest_db.conf b/db/quest_db.conf
index 48d4129a..bc8acb82 100644
--- a/db/quest_db.conf
+++ b/db/quest_db.conf
@@ -162,6 +162,26 @@ quest_db: (
Name: "Artis_Legion_Progress"
},
{
+ Id: 36
+ Name: "HurnscaldQuests_Hinnak"
+},
+{
+ Id: 37
+ Name: "HurnscaldQuests_Soup"
+},
+{
+ Id: 38
+ Name: "HurnscaldQuests_Inspector"
+},
+{
+ Id: 39
+ Name: "HurnscaldQuests_ForestBow"
+},
+{
+ Id: 40
+ Name: "HurnscaldQuests_WoodenShield"
+},
+{
Id: 1000
Name: "Test_testing1"
},
diff --git a/db/re/item_db.conf b/db/re/item_db.conf
index de337b46..7c768daf 100644
--- a/db/re/item_db.conf
+++ b/db/re/item_db.conf
@@ -1272,6 +1272,339 @@ item_db: (
">
},
{
+ Id: 563
+ AegisName: "Beer"
+ Name: "Beer"
+ Type: "IT_HEALING"
+ Buy: 250
+ Sell: 50
+ Weight: 50
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Refine: false
+ ViewSprite: 563
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 750
+ Sprite: 0
+ UseEffect: "EFFECT_HEAL"
+ Script: <"
+ @min = 250;
+ @max = 450;
+ @delay = 8;
+ @type = 1;
+ doevent "rand_sc_heal::OnUse";
+ ">
+},
+{
+ Id: 564
+ AegisName: "RoastedMaggot"
+ Name: "Roasted Maggot"
+ Type: "IT_HEALING"
+ Buy: 500
+ Sell: 50
+ Weight: 25
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Refine: false
+ ViewSprite: 564
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 450
+ Sprite: 0
+ UseEffect: "EFFECT_HEAL"
+ Script: <"
+ @min = 180;
+ @max = 360;
+ @delay = 50;
+ @type = 1;
+ doevent "rand_sc_heal::OnUse";
+ ">
+},
+{
+ Id: 565
+ AegisName: "CherryCake"
+ Name: "Cherry Cake"
+ Type: "IT_HEALING"
+ Buy: 800
+ Sell: 75
+ Weight: 35
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Refine: false
+ ViewSprite: 565
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 450
+ Sprite: 0
+ UseEffect: "EFFECT_HEAL"
+ Script: <"
+ @min = 250;
+ @max = 450;
+ @delay = 150;
+ @type = 1;
+ doevent "rand_sc_heal::OnUse";
+ ">
+},
+{
+ Id: 600
+ AegisName: "SmallHealing"
+ Name: "Small Healing Potion"
+ Type: "IT_HEALING"
+ Buy: 2500
+ Sell: 300
+ Weight: 32
+ Atk: 0
+ Matk: 0
+ Def: 0
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ WeaponLv: 0
+ EquipLv: 0
+ Refine: false
+ ViewSprite: 600
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 100
+ Sprite: 0
+ UseEffect: "EFFECT_HEAL"
+ Script: <"
+ @min = 200;
+ @max = 300;
+ @delay = 3;
+ @type = 2;
+ doevent "rand_sc_heal::OnUse";
+ ">
+},
+{
+ Id: 601
+ AegisName: "MediumHealing"
+ Name: "Medium Healing Potion"
+ Type: "IT_HEALING"
+ Buy: 5000
+ Sell: 650
+ Weight: 64
+ Atk: 0
+ Matk: 0
+ Def: 0
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ WeaponLv: 0
+ EquipLv: 0
+ Refine: false
+ ViewSprite: 601
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 100
+ Sprite: 0
+ UseEffect: "EFFECT_HEAL"
+ Script: <"
+ @min = 400;
+ @max = 600;
+ @delay = 4;
+ @type = 2;
+ doevent "rand_sc_heal::OnUse";
+ ">
+},
+{
+ Id: 602
+ AegisName: "LargeHealing"
+ Name: "Large Healing Potion"
+ Type: "IT_HEALING"
+ Buy: 10000
+ Sell: 1250
+ Weight: 128
+ Atk: 0
+ Matk: 0
+ Def: 0
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ WeaponLv: 0
+ EquipLv: 0
+ Refine: false
+ ViewSprite: 602
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 100
+ Sprite: 0
+ UseEffect: "EFFECT_HEAL"
+ Script: <"
+ @min = 800;
+ @max = 1200;
+ @delay = 5;
+ @type = 2;
+ doevent "rand_sc_heal::OnUse";
+ ">
+},
+{
+ Id: 603
+ AegisName: "SmallMana"
+ Name: "Small Mana Potion"
+ Type: "IT_HEALING"
+ Buy: 2000
+ Sell: 250
+ Weight: 32
+ Atk: 0
+ Matk: 0
+ Def: 0
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ WeaponLv: 0
+ EquipLv: 0
+ Refine: false
+ ViewSprite: 603
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 205
+ Sprite: 0
+ UseEffect: "EFFECT_HEAL"
+ Script: <"
+ bonus bMaxSP,20;
+ ">
+},
+{
+ Id: 604
+ AegisName: "MediumMana"
+ Name: "Medium Mana Potion"
+ Type: "IT_HEALING"
+ Buy: 5000
+ Sell: 600
+ Weight: 64
+ Atk: 0
+ Matk: 0
+ Def: 0
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ WeaponLv: 0
+ EquipLv: 0
+ Refine: false
+ ViewSprite: 604
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 250
+ Sprite: 0
+ UseEffect: "EFFECT_HEAL"
+ Script: <"
+ bonus bMaxSP,50;
+ ">
+},
+{
+ Id: 605
+ AegisName: "LargeMana"
+ Name: "Large Mana Potion"
+ Type: "IT_HEALING"
+ Buy: 10000
+ Sell: 1500
+ Weight: 128
+ Atk: 0
+ Matk: 0
+ Def: 0
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ WeaponLv: 0
+ EquipLv: 0
+ Refine: false
+ ViewSprite: 605
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 250
+ Sprite: 0
+ UseEffect: "EFFECT_HEAL"
+ Script: <"
+ bonus bMaxSP,100;
+ ">
+},
+{
+ Id: 606
+ AegisName: "ConcPotion"
+ Name: "Concentration Potion"
+ Type: "IT_HEALING"
+ Buy: 2500
+ Sell: 650
+ Weight: 25
+ Atk: 0
+ Matk: 0
+ Def: 0
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ WeaponLv: 0
+ EquipLv: 0
+ Refine: false
+ ViewSprite: 606
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 100
+ Sprite: 0
+ UseEffect: "EFFECT_HEAL"
+ Script: <"
+ bonus bAspd,50;
+ ">
+},
+{
+ Id: 607
+ AegisName: "IronPotion"
+ Name: "Iron Potion"
+ Type: "IT_HEALING"
+ Buy: 2500
+ Sell: 650
+ Weight: 40
+ Atk: 0
+ Matk: 0
+ Def: 0
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ WeaponLv: 0
+ EquipLv: 0
+ Refine: false
+ ViewSprite: 606
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 500
+ Sprite: 0
+ UseEffect: "EFFECT_HEAL"
+ Script: <"
+ bonus bStr,5;
+ ">
+},
+{
Id: 700
AegisName: "SmallTentacles"
Name: "Small Tentacles"
@@ -2629,8 +2962,8 @@ item_db: (
Buy: 10000
Sell: 400
Weight: 50
- Atk: 0
- Matk: 0
+ Atk: 5
+ Matk: 25
Def: 0
Range: 0
Slots: 1
@@ -2640,7 +2973,7 @@ item_db: (
Gender: "SEX_ANY"
Loc: "EQP_ACC_L"
WeaponLv: 0
- EquipLv: 1
+ EquipLv: 10
Refine: false
ViewSprite: 1000
BindOnEquip: false
@@ -2906,6 +3239,54 @@ item_db: (
">
},
{
+ Id: 1308
+ AegisName: "FineDress"
+ Name: "Fine Dress"
+ Type: "IT_ARMOR"
+ Buy: 12000
+ Sell: 2600
+ Weight: 240
+ Atk: 0
+ Matk: 170
+ Def: 250
+ Range: 0
+ Slots: 1
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_HEAD_MID"
+ WeaponLv: 0
+ EquipLv: 15
+ Refine: false
+ ViewSprite: 1308
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+ AllowCards: {
+ id5003: 1
+ id5004: 1
+ id5005: 1
+ id5006: 1
+ id5007: 1
+ id5008: 1
+ id5009: 1
+ id5010: 1
+ id5011: 1
+ id5012: 1
+ id5013: 1
+ id5014: 1
+ id5015: 1
+ id5016: 1
+ id5017: 1
+ id5018: 1
+ id5019: 1
+ id5020: 1
+ id5021: 1
+ }
+},
+{
Id: 1800
AegisName: "LousyMoccasins"
Name: "Lousy Moccasins"
@@ -2933,6 +3314,55 @@ item_db: (
Sprite: 0
},
{
+ Id: 1801
+ AegisName: "CottonBoots"
+ Name: "Cotton Boots"
+ Type: "IT_ARMOR"
+ Buy: 2600
+ Sell: 420
+ Weight: 35
+ Atk: 0
+ Matk: 0
+ Def: 120
+ Range: 0
+ Slots: 1
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_SHOES"
+ WeaponLv: 0
+ EquipLv: 12
+ Refine: false
+ ViewSprite: 1801
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+ AllowCards: {
+ id5003: 1
+ id5004: 1
+ id5005: 1
+ id5006: 1
+ id5007: 1
+ id5008: 1
+ id5009: 1
+ id5010: 1
+ id5011: 1
+ id5012: 1
+ id5013: 1
+ id5014: 1
+ id5015: 1
+ id5016: 1
+ id5017: 1
+ id5018: 1
+ id5019: 1
+ id5020: 1
+ id5021: 1
+ }
+},
+
+{
Id: 2000
AegisName: "Armbands"
Name: "Armbands"
@@ -3014,6 +3444,81 @@ item_db: (
Sprite: 0
},
{
+ Id: 2003
+ AegisName: "CottonGloves"
+ Name: "Cotton Gloves"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 250
+ Weight: 60
+ Atk: 0
+ Matk: 0
+ Def: 10
+ Range: 0
+ Slots: 1
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_GARMENT"
+ WeaponLv: 0
+ EquipLv: 10
+ Refine: false
+ ViewSprite: 2003
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+ AllowCards: {
+ id5003: 1
+ id5004: 1
+ id5005: 1
+ id5006: 1
+ id5007: 1
+ id5008: 1
+ id5009: 1
+ id5010: 1
+ id5011: 1
+ id5012: 1
+ id5013: 1
+ id5014: 1
+ id5015: 1
+ id5016: 1
+ id5017: 1
+ id5018: 1
+ id5019: 1
+ id5020: 1
+ id5021: 1
+ }
+},
+{
+ Id: 2004
+ AegisName: "LeatherGloves"
+ Name: "Leather Gloves"
+ Type: "IT_ARMOR"
+ Buy: 3500
+ Sell: 500
+ Weight: 140
+ Atk: 0
+ Matk: 0
+ Def: 20
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_GARMENT"
+ WeaponLv: 0
+ EquipLv: 20
+ Refine: false
+ ViewSprite: 2004
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+},
+{
Id: 2200
AegisName: "CreasedShorts"
Name: "Creased Shorts"
@@ -3068,6 +3573,140 @@ item_db: (
Sprite: 0
},
{
+ Id: 2202
+ AegisName: "JeansChaps"
+ Name: "Jeans Chaps"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 500
+ Weight: 360
+ Atk: 0
+ Matk: -100
+ Def: 240
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 12
+ Refine: false
+ ViewSprite: 2202
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+},
+{
+ Id: 2203
+ AegisName: "SilkPants"
+ Name: "Silk Pants"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 1000
+ Weight: 20
+ Atk: 0
+ Matk: 0
+ Def: 80
+ Range: 0
+ Slots: 1
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 17
+ Refine: false
+ ViewSprite: 2203
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+ AllowCards: {
+ id5000: 1
+ id5001: 1
+ id5002: 1
+ }
+},
+{
+ Id: 2204
+ AegisName: "CottonSkirt"
+ Name: "Cotton Skirt"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 600
+ Weight: 15
+ Atk: 0
+ Matk: 0
+ Def: 20
+ Range: 0
+ Slots: 1
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 5
+ Refine: false
+ ViewSprite: 2204
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+ AllowCards: {
+ id5003: 1
+ id5004: 1
+ id5005: 1
+ id5006: 1
+ id5007: 1
+ id5008: 1
+ id5009: 1
+ id5010: 1
+ id5011: 1
+ id5012: 1
+ id5013: 1
+ id5014: 1
+ id5015: 1
+ id5016: 1
+ id5017: 1
+ id5018: 1
+ id5019: 1
+ id5020: 1
+ id5021: 1
+ }
+},
+{
+ Id: 2205
+ AegisName: "LeatherTrousers"
+ Name: "Leather Trousers"
+ Type: "IT_ARMOR"
+ Buy: 9500
+ Sell: 2100
+ Weight: 280
+ Atk: 0
+ Matk: 0
+ Def: 160
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 15
+ Refine: false
+ ViewSprite: 2205
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+},
+{
Id: 2700
AegisName: "Barrel"
Name: "Barrel"
@@ -3123,6 +3762,53 @@ item_db: (
">
},
{
+ Id: 2702
+ AegisName: "WoodenShield"
+ Name: "Wooden Shield"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 750
+ Weight: 2450
+ Def: 72
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_HAND_L"
+ EquipLv: 12
+ Refine: false
+ ViewSprite: 0
+ BindOnEquip: false
+ BuyingStore: true
+ OnEquipScript: <"
+ bonus bAtkRange, -1;
+ ">
+},
+{
+ Id: 2703
+ AegisName: "SteelShield"
+ Name: "Steel Shield"
+ Type: "IT_ARMOR"
+ Buy: 25000
+ Sell: 2630
+ Weight: 5500
+ Def: 200
+ Matk: -200
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_HAND_L"
+ EquipLv: 20
+ Refine: false
+ ViewSprite: 2701
+ BindOnEquip: false
+ BuyingStore: true
+ OnEquipScript: <"
+ bonus bAtkRange, -1;
+ ">
+},
+{
Id: 2900
AegisName: "Bandana"
Name: "Bandana"
@@ -3274,11 +3960,255 @@ item_db: (
All: true
}
Gender: "SEX_ANY"
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2200
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+},
+
+{
+ Id: 2906
+ AegisName: "InfantryHelmet"
+ Name: "Infantry Helmet"
+ Type: "IT_ARMOR"
+ Buy: 1600
+ Sell: 300
+ Weight: 400
+ Atk: 0
+ Matk: -50
+ Def: 160
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 8
+ EquipLv: 12
+ Refine: false
+ ViewSprite: 2906
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+},
+{
+ Id: 2907
+ AegisName: "CandleHelmet"
+ Name: "Candle Helmet"
+ Type: "IT_ARMOR"
+ Buy: 4500
+ Sell: 650
+ Weight: 500
+ Atk: 0
+ Matk: -25
+ Def: 180
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 16
+ Refine: false
+ ViewSprite: 2907
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+},
+{
+ Id: 2908
+ AegisName: "WarlordHelmet"
+ Name: "Warlord Helmet"
+ Type: "IT_ARMOR"
+ Buy: 13500
+ Sell: 3200
+ Weight: 1000
+ Atk: 0
+ Matk: -300
+ Def: 340
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 24
+ Refine: false
+ ViewSprite: 2908
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+},
+{
+ Id: 2909
+ AegisName: "AxeHat"
+ Name: "Axe Hat"
+ Type: "IT_ARMOR"
+ Buy: 3500
+ Sell: 750
+ Weight: 50
+ Atk: 0
+ Matk: 25
+ Def: 12
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 5
+ Refine: false
+ ViewSprite: 2909
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+},
+{
+ Id: 2910
+ AegisName: "PinkieHat"
+ Name: "Pinkie Hat"
+ Type: "IT_ARMOR"
+ Buy: 12600
+ Sell: 3500
+ Weight: 5
+ Atk: 0
+ Matk: 7
+ Def: 7
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 10
Refine: false
- ViewSprite: 2905
+ ViewSprite: 2910
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+},
+{
+ Id: 2911
+ AegisName: "TopHat"
+ Name: "Top Hat"
+ Type: "IT_ARMOR"
+ Buy: 50000
+ Sell: 12500
+ Weight: 40
+ Atk: 0
+ Matk: 0
+ Def: 50
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 17
+ Refine: false
+ ViewSprite: 2911
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+},
+{
+ Id: 2912
+ AegisName: "BowlerHat"
+ Name: "Bowler Hat"
+ Type: "IT_ARMOR"
+ Buy: 17355
+ Sell: 4300
+ Weight: 30
+ Atk: 0
+ Matk: 0
+ Def: 40
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 15
+ Refine: false
+ ViewSprite: 2912
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+},
+{
+ Id: 2913
+ AegisName: "FairyHat"
+ Name: "Fairy Hat"
+ Type: "IT_ARMOR"
+ Buy: 6300
+ Sell: 1200
+ Weight: 5
+ Atk: 0
+ Matk: 0
+ Def: 25
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 10
+ Refine: false
+ ViewSprite: 2913
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+},
+{
+ Id: 2914
+ AegisName: "NohMask"
+ Name: "Noh Mask"
+ Type: "IT_ARMOR"
+ Buy: 25000
+ Sell: 5200
+ Weight: 150
+ Atk: 0
+ Matk: 0
+ Def: 20
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 15
+ Refine: false
+ ViewSprite: 2914
BindOnEquip: false
BuyingStore: true
Delay: 0
@@ -3323,7 +4253,7 @@ item_db: (
Gender: "SEX_ANY"
Loc: "EQP_HAND_R"
WeaponLv: 1
- EquipLv: 1
+ EquipLv: 15
Refine: false
Subtype: "W_DAGGER"
ViewSprite: 1
@@ -3521,7 +4451,7 @@ item_db: (
Gender: "SEX_ANY"
Loc: ["EQP_HAND_R","EQP_HAND_L"]
WeaponLv: 1
- EquipLv: 15
+ EquipLv: 12
Refine: false
Subtype: "W_2HSPEAR"
BindOnEquip: false
@@ -3530,6 +4460,62 @@ item_db: (
Sprite: 0
},
{
+ Id: 3508
+ AegisName: "Dagger"
+ Name: "Dagger"
+ Type: "IT_WEAPON"
+ Buy: 2500
+ Sell: 500
+ Weight: 350
+ Atk: 100
+ Matk: 0
+ Def: 0
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 15
+ Refine: false
+ Subtype: "W_DAGGER"
+ ViewSprite: 1
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+},
+{
+ Id: 3509
+ AegisName: "Setzer"
+ Name: "Setzer"
+ Type: "IT_WEAPON"
+ Buy: 25000
+ Sell: 5000
+ Weight: 250
+ Atk: 600
+ Matk: 0
+ Def: 0
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ Subtype: "W_DAGGER"
+ ViewSprite: 1
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+},
+{
Id: 3510
AegisName: "Pickaxe"
Name: "Pickaxe"
@@ -3537,7 +4523,7 @@ item_db: (
Buy: 17500
Sell: 3700
Weight: 250
- Atk: 50
+ Atk: 200
Matk: 0
Def: 0
Range: 0
@@ -3546,7 +4532,7 @@ item_db: (
All: true
}
Gender: "SEX_ANY"
- Loc: ["EQP_HAND_R", "EQP_HAND_L"]
+ Loc: ["EQP_HAND_R","EQP_HAND_L"]
WeaponLv: 1
EquipLv: 15
Refine: false
@@ -3557,6 +4543,33 @@ item_db: (
Sprite: 0
},
{
+ Id: 3511
+ AegisName: "Torch"
+ Name: "Torch"
+ Type: "IT_WEAPON"
+ Buy: 2500
+ Sell: 500
+ Weight: 100
+ Atk: 150
+ Matk: 0
+ Def: 0
+ Range: 0
+ Slots: 0
+ Job: {
+ All: true
+ }
+ Gender: "SEX_ANY"
+ Loc: ["EQP_HAND_R","EQP_HAND_L"]
+ WeaponLv: 1
+ EquipLv: 10
+ Refine: false
+ Subtype: "W_DAGGER"
+ BindOnEquip: false
+ BuyingStore: true
+ Delay: 0
+ Sprite: 0
+},
+{
Id: 4000
AegisName: "PiouEgg"
Name: "Piou egg"
@@ -3575,7 +4588,7 @@ item_db: (
Type: "IT_CARD"
Buy: 2000
Sell: 80
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_HEAD_LOW"]
},
{
Id: 5001
@@ -3584,7 +4597,7 @@ item_db: (
Type: "IT_CARD"
Buy: 2000
Sell: 80
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_HEAD_LOW"]
},
{
Id: 5002
@@ -3593,7 +4606,7 @@ item_db: (
Type: "IT_CARD"
Buy: 2000
Sell: 80
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_HEAD_LOW"]
},
{
Id: 5003
@@ -3602,7 +4615,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5004
@@ -3611,7 +4624,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5005
@@ -3620,7 +4633,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5006
@@ -3629,7 +4642,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5007
@@ -3638,7 +4651,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5008
@@ -3647,7 +4660,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5009
@@ -3656,7 +4669,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5010
@@ -3665,7 +4678,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5011
@@ -3674,7 +4687,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5012
@@ -3683,7 +4696,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5013
@@ -3692,7 +4705,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5014
@@ -3701,7 +4714,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5015
@@ -3710,7 +4723,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5016
@@ -3719,7 +4732,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5017
@@ -3728,7 +4741,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5018
@@ -3737,7 +4750,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5019
@@ -3746,7 +4759,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5020
@@ -3755,7 +4768,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5021
@@ -3764,7 +4777,7 @@ item_db: (
Type: "IT_CARD"
Buy: 1200
Sell: 70
- Loc: "EQP_HEAD_MID"
+ Loc: ["EQP_HEAD_MID","EQP_SHOES","EQP_GARMENT","EQP_HEAD_LOW"]
},
{
Id: 5022
@@ -3832,7 +4845,7 @@ item_db: (
bonus bLuk, 2;
bonus bDex, -1;
">
- Loc: "EQP_ACC"
+ Loc: ["EQP_ACC_L"]
},
{
Id: 5029
@@ -3846,7 +4859,7 @@ item_db: (
bonus bStr, 2;
bonus bAgi, -1;
">
- Loc: "EQP_ACC"
+ Loc: ["EQP_ACC_L"]
},
{
Id: 5030
@@ -3860,7 +4873,7 @@ item_db: (
bonus bDex, 2;
bonus bVit, -1;
">
- Loc: "EQP_ACC"
+ Loc: ["EQP_ACC_L"]
},
{
Id: 5031
@@ -3874,7 +4887,7 @@ item_db: (
bonus bInt, 2;
bonus bVit, -1;
">
- Loc: "EQP_ACC"
+ Loc: ["EQP_ACC_L"]
},
{
Id: 5032
@@ -3888,7 +4901,7 @@ item_db: (
bonus bVit, 2;
bonus bLuk, -1;
">
- Loc: "EQP_ACC"
+ Loc: ["EQP_ACC_L"]
},
{
Id: 5033
@@ -3902,7 +4915,7 @@ item_db: (
bonus bAgi, 2;
bonus bStr, -1;
">
- Loc: "EQP_ACC"
+ Loc: ["EQP_ACC_L"]
},
{
Id: 6000
@@ -3913,7 +4926,7 @@ item_db: (
Sell: 52
Weight: 12
Atk: 150
- Range: 7
+ Range: 4
MinRange: 3
Loc: ["EQP_HAND_R", "EQP_HAND_L"]
WeaponLv: 1
@@ -3924,6 +4937,44 @@ item_db: (
}
},
{
+ Id: 6001
+ AegisName: "ShortBow"
+ Name: "Short Bow"
+ Type: "IT_WEAPON"
+ Buy: 1200
+ Sell: 250
+ Weight: 260
+ Atk: 100
+ Range: 5
+ MinRange: 3
+ Loc: ["EQP_HAND_R", "EQP_HAND_L"]
+ WeaponLv: 1
+ EquipLv: 15
+ Subtype: "W_BOW"
+ AllowAmmo: {
+ Id6500: 1
+ }
+},
+{
+ Id: 6002
+ AegisName: "ForestBow"
+ Name: "Forest Bow"
+ Type: "IT_WEAPON"
+ Buy: 7500
+ Sell: 1250
+ Weight: 480
+ Atk: 150
+ Range: 6
+ MinRange: 3
+ Loc: ["EQP_HAND_R", "EQP_HAND_L"]
+ WeaponLv: 1
+ EquipLv: 20
+ Subtype: "W_BOW"
+ AllowAmmo: {
+ Id6500: 1
+ }
+},
+{
Id: 6500
AegisName: "TrainingArrow"
Name: "Training Arrow"
diff --git a/maps/re/001-3-0.mcache b/maps/re/001-3-0.mcache
index 54c5fd48..7dd92e07 100644
--- a/maps/re/001-3-0.mcache
+++ b/maps/re/001-3-0.mcache
Binary files differ
diff --git a/maps/re/008-1-1.mcache b/maps/re/008-1-1.mcache
index 6365fa18..389c1412 100644
--- a/maps/re/008-1-1.mcache
+++ b/maps/re/008-1-1.mcache
Binary files differ
diff --git a/maps/re/008-1.mcache b/maps/re/008-1.mcache
index e8534b08..b8d09505 100644
--- a/maps/re/008-1.mcache
+++ b/maps/re/008-1.mcache
Binary files differ
diff --git a/maps/re/008-2-2.mcache b/maps/re/008-2-2.mcache
index b98e0800..c718dfc6 100644
--- a/maps/re/008-2-2.mcache
+++ b/maps/re/008-2-2.mcache
Binary files differ
diff --git a/npc/001-1/_import.txt b/npc/001-1/_import.txt
index eb522c73..1b748d55 100644
--- a/npc/001-1/_import.txt
+++ b/npc/001-1/_import.txt
@@ -18,6 +18,7 @@
"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",
@@ -28,10 +29,12 @@
"npc/001-1/pious.txt",
"npc/001-1/qonan.txt",
"npc/001-1/qpid.txt",
+"npc/001-1/rowboat.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",
diff --git a/npc/001-1/koga.txt b/npc/001-1/koga.txt
new file mode 100644
index 00000000..1359f4e3
--- /dev/null
+++ b/npc/001-1/koga.txt
@@ -0,0 +1,20 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// The Koga in Artis, only accessable via Rowboat.
+// THIS IS A PLACEHOLDER!
+
+001-1,225,59,0 script Koga NPC_KOGA,{
+ speech
+ 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.");
+
+ close;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 4;
+ end;
+}
diff --git a/npc/001-1/rowboat.txt b/npc/001-1/rowboat.txt
new file mode 100644
index 00000000..8682ba0e
--- /dev/null
+++ b/npc/001-1/rowboat.txt
@@ -0,0 +1,20 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// The rowboat, picking up the player on small beach in order to bring it to Koga.
+// THIS IS A PLACEHOLDER!
+
+001-1,203,64,0 script Rowboat NPC_ROWBOAT_STAND_WE,{
+ speech
+ 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.");
+
+ close;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 3;
+ end;
+}
diff --git a/npc/001-1/sophialla.txt b/npc/001-1/sophialla.txt
new file mode 100644
index 00000000..ad4d508a
--- /dev/null
+++ b/npc/001-1/sophialla.txt
@@ -0,0 +1,20 @@
+// 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,{
+ speech
+ l("Hello."),
+ l("Can't you see I am reading? If you need something, tell me the secret password.");
+ lg("If you don't know it, just go, please.");
+
+ close;
+
+OnInit:
+ .sex = G_FEMALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/001-3-0/_import.txt b/npc/001-3-0/_import.txt
index 320f28ce..5ead6439 100644
--- a/npc/001-3-0/_import.txt
+++ b/npc/001-3-0/_import.txt
@@ -2,3 +2,4 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/001-3-0/_mobs.txt",
"npc/001-3-0/_warps.txt",
+"npc/001-3-0/mundane.txt",
diff --git a/npc/001-3-0/_mobs.txt b/npc/001-3-0/_mobs.txt
index 18967b07..88caa962 100644
--- a/npc/001-3-0/_mobs.txt
+++ b/npc/001-3-0/_mobs.txt
@@ -15,7 +15,7 @@
001-3-0,175,50,0,4 monster Ratto 1005,2,60000,30000
001-3-0,175,64,3,2 monster Cave Maggot 1027,4,5000,15000
001-3-0,104,75,48,43 monster Cave Maggot 1027,25,500,2000
-001-3-0,91,67,3,5 monster Cave Maggot 1027,3,500,2000
+001-3-0,90,67,2,5 monster Cave Maggot 1027,3,500,2000
001-3-0,128,86,3,5 monster Green Slime 1024,3,500,2000
001-3-0,42,103,3,5 monster Green Slime 1024,3,500,2000
001-3-0,120,85,7,2 monster Little Green Slime 1025,2,500,2000
diff --git a/npc/001-3-0/_warps.txt b/npc/001-3-0/_warps.txt
index a2d4e9e2..d192e4ef 100644
--- a/npc/001-3-0/_warps.txt
+++ b/npc/001-3-0/_warps.txt
@@ -3,6 +3,6 @@
001-3-0,196,35,0 warp #001-3-0_196_35 0,0,001-1,197,35
001-3-0,172,41,0 warp #001-3-0_172_41 0,0,001-3-1,34,58
001-3-0,162,40,0 warp #001-3-0_162_40 0,0,001-3-1,23,57
-001-3-0,198,59,0 warp #001-3-0_198_59 0,0,001-1,199,61
+001-3-0,198,60,0 warp #001-3-0_198_60 0,0,001-1,199,61
001-3-0,152,55,0 warp #001-3-0_152_55 0,0,001-1,152,51
001-3-0,85,130,0 warp #001-3-0_85_130 0,0,001-1,86,130
diff --git a/npc/001-3-0/mundane.txt b/npc/001-3-0/mundane.txt
new file mode 100644
index 00000000..51ffb1bd
--- /dev/null
+++ b/npc/001-3-0/mundane.txt
@@ -0,0 +1,20 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Mundane, Monas dad, lost in sewers.
+// THIS IS A PLACEHOLDER!
+
+001-3-0,97,66,0 script Mundane#001-3-0 NPC_MUNDANE,{
+ speech
+ l("Oh, Hi."),
+ l("I didn't expect someone coming here. I need help.");
+ lg("Do you know the way out of here? My daughter Mona may worry already.");
+
+ close;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-1-1/_import.txt b/npc/008-1-1/_import.txt
index 7063c99e..ea6fd468 100644
--- a/npc/008-1-1/_import.txt
+++ b/npc/008-1-1/_import.txt
@@ -1,2 +1,3 @@
// Map 008-1-1: Woodland
// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/008-1-1/_warps.txt",
diff --git a/npc/008-1-1/_warps.txt b/npc/008-1-1/_warps.txt
new file mode 100644
index 00000000..8dc1e0b5
--- /dev/null
+++ b/npc/008-1-1/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 008-1-1: Woodland warps
+008-1-1,247,85,0 warp #008-1-1_247_85 0,1,008-1,21,85
diff --git a/npc/008-1/_import.txt b/npc/008-1/_import.txt
index b7797bf0..31bb5966 100644
--- a/npc/008-1/_import.txt
+++ b/npc/008-1/_import.txt
@@ -2,7 +2,19 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-1/_mobs.txt",
"npc/008-1/_warps.txt",
+"npc/008-1/auldsbel.txt",
+"npc/008-1/banu.txt",
"npc/008-1/confused-tree.txt",
-"npc/008-1/doors.txt",
+"npc/008-1/hinnak.txt",
+"npc/008-1/jack.txt",
"npc/008-1/mapflags.txt",
+"npc/008-1/mikhail.txt",
+"npc/008-1/milly.txt",
+"npc/008-1/old-man.txt",
+"npc/008-1/old-woman.txt",
+"npc/008-1/oscar.txt",
+"npc/008-1/sabine.txt",
+"npc/008-1/snarfles.txt",
+"npc/008-1/soul-menhir.txt",
+"npc/008-1/voltain.txt",
"npc/008-1/wateranimation.txt",
diff --git a/npc/008-1/_warps.txt b/npc/008-1/_warps.txt
index ab1728ed..46e9891d 100644
--- a/npc/008-1/_warps.txt
+++ b/npc/008-1/_warps.txt
@@ -24,3 +24,4 @@
008-1,257,130,0 warp #008-1_257_130 0,0,008-2-28,25,31
008-1,233,131,0 warp #008-1_233_131 0,0,008-2-29,36,24
008-1,287,133,0 warp #008-1_287_133 0,0,008-2-30,52,39
+008-1,20,85,0 warp #008-1_20_85 0,1,008-1-1,246,85
diff --git a/npc/008-1/auldsbel.txt b/npc/008-1/auldsbel.txt
new file mode 100644
index 00000000..cf4cd16e
--- /dev/null
+++ b/npc/008-1/auldsbel.txt
@@ -0,0 +1,20 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Auldsbel the Magician.
+// THIS IS A PLACEHOLDER!
+
+008-1,119,114,0 script Auldsbel#008-1 NPC_WIZARD,{
+ speech
+ l("Hello."),
+ l("Oh, you look more interested in magic.. the brotherhood did forbid most of the interesting paths of magic, but boring baby spells are still allowed."),
+ lg("If you come back later, I may teach you something. But psst, practising magic is quite dangerous these days.");
+
+ close;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-1/banu.txt b/npc/008-1/banu.txt
new file mode 100644
index 00000000..d8040153
--- /dev/null
+++ b/npc/008-1/banu.txt
@@ -0,0 +1,21 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Banu, the old lady.
+// THIS IS A PLACEHOLDER!
+
+008-1,244,88,0 script Banu#008-1 NPC_OLD_LADY,{
+ speech
+ l("Hello."),
+ l("You don't have a scythe, by chance? I am too old to mew this field all alone."),
+ l("I asked Hinnak, but he wants at least a beer in exchange for his scythe."),
+ lg("But I hate alcohol, so thats not an option for me.");
+
+ close;
+
+OnInit:
+ .sex = G_FEMALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-1/doors.txt b/npc/008-1/doors.txt
deleted file mode 100644
index de8ed1d8..00000000
--- a/npc/008-1/doors.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-008-1,104,27,0 script CottageDoor NPC_WARP,0,0,{
- end;
-
-OnTouch:
- dispbottom(l("Locked."));
-}
diff --git a/npc/008-1/hinnak.txt b/npc/008-1/hinnak.txt
new file mode 100644
index 00000000..08b6242a
--- /dev/null
+++ b/npc/008-1/hinnak.txt
@@ -0,0 +1,354 @@
+// Evol scripts.
+// Author:
+// gumi, Micksha
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - hinnak asked for help
+// [1] 3 - helped hinnak
+// [2] kill counter
+// Description:
+
+// Hinnak needs help to get rid of the same stuff than ever.
+
+008-1,270,74,0 script Hinnak#008-1 NPC_HINNAK,{
+
+ if (BaseLevel < .min_level)
+ {
+ npctalk3 generic(1 | 16 | 64);
+ end;
+ }
+
+ function hinn_new_player
+ {
+ if(getequipid(EQI_HEAD_TOP) == .bad_hat)
+ {
+ narrator 4,
+ l("The farmer lunges at you with a farming implement.");
+ heal -50, 0;
+
+ selectd
+ l("I'm out of here."),
+ l("Whoa, what are you doing?");
+
+ if (@menu == 1)
+ {
+ return;
+ }
+
+ speech 4 | 1,
+ l("Sorry, you look like a pinkie."),
+ l("They've been destroying my fields, and I guess I got a bit worked up.");
+ }
+
+ else
+ {
+ speech 4,
+ l("Argh!"),
+ l("I hate them!"),
+ l("I @#$% hate them!"),
+ l("I @#$% hate these @#$% pinkies!");
+
+ selectd
+ l("You need some anger control therapy."),
+ l("Why do you hate them?");
+
+ if (@menu == 1)
+ {
+ return;
+ }
+
+ speech 4 | 1,
+ l("These @#$% beasts are jumping around in my fields destroying all my harvest."),
+ l("But they are too fast."),
+ l("I can't catch them.");
+ }
+
+ selectd
+ l("Want me to help you?");
+
+ speech 4 | 1,
+ l("Yes, you look quite fast."),
+ l("Maybe you can catch some of them."),
+ l("That will pay them a lesson."),
+ l("Slay some of them and bring me %d of their antennae.", .drop_count);
+
+ setq .quest, 2, 0;
+
+ selectd
+ l("How much is this worth to you?");
+
+ speech 1,
+ l("Well, I can't offer you much."),
+ l("But I got an old scythe laying around."),
+ l("Maybe you can use it as a weapon.");
+
+ close;
+ }
+
+ function hinn_help
+ {
+ if (getequipid(EQI_HEAD_TOP) == .bad_hat)
+ {
+ narrator 4,
+ l("The farmer glares at your hat.");
+ }
+
+ speech 4,
+ l("Have you got the %d antennae?", .drop_count);
+
+ selectd
+ l("Not yet, but I am working on it."),
+ rif(countitem(.monster_drop) >= .drop_count, l("Sure, here they are!"));
+
+ if (@menu == 1)
+ {
+ return;
+ }
+
+ if (getq2(.quest) < .kill_count)
+ {
+ speech 1,
+ l("Don't try to fool me!"),
+ l("I know you didn't kill them yourself!"),
+ l("Kill at least %d pinkies and come back.", .kill_count);
+ close;
+ }
+
+ speech 1,
+ l("Thank you very much"),
+ l("As promised, here's my old scythe."),
+ l("Maybe you can use it as a weapon."),
+ l("It is a bit cumbersome but its strikes are deadly.");
+
+ if (countitem(.monster_drop) >= .drop_count)
+ {
+ delitem .monster_drop, .drop_count;
+ getitem .reward_item, 1;
+ Zeny += .reward_money;
+ //getexp .reward_exp, 0;
+ setq .quest, 3;
+ }
+ close;
+ }
+
+ function hinn_thanks
+ {
+ if (getequipid(EQI_HEAD_TOP) == .bad_hat)
+ {
+ speech 4,
+ l("That better be a trophy on your head.");
+
+ selectd
+ l("It is.");
+
+ speech 4 | 1,
+ l("Good then."),
+ l("Thanks for your help with the pinkies.");
+ }
+
+ else
+ {
+ speech 4,
+ l("Good to see you again."),
+ l("Thanks again for helping me with the pinkies!");
+ }
+
+ selectd
+ l("Sure, any time!"),
+ l("Anything else you want me to do?"),
+ l("You're welcome. Bye!");
+
+ if (@menu == 3)
+ {
+ return;
+ }
+
+ speech 4 | 1,
+ l("Actually, it's been a long day."),
+ l("If it's no trouble, could you get me a %s?",
+ getitemlink(.drink_item));
+
+ selectd
+ rif(countitem(.drink_item) >= 1, l("Here you are.")),
+ l("Sure, I'll go get one. Bye!"),
+ l("You shouldn't drink while working!");
+
+ do
+ {
+ switch (@menu)
+ {
+ case 2: return;
+ case 3:
+ speech 1,
+ l("Well, I'm done for the day, and I'm quite old enough to decide when I can have a %s, thank you!",
+ getitemname(.drink_item));
+ selectd
+ rif(countitem(.drink_item) >= 1, l("Sorry... here you are.")),
+ l("I don't have any.");
+ break;
+ default:
+ if (countitem(.drink_item) < 1)
+ {
+ return;
+ }
+ delitem .drink_item, 1;
+
+ narrator 4 | 8 | 2 | 1,
+ l("%s takes a sip.", .name$);
+
+ speech 4,
+ l("Aaah!"),
+ l("Nothing like a well-deserved %s after a long day of tending the crops!",
+ getitemname(.drink_item)),
+ l("Thanks, that was very kind of you!");
+
+ narrator 4 | 8 | 1 | 2,
+ l("He takes another sip.");
+
+ speech 4,
+ l("Thanks!"),
+ l("You know, I had the strangest thing happen to me."),
+ l("I had this patch of ground that was really clumpy; lots of clay, you see."),
+ l("Right over there."),
+ // TODO: move cam to the spot
+ l("Looks much better now, doesn't it?"),
+ // TODO: restore cam
+ l("But how I got there is kind of scary..."),
+ l("I'd been trying to break it up for a while, but that kind of work is a pain."),
+ l("So my wife said that I should go and see the witch, just in case she knows something."),
+ l("And sure enough I ask the witch, and she has a look at it."),
+ l("“Nothing I can do”, she says, “but I can ask a friend”."),
+ l("So the next day another witch shows up."),
+ l("Gorgeous woman, but when she looked at me, the scares went scuttling down my spine..."),
+ l("First thing she asked was if I'm a farmer."),
+ l("Said her friend had told her that I needed help."),
+ l("I show her what the problem is, and she tells me to go inside and wait.");
+
+ narrator 4 | 8 | 1 | 2,
+ l("%s drains his mug in one long sip, then hesitates.", .name$);
+
+ speech 4,
+ l("So I go inside."),
+ l("I'm barely in when it starts raining outside, pouring cats and mouboos!"),
+ l("Not so weird, perhaps, except that it was been bright and sunny just a second before!"),
+ l("So I rush out, my wife telling me to leave the witch alone, and I see her standing there in the middle of the rain..."),
+ l("None of the raindrops touched her, as if they were afraid!"),
+ l("Then she yells out some gobbledygook word, and out of the ground there comes a swarm of maggots, crawling and digging and climbing over each other's backs..."),
+ // XXX: maybe here insert a reference to SUSAN?
+ l("And then she turns to me!"),
+ l("Seeing her gaze, for a moment there I thought she would turn me into a pinkie, for sure..."),
+ l("But all she says is, “had you stayed inside, you wouldn't be wet now”.");
+
+ selectd
+ l("Hahaha!"),
+ l("Whoah, scary..."),
+ l("What was that gobbledygook word?"),
+ l("I better go now. Bye.");
+
+ switch (@menu)
+ {
+ case 1:
+ speech 1,
+ l("Yeah, funny now..."),
+ l("But you should've seen that gaze!"),
+ l("Ah, well, never mind.");
+ close;
+ case 2:
+ speech 1,
+ l("Yeah, you could say that...");
+ close;
+ case 3:
+ speech 1,
+ l("Oh, I can't be sure..."),
+ l("But something like “Nanaj princino”, I think."); // this is "Dwarven Princess" translated to Esperanto
+ close;
+ }
+ return;
+ }
+ } while(true);
+ }
+
+ // OnTalk:
+
+ if (getq(.quest_inspector) == 11)
+ {
+ selectd
+ l("Did you see anyone in a mask come by here at night?"),
+ l("Did you see anyone with a large satchel come by here at night?"),
+ l("Hello.");
+
+ switch (@menu)
+ {
+ case 1:
+ speech
+ l("No."),
+ l("It tends to be too dark to see a mask.");
+ close;
+
+ case 2:
+ speech
+ l("Yes, I saw someone with a large sack on their back go to the mining camp.");
+ close;
+ }
+ }
+
+ switch (getq(.quest))
+ {
+ case 0:
+ case 1: hinn_new_player; break;
+ case 2: hinn_help; break;
+ default: hinn_thanks;
+ }
+
+ closeclientdialog();
+ close;
+
+OnNPCKillEvent:
+ // XXX: maybe have a OnTakeScript on the pinky antena item so we count pickups instead of kills
+ if (killedrid == .monster_id && getq(.quest) == 2 &&
+ getq2(.quest) < .kill_count && strcharinfo(PC_MAP) == .map$)
+ {
+ setq .quest, 2, getq2(.quest) + 1;
+ }
+ end;
+
+OnPCLoginEvent:
+OnPCBaseLvUpEvent:
+ if (BaseLevel >= .min_level && getq(.quest) < 1)
+ {
+ setq .quest, 1; // allow the player to do the quest
+ dispbottom l("New quest available: %s (level %d+)",
+ getquestlink(.quest), .min_level); // XXX: requires new manaplus versions, maybe show a different message for old versions?
+ }
+ end;
+
+OnInit:
+ .min_level = 15; // min level to do the quest
+ .monster_id = Pinkie; // monster to kill
+ .monster_drop = PinkAntennae; // monster drop to collect
+ .drop_count = 10; // amount of that drop needed
+ .kill_count = 10; // min number of kills
+ .reward_item = Scythe; // reward item
+ .reward_money = 0; // reward money
+ .reward_exp = 0; // reward exp
+ .bad_hat = PinkieHat; // hinnak attacks you when you wear this hat
+ .drink_item = Beer; // the item hinnak asks to drink
+
+ .quest = HurnscaldQuests_Hinnak;
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest;
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
+
diff --git a/npc/008-1/jack.txt b/npc/008-1/jack.txt
new file mode 100644
index 00000000..d8f1ff2d
--- /dev/null
+++ b/npc/008-1/jack.txt
@@ -0,0 +1,314 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states (forest bow):
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - alan wants to ask jack
+// [1] 3 - jack explained problem
+// [1] 4 - alan asks to find wood
+// [1] 5 - found perfect wood
+// [1] 6 - got the bow
+// [2] unused
+// [3] unused
+// [t] unused
+// Quest states (wooden shield):
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - jack proposes shield
+// [1] 3 - player accepted quest
+// [1] 4 - got the shield
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// Jack Lumber, the handsome lumberjack
+
+
+008-1,241,116,0 script Jack NPC_LUMBERJACK,{
+
+ function bow_intro {
+ speech(4,
+ l("Why not?!"),
+ l("I value my life, that's why!"));
+
+ selectd(l("What do you mean?"));
+
+ speech(4,
+ l("A week ago, I was going to chop down one of those twigleaf trees in the forest to the southwest."),
+ l("These twigleafs are the trees that give me the living wood you speak of."), // XXX: were Log Heads named "Twigleaf" at some point in the past?
+ l("I was just chopping away with my axe, and guess what happened?"),
+ l("One of its branches hit me!"),
+ l("At first, I thought it fell down or the wind blew it, but it hurt!"),
+ l("After I shook it off and struck the tree again with my axe, another branch hit me!"),
+ l("I got angry and started to chop off all the low-hanging branches so this couldn't happen anymore."),
+ l("Even after all that though, I still can't believe what happened next."));
+
+ selectd(l("What happened?"));
+
+ speech(4,
+ l("You'll think I'm insane if I tell you..."));
+
+ selectd(l("I won't. I promise."));
+
+ speech(4,
+ l("Alright, well..."),
+ l("After I chopped off a few branches, the whole tree started to move!"),
+ l("Its roots tore out of the earth, all the branches started to wave around, and a face appeared on the trunk."),
+ l("The whole tree CAME TO LIFE! It was mad!"));
+
+ selectd(l("Did you run away?"), l("Did you fight it?"));
+
+ speech(4,
+ l("I fought it, of course!"),
+ l("I took my axe and attacked the beast!"),
+ l("It hit me here *points at a bruise on his shoulder*, here *lifts his trouser leg to show another bruise*, and here *lifts his shirt and reveals even worse bruises*."), // XXX: that's kinda dirty imho... maybe we could use the narrator?
+ l("But I didn't give up!"),
+ l("I chopped away at it, branch after branch, and in the end I chopped off its roots, and it fell to the ground, motionless."));
+
+ selectd(l("So you beat the monster? Then why are you so scared?"));
+
+ speech(4,
+ l("Well, I was exhausted and had to rest."),
+ l("A few minutes passed, and suddenly I was practically surrounded by a dozen or more of these living trees!"));
+
+ selectd(l("Did you fight them too?"));
+
+ speech(4,
+ l("Are you crazy?"),
+ l("I barely destroyed one of those beasts."),
+ l("I was in no shape to fight again!"),
+ l("I ran away as fast as I could, and lucky for me the monsters aren't that fast on their tiny root legs, Ha!"));
+
+ selectd(l("So, I guess you aren't chopping down trees anymore?"));
+
+ speech(4,
+ l("I still do; it's my job."),
+ l("But I'll no longer chop those twigleafs, I'll tell you that."),
+ l("I know the bow master wants some twigleaf wood, but I don't care."),
+ l("I won't risk MY life for a few gold pieces!"),
+ l("If you really want to, just go to the southwest, but I can't help you."),
+ l("I won't go there ever again."));
+
+ selectd(l("Southwest you say? OK, thank you."));
+
+ speech(l("Don't say I didn't warn you!"));
+
+ // What a huge text wall, I feel sorry for the players
+
+ close2;
+ setq(.quest_bow, 3);
+ end;
+ }
+
+ function bow_good_luck {
+ if (getq(.quest_inspector) == 2)
+ {
+ speech(4,
+ l("Good luck hunting those tree monsters – you'll need it."));
+
+ selectd(l("Have you seen anything that might be connected to the recent robberies in town?"));
+
+ speech(l("Sorry, no."));
+ close;
+ }
+
+ npctalk3(l("Good luck hunting those tree monsters – you'll need it."));
+ end;
+ }
+
+ function shield_intro {
+ speech(4,
+ l("I have an idea."),
+ l("What would you say about a new shield?"));
+
+ setq(.quest_shield, 2);
+
+ selectd(
+ l("No thanks."),
+ l("Yes, please!"),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything that might be connected to the recent robberies in town?")));
+
+ switch (@menu)
+ {
+ case 1: closeclientdialog(); close;
+ case 2:
+ speech(
+ l("All I need is %d %s.", .logs_amount, getitemlink(.logs_item)),
+ l("This needn't be high quality wood; pretty much any log you can find should work."),
+ l("Oh, and I'll also need %s E for other materials.", format_number(.shield_cost)));
+
+ close2;
+ setq(.quest_shield, 3);
+ end;
+ case 3: speech(l("Sorry, no.")); close;
+ }
+ }
+
+ function bow_congrats {
+ speech(4,
+ l("You've finally found that perfect piece of living wood that Alan needs to make a Forest Bow, haven't you?"));
+
+ selectd(
+ l("I couldn't afford the bow, though..."),
+ l("No, I'm still looking."),
+ l("Yes, I've got the Forest bow now."),
+ l("I'm a melee warrior, I don't need bows."),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything that might be connected to the recent robberies in town?")));
+
+ switch (@menu)
+ {
+ case 3:
+ if (getq(.quest_bow) <= 5)
+ {
+ speech(4,
+ l("Hrmph."),
+ l("I'm someone who respects those speaking the truth."));
+ }
+ // fallthrough
+ case 1:
+ case 4:
+ speech(4,
+ l("You no doubt remember how I struggled with those beasts, fighting for my life."),
+ l("Scared me, those seven-branched little stumps did!"),
+ l("Never since that day have I strayed near them, and yet there you are, cutting them down one by one."),
+ l("I'm proud of you – to dare to fight those trunks is admirable indeed."),
+ l("You're as strong as if you were my own child!"));
+
+ shield_intro;
+ break;
+ case 2: speech(l("You should go talk to Alan again.")); close;
+ case 5: speech(l("Sorry, no.")); close;
+ }
+ }
+
+ function shield_make {
+ speech(4,
+ l("Do you have the %d %s and %s E for the shield?",
+ .logs_amount, getitemlink(.logs_item), format_number(.shield_cost)));
+
+ selectd(
+ rif(countitem(.logs_item) >= .logs_amount && Zeny >= .shield_cost,
+ l("Here it is.")),
+ l("I'll come back later."));
+
+ if (@menu != 1) {
+ closeclientdialog();
+ close;
+ }
+
+ speech(4,
+ l("Have a seat."));
+
+ narrator(4,
+ l("Jack saws the logs into pieces and then sands them until they are smooth to the touch."),
+ l("Applying some strong-smelling liquid, he tans them to a darker hue."),
+ l("Grabbing one of two leftover pieces, he begins to carve it into a round shape, then repeats this with the second piece – shield handles from what you can tell."),
+ l("Meanwhile, the sun has dried the other pieces."),
+ l("Jack places them next to each other, adds a frame, and nails everything together."),
+ l("The resulting shield looks usable already, but Jack applies another liquid to it and leaves it to dry for a few moments."),
+ l("Finally, he hands the shield to you."));
+
+ if (checkweight(.shield_item, 1) != true)
+ {
+ speech(
+ l("It seems you can't carry the %s.", getitemlink(.shield_item)),
+ l("Come back when you do."));
+ close;
+ }
+
+ if (Zeny < .shield_cost || countitem(.logs_item) < .logs_amount)
+ close; // double-check
+
+ setq(.quest_shield, 4);
+ delitem(.logs_item, .logs_amount);
+ getitem(.shield_item, 1);
+ Zeny -= .shield_cost;
+ getexp(.shield_exp, 0);
+
+ speech(
+ l("Enjoy your new shield!"));
+
+ close;
+ }
+
+ function wood_daily {
+ speech(4,
+ l("I hope that my shield will serve you well!"));
+
+ selectd(
+ l("Me too."),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything that might be connected to the recent robberies in town?")));
+
+ switch (@menu)
+ {
+ case 2: speech(l("Sorry, no.")); close;
+ }
+
+ closeclientdialog(); // TODO: daily quest (needs the generic daily quest script)
+ close;
+ }
+
+ // OnTalk:
+ switch (getq(.quest_shield))
+ {
+ case 2: shield_intro; break;
+ case 3: shield_make; break;
+ case 4: wood_daily; break;
+ }
+
+ switch (getq(.quest_bow))
+ {
+ case 3:
+ case 4: bow_good_luck; break;
+ case 5:
+ case 6: bow_congrats; break;
+ }
+
+ // initial intro
+ {
+ speech(4,
+ l("Hello there!"),
+ l("My name is Jack Lumber, the enemy of all trees."),
+ l("If you need some firewood, just let me know."));
+
+ selectd(
+ l("I'll keep that in mind."),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything that might be connected to the recent robberies in town?")),
+ rif(getq(.quest_bow) == 2, l("I heard you aren't delivering any more living wood. Why not?")));
+
+ switch (@menu)
+ {
+ case 2: speech(l("Sorry, no.")); close;
+ case 3: bow_intro; break;
+ }
+
+ }
+
+ closeclientdialog();
+ close;
+
+OnInit:
+ .logs_item = RawLog;
+ .logs_amount = 40; // XXX: maybe nlogn?
+ .shield_cost = 5000; // XXX: maybe nlogn?
+ .shield_exp = 2500;
+ .shield_item = WoodenShield;
+
+ .quest_bow = HurnscaldQuests_ForestBow;
+ .quest_shield = HurnscaldQuests_WoodenShield;
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_bow;
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/008-1/mikhail.txt b/npc/008-1/mikhail.txt
new file mode 100644
index 00000000..3e442499
--- /dev/null
+++ b/npc/008-1/mikhail.txt
@@ -0,0 +1,131 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - bernard wants roasted maggot
+// [1] 3 - brought maggot
+// [1] 4 - bernard wants maggot slime
+// [1] 5 - brought maggot slime
+// [1] 6 - mikhail needs maggot slime
+// [1] 7 - brought maggot slime
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// takes part in the slime soup quest (Bernard)
+
+008-1,298,95,0 script Mikhail NPC_MIKHAIL,{
+
+ function soup_scared {
+ speech 4,
+ l("Hello..."),
+ l("I'm supposed to be helping Bernard from the Inn but...");
+
+ narrator 4,
+ l("His eyes grow wide");
+
+ speech 4,
+ l("Eeekkk another one.");
+
+ narrator
+ l("It seems that the boy would like to say more, but seems too terrified at the moment."),
+ l("Maybe you should help someone else first, so that he sees your intentions are good.");
+
+ close;
+ }
+
+ function soup_intro2 {
+ speech 4,
+ l("Bernard sent me to get %d %s from the %s in the fields, but they scare me so bad!",
+ .third_item_qty, getitemlink(.third_item), getmonsterlink(.third_item_mob)),
+ l("You look like a nice person."),
+ l("Would you go get them for me?");
+
+ selectd
+ l("Of course, I'll go get them for you.");
+
+ speech
+ l("Thank you so much!"),
+ l("I'll wait for you here.");
+
+ setq .quest, 6;
+ close;
+ }
+
+ function soup_reminder_slime2 {
+ speech
+ l("Did you bring me the %d %s I need?",
+ .third_item_qty, getitemlink(.third_item)),
+ l("It doesn't look like you have them all...");
+ close;
+ }
+
+ function soup_reward_slime2 {
+ speech
+ l("Did you bring me the %d %s I need?",
+ .third_item_qty, getitemlink(.third_item)),
+ l("Ooh!"),
+ l("Thank you so much!"),
+ l("I can get back to Bernard now!");
+
+ if (countitem(.third_item) < .third_item_qty)
+ close; // double-check
+
+ delitem .third_item, .third_item_qty;
+ setq .quest, 7;
+ getexp .third_reward_exp, 0;
+ close;
+ }
+
+ function soup_thanks_slime2 {
+ speech
+ l("Thanks again for helping me!") + " %%Q";
+
+ close;
+ }
+
+ switch(getq(.quest))
+ {
+
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4: soup_scared; break;
+ case 5: soup_intro2; break;
+ case 6:
+ if (countitem(.third_item) < .third_item_qty)
+ soup_reminder_slime2;
+ else
+ soup_reward_slime2;
+ break;
+ default: soup_thanks_slime2;
+ }
+
+ closeclientdialog();
+ close;
+
+OnInit:
+ .third_item = MaggotSlime;
+ .third_item_qty = 5;
+ .third_item_mob = Maggot;
+
+ .third_reward_exp = 100;
+
+ .quest = HurnscaldQuests_Soup;
+ .quest_debug = .quest;
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/008-1/milly.txt b/npc/008-1/milly.txt
new file mode 100644
index 00000000..0ea17a1c
--- /dev/null
+++ b/npc/008-1/milly.txt
@@ -0,0 +1,109 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states (inspector):
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// robberies in hurnscald
+
+008-1,282,114,0 script Milly NPC_GIRL_MILLY,{
+
+ // TODO: make the actual beanie copter quest after those are finished:
+ // [X] Inspector quest
+ // [ ] Bone knife quest
+ // [ ] Setzer quest
+ // [ ] Rossy quest
+ // [ ] Cindy quest
+
+ .@q_inspector = getq(.quest_inspector);
+
+ speech(4,
+ l("Hello traveler, welcome to Hurnscald."),
+ l("Have you met Kfahr yet?"),
+ l("He is the greatest hero that ever walked the land of Hurnscald!"));
+
+ selectd(
+ l("Hi! No, I haven't seen him yet."),
+ l("Where can I find him?"),
+ l("Mh, I don't care for heroes."),
+ l("Hello, yes I have met him."),
+ rif(.@q_inspector == 2, l("Have you seen anything strange lately?")),
+ rif(.@q_inspector == 2, l("Do you know anything about the recent robberies?")));
+
+ switch (@menu)
+ {
+ case 3:
+ speech(4,
+ l("What?"),
+ l("Surely you do not appreciate what a hero he is!"),
+ l("Mh, or perhaps honor is dead in you; for you to be so slow to comprehend the good that his exploits have wrought for us."), // XXX: this sentence seems too complicated to come from a child's mouth
+ l("Put on your thinking cap and be propelled into high adventure!"),
+ l("Go to Kfahr, and listen to his stories."),
+ l("You can't have met him."),
+ l("No one who has met him would say such silly things."));
+ // fallthrough
+
+ case 1:
+ speech(4,
+ l("I highly recommend you seek him out!"));
+ // fallthrough
+
+ case 2:
+ speech(
+ l("He is a regular at the inn, located in the north-west part of town."),
+ l("If you are lucky he might tell you a story about his adventures."));
+ break;
+
+ case 4:
+ speech(
+ l("Oh, I hope you stayed and listened to his stories about his adventures."));
+ break;
+
+ case 5:
+ speech(
+ l("I haven't seen anything strange."));
+ break;
+
+ case 6:
+ speech(
+ l("No, sorry."));
+ break;
+ }
+
+ close;
+
+OnInit:
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_inspector; // TODO: change this to the milly quest debug when it exists
+ .sex = G_FEMALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/008-1/old-man.txt b/npc/008-1/old-man.txt
new file mode 100644
index 00000000..c2004a7d
--- /dev/null
+++ b/npc/008-1/old-man.txt
@@ -0,0 +1,90 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// robberies in hurnscald
+
+008-1,290,139,0 script Old Man NPC_OLD_MAN_HURNS,{
+
+ function oldman_ask {
+ speech(4,
+ l("Hi there, need something?"));
+
+ selectd(
+ l("Have you seen anything strange lately?"),
+ l("Do you know anything about the recent robberies?"));
+
+ speech(
+ l("I'm sorry, but I didn't see anything."),
+ l("You should ask my old woman."));
+ close;
+ }
+
+ function oldman_accuse {
+ speech(4,
+ l("Found anything new?"));
+
+ selectd(
+ l("The leader of the troupe said you hung around them a lot while they were in town."));
+
+ speech(
+ l("Yes, I hung around the theater a lot."),
+ l("I was an actor when I was younger."),
+ l("But I wasn't there that night."),
+ l("Me and the wife were at home all night."));
+
+ close2;
+ setq(.quest_inspector, 8);
+ end;
+ }
+
+ // OnTalk:
+ switch (getq(.quest_inspector))
+ {
+ case 2: oldman_ask; break;
+ case 7: oldman_accuse; break;
+ }
+
+ // initial intro
+ npctalk3(l("Don't let those monsters get to you."));
+ end;
+
+OnInit:
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_inspector;
+ .sex = G_MALE;
+ .distance = 1; // this npc has bad hearing
+ .speed = 2000; // this npc is very old
+ // TODO: move graph (after the Hurnscald map is finalized)
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/008-1/old-woman.txt b/npc/008-1/old-woman.txt
new file mode 100644
index 00000000..c6ca467b
--- /dev/null
+++ b/npc/008-1/old-woman.txt
@@ -0,0 +1,137 @@
+/// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// Old Lady in the flower field, Robberies in Hurnscald.
+
+008-1,231,114,0 script Old Woman NPC_OLD_LADY,{
+
+ function is_inspector {
+ return (getequipcardid(EQI_HEAD_MID, 0) == NavyBlueCottonDye /*&&
+ getequipcardid(EQI_HEAD_LOW, 0) == NavyBlueCottonDye*/); // TODO / FIXME: remove the /* */ whenever we have cotton pants
+ }
+
+ function oldwoman_ask {
+ speech(4,
+ l("Hello deary."));
+
+ selectd(
+ l("Have you seen anything strange lately?"),
+ l("Do you know anything about the recent robberies?"));
+
+ .@q = getq(.quest_inspector);
+
+ if (!is_inspector())
+ {
+ speech(l("Yes, but I'm only talking to the inspector himself!"));
+
+ close2;
+ if (.@q < 3)
+ setq(.quest_inspector, 3);
+ end;
+ }
+
+ if (.@q == 2 || .@q == 3)
+ {
+ speech(
+ l("I saw someone sneaking around town wearing a theater mask."),
+ l("It looked like one of the masks used by the troupe that was in town recently."));
+
+ close2;
+ setq(.quest_inspector, 4);
+ }
+
+ else if (.@q == 10)
+ {
+ speech(
+ l("I've remembered something else."),
+ l("The night the troupe left, I saw someone with a theater mask take a large satchel out of town."),
+ l("He was heading north."));
+
+ close2;
+ setq(.quest_inspector, 11);
+ }
+
+ end;
+ }
+
+ function oldwoman_alibi {
+ speech(4,
+ l("Hello deary."));
+
+ selectd(
+ l("Was your husband with you at home all night the last night that the troupe was in town?"));
+
+ speech(
+ l("Yes, we were both at home all night."));
+
+ close2;
+ setq(.quest_inspector, 9);
+ end;
+ }
+
+ function oldwoman_filler {
+ npctalk3(l("I hope you catch that naughty person!"));
+ end;
+ }
+
+ // OnTalk:
+ switch (getq(.quest_inspector))
+ {
+ case 2:
+ case 3: oldwoman_ask; break;
+ case 4:
+ case 5:
+ case 6:
+ case 7: oldwoman_filler; break;
+ case 8:
+ case 9: oldwoman_alibi; break;
+ case 10: oldwoman_ask; break;
+ }
+
+ // initial intro
+ if (BaseLevel < 40)
+ npctalk3(l("Watch out for these flowers. They don't like to be messed with."));
+ else
+ npctalk3(l("Hello deary."));
+ end;
+
+OnInit:
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_inspector;
+ .sex = G_FEMALE;
+ .distance = 1; // this npc has bad hearing
+ .speed = 2000; // this npc is very old
+ // TODO: move graph (after the Hurnscald map is finalized)
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/008-1/oscar.txt b/npc/008-1/oscar.txt
new file mode 100644
index 00000000..9541da7b
--- /dev/null
+++ b/npc/008-1/oscar.txt
@@ -0,0 +1,20 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Oscar the farmer.
+// THIS IS A PLACEHOLDER!
+
+008-1,160,77,0 script Oscar#008-1 NPC_CAUL,{
+ speech
+ l("Hi, my name is Oscar."),
+ l("I used to be a farmer, but my magic attempts were banned by the gouvernment."),
+ lg("Now I remain poor and unemployed.");
+
+ close;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-1/sabine.txt b/npc/008-1/sabine.txt
new file mode 100644
index 00000000..87026efb
--- /dev/null
+++ b/npc/008-1/sabine.txt
@@ -0,0 +1,64 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// robberies in hurnscald
+
+008-1,291,97,0 script Sabine NPC_SABINE,{
+
+ if (getq(.quest_inspector) != 2)
+ {
+ npctalk3(generic(1 | 16));
+ end;
+ }
+
+ speech(4,
+ l("Isn't this place pretty?"),
+ l("I love hanging out here!"));
+
+ selectd(
+ l("Have you seen anything strange lately?"),
+ l("Do you know anything about the recent robberies?"));
+
+ speech(
+ l("No, sorry."));
+
+ close;
+
+OnInit:
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_inspector;
+ .sex = G_FEMALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/008-1/snarfles.txt b/npc/008-1/snarfles.txt
new file mode 100644
index 00000000..6ad08867
--- /dev/null
+++ b/npc/008-1/snarfles.txt
@@ -0,0 +1,20 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Snarfles the mouboo farmer.
+// THIS IS A PLACEHOLDER!
+
+008-1,79,118,0 script Snarfles#008-1 NPC_SNARFLES,{
+ speech
+ l("My Mouboos, my beloved Mouboos!"),
+ l("Oh, hi, isn't it cool to live among all those Mouboos? I don't understand how some people can eat Mouboo steak."),
+ lg("Murderers!");
+
+ close;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-1/soul-menhir.txt b/npc/008-1/soul-menhir.txt
new file mode 100644
index 00000000..3c295c92
--- /dev/null
+++ b/npc/008-1/soul-menhir.txt
@@ -0,0 +1,58 @@
+// Evol scripts.
+// Author:
+// gumi
+// Description:
+// place of power, mana refills faster when sitting nearby
+
+008-1,252,111,0 script Soul Menhir#hurnscald NPC_NO_SPRITE,{
+
+ end;
+
+OnRefill:
+ @menhir_lock = false;
+ getmapxy(.@map$, .@x, .@y, UNITTYPE_PC);
+
+ if (.@map$ != .map$ || distance(.x, .y, .@x, .@y) > .refill_distance ||
+ !(issit()))
+ end;
+
+ heal(0, .refill_rate);
+ end;
+
+
+OnTimer500:
+ .@count = getunits(BL_PC, .@units[0], false, .map$, (.x - .refill_distance),
+ (.y - .refill_distance), (.x + .refill_distance), (.y + .refill_distance));
+
+ for (.@i = 0; .@i < .@count; ++.@i)
+ {
+ if (.@units[.@i] < 0) continue; // pre-check, just in case
+ deltimer(.name$ + "::OnRefill", .@units[.@i]);
+ if (gettimer(TIMER_COUNT, .@units[.@i], .name$ + "::OnRefill") > 0 ||
+ getvariableofpc(@menhir_lock, .@units[.@i])) {
+ continue;
+ }
+ set(getvariableofpc(@menhir_lock, .@units[.@i]), true);
+ addtimer(rand(.refill_timer), .name$ + "::OnRefill", .@units[.@i]);
+ }
+
+ initnpctimer();
+ end;
+
+OnInit:
+
+ .refill_rate = 1; // number of SP to give every refill
+ .refill_distance = 7; // max distance
+ .refill_timer = 200; // wait rand(X) ms before refill
+ initnpctimer();
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/008-1/voltain.txt b/npc/008-1/voltain.txt
new file mode 100644
index 00000000..b5f82db0
--- /dev/null
+++ b/npc/008-1/voltain.txt
@@ -0,0 +1,19 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Voltain the dark druid.
+// THIS IS A PLACEHOLDER!
+
+008-1,182,155,0 script Voltain#008-1 NPC_DARK_DRUID,{
+ speech
+ l("Go away, I have to think about new evil doings."),
+ lg("GO AWAY, I SAID!");
+
+ close;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-1/wateranimation.txt b/npc/008-1/wateranimation.txt
index 8b66f637..74ff5fd9 100644
--- a/npc/008-1/wateranimation.txt
+++ b/npc/008-1/wateranimation.txt
@@ -5,5 +5,5 @@
// Description:
// Water animations, splash, fishes, etc...
-008-1,139,32,0 duplicate(#water_animation0) #water_animation16 NPC_WATER_SPLASH
-008-1,140,40,0 duplicate(#water_animation0) #water_animation17 NPC_WATER_SPLASH
+008-1,311,97,0 duplicate(#water_animation0) #water_animation16 NPC_WATER_SPLASH
+008-1,314,139,0 duplicate(#water_animation0) #water_animation17 NPC_WATER_SPLASH
diff --git a/npc/008-2-0/_import.txt b/npc/008-2-0/_import.txt
index f2ecc3b8..2cd1023b 100644
--- a/npc/008-2-0/_import.txt
+++ b/npc/008-2-0/_import.txt
@@ -2,4 +2,5 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-2-0/_savepoints.txt",
"npc/008-2-0/_warps.txt",
+"npc/008-2-0/celestia.txt",
"npc/008-2-0/mapflags.txt",
diff --git a/npc/008-2-0/celestia.txt b/npc/008-2-0/celestia.txt
new file mode 100644
index 00000000..d6ce7bc5
--- /dev/null
+++ b/npc/008-2-0/celestia.txt
@@ -0,0 +1,20 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Our beloved Princess Celestia.
+// THIS IS A PLACEHOLDER!
+
+008-2-0,30,23,0 script Celestia NPC_CELESTIA,{
+ speech
+ l("Hi!"),
+ lg("You may remember me, I am Celestia.");
+ l("Take a cup of tea until something happens here.");
+
+ close;
+
+OnInit:
+ .sex = G_FEMALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-2-1/_import.txt b/npc/008-2-1/_import.txt
index 1e5137a7..06ba6d3b 100644
--- a/npc/008-2-1/_import.txt
+++ b/npc/008-2-1/_import.txt
@@ -2,4 +2,8 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-2-1/_savepoints.txt",
"npc/008-2-1/_warps.txt",
+"npc/008-2-1/generalstore.txt",
+"npc/008-2-1/inspector.txt",
"npc/008-2-1/mapflags.txt",
+"npc/008-2-1/richard.txt",
+"npc/008-2-1/selim.txt",
diff --git a/npc/008-2-1/generalstore.txt b/npc/008-2-1/generalstore.txt
new file mode 100644
index 00000000..73b24a5e
--- /dev/null
+++ b/npc/008-2-1/generalstore.txt
@@ -0,0 +1,20 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// General Store.
+// THIS IS A PLACEHOLDER!
+
+008-2-1,38,35,0 script Generalstore#008-1 NPC_GENERAL_STORE,{
+ speech
+ l("Hi!"),
+ l("My name is General Store, they still call me this although I left the army a few years ago.");
+ lg("I have nothing to sell, come back later.");
+
+ close;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-2-1/inspector.txt b/npc/008-2-1/inspector.txt
new file mode 100644
index 00000000..725f5cbd
--- /dev/null
+++ b/npc/008-2-1/inspector.txt
@@ -0,0 +1,190 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// robberies in hurnscald
+
+008-2-1,30,34,0 script Inspector NPC_INSPECTOR,{
+
+ if (BaseLevel < .min_level)
+ {
+ npctalk3(l("I'm sorry, but I'm busy looking into this string of robberies."));
+ end;
+ }
+
+ // OnTalk:
+ switch (getq(.quest))
+ {
+ case 0:
+ case 1:
+ speech(4,
+ l("Hmm... what to do."));
+ narrator(4,
+ l("He looks up and into your face."));
+ speech(4,
+ l("You look capable, will you help me solve these robberies?"),
+ l("I would go myself, but for some reason I'm a non-walking NPC."));
+
+ if (selectd("Yes", "No") == 2) {
+ closeclientdialog();
+ close;
+ }
+
+ speech(
+ l("Ok then."),
+ l("I'd like you to ask the villagers about the recent string of robberies."));
+
+ close2;
+ setq(.quest, 2);
+ end;
+
+ case 2:
+ npctalk3(l("Please continue talking to the villagers."));
+ end;
+
+ case 3:
+ speech(
+ l("Hm..."),
+ l("I don't know if I trust her eyesight or memory."),
+ l("See if someone else knows anything."));
+ close;
+
+ case 4:
+ speech(
+ l("Someone in a theater mask, eh?"),
+ l("There was a traveling theater troupe in town recently, but they've moved on to Tulimshar."),
+ l("Please go talk to their leader about this."));
+
+ close2;
+ setq(.quest, 5);
+ end;
+
+ case 5:
+ npctalk3(l("Please go talk to the leader of the traveling troupe about the theater mask."));
+ end;
+
+ case 6:
+ speech(
+ l("Hm... an old man?"),
+ l("Could you interrogate him for me?"));
+
+ close2;
+ setq(.quest, 7);
+ end;
+
+ case 7:
+ npctalk3(l("Have you talked with the old man yet?"));
+ end;
+
+ case 8:
+ npctalk3(l("Can you verify that with his wife?"));
+ end;
+
+ case 9:
+ speech(
+ l("Hm... then it couldn't be him."),
+ l("I'm not sure where to go from here, maybe you can find something else."),
+ l("Try talking to everyone again."));
+
+ close2;
+ setq(.quest, 10);
+ end;
+
+ case 10:
+ npctalk3(l("Made any progress yet?"));
+ end;
+
+ case 11:
+ npctalk3(l("Then go north and investigate!"));
+ end;
+
+ case 12:
+ npctalk3(l("Did you look over the basement?"));
+ end;
+
+ case 13:
+ speech(
+ l("What a strange note."),
+ l("I'll keep track of this, while you return the mask to the troupe."),
+ l("I would go myself, but the developers were too lazy to make me walk."),
+ "...",
+ l("By the way, stay sharp! I may call upon you again."));
+
+ close2;
+ setq(.quest, 14);
+ end;
+
+ case 14:
+ npctalk3(l("Please return the mask to the traveling troupe."));
+ end;
+
+ case 15:
+ speech(
+ l("My men have found all of the stolen items."),
+ l("They were all in the mining camp."),
+ l("We still don't know who did it.")); // XXX: feel free to extend this quest beyond this point
+
+ close2;
+ setq(.quest, 16);
+ getexp(.reward_exp, 0);
+ end;
+
+ case 16:
+ npctalk3(l("Remember to stay sharp. I might need your help on another case."));
+ end;
+ }
+
+ closeclientdialog();
+ close;
+
+OnPCLoginEvent:
+OnPCBaseLvUpEvent:
+ if (BaseLevel >= .min_level && getq(.quest) < 1)
+ {
+ setq(.quest, 1); // allow the player to do the quest
+ dispbottom(l("New quest available: %s (level %d+)",
+ getquestlink(.quest), .min_level)); // XXX: requires new manaplus versions, maybe show a different message for old versions?
+ }
+ end;
+
+OnInit:
+ .min_level = 20; // min level to do the quest
+
+ .reward_exp = 2500;
+
+ .quest = HurnscaldQuests_Inspector;
+ .quest_debug = .quest;
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/008-2-1/richard.txt b/npc/008-2-1/richard.txt
new file mode 100644
index 00000000..958ecab4
--- /dev/null
+++ b/npc/008-2-1/richard.txt
@@ -0,0 +1,20 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Richard the Hurns storage guy.
+// THIS IS A PLACEHOLDER!
+
+008-2-1,26,35,0 script Richard#008-1 NPC_RICHARD_LEGACY,{
+ speech
+ l("Oh hey!"),
+ l("I was supposed to act as storagekeeper, but I forgot my key.");
+ lg("Come back later, perhaps I can find it.");
+
+ close;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-2-1/selim.txt b/npc/008-2-1/selim.txt
new file mode 100644
index 00000000..c578f6cd
--- /dev/null
+++ b/npc/008-2-1/selim.txt
@@ -0,0 +1,19 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Selim the Dyer.
+// THIS IS A PLACEHOLDER!
+
+008-1,38,40,0 script Selim#008-1 NPC_GUMI_THE_DYER,{
+ speech
+ l("Oh hey!"),
+ lg("Good you are here, you could be handy for me right now.");
+
+ close;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-2-10/_import.txt b/npc/008-2-10/_import.txt
index 994726eb..2dd9ec77 100644
--- a/npc/008-2-10/_import.txt
+++ b/npc/008-2-10/_import.txt
@@ -1,4 +1,5 @@
// Map 008-2-10: Hurnscald City Hall
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-2-10/_warps.txt",
+"npc/008-2-10/airlia.txt",
"npc/008-2-10/mapflags.txt",
diff --git a/npc/008-2-10/airlia.txt b/npc/008-2-10/airlia.txt
new file mode 100644
index 00000000..cb7aced2
--- /dev/null
+++ b/npc/008-2-10/airlia.txt
@@ -0,0 +1,20 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Airlia, the major's daughter.
+// THIS IS A PLACEHOLDER!
+
+008-2-10,42,29,0 script Airlia#008-2-8 NPC_AIRLIA,{
+ speech
+ l("Hello."),
+ l("Do you know where the graveyard is?"),
+ lg("No? Better is that. Its so dangerous there.");
+
+ close;
+
+OnInit:
+ .sex = G_FEMALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-2-12/_import.txt b/npc/008-2-12/_import.txt
index 88a854e4..f5f593a2 100644
--- a/npc/008-2-12/_import.txt
+++ b/npc/008-2-12/_import.txt
@@ -2,3 +2,4 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-2-12/_warps.txt",
"npc/008-2-12/mapflags.txt",
+"npc/008-2-12/nurse.txt",
diff --git a/npc/008-2-12/nurse.txt b/npc/008-2-12/nurse.txt
new file mode 100644
index 00000000..29452258
--- /dev/null
+++ b/npc/008-2-12/nurse.txt
@@ -0,0 +1,101 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// Hurnscald Nurse. Robberies in Hurnscald.
+
+008-2-12,28,30,0 script Nurse NPC_NURSE_LEGACY,{
+
+ speech(4,
+ l("How can I help you?"));
+
+ // TODO: check for AxeHat when we get it
+ // XXX: this npc used to teach the resist poison skill, do we still want that?
+
+ selectd(
+ l("Oooh, these wounds! They hurt so much!"),
+ l("I don't feel so well, I might be sick."),
+ l("No, I'm fine."),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything out of the ordinary?")));
+
+ switch (@menu)
+ {
+ case 1:
+ if (BaseLevel > .heal_max_level)
+ {
+ speech(
+ l("I'm sorry but I'm here only to help young people."), // XXX: this sounds cruel towards elderly people
+ l("Your level is already higher than %d.", .heal_max_level),
+ l("You can get some rest at the inn near here."));
+ close;
+ }
+ speech(4,
+ l("Here, let me heal you."));
+
+ npcskill(AL_HEAL, .heal_skill_level, .heal_npc_stats, .heal_npc_level);
+
+ speech(
+ l("There you go, like new."));
+ close;
+ case 2:
+ speech(
+ l("Then you should better see the doctor."),
+ l("He is usually in his office on the 3rd floor."));
+ close;
+ case 3:
+ speech(
+ l("Then I would ask you to leave."),
+ l("There are people who really need our help."));
+ close;
+ case 4:
+ speech(
+ l("I'm too busy here to observe the town."));
+ close;
+ }
+
+
+ end;
+
+OnInit:
+ .heal_max_level = 20; // she will only heal low level players
+
+ .heal_skill_level = 10; // what level of the healing skill to use
+ .heal_npc_stats = 99; // what stat points the NPC has
+ .heal_npc_level = 60; // what level the npc has
+
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_inspector;
+ .sex = G_FEMALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/008-2-13/_import.txt b/npc/008-2-13/_import.txt
index a4b0330e..ec6a73b7 100644
--- a/npc/008-2-13/_import.txt
+++ b/npc/008-2-13/_import.txt
@@ -2,4 +2,5 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-2-13/_savepoints.txt",
"npc/008-2-13/_warps.txt",
+"npc/008-2-13/lena.txt",
"npc/008-2-13/mapflags.txt",
diff --git a/npc/008-2-13/lena.txt b/npc/008-2-13/lena.txt
new file mode 100644
index 00000000..df9f38e9
--- /dev/null
+++ b/npc/008-2-13/lena.txt
@@ -0,0 +1,20 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Lena the Bowwoman.
+// THIS IS A PLACEHOLDER!
+
+008-2-13,27,27,0 script Lena#008-2-13 NPC_LENA,{
+ speech
+ l("Hey."),
+ l("Did you hear about the Bandit's attacks? They must have a hideout somewhere outside Hurnscald."),
+ lg("I will inform you when I have more information about all this.");
+
+ close;
+
+OnInit:
+ .sex = G_FEMALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-2-14/_import.txt b/npc/008-2-14/_import.txt
index 29a984e8..818ced88 100644
--- a/npc/008-2-14/_import.txt
+++ b/npc/008-2-14/_import.txt
@@ -2,4 +2,5 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-2-14/_savepoints.txt",
"npc/008-2-14/_warps.txt",
+"npc/008-2-14/doctor.txt",
"npc/008-2-14/mapflags.txt",
diff --git a/npc/008-2-14/doctor.txt b/npc/008-2-14/doctor.txt
new file mode 100644
index 00000000..52c8653c
--- /dev/null
+++ b/npc/008-2-14/doctor.txt
@@ -0,0 +1,80 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// The crazy Hurnscald Doctor.
+
+008-2-14,27,27,0 script Doctor NPC_DOCTOR_LEGACY,{
+
+ speech(4,
+ l("Hello, can I help you?"));
+
+ // TODO: check for AxeHat when we get it
+ // TODO: check for EyePatch when we get it
+
+ selectd(
+ l("I think I am sick!"),
+ l("No, I feel fine."),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything strange in town? Anything that might have to do with the robberies?")));
+
+ switch (@menu)
+ {
+ case 1:
+ narrator(4,
+ l("The doctor examines you briefly."));
+ // TODO: check for poison or other status conditions currently in use
+ speech(
+ l("Nonsense!"),
+ l("You look fine and dandy to me."),
+ l("All you need is a bit more exercise and fresh fruit in your diet!"));
+ close;
+ case 2:
+ speech(
+ l("Then please stop wasting my precious time."));
+ close;
+ case 3:
+ speech(
+ l("No, I haven't seen anything."));
+ close;
+ }
+
+
+ end;
+
+OnInit:
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_inspector;
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/008-2-17/_import.txt b/npc/008-2-17/_import.txt
index d90289e3..854dad03 100644
--- a/npc/008-2-17/_import.txt
+++ b/npc/008-2-17/_import.txt
@@ -1,3 +1,5 @@
// Map 008-2-17: Mining Camp
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-2-17/_warps.txt",
+"npc/008-2-17/angus.txt",
+"npc/008-2-17/caul.txt",
diff --git a/npc/008-2-17/angus.txt b/npc/008-2-17/angus.txt
new file mode 100644
index 00000000..3efeefb6
--- /dev/null
+++ b/npc/008-2-17/angus.txt
@@ -0,0 +1,20 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Angus the Smith.
+// THIS IS A PLACEHOLDER!
+
+008-2-17,34,47,0 script Angus#008-2-17 NPC_ANGUS_THE_SMITH,{
+ speech
+ l("Hello."),
+ l("Do you need your pickaxe or your shovel fixed? Then I am your man."),
+ lg("If you want to play with unicorns, you better piss off now.");
+
+ close;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-2-17/caul.txt b/npc/008-2-17/caul.txt
new file mode 100644
index 00000000..41c5488c
--- /dev/null
+++ b/npc/008-2-17/caul.txt
@@ -0,0 +1,20 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Caul the Alchemist.
+// THIS IS A PLACEHOLDER!
+
+008-2-17,40,33,0 script Caul#008-2-17 NPC_CAUL,{
+ speech
+ l("Hi there."),
+ l("Don't you like the smoke, when there is a nice fire beneath a cauldron?"),
+ lg("Honestly, sometimes I prefer nice explosions. Better keep back!");
+
+ close;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-2-18/_import.txt b/npc/008-2-18/_import.txt
index 4f791e6f..5035c75c 100644
--- a/npc/008-2-18/_import.txt
+++ b/npc/008-2-18/_import.txt
@@ -1,3 +1,4 @@
// Map 008-2-18: Mining Camp First Floor
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-2-18/_warps.txt",
+"npc/008-2-18/malik.txt",
diff --git a/npc/008-2-18/malik.txt b/npc/008-2-18/malik.txt
new file mode 100644
index 00000000..ab95dc92
--- /dev/null
+++ b/npc/008-2-18/malik.txt
@@ -0,0 +1,65 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// robberies in hurnscald
+// TODO: Make Malik prepare Crude Gem from shards, and make him produce Gem Powder later, once the player visited Tulim(dont tell WildX, though)
+
+008-2-18,32,24,0 script Malik#008-2-18 NPC_MALIK,{
+ if (getq(.quest_inspector) == 11)
+ {
+ speech(4,
+ l("Hi, can I help you at all?"));
+
+ selectd(
+ l("The inspector sent me here to investigate."));
+
+ speech(4,
+ l("Yeah, we did hear a commotion."),
+ l("We thought we heard someone go down to the basement, but we checked the whole place over and didn't see anything out of the ordinary."));
+
+ close2;
+ setq(.quest_inspector, 12);
+ end;
+ }
+
+ npctalk3(generic(32 | 256));
+ end;
+
+OnInit:
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_inspector;
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/008-2-19/_import.txt b/npc/008-2-19/_import.txt
index c080bfb8..1d12e589 100644
--- a/npc/008-2-19/_import.txt
+++ b/npc/008-2-19/_import.txt
@@ -1,3 +1,4 @@
// Map 008-2-19: Mining Camp Basement
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-2-19/_warps.txt",
+"npc/008-2-19/books.txt",
diff --git a/npc/008-2-19/books.txt b/npc/008-2-19/books.txt
new file mode 100644
index 00000000..81cd4b98
--- /dev/null
+++ b/npc/008-2-19/books.txt
@@ -0,0 +1,60 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// robberies in hurnscald
+
+008-2-19,33,21,0 script bookcase NPC_NO_SPRITE,{
+
+ if (getq(.quest_inspector) != 12)
+ {
+ dispbottom(l("You see an ordinary bookcase."));
+ end;
+ }
+
+ narrator(
+ l("You see an ordinary bookcase."),
+ l("Looking over closely, you find a book that is upside down."),
+ l("The book has been hollowed out."),
+ l("Inside is a theater mask and a note that you cannot even begin to read."));
+
+ close2;
+ setq(.quest_inspector, 13);
+ end;
+
+OnInit:
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_inspector;
+ .distance = 1;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/008-2-2/_import.txt b/npc/008-2-2/_import.txt
index 5a896da0..34d628f7 100644
--- a/npc/008-2-2/_import.txt
+++ b/npc/008-2-2/_import.txt
@@ -1,4 +1,11 @@
// Map 008-2-2: The Rusty Pick
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-2-2/_warps.txt",
+"npc/008-2-2/barron.txt",
+"npc/008-2-2/kfahr.txt",
+"npc/008-2-2/ledmitz.txt",
"npc/008-2-2/mapflags.txt",
+"npc/008-2-2/melania.txt",
+"npc/008-2-2/melinda.txt",
+"npc/008-2-2/note.txt",
+"npc/008-2-2/shop.txt",
diff --git a/npc/008-2-2/barron.txt b/npc/008-2-2/barron.txt
new file mode 100644
index 00000000..48ad1120
--- /dev/null
+++ b/npc/008-2-2/barron.txt
@@ -0,0 +1,32 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Barron, the bartender of the Rusty Pick.
+
+008-2-2,43,28,0 script Barron#008-2-2 NPC_GENERAL_STORE,{
+speech S_LAST_NEXT,
+ l("Hi!"),
+ l("I am the bartender here, can I provide you with some delicious beverage?"),
+ l("Or you can take seat and ask Melinda if you need something.");
+
+ switch (select(l("What beverages do you have?"),
+ l("I'll ask Melinda later")))
+ {
+ case 1:
+ closeclientdialog;
+ shop "#Invisible008-2-2";
+ close;
+ case 2:
+ speech S_FIRST_BLANK_LINE,
+ l("Make sure to tip her, it will brighten up her day.");
+ close;
+ }
+
+
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-2-2/kfahr.txt b/npc/008-2-2/kfahr.txt
new file mode 100644
index 00000000..0ffae5df
--- /dev/null
+++ b/npc/008-2-2/kfahr.txt
@@ -0,0 +1,20 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Kfahr the hero.
+// THIS IS A PLACEHOLDER!
+
+008-2-2,44,36,0 script Kfahr#008-2-2 NPC_YOUNG_MAN_KFAHR,{
+ speech
+ l("Oh hey *hicks*"),
+ l("This waitress *hicks* is great, she never stops to bring beer *hicks.");
+ lg("When I am less busy *hicks*, I can tell you stories of my heroism.");
+
+ close;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-2-2/ledmitz.txt b/npc/008-2-2/ledmitz.txt
new file mode 100644
index 00000000..5939428e
--- /dev/null
+++ b/npc/008-2-2/ledmitz.txt
@@ -0,0 +1,55 @@
+// Evol scripts.
+// Author:
+// gumi
+
+008-2-2,43,34,0 script Ledd NPC_DRINKER_ROAMINGO,{
+ // XXX: ^ I know it should be Led and Mitz but 4144 made names
+ // shorter than 4 characters illegal
+
+ deltimer("Mitz::OnTalk");
+ addtimer(rand(500, 900), "Mitz::OnTalk");
+OnTalk:
+ npctalk3(l("Ha! I'll drink muuuch mo.. more than you! Im not ooone biiit dr...dr..unk!"));
+ // TODO: add more sentences
+ // XXX: maybe instead of making them respond to a click they should just
+ // shout at each other at regular intervals?
+ end;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
+
+008-2-2,46,34,0 script Mitz NPC_DRINKER_MICKSHA,{
+
+ deltimer("Ledd::OnTalk");
+ addtimer(rand(500, 900), "Ledd::OnTalk");
+OnTalk:
+ npctalk3(l("I can still drink more! Better give up you... you... teelotaler! MORE BEER MELINDA!"));
+ // TODO: add more sentences
+ end;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/008-2-2/melania.txt b/npc/008-2-2/melania.txt
new file mode 100644
index 00000000..9b3980ed
--- /dev/null
+++ b/npc/008-2-2/melania.txt
@@ -0,0 +1,21 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Receptionist of Rusty Pick.
+// THIS IS A PLACEHOLDER!
+
+008-2-2,28,27,0 script Melania NPC_AIRLIA,{
+ speech
+ l("Hello Sir."),
+ l("Welcome to the Rusty Pick. Sorry, we have no room left today."),
+ l("One advice: Don't take the things the Drinkers say too serious. They are sitting here and drinking all day."),
+ lg("I wish you a beautiful day.");
+
+ close;
+
+OnInit:
+ .sex = G_FEMALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-2-2/melinda.txt b/npc/008-2-2/melinda.txt
new file mode 100644
index 00000000..2013c326
--- /dev/null
+++ b/npc/008-2-2/melinda.txt
@@ -0,0 +1,156 @@
+
+// Evol scripts.
+// Authors:
+// Toams
+// Description:
+// Melinda, Rusty Pick's waitress
+
+008-2-2,40,29,0 script Melinda#008-2-2 NPC_MELINDA,1,1,{
+
+function StartConversation {
+
+ .@tick = gettimetick(1);
+ if (.@tick > @Hurns_Rusty_Pick_WaitressTick + 10)
+ {
+ setarray .messages$[0], l("Welcome to our inn!"),
+ l("Welcome to the Rusty Pick."),
+ l("Please, have a seat."),
+ l("Lovely day, isn't it?");
+
+ .@r = rand(getarraysize(.messages$));
+ .@msg$ = .messages$[.@r];
+ npctalk3 .@msg$;
+ @Hurns_Rusty_Pick_WaitressTick = .@tick;
+ }
+ }
+
+mes "";
+mesn;
+mesq l("Hi, sweetie! Want a fresh beer for 170 Florin?");
+switch (select(l("Sure! [Don't tip]"),
+ l("Sure! [Tip 5 Florin]"),
+ l("Sure! [Tip 10 Florin]"),
+ l("Nah, maybe later.")))
+{
+ case 1:
+ if (Zeny < 170)
+ goto L_NoMoney;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("Beer") == 0)
+ goto L_TooMany;
+ set Zeny, Zeny - 170;
+ getitem Beer, 1;
+ mes "";
+ mesn;
+ mesq l("Pff... Nickel nurser!");
+ goto L_Close;
+ case 2:
+ if (Zeny < 175)
+ goto L_NoMoney;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("Beer") == 0)
+ goto L_TooMany;
+ set Zeny, Zeny - 175;
+ getitem "Beer", 1;
+ mes "";
+ mesn;
+ mesq l("Thanks for the tip!");
+ goto L_Close;
+ case 3:
+ if (Zeny < 180)
+ goto L_NoMoney;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("Beer") == 0)
+ goto L_TooMany;
+ set Zeny, Zeny - 180;
+ getitem "Beer", 1;
+ mes "";
+ mesn;
+ mesq l("Thank you, sweetie! Want to hear a secret?");
+ switch (select(l("What is it, darling?"),
+ l("Nah, I don't feel like chatting.")))
+ {
+ case 1:
+ mes "";
+ mesn;
+ mesq l("The master bowyer in this village used to construct exceptional bows. When you want one you should go and ask him.");
+ goto L_Close;
+ case 2:
+ goto L_No;
+ }
+ goto L_Close;
+ case 4:
+ goto L_No;
+}
+
+L_NoMoney:
+ mes "";
+ mesn;
+ mesq l("You look broke. Don't think that you can dine and dash here!");
+ goto L_Close;
+
+L_No:
+ mes "";
+ mesn;
+ mesq l("Just call me when you changed your mind.");
+ goto L_Close;
+
+L_Close:
+ initnpctimer;
+ close;
+
+L_TooMany:
+ mes "";
+ mesn;
+ mesq l("You don't have room for a beer!");
+ goto L_Close;
+
+OnTimer1000:
+ dographmovestep;
+
+OnTouch:
+ StartConversation;
+ end;
+
+OnInit:
+ .sex = G_FEMALE;
+ .distance = 5;
+ .speed = 300;
+ initmovegraph "barkeeper", 43, 30,
+ "kfahr", 45, 36,
+ "l_table_b", 36, 36,
+ "l_table_r", 38, 33,
+ "m_table_l", 39, 33,
+ "m_table_b", 41, 36,
+ "r_table_r", 46, 32,
+ "bucket", 46, 30;
+
+
+
+ setmovegraphcmd "barkeeper", "kfahr", 1, "dir 4; wait 1",
+ "barkeeper", "r_table_r", 1, "dir 2; wait 1",
+ "kfahr", "barkeeper", 1, "dir 4; wait 1; say Another round for kfahr's table.;"
+ "wait 1; say They sure are thirsty today;"
+ "wait 1; moveon",
+ "kfahr", "bucket", 1, "dir 4; wait 1; emote 1;"// todo: find angry emote
+ "wait 15; moveon",
+ "kfahr", "r_table_r", 1, "dir 2; wait 1",
+ "bucket", "l_table_b", 1, "dir 4; wait 1",
+ "bucket", "l_table_r", 1, "dir 2; wait 1",
+ "bucket", "m_table_l", 1, "dir 3; wait 1",
+ "bucket", "m_table_b", 1, "dir 4; wait 1",
+ "bucket", "r_table_r", 1, "dir 2; wait 1",
+ "bucket", "kfahr", 1, "dir 4; wait 1",
+ "l_table_b", "barkeeper", 1, "dir 4; wait 1",
+ "l_table_b", "bucket", 1, "dir 4; wait 1; emote 1;" // todo: find angry emote
+ "wait 15; moveon",
+ "l_table_b", "m_table_l", 1, "dir 1; wait 1",
+ "m_table_b", "l_table_b", 1, "dir 4; wait 1",
+ "r_table_r", "kfahr", 1, "dir 4; wait 1",
+ "m_table_l", "bucket", 1, "dir 4; wait 1",
+ "l_table_r", "kfahr", 1, "dir 4; wait 1";
+
+
+ firstmove "wait 8";
+ initnpctimer;
+}
diff --git a/npc/008-2-2/note.txt b/npc/008-2-2/note.txt
new file mode 100644
index 00000000..2fcce90f
--- /dev/null
+++ b/npc/008-2-2/note.txt
@@ -0,0 +1,28 @@
+// Evol scripts.
+// Author:
+// gumi
+
+008-2-2,32,28,0 script Note#Hurnscald:pub NPC_PAPER_NOTE,{
+ narrator(8,
+ l("We refuse service to anyone who:"),
+ l("• Has a bubblehead"),
+ l("• Is not properly shaded"),
+ l("• Can't walk without stopping after every step"));
+
+ // In case you don't get the joke, know that it's a parody on Illutia.
+
+ close;
+
+OnInit:
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/008-2-2/shop.txt b/npc/008-2-2/shop.txt
new file mode 100644
index 00000000..823e62c8
--- /dev/null
+++ b/npc/008-2-2/shop.txt
@@ -0,0 +1,25 @@
+// Evol scripts.
+// Authors:
+// 4144
+// Reid
+// Description:
+// Inn hidden shop.
+
+008-2-2,40,30,0 trader #Invisible008-2-2 NPC_HIDDEN,{
+
+OnInit:
+ tradertype(NST_MARKET);
+
+ sellitem Beer, -1, 50;
+
+ .sex = G_OTHER;
+ .distance = 10;
+ end;
+
+OnClock0000:
+ restoreshopitem Beer, 20;
+OnClock0800:
+ restoreshopitem Beer, 20;
+OnClock1600:
+ restoreshopitem Beer, 20;
+}
diff --git a/npc/008-2-24/_import.txt b/npc/008-2-24/_import.txt
index e8f862f4..63cfe25c 100644
--- a/npc/008-2-24/_import.txt
+++ b/npc/008-2-24/_import.txt
@@ -1,3 +1,4 @@
// Map 008-2-24: Dimond's Cove Ground Floor
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-2-24/_warps.txt",
+"npc/008-2-24/troupe-leader.txt",
diff --git a/npc/008-2-24/troupe-leader.txt b/npc/008-2-24/troupe-leader.txt
new file mode 100644
index 00000000..8b10fed8
--- /dev/null
+++ b/npc/008-2-24/troupe-leader.txt
@@ -0,0 +1,119 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - talked to inspector (1) <= start
+// [1] 3 - talked to old woman (1)
+// [1] 4 - talked to old woman (2)
+// [1] 5 - talked to inspector (2)
+// [1] 6 - talked to troupe leader (1)
+// [1] 7 - talked to inspector (3)
+// [1] 8 - talked to old man
+// [1] 9 - talked to old woman (3)
+// [1] 10 - talked to inspector (4)
+// [1] 11 - talked to old woman (4)
+// [1] 12 - talked to malek
+// [1] 13 - searched the bookcase
+// [1] 14 - talked to inspector (5)
+// [1] 15 - talked to troupe leader (2) <= reward
+// [1] 16 - talked to inspector (6) <= reward, end
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// robberies in hurnscald
+
+008-2-24,41,39,0 script Troupe Leader NPC_DIMOND,{
+
+ function nohmask_question {
+ // XXX: shouldn't the player ask a question before she replies Yes? this feels too abrupt
+ speech(4,
+ l("Yes, a mask was stolen from us the last night we were in Hurnscald."));
+
+ selectd(
+ l("Any ideas on who might have taken it?"),
+ l("Are you sure one of your troupe members didn't hide it and commit those robberies?"),
+ l("Hmm..."));
+
+ switch (@menu)
+ {
+ case 1:
+ speech(
+ l("Hm..."),
+ l("I did see an old man hang out near the theater after our last show."));
+ close2;
+ setq(.quest_inspector, 6);
+ close;
+
+ case 2:
+ speech(
+ l("I am absolutely positive."),
+ l("None of my troupe have left the city since we got here."),
+ l("Good day!"));
+ close;
+ }
+
+ closeclientdialog();
+ close;
+ }
+
+ function nohmask_found {
+ // XXX: shouldn't the player say "I found your mask" before the npc says thanks?
+ speech(4,
+ l("Thank you for finding the mask."),
+ l("You did such a good job, you should keep it."));
+
+ if (checkweight(.reward_item, 1) != true)
+ {
+ speech(8,
+ l("It seems you can't carry it right now..."));
+ close;
+ }
+
+ setq(.quest_inspector, 15);
+ getexp(.reward_exp, 0);
+ getitem(.reward_item, 1);
+
+ speech(
+ l("We don't need it anymore."),
+ l("We're doing different shows here."));
+ close;
+ }
+
+ // OnTalk:
+ switch (getq(.quest_inspector))
+ {
+ case 5: nohmask_question; break;
+ // XXX: shouldn't it have an in-between state where it says good luck or something?
+ case 14: nohmask_found; break;
+ // XXX: shouldn't it have a "completed" state where it says thanks, come back any time?
+ }
+
+ // initial intro
+ speech(
+ l("Hello."),
+ l("I'm the leader of a traveling theater troupe."),
+ l("We'll be staying here in Tulimshar for a while."));
+ close;
+
+OnInit:
+ .reward_item = NohMask; // FIXME: change this when we get NohMask
+ .reward_exp = 1500;
+
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_inspector;
+ .sex = G_FEMALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/008-2-4/_import.txt b/npc/008-2-4/_import.txt
index 8ab4d742..826aa135 100644
--- a/npc/008-2-4/_import.txt
+++ b/npc/008-2-4/_import.txt
@@ -2,4 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-2-4/_savepoints.txt",
"npc/008-2-4/_warps.txt",
+"npc/008-2-4/bernard.txt",
"npc/008-2-4/mapflags.txt",
+"npc/008-2-4/olana.txt",
diff --git a/npc/008-2-4/bernard.txt b/npc/008-2-4/bernard.txt
new file mode 100644
index 00000000..a528bcc3
--- /dev/null
+++ b/npc/008-2-4/bernard.txt
@@ -0,0 +1,230 @@
+// Evol scripts.
+// Author:
+// gumi
+// Quest states:
+// [1] 0 - cannot do the quest
+// [1] 1 - can do the quest
+// [1] 2 - bernard wants roasted maggot
+// [1] 3 - brought maggot
+// [1] 4 - bernard wants maggot slime
+// [1] 5 - brought maggot slime
+// [1] 6 - mikhail needs maggot slime
+// [1] 7 - brought maggot slime
+// [2] unused
+// [3] unused
+// [t] unused
+// Description:
+// Bernard wants to make a maggot slime soup
+
+008-2-4,34,29,0 script Bernard NPC_BERNARD,{
+
+ if (BaseLevel < .min_level)
+ {
+ npctalk3 generic(16 | 32);
+ end;
+ }
+
+ function soup_intro {
+ if (rand(2) == 1)
+ {
+ speech 4,
+ l("The fields are crawling with maggots."),
+ l("Where is Mikhail?"),
+ l("What is taking them so long?"),
+ l("Could I ask a favor of you?");
+ }
+ else
+ {
+ speech 4,
+ l("The taste of maggots in soup is... unforgettable."),
+ l("They taste simply divine!"),
+ l("I sent someone to kill me some maggots and they have yet to return."),
+ l("Would you help me kill some?");
+ }
+
+ if (selectd(l("Yes."), l("No.")) == 2)
+ {
+ return;
+ }
+
+ if (rand(2) == 1)
+ {
+ speech 4,
+ l("Great!"),
+ l("I need a %s for my soup.", getitemlink(.first_item));
+ }
+ else
+ {
+ speech 4,
+ l("Bring me a %s.", getitemlink(.first_item)),
+ l("I'll give you something if you do.");
+ }
+
+ speech 8,
+ l("Please bring it to me!");
+
+ setq .quest, 2;
+ close;
+ }
+
+ function soup_reminder_roasted {
+ speech
+ l("Oh, please hurry and bring me a %s.", getitemlink(.first_item)),
+ l("I'm yearning for maggot soup!");
+ close;
+ }
+
+ function soup_no_room {
+ speech 1 | 8,
+ "...",
+ l("It seems you don't have room for my reward."),
+ l("I'll wait until you do.");
+ close;
+ }
+
+ function soup_reward_roasted {
+ speech 4,
+ l("Oooh, perfect! It's perfect!"),
+ l("You brought me my %s!", getitemlink(.first_item)),
+ l("Here, have some %s for your troubles.",
+ getitemlink(.first_reward_item));
+
+ if (checkweight(.first_reward_item, .first_reward_amount) != true)
+ soup_no_room;
+
+ if (countitem(.first_item) < 1)
+ close;
+
+ delitem .first_item, 1;
+ getitem .first_reward_item, .first_reward_amount;
+ getexp .first_reward_exp, 0;
+ setq .quest, 3;
+
+ speech 8,
+ l("Now let's see...");
+ close;
+ }
+
+ function soup_ask_slime {
+ speech
+ l("Thank you so much!"),
+ l("But... something is missing to make the soup creamy."),
+ l("I need %d %s for that.",
+ .second_item_qty, getitemlink(.second_item)),
+ l("Bring them to me, and I'll give you something nice.");
+
+ setq .quest, 4;
+ close;
+ }
+
+ function soup_reminder_slime {
+ speech
+ l("Please do hurry and bring me %d %s, so I can finish my soup!",
+ .second_item_qty, getitemlink(.second_item));
+ close;
+ }
+
+ function soup_reward_slime {
+ speech
+ l("Nice!"),
+ l("They're perfect, just perfect!"),
+ l("You brought me the %d %s!",
+ .second_item_qty, getitemlink(.second_item)),
+ l("Here, have some %s as reward.",
+ getitemlink(.second_reward_item));
+
+ if (checkweight(.second_reward_item, .second_reward_amount) != true)
+ soup_no_room;
+
+ if (countitem(.second_item) < .second_item_qty)
+ close;
+
+ delitem .second_item, .second_item_qty;
+ getitem .second_reward_item, .second_reward_amount;
+ getexp .second_reward_exp, 0;
+ setq .quest, 5;
+
+ close;
+ }
+
+ function soup_thanks_slime {
+ speech
+ l("I didn't mention it before, but I also put beer in my soup."),
+ l("I hope you like beer as much as I do, because, you see..."),
+ l("Beer is life!");
+ close;
+ }
+
+ function soup_thanks_mikhail {
+ speech
+ l("My help, Mikhail, finally returned with the slimes I needed."),
+ l("I wonder what took him so long?");
+ close;
+ }
+
+
+ // OnTalk:
+ switch (getq(.quest))
+ {
+ case 0:
+ case 1: soup_intro; break;
+ case 2:
+ if (countitem(.first_item) < 1)
+ soup_reminder_roasted;
+ else
+ soup_reward_roasted;
+ break;
+ case 3: soup_ask_slime; break;
+ case 4:
+ if (countitem(.second_item) < .second_item_qty)
+ soup_reminder_slime;
+ else
+ soup_reward_slime;
+ break;
+ case 5:
+ case 6: soup_thanks_slime; break;
+ default: soup_thanks_mikhail;
+ }
+
+ closeclientdialog();
+ close;
+
+OnPCLoginEvent:
+OnPCBaseLvUpEvent:
+ if (BaseLevel >= .min_level && getq(.quest) < 1)
+ {
+ setq .quest, 1; // allow the player to do the quest
+ dispbottom l("New quest available: %s (level %d+)",
+ getquestlink(.quest), .min_level); // XXX: requires new manaplus versions, maybe show a different message for old versions?
+ }
+ end;
+
+OnInit:
+ .min_level = 10; // min level to do the quest
+
+ .first_item = RoastedMaggot;
+ .first_reward_item = CherryCake;
+ .first_reward_amount = 5;
+ .first_reward_exp = 100;
+
+ .second_item = MaggotSlime;
+ .second_item_qty = 3;
+ .second_reward_item = Beer;
+ .second_reward_amount = 3;
+ .second_reward_exp = 100;
+
+ .quest = HurnscaldQuests_Soup;
+ .quest_debug = .quest;
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/008-2-4/olana.txt b/npc/008-2-4/olana.txt
new file mode 100644
index 00000000..c16e8887
--- /dev/null
+++ b/npc/008-2-4/olana.txt
@@ -0,0 +1,21 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Olana, the old woman who is looking for her daughter Rossy.
+// THIS IS A PLACEHOLDER!
+
+008-2-4,30,28,0 script Olana#008-2-4 NPC_OLANA,{
+ speech
+ l("Oh, a traveller. Welcome."),
+ l("Did you see my daughter Rossy, by chance?"),
+ l("She wasn't at home for two days now. I worry about her!"),
+ lg("If you see her, please tell her to come home.");
+
+ close;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-2-6/_import.txt b/npc/008-2-6/_import.txt
index 4630df43..38c19068 100644
--- a/npc/008-2-6/_import.txt
+++ b/npc/008-2-6/_import.txt
@@ -1,4 +1,6 @@
// Map 008-2-6: Two Guys One Bed
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-2-6/_warps.txt",
+"npc/008-2-6/alan.txt",
+"npc/008-2-6/donald.txt",
"npc/008-2-6/mapflags.txt",
diff --git a/npc/008-2-6/alan.txt b/npc/008-2-6/alan.txt
new file mode 100644
index 00000000..35d75437
--- /dev/null
+++ b/npc/008-2-6/alan.txt
@@ -0,0 +1,303 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Alan the bow-maker.
+
+008-2-6,31,26,0 script Alan NPC_YOUNG_MAN_KFAHR,{
+
+ function bow_intro {
+ speech(4,
+ l("When you want to buy something then please speak to my apprentice."),
+ l("I am only doing special requests."));
+
+ selectd(
+ l("OK, thanks."),
+ rif(BaseLevel >= .min_level, l("Can you make me a really good bow?")),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything strange recently that might be connected to the robberies?")));
+
+ switch (@menu)
+ {
+ case 1: closeclientdialog(); close;
+ case 3: speech(l("No.")); close;
+ }
+
+ speech(4,
+ l("You mean like one of my legendary forest bows?"));
+
+ selectd(
+ l("Yes, that would be nice."));
+
+ speech(4,
+ l("Sorry, I am not making these anymore."));
+
+ selectd(
+ l("Oh, too bad."),
+ l("What? Why not?"));
+
+ if (@menu == 1) {
+ closeclientdialog();
+ close;
+ }
+
+ speech(4,
+ l("The problem is that I am short of material."),
+ l("My forestbows are not made of regular wood, you know."),
+ l("They are made of special living wood."),
+ l("And only the best logs of living wood are good enough for them."),
+ l("I used to get these logs from Jack, the handsome lumberjack."),
+ l("But the last time I asked him for a new delivery he said that he would never again get any for me."));
+
+ selectd(
+ l("Too bad."),
+ l("Did you ask him why?"));
+
+ if (@menu == 1) {
+ closeclientdialog();
+ close;
+ }
+
+ speech(4,
+ l("Sure I did."),
+ l("But he just told me to leave him alone."),
+ l("Maybe you could ask him what's wrong?"));
+
+ selectd(
+ l("OK, I'll ask him."),
+ l("I am sure he got his reasons."));
+
+ setq(.quest_bow, 2);
+ closeclientdialog();
+ close;
+ }
+
+ function bow_reminder {
+ if (getq(.quest_inspector) == 2)
+ {
+ speech(4,
+ l("Did you already ask Jack why he won't deliver me any more living wood?"));
+
+ selectd(
+ l("Have you seen anything strange recently that might be connected to the robberies?"));
+
+ speech(l("No."));
+ close;
+ }
+
+ npctalk3(l("Did you already ask Jack why he won't deliver me any more living wood?"));
+ end;
+ }
+
+ function bow_explain {
+ speech(4,
+ l("Did you already ask Jack why he won't deliver me any more living wood?"));
+
+ selectd(
+ l("Yes, I did. He said that the trees turned into dangerous monsters."),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything strange recently that might be connected to the robberies?")));
+
+ if (@menu != 1)
+ {
+ speech(l("No."));
+ close;
+ }
+
+ speech(
+ l("Oh, that's really bad news."),
+ l("Maybe you can do his job?"),
+ l("If you kill some of these tree monsters and bring me their wood I could take a look at them."),
+ l("Maybe you will find a piece of wood that is strong enough to become one of my forest bows."));
+
+ close2;
+ setq(.quest_bow, 4);
+ end;
+ }
+
+ function bow_make {
+ speech(4,
+ l("I can make you a really nice forest bow out of this."),
+ l("I just need %s E for material and work time.",
+ format_number(.req_esp)));
+
+ selectd(
+ l("%s??? What a ripoff!", format_number(.req_esp)),
+ rif(Zeny >= .req_esp, l("Sure, here you go!")),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything strange recently that might be connected to the robberies?")));
+
+ switch (@menu)
+ {
+ case 1: speech(l("Fine, I'll just hold on to this log should you ever change your mind.")); close;
+ case 3: speech(l("No.")); close;
+ }
+
+ // XXX: maybe here we could make the player wait real-world hours for Alan to finish?
+
+ if (checkweight(.reward_item, 1) != true)
+ {
+ speech(
+ l("It seems you can't carry the bow right now."),
+ l("Go clean up your inventory and come back."));
+ close;
+ }
+
+ if (Zeny < .req_esp)
+ close; // double-check
+
+ setq(.quest_bow, 6);
+ Zeny -= .req_esp;
+ getitem(.reward_item, 1);
+ getexp(.reward_exp, 0);
+
+ speech(
+ l("Here you go - have fun with it."));
+ close;
+ }
+
+ function bow_check_wood {
+ speech(4,
+ l("How is the hunt going?"),
+ l("Did you bring me any wood?"));
+
+ selectd(
+ l("No, sorry."),
+ rif(countitem(.req_item) >= 1, l("Here, take a look!")),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything strange recently that might be connected to the robberies?")));
+
+ switch (@menu)
+ {
+ case 1: closeclientdialog(); close;
+ case 3: speech(l("No.")); close;
+ }
+
+ .@first = true;
+
+ do {
+ if (countitem(.req_item) < 1)
+ break;
+
+ if (.@first == false)
+ {
+ narrator(4,
+ l("You hand him another log."));
+ }
+
+ delitem(.req_item, 1);
+ .@first = false;
+
+ speech(4,
+ l("Hmmm... looks ok, but is it strong enough?"));
+
+ narrator(4,
+ l("Alan bends the log over his knee."));
+
+ if (rand(.success_rate) == 0)
+ {
+ narrator(4 | 8,
+ l("Alan tries as hard as he can but the log won't bend."));
+
+ speech(4,
+ l("Aaah!"),
+ l("Yes!"),
+ l("That is a really fine piece of wood you brought me."),
+ l("It will make an excellent bow!"));
+
+ setq(.quest_bow, 5);
+ setq(.quest_shield, 1);
+
+ narrator(4,
+ l("He proceeds to further scrutinize the log."));
+
+ bow_make;
+ end;
+ }
+
+ narrator(4 | 8,
+ l("The log breaks with a loud crack."));
+
+ speech(4,
+ l("Sorry, this log was too weak for one of my forest bows."),
+ l("Now it is junk."),
+ l("Do you wish to try again?"));
+
+ selectd(
+ l("Sure, here you go."),
+ l("Hey! Stop breaking my stuff!"));
+
+ if (@menu != 1) {
+ closeclientdialog();
+ close;
+ }
+
+ } while (true);
+
+ speech(l("It seems you have no wood left."));
+ close;
+ }
+
+ function bow_done {
+ speech(4,
+ l("I hope you are satisfied with your forest bow."),
+ l("It is one of my best works."));
+
+ selectd(
+ l("I am!"),
+ rif(getq(.quest_inspector) == 2, l("Have you seen anything strange recently that might be connected to the robberies?")));
+
+ switch (@menu)
+ {
+ case 2: speech(l("No.")); close;
+ default: closeclientdialog(); close;
+ }
+ }
+
+ // OnTalk:
+ switch (getq(.quest_bow))
+ {
+ case 0:
+ case 1: bow_intro; break;
+ case 2: bow_reminder; break;
+ case 3: bow_explain; break;
+ case 4: bow_check_wood; break;
+ case 5: bow_make; break;
+ default: bow_done; break;
+ }
+
+ closeclientdialog();
+ close;
+
+OnPCLoginEvent:
+OnPCBaseLvUpEvent:
+ if (BaseLevel >= .min_level && getq(.quest_bow) < 1)
+ {
+ setq(.quest_bow, 1); // allow the player to do the quest
+ dispbottom(l("New quest available: %s (level %d+)",
+ getquestlink(.quest_bow), .min_level)); // XXX: requires new manaplus versions, maybe show a different message for old versions?
+ }
+ end;
+
+OnInit:
+ .min_level = 25; // min level to do the quest
+
+ .req_item = RawLog; // item required to make the bow
+ .req_esp = 10000; // amount of Esperin required to make the bow
+ .reward_item = ForestBow; // quest reward (item)
+ .reward_exp = 500; // quest reward (exp)
+ .success_rate = 20; // one in X chances to get a perfect log
+
+ .quest_bow = HurnscaldQuests_ForestBow;
+ .quest_shield = HurnscaldQuests_WoodenShield;
+ .quest_inspector = HurnscaldQuests_Inspector;
+ .quest_debug = .quest_bow;
+ .sex = G_MALE;
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/008-2-6/donald.txt b/npc/008-2-6/donald.txt
new file mode 100644
index 00000000..2b3a72f3
--- /dev/null
+++ b/npc/008-2-6/donald.txt
@@ -0,0 +1,20 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Alan's Apprentice.
+// THIS IS A PLACEHOLDER!
+
+008-2-6,29,27,0 script Donald NPC_YOUNG_MAN_APPRENTICE,{
+ speech
+ l("Hi Sir."),
+ l("Sorry, we are sold out for today."),
+ lg("Come back later.");
+
+ close;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-2-7/_import.txt b/npc/008-2-7/_import.txt
index 263e5dcf..4cb38df9 100644
--- a/npc/008-2-7/_import.txt
+++ b/npc/008-2-7/_import.txt
@@ -3,3 +3,4 @@
"npc/008-2-7/_savepoints.txt",
"npc/008-2-7/_warps.txt",
"npc/008-2-7/mapflags.txt",
+"npc/008-2-7/wyara.txt",
diff --git a/npc/008-2-7/wyara.txt b/npc/008-2-7/wyara.txt
new file mode 100644
index 00000000..a875544a
--- /dev/null
+++ b/npc/008-2-7/wyara.txt
@@ -0,0 +1,20 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Wyara the witch.
+// THIS IS A PLACEHOLDER!
+
+008-2-7,27,28,0 script Wyara#008-2-7 NPC_DARK_DRUID,{
+ speech
+ l("What? Is there someone?"),
+ l("Please, leave me alone. I have to pixel potions."),
+ lg("I will sell some when you return a bit later.");
+
+ close;
+
+OnInit:
+ .sex = G_FEMALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/008-2-8/_import.txt b/npc/008-2-8/_import.txt
index d3346591..8bb44bb1 100644
--- a/npc/008-2-8/_import.txt
+++ b/npc/008-2-8/_import.txt
@@ -1,4 +1,6 @@
// Map 008-2-8: Hurnscald Forge
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-2-8/_warps.txt",
+"npc/008-2-8/macgowan.txt",
"npc/008-2-8/mapflags.txt",
+"npc/008-2-8/nicholas.txt",
diff --git a/npc/008-2-8/macgowan.txt b/npc/008-2-8/macgowan.txt
new file mode 100644
index 00000000..efeee33e
--- /dev/null
+++ b/npc/008-2-8/macgowan.txt
@@ -0,0 +1,24 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// The Smith's apprentice.
+// THIS IS A PLACEHOLDER!
+
+008-2-8,38,29,0 script Macgowan NPC_YOUNG_MAN_APPRENTICE,{
+ npctalk3(l("Hello, I am Macgowan, apprentice to Nicholas."));
+ end;
+
+OnInit:
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/008-2-8/nicholas.txt b/npc/008-2-8/nicholas.txt
new file mode 100644
index 00000000..7b62090d
--- /dev/null
+++ b/npc/008-2-8/nicholas.txt
@@ -0,0 +1,28 @@
+// Evol scripts.
+// Author:
+// gumi, Micksha
+// Description:
+// Nicholas the Smith.
+
+008-2-8,40,27,0 script Nicholas NPC_NICHOLAS,{
+ speech(
+ l("Hello, there!"),
+ l("I'm an expert blacksmith."),
+ l("If you get me some Coal and Iron Ingots, I could make you a very valuable shield or helmet."));
+
+ // TODO: setzer quest
+ close;
+
+OnInit:
+ .distance = 3;
+
+////////// UNFINISHED //////////
+////////////////////////////////
+// REMOVE THIS CODE WHEN THIS //
+// NPC IS NO LONGER A WIP //////
+////////////////////////////////
+//if (!debug) disablenpc(.name$);
+///////// UNFINISHED ///////////
+
+ end;
+}
diff --git a/npc/_anchors.txt b/npc/_anchors.txt
index 3630ba7e..5142b8c9 100644
--- a/npc/_anchors.txt
+++ b/npc/_anchors.txt
@@ -19,6 +19,7 @@ OnInit:
htput(.ht, "^LEG", "001-2-33 34 42");
htput(.ht, "^LIB", "001-2-4 42 35");
htput(.ht, "^LIGHT", "001-2-0 37 32");
+ htput(.ht, "^LUVIA", "008-1 256 206");
htput(.ht, "^MERCH|^BANK", "001-2-19 28 30");
htput(.ht, "^MOON", "001-2-2 40 34");
htput(.ht, "^NARD", "000-2-3 21 28");
diff --git a/npc/commands/debug-quest.txt b/npc/commands/debug-quest.txt
index 2c590a2d..468e5af2 100644
--- a/npc/commands/debug-quest.txt
+++ b/npc/commands/debug-quest.txt
@@ -90,6 +90,31 @@ function script GlobalQuestDebug {
} while (1);
}
+ function qDebugHurnscald {
+ do
+ {
+ clear;
+ setnpcdialogtitle l("Quest debug") + " - Hurnscald";
+ mes l("This menu gives access to quest debug menus for @@ quests.", "Hurnscald");
+ next;
+ mes l("Please select a quest:");
+
+ menuint
+ menuimage("actions/back", l("Go back")), -1,
+ "Hinnak", HurnscaldQuests_Hinnak,
+ l("Maggot soup"), HurnscaldQuests_Soup,
+ l("Inspector"), HurnscaldQuests_Inspector,
+ l("Forest bow"), HurnscaldQuests_ForestBow,
+ l("Wooden shield"), HurnscaldQuests_WoodenShield;
+
+ switch (@menuret)
+ {
+ case -1: return;
+ default: callfunc "QuestDebug" + @menuret;
+ }
+ } while (1);
+ }
+
function qDebugGeneral {
do
{
@@ -125,6 +150,7 @@ function script GlobalQuestDebug {
select
l("Prologue"),
"Artis",
+ "Hurnscald",
l("Other"),
rif(getarg(0,0), menuimage("actions/back", l("Return to Debug menu")));
@@ -132,8 +158,9 @@ function script GlobalQuestDebug {
{
case 1: qDebugShip; break;
case 2: qDebugArtis; break;
- case 3: qDebugGeneral; break;
- case 4: return;
+ case 3: qDebugHurnscald; break;
+ case 4: qDebugGeneral; break;
+ case 5: return;
}
} while (1);
}
diff --git a/npc/functions/generic-text.txt b/npc/functions/generic-text.txt
new file mode 100644
index 00000000..ede6e954
--- /dev/null
+++ b/npc/functions/generic-text.txt
@@ -0,0 +1,120 @@
+// Evol functions.
+// Authors:
+// gumi
+// Description:
+// text register
+
+function script generic {
+ .@flags = getarg(0, 1);
+
+ .@villager = (1 << 0);
+ .@old = (1 << 1);
+ .@kid = (1 << 2);
+ .@sailor = (1 << 3);
+ .@busy = (1 << 4);
+ .@tired = (1 << 5);
+ .@angry = (1 << 6);
+ .@legion = (1 << 7);
+ .@crazy = (1 << 8);
+
+ if (.@flags == 0)
+ return l("I'm sorry, I can't talk right now.");
+
+ if (.@flags & .@villager)
+ {
+ setarray(.@array$[.@count],
+ l("It is a sunny day, don't you think?"),
+ l("I just want to live my life in peace."),
+ l("Isn't this place pretty? I love hanging out here!"));
+
+ .@count += 3;
+ }
+
+ if (.@flags & .@old)
+ {
+ setarray(.@array$[.@count],
+ l("Come closer dear, I can't hear you."),
+ l("Hmm... where did I put it again?"),
+ l("I miss the good old days."));
+
+ .@count += 3;
+ }
+
+ if (.@flags & .@kid)
+ {
+ setarray(.@array$[.@count],
+ l("Mommy doesn't want me to talk to strangers."));
+
+ .@count += 1;
+ }
+
+ if (.@flags & .@sailor)
+ {
+ setarray(.@array$[.@count],
+ l("So finally someone has came to visit me?"),
+ l("A-hoy matey!"));
+
+ .@count += 2;
+ }
+
+ if (.@flags & .@busy)
+ {
+ setarray(.@array$[.@count],
+ l("Can't talk right now."),
+ l("Can't you see I'm busy?"),
+ l("Come back later."),
+ l("I'm a little busy right now."));
+
+ .@count += 4;
+ }
+
+ if (.@flags & .@tired)
+ {
+ setarray(.@array$[.@count],
+ l("I had a long day, come back tomorrow."),
+ l("I need to rest."),
+ l("*snores*"));
+
+ .@count += 3;
+ }
+
+ if (.@flags & .@angry)
+ {
+ setarray(.@array$[.@count],
+ l("Go pester someone else."),
+ l("I don't feel like talking to you."),
+ l("Stop wasting my time."),
+ l("Go fly a kite"),
+ l("Not in the mood to chat."),
+ l("Give me some space."),
+ l("Can you please go away?"));
+
+ .@count += 7;
+ }
+
+ if (.@flags & .@legion)
+ {
+ setarray(.@array$[.@count],
+ l("My breath smells bad."),
+ l("Don't distract me, I have to stay alert."),
+ l("Can't talk right now, I'm on patrol duty."),
+ l("I can't stay here and talk all day. I have a job to do."),
+ l("Keep moving."),
+ l("So you think you're tough? A warrior must also be loyal and patient."),
+ l("Practice! There are no secrets to becoming a warrior."),
+ l("There is no honor in fighting a weak opponent."));
+
+ .@count += 8;
+ }
+
+ if (.@flags & .@crazy)
+ {
+ setarray(.@array$[.@count],
+ l("Do I look like a tree? I feel like one."),
+ l("What're you looking at?!"));
+
+ .@count += 2;
+ }
+
+ return .@array$[rand(.@count)];
+}
diff --git a/npc/functions/quest-debug/036-HurnscaldQuests_Hinnak.txt b/npc/functions/quest-debug/036-HurnscaldQuests_Hinnak.txt
new file mode 100644
index 00000000..61dc294e
--- /dev/null
+++ b/npc/functions/quest-debug/036-HurnscaldQuests_Hinnak.txt
@@ -0,0 +1,32 @@
+// Hinnak quest debug
+// Author:
+// gumi
+
+function script QuestDebug36 {
+ do
+ {
+ clear;
+ setnpcdialogtitle l("Quest debug");
+ mes "HurnscaldQuests_Hinnak";
+ mes "---";
+ mes l("Quest state: @@, @@",
+ getq(HurnscaldQuests_Hinnak),
+ getq2(HurnscaldQuests_Hinnak));
+ next;
+
+ GenericQuestDebug HurnscaldQuests_Hinnak,
+ l("Cannot do the quest"), 0,
+ l("Can do the quest"), 1,
+ l("Hinnak asked for help"), 2,
+ l("Helped Hinnak"), 3;
+
+ switch (@menuret)
+ {
+ case 0:
+ case 1:
+ case 2: setq HurnscaldQuests_Hinnak, getq(HurnscaldQuests_Hinnak), 0; break;
+ default: if (@menuret < 0) return;
+ }
+
+ } while (1);
+}
diff --git a/npc/functions/quest-debug/037-HurnscaldQuests_Soup.txt b/npc/functions/quest-debug/037-HurnscaldQuests_Soup.txt
new file mode 100644
index 00000000..43eba0d6
--- /dev/null
+++ b/npc/functions/quest-debug/037-HurnscaldQuests_Soup.txt
@@ -0,0 +1,32 @@
+// Mikhail & Bernard quest debug
+// Author:
+// gumi
+
+function script QuestDebug37 {
+ do
+ {
+ clear;
+ setnpcdialogtitle l("Quest debug");
+ mes "HurnscaldQuests_Soup";
+ mes "---";
+ mes l("Quest state: @@",
+ getq(HurnscaldQuests_Soup));
+ next;
+
+ GenericQuestDebug HurnscaldQuests_Soup,
+ l("Cannot do the quest"), 0,
+ l("Can do the quest"), 1,
+ l("Bernard wants roasted maggot"), 2,
+ l("brought maggot"), 3,
+ l("Bernard wants maggot slime"), 4,
+ l("brought maggot slime"), 5,
+ l("Mikhail needs maggot slime"), 6,
+ l("brought maggot slime"), 7;
+
+ if (@menuret < 0)
+ {
+ return;
+ }
+
+ } while (1);
+}
diff --git a/npc/functions/quest-debug/038-HurnscaldQuests_Inspector.txt b/npc/functions/quest-debug/038-HurnscaldQuests_Inspector.txt
new file mode 100644
index 00000000..053f085e
--- /dev/null
+++ b/npc/functions/quest-debug/038-HurnscaldQuests_Inspector.txt
@@ -0,0 +1,41 @@
+// Inspector quest debug
+// Author:
+// gumi
+
+function script QuestDebug38 {
+ do
+ {
+ clear;
+ setnpcdialogtitle l("Quest debug");
+ mes "HurnscaldQuests_Inspector";
+ mes "---";
+ mes l("Quest state: @@",
+ getq(HurnscaldQuests_Inspector));
+ next;
+
+ GenericQuestDebug HurnscaldQuests_Inspector,
+ l("Cannot do the quest"), 0,
+ l("Can do the quest"), 1,
+ l("Talked to Inspector (1)"), 2,
+ l("Talked to Old Woman (1)"), 3,
+ l("Talked to Old Woman (2)"), 4,
+ l("Talked to Inspector (2)"), 5,
+ l("Talked to Troupe Leader (1)"), 6,
+ l("Talked to Inspector (3)"), 7,
+ l("Talked to Old Man"), 8,
+ l("Talked to Old Woman (3)"), 9,
+ l("Talked to Inspector (4)"), 10,
+ l("Talked to Old Woman (4)"), 11,
+ l("Talked to Malek"), 12,
+ l("Searched the bookcase"), 13,
+ l("Talked to Inspector (5)"), 14,
+ l("Talked to Troupe Leader (2)"), 15,
+ l("Talked to Inspector (6)"), 16;
+
+ if (@menuret < 0)
+ {
+ return;
+ }
+
+ } while (1);
+}
diff --git a/npc/functions/quest-debug/039-HurnscaldQuests_ForestBow.txt b/npc/functions/quest-debug/039-HurnscaldQuests_ForestBow.txt
new file mode 100644
index 00000000..c6a61a1b
--- /dev/null
+++ b/npc/functions/quest-debug/039-HurnscaldQuests_ForestBow.txt
@@ -0,0 +1,42 @@
+// Jack Lumber quest debug
+// Author:
+// gumi
+
+function script QuestDebug39 {
+ do
+ {
+ clear;
+ setnpcdialogtitle l("Quest debug");
+ mes "HurnscaldQuests_ForestBow";
+ mes "---";
+ mes l("Quest state: @@", getq(HurnscaldQuests_ForestBow));
+ mes "---";
+ mes l("Related quests:");
+ mes "HurnscaldQuests_WoodenShield: " + getq(HurnscaldQuests_WoodenShield);
+ next;
+
+ GenericQuestDebug HurnscaldQuests_ForestBow,
+ menuimage("actions/manage", l("Debug Wooden Shield")), -1,
+ l("Cannot do the quest"), 0,
+ l("Can do the quest"), 1,
+ l("Alan wants to ask Jack"), 2,
+ l("Jack explained problem"), 3,
+ l("Alan asks to find wood"), 4,
+ l("Found perfect wood"), 5,
+ l("Got the bow"), 6;
+
+ switch (@menuret)
+ {
+ case -1: callfunc "QuestDebug40"; break;
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4: setq(HurnscaldQuests_WoodenShield, 0); break;
+ case 5:
+ case 6: setq(HurnscaldQuests_WoodenShield, max(1, getq(HurnscaldQuests_WoodenShield))); break;
+ default: if (@menuret < 0) return;
+ }
+
+ } while (1);
+}
diff --git a/npc/functions/quest-debug/040-HurnscaldQuests_WoodenShield.txt b/npc/functions/quest-debug/040-HurnscaldQuests_WoodenShield.txt
new file mode 100644
index 00000000..05d08130
--- /dev/null
+++ b/npc/functions/quest-debug/040-HurnscaldQuests_WoodenShield.txt
@@ -0,0 +1,37 @@
+// Jack Lumber quest debug
+// Author:
+// gumi
+
+function script QuestDebug40 {
+ do
+ {
+ clear;
+ setnpcdialogtitle l("Quest debug");
+ mes "HurnscaldQuests_WoodenShield";
+ mes "---";
+ mes l("Quest state: @@", getq(HurnscaldQuests_WoodenShield));
+ mes "---";
+ mes l("Related quests:");
+ mes "HurnscaldQuests_ForestBow: " + getq(HurnscaldQuests_ForestBow);
+ next;
+
+ GenericQuestDebug HurnscaldQuests_WoodenShield,
+ menuimage("actions/manage", l("Debug Forest Bow")), -1,
+ l("Cannot do the quest"), 0,
+ l("Can do the quest"), 1,
+ l("Jack proposes shield"), 2,
+ l("Accepted the quest"), 3,
+ l("Got the shield"), 4;
+
+ switch (@menuret)
+ {
+ case -1: callfunc "QuestDebug39"; break;
+ case 1:
+ case 2:
+ case 3:
+ case 4: setq(HurnscaldQuests_ForestBow, max(5, getq(HurnscaldQuests_ForestBow))); break;
+ default: if (@menuret < 0) return;
+ }
+
+ } while (1);
+}
diff --git a/npc/scripts.conf b/npc/scripts.conf
index 3bb929a9..91d5b218 100644
--- a/npc/scripts.conf
+++ b/npc/scripts.conf
@@ -39,6 +39,7 @@
"npc/functions/npcmovegraph.txt",
"npc/functions/fishing.txt",
"npc/functions/mouboofunc.txt",
+"npc/functions/generic-text.txt",
"npc/functions/asklanguage.txt",
"npc/functions/game-rules.txt",
"npc/functions/riddle.txt",
@@ -56,6 +57,7 @@
"npc/functions/quest-debug/005-ShipQuests_Knife.txt",
"npc/functions/quest-debug/006-ShipQuests_ArpanMoney.txt",
"npc/functions/quest-debug/007-ShipQuests_Door.txt",
+// 008: ???
"npc/functions/quest-debug/009-ShipQuests_TreasureChest.txt",
"npc/functions/quest-debug/010-ShipQuests_Ale.txt",
"npc/functions/quest-debug/011-ShipQuests_Astapolos.txt",
@@ -71,8 +73,8 @@
"npc/functions/quest-debug/021-ArtisQuests_CatchPiou.txt",
"npc/functions/quest-debug/022-ArtisQuests_Fishman.txt",
"npc/functions/quest-debug/023-ArtisQuests_QOnan.txt",
-// 24: quest removed (Halloween_VisitArtis)
-// 25: quest removed (Halloween_BarrelQuest)
+// 024: removed quest (Halloween_VisitArtis)
+// 025: removed quest (Halloween_BarrelQuest)
"npc/functions/quest-debug/026-General_Rumly.txt",
"npc/functions/quest-debug/027-ArtisQuests_Enora.txt",
"npc/functions/quest-debug/028-General_Narrator.txt",
@@ -81,6 +83,13 @@
"npc/functions/quest-debug/031-General_Janus.txt",
"npc/functions/quest-debug/032-ArtisQuests_MonaDad.txt",
"npc/functions/quest-debug/033-Artis_Legion_Progress.txt",
+// 034: ???
+// 035: ???
+"npc/functions/quest-debug/036-HurnscaldQuests_Hinnak.txt",
+"npc/functions/quest-debug/037-HurnscaldQuests_Soup.txt",
+"npc/functions/quest-debug/038-HurnscaldQuests_Inspector.txt",
+"npc/functions/quest-debug/039-HurnscaldQuests_ForestBow.txt",
+"npc/functions/quest-debug/040-HurnscaldQuests_WoodenShield.txt",
// Item functions
"npc/items/croconut.txt",
@@ -106,5 +115,10 @@
// config script
"npc/config/hairstyle_config.txt",
+// placeholder scripts
+//"npc/placeholder/angus.txt",
+//"npc/placeholder/caul.txt",
+//"npc/placeholder/receptionist.txt",
+
// Maps specific scripts
@include "npc/_import.txt"