summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesusaves <cpntb1@ymail.com>2020-12-06 19:30:53 +0000
committerJesusaves <cpntb1@ymail.com>2020-12-06 19:30:53 +0000
commit70745c44049d888ef84c0a597fcd24779bdff126 (patch)
tree91a042a0d2a9735e2907bb4daec4c3b0dd368721
parent3db95edc1d79e290c3d18ec6f2f6af9b42b89396 (diff)
parent5195432edc23040407c7ae84061e9db0c2cbebf1 (diff)
downloadserverdata-70745c44049d888ef84c0a597fcd24779bdff126.tar.gz
serverdata-70745c44049d888ef84c0a597fcd24779bdff126.tar.bz2
serverdata-70745c44049d888ef84c0a597fcd24779bdff126.tar.xz
serverdata-70745c44049d888ef84c0a597fcd24779bdff126.zip
Merge branch 'jesusalva/contentIV' into 'master'
Super Merge Request ContentIV (untested) Closes evol-all#7 See merge request evol/serverdata!280
-rw-r--r--.mailmap13
-rw-r--r--db/constants.conf54
-rw-r--r--db/job_db2.txt6
-rw-r--r--db/quest_db.conf10
-rw-r--r--db/re/item_db.conf221
-rw-r--r--db/re/job_db.conf10
-rw-r--r--db/re/skill_db.conf2
-rw-r--r--db/re/skill_tree.conf10
-rw-r--r--maps/re/020-2-15.mcachebin73 -> 79 bytes
-rw-r--r--npc/000-0/sailors.txt13
-rw-r--r--npc/000-1/_import.txt1
-rw-r--r--npc/000-1/_mobs.txt1
-rw-r--r--npc/000-1/boss.txt43
-rw-r--r--npc/000-2-0/julia.txt50
-rw-r--r--npc/001-1/chelios.txt145
-rw-r--r--npc/001-1/enora.txt5
-rw-r--r--npc/001-1/shop.txt2
-rw-r--r--npc/001-1/wateranimation.txt42
-rw-r--r--npc/001-2-2/moon.txt4
-rw-r--r--npc/001-2-27/don.txt131
-rw-r--r--npc/001-2-27/kaylo.txt2
-rw-r--r--npc/001-2-27/lydon.txt2
-rw-r--r--npc/001-2-40/_import.txt2
-rw-r--r--npc/001-2-40/_warps.txt2
-rw-r--r--npc/001-2-41/edouard.txt10
-rw-r--r--npc/001-2-6/books.txt16
-rw-r--r--npc/001-3-2/henry.txt9
-rw-r--r--npc/008-1/_import.txt2
-rw-r--r--npc/008-1/hinnak.txt3
-rw-r--r--npc/008-1/jack.txt3
-rw-r--r--npc/008-1/mikhail.txt11
-rw-r--r--npc/008-1/rossy.txt7
-rw-r--r--npc/008-1/soul-menhir.txt59
-rw-r--r--npc/008-1/wateranimation.txt24
-rw-r--r--npc/008-2-1/inspector.txt5
-rw-r--r--npc/008-2-1/selim.txt7
-rw-r--r--npc/008-2-13/lena.txt255
-rw-r--r--npc/008-2-16/yannika.txt4
-rw-r--r--npc/008-2-2/kfahr.txt4
-rw-r--r--npc/008-2-24/troupe-leader.txt5
-rw-r--r--npc/008-2-4/bernard.txt17
-rw-r--r--npc/008-2-4/olana.txt6
-rw-r--r--npc/008-2-6/alan.txt12
-rw-r--r--npc/008-2-7/wyara.txt75
-rw-r--r--npc/008-3-0/juliet.txt7
-rw-r--r--npc/008-3-1/_import.txt1
-rw-r--r--npc/008-3-1/arkim.txt57
-rw-r--r--npc/008-3-2/boss.txt28
-rw-r--r--npc/008-3-5/_import.txt2
-rw-r--r--npc/008-3-5/bryant.txt80
-rw-r--r--npc/008-3-5/lordcave.txt101
-rw-r--r--npc/008-3-5/nunia.txt2
-rw-r--r--npc/009-1/_import.txt6
-rw-r--r--npc/009-1/blackwin.txt30
-rw-r--r--npc/009-1/forwin.txt25
-rw-r--r--npc/009-1/hamond.txt19
-rw-r--r--npc/009-1/soul-menhir.txt7
-rw-r--r--npc/009-1/thurstan.txt23
-rw-r--r--npc/009-1/wateranimation.txt10
-rw-r--r--npc/009-2-3/_import.txt2
-rw-r--r--npc/009-2-3/barbara.txt17
-rw-r--r--npc/009-2-3/chef.txt2
-rw-r--r--npc/009-2-3/reid.txt22
-rw-r--r--npc/009-2-4/_import.txt2
-rw-r--r--npc/009-2-4/aldred.txt18
-rw-r--r--npc/009-2-4/golbenez.txt52
-rw-r--r--npc/009-2-5/_import.txt2
-rw-r--r--npc/009-2-5/lovers.txt29
-rw-r--r--npc/009-2-5/savaric.txt20
-rw-r--r--npc/009-2-6/_import.txt2
-rw-r--r--npc/009-2-6/eurni.txt22
-rw-r--r--npc/009-2-6/jpmorbid.txt (renamed from npc/009-2-7/jpmorbid.txt)3
-rw-r--r--npc/009-2-7/_import.txt3
-rw-r--r--npc/009-2-7/leofwin.txt18
-rw-r--r--npc/009-2-7/umfrey.txt25
-rw-r--r--npc/009-2-8/_import.txt1
-rw-r--r--npc/009-2-8/cerhan.txt19
-rw-r--r--npc/012-1/_import.txt1
-rw-r--r--npc/012-1/wateranimation.txt12
-rw-r--r--npc/012-2-4/morgan.txt4
-rw-r--r--npc/012-2-7/_import.txt1
-rw-r--r--npc/012-2-7/marazor.txt17
-rw-r--r--npc/020-1/_import.txt4
-rw-r--r--npc/020-1/_mobs.txt1
-rw-r--r--npc/020-1/adrian.txt2
-rw-r--r--npc/020-1/anwar.txt137
-rw-r--r--npc/020-1/boss.txt43
-rw-r--r--npc/020-1/eomie.txt182
-rw-r--r--npc/020-1/hocus.txt91
-rw-r--r--npc/020-1/issay.txt16
-rw-r--r--npc/020-1/itka.txt30
-rw-r--r--npc/020-1/joaquim.txt201
-rw-r--r--npc/020-1/malivox.txt6
-rw-r--r--npc/020-1/martha.txt2
-rw-r--r--npc/020-1/noke.txt2
-rw-r--r--npc/020-1/wateranimation.txt20
-rw-r--r--npc/020-2-10/hetchel.txt16
-rw-r--r--npc/020-2-15/_import.txt6
-rw-r--r--npc/020-2-15/_warps.txt2
-rw-r--r--npc/020-2-15/eleanore.txt16
-rw-r--r--npc/020-2-15/kadiya.txt22
-rw-r--r--npc/020-2-15/memoriam.txt19
-rw-r--r--npc/020-2-15/yumi.txt55
-rw-r--r--npc/020-2-24/kylian.txt78
-rw-r--r--npc/020-2-34/casino.txt9
-rw-r--r--npc/020-2-8/_import.txt2
-rw-r--r--npc/020-2-8/heathin.txt (renamed from npc/020-2-9/heathin.txt)2
-rw-r--r--npc/020-2-8/jhedia.txt (renamed from npc/020-2-9/jhedia.txt)5
-rw-r--r--npc/020-2-9/_import.txt3
-rw-r--r--npc/020-2-9/yanis.txt18
-rw-r--r--npc/commands/music.txt46
-rw-r--r--npc/functions/barber.txt67
-rw-r--r--npc/functions/crafting.txt4
-rw-r--r--npc/functions/fishing.txt112
-rw-r--r--npc/functions/main.txt82
-rw-r--r--npc/functions/music.txt58
-rw-r--r--npc/functions/resetstatus.txt117
-rw-r--r--npc/functions/soul-menhir.txt75
-rw-r--r--npc/items/master_skillbook.txt38
-rw-r--r--npc/scripts.conf4
120 files changed, 2982 insertions, 608 deletions
diff --git a/.mailmap b/.mailmap
index 08094667..9d753f39 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1,19 +1,32 @@
Jesusaves <jesusalva@themanaworld.org> Jesusaves <cpntb1@ymail.com>
Jesusaves <jesusalva@themanaworld.org> Jonatas L. Nogueira <cpntb1@ymail.com>
Alige <aligetmw@hotmail.fr> Alige <gauvain.dauchy@free.fr>
+Alige <aligetmw@hotmail.fr> Alige <alige@debian>
Reid <reidyaro@gmail.com> Reid Yaro <reidyaro@gmail.com>
Reid <reidyaro@gmail.com> Reid <reid@Chlian>
Reid <reidyaro@gmail.com> Reid Yaro <reid@Julie>
+Reid <reidyaro@gmail.com> Reid <reid@IdeaPad.(none)>
gumi <git@gumi.ca> gumi <mekolat@users.noreply.github.com>
Hal9000 <miglietta.francesco@gmail.com> Hal9OOO <miglietta.francesco@gmail.com>
Hal9000 <miglietta.francesco@gmail.com> Hal9OOO (Francesco Miglietta) <miglietta.francesco@gmail.com>
+Hal9000 <miglietta.francesco@gmail.com> epoc <epoc@hal9000.(none)>
+Hal9000 <miglietta.francesco@gmail.com> <epoc@halthink.(none)>
Micksha <ms-shaman@gmx.de> Micksha <Micksha@users.noreply.github.com>
omatt <m.vuoso@laposte.net> omattornot <m.vuoso@laposte.net>
+omatt <m.vuoso@laposte.net> omatt <m.vuoso@laposte.net>
gumi <git@gumi.ca> mekolat <mekolat@users.noreply.github.com>
wushin <pasekei@gmail.com> Wushin <pasekei@gmail.com>
Monwarez <monwarez@gmail.com> Thibault Payet <monwarez@gmail.com>
+Monwarez <monwarez@gmail.com> User Monwarez <monwarez@gmail.com>
Vasily_Makarov <danilka.pro@gmail.com> Dan Sagunov <danilka.pro@gmail.com>
Vasily_Makarov <danilka.pro@gmail.com> Dan Sagunov <dan@archdemon.(none)>
Vasily_Makarov <danilka.pro@gmail.com> dan <dan@dan-P41-ES3G.(none)>
Vasily_Makarov <danilka.pro@gmail.com> Vasily <danilka.pro@gmail.com>
Akko Teru <none@null.nil> Teru <9bi at [comc]ast dot net>
+jak1 <jak1@germantmw.de> jak1 <jak89_1@ftb4u.de>
+Kurt Kuschinski <hocus@themanaworld.org> Hocus <hocus@themanaworld.org>
+Kurt Kuschinski <hocus@themanaworld.org> Kurt Kuschinski <kurt.kuschinski@gmail.com>
+Saweres <onshine20@gmail.com> root <root@saweres.localdomain>
+Mikko <mikko.devel@gmail.com> Mikko <mikko@debian>
+Ledmitz <ledmitz@gmail.com> Ledmitz <smoothshifter@tuta.io>
+
diff --git a/db/constants.conf b/db/constants.conf
index 76541432..895d575f 100644
--- a/db/constants.conf
+++ b/db/constants.conf
@@ -704,7 +704,7 @@ more than one separator can be used in a row (so 12_3___456 is illegal).
Ele_Holy: 6
Ele_Dark: 7
- // Kept for Compatibility
+ // Kept for Compatibility
Ele_Earth: 2
Ele_Wind: 2 // 4
Ele_Poison: 2 // 5
@@ -4792,9 +4792,9 @@ more than one separator can be used in a row (so 12_3___456 is illegal).
G_OTHER: 3
comment__: "races"
- KaizeiViro: 0
- ArgaesViro: 1
- TonoriViro: 2
+ KaizeiTalpan: 0
+ ArgaesTalpan: 1
+ TonoriTalpan: 2
CaveUkar: 3
MountainUkar: 4
SeaTritan: 5
@@ -4806,7 +4806,7 @@ more than one separator can be used in a row (so 12_3___456 is illegal).
// DEPRECATED: Kept for compatibility
Human: 0
- Viro: 0
+ Talpan: 0
Ukar: 3
Tritan: 5
Raijin: 7
@@ -4971,6 +4971,20 @@ more than one separator can be used in a row (so 12_3___456 is illegal).
NPC_JUKEBOX: 228
NPC_LA_MARINE: 229
NPC_TIKI: 230
+ NPC_GOLBENEZ: 231
+ NPC_REIDCHEF: 232
+ NPC_ARCHIBALD: 233
+ NPC_LEOFWIN: 234
+ NPC_UMFREY: 235
+ NPC_LOVERS: 236
+ NPC_BARBARA: 237
+ NPC_WOLFGANG: 238
+ NPC_BENNET: 239
+ NPC_EDWIN: 240
+ NPC_DARNEL: 241
+ NPC_ESTRILDA: 242
+ NPC_CARETAKER: 243
+ NPC_CARETAKER_WIFE: 244
NPC_CONFUSED_TREE: 400
NPC_ALIGE: 401
@@ -5049,6 +5063,18 @@ more than one separator can be used in a row (so 12_3___456 is illegal).
NPC_MAGE_BLUE: 476
NPC_HAL: 477
NPC_SUMMONING_CIRC: 478
+ NPC_MOUBOOMASTER: 479
+ NPC_UNDEAD_RECPTION: 480
+ NPC_UNDEAD_GUARD: 481
+ NPC_JPMORBID: 482
+ NPC_HAMOND: 483
+ NPC_THURSTAN: 484
+ NPC_SAVARIC: 485
+ NPC_REID: 486
+ NPC_NIGEL: 487
+ NPC_EURNI: 488
+ NPC_CHRONOS: 489
+ NPC_UNDEAD_WEPPER: 490
NPC_TEST1: 800
NPC_PLAYER: 801
@@ -5065,7 +5091,7 @@ more than one separator can be used in a row (so 12_3___456 is illegal).
NPC_DAN_NOTE: 912
NPC_OFFSET_NO_SPRITE: 998
- // Avatars (1000+)
+ // Avatars (1000+)
AVATAR_CARDA: 1000
AVATAR_CARD2: 1001
AVATAR_CARD3: 1002
@@ -5197,10 +5223,10 @@ more than one separator can be used in a row (so 12_3___456 is illegal).
comment__: "Daily Constants"
DAILY_LOWLEVEL: 0
- DAILY_IGNORED: 1
- DAILY_NOPTS: 2
- DAILY_NOITEMS: 3
- DAILY_OK: 4
+ DAILY_IGNORED: 1
+ DAILY_NOPTS: 2
+ DAILY_NOITEMS: 3
+ DAILY_OK: 4
comment__: "Misc settings"
CHEST_WAITTIME: 900 // 15 minutes
@@ -5245,5 +5271,13 @@ more than one separator can be used in a row (so 12_3___456 is illegal).
ROSSY_READY: 1023
ROSSY_BOSSCAVE: 1024
+ comment__: "Kylian Quest Constants"
+ KYLIAN_YANIS: 1
+ KYLIAN_WEELLOS: 2
+ KYLIAN_FIERI: 4
+ KYLIAN_CASINO: 8
+ KYLIAN_HETCHEL: 16
+ KYLIAN_HOCUS: 32
+
@include "conf/import/constants.conf"
}
diff --git a/db/job_db2.txt b/db/job_db2.txt
index cd75322e..955ca6aa 100644
--- a/db/job_db2.txt
+++ b/db/job_db2.txt
@@ -16,11 +16,11 @@
//
// .:: HUMANS ::.
-// Kaizei Viro
+// Kaizei Talpan
0,0,0,0,0,3,0,0,0,0,2,0,0,0,0,1,0,0,0,0,4,0,0,0,0,5,0,0,0,0,6,0,0,0,0,2,0,0,0,0,1,0,0,0,0,5,0,0,0,0,4,0,0,0,0,3,0,0,0,0,2,0,0,0,0,1,0,0,0,0,4,0,0,0,0,5,0,0,0,0,6,0,0,0,0,2,0,0,0,0,1
-// Argaes Viro
+// Argaes Talpan
1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,1,0,0,0,0,4,0,0,0,0,5,0,0,0,0,6,0,0,0,0,2,0,0,0,0,1,0,0,0,0,5,0,0,0,0,4,0,0,0,0,3,0,0,0,0,2,0,0,0,0,1,0,0,0,0,4,0,0,0,0,5,0,0,0,0,6,0,0,0,0,2,0,0,0,0,1
-// Tonori Viro
+// Tonori Talpan
2,0,0,0,0,3,0,0,0,0,2,0,0,0,0,1,0,0,0,0,4,0,0,0,0,5,0,0,0,0,6,0,0,0,0,2,0,0,0,0,1,0,0,0,0,5,0,0,0,0,4,0,0,0,0,3,0,0,0,0,2,0,0,0,0,1,0,0,0,0,4,0,0,0,0,5,0,0,0,0,6,0,0,0,0,2,0,0,0,0,1
diff --git a/db/quest_db.conf b/db/quest_db.conf
index 6a0538f5..ef64fe4b 100644
--- a/db/quest_db.conf
+++ b/db/quest_db.conf
@@ -211,6 +211,10 @@ quest_db: (
Id: 61
Name: "General_CptHal"
},
+{
+ Id: 62
+ Name: "HurnscaldQuest_Bandits"
+},
// Event and General Quests (100~149)
{
@@ -241,7 +245,7 @@ quest_db: (
},
{
Id: 151
- Name: "TonoriQuest_Anwar"
+ Name: "TulimsharQuest_AnwarField"
},
{
Id: 152
@@ -267,6 +271,10 @@ quest_db: (
Id: 157
Name: "TonoriQuest_Hocus"
},
+{
+ Id: 158
+ Name: "TonoriQuest_Joaquim"
+},
// Test Quests, Debug Quests, etc. (1000+)
{
diff --git a/db/re/item_db.conf b/db/re/item_db.conf
index c0e71386..436698ad 100644
--- a/db/re/item_db.conf
+++ b/db/re/item_db.conf
@@ -49,17 +49,17 @@ item_db: (
Slots: Slots (int, defaults to 0)
Job: { (defaults to all job)
All: true/false (boolean, defaults to false)
- Viro: true/false (boolean, defaults to false)
+ KaizeiTalpan: true/false (boolean, defaults to false)
+ ArgaesTalpan: true/false (boolean, defaults to false)
+ TonoriTalpan: true/false (boolean, defaults to false)
CaveUkar: true/false (boolean, defaults to false)
- FireKralog: true/false (boolean, defaults to false)
- LightRaijin: true/false (boolean, defaults to false)
+ MountainUkar: true/false (boolean, defaults to false)
SeaTritan: true/false (boolean, defaults to false)
- FrostKralog: true/false (boolean, defaults to false)
- DarkRaijin: true/false (boolean, defaults to false)
- ArgaesViro: true/false (boolean, defaults to false)
- TonoriViro: true/false (boolean, defaults to false)
LakeTritan: true/false (boolean, defaults to false)
- MountainUkar: true/false (boolean, defaults to false)
+ LightRaijin: true/false (boolean, defaults to false)
+ DarkRaijin: true/false (boolean, defaults to false)
+ FireKralog: true/false (boolean, defaults to false)
+ FrostKralog: true/false (boolean, defaults to false)
}
Job: Job mask (alternate format, int, defaults to all jobs = 0xFFFFFFFF)
Upper: Upper mask (bitmask array, string or int, defaults to "ITEMUPPER_ALL")
@@ -144,22 +144,23 @@ item_db: (
/*
501 699 = Usable Items
700 999 = Generic Items
-1000 1099 = Necklaces
-1100 1299 = Rings
-1300 1799 = Chest Armors
-1800 1999 = Boots
-2000 2199 = Gloves
-2200 2499 = Pants
-2500 2699 = Wings
-2700 2899 = Shields
-2900 3199 = Head Gears
-3200 3499 = Neck Armors
-3500 3999 = Weapons
+1000 1099 = Necklaces (LEVEL ID 6)
+1200 1299 = Charms (LEVEL ID 9)
+1100 1299 = Rings (LEVEL ID 8)
+1300 1799 = Chest Armors (LEVEL ID 1)
+1800 1999 = Boots (LEVEL ID 4)
+2000 2199 = Gloves (LEVEL ID 5)
+2200 2499 = Pants (LEVEL ID 2)
+2500 2699 = Wings (LEVEL ID 7)
+2700 2899 = Shields (LEVEL ID 7)
+2900 3199 = Head Gears (LEVEL ID 3)
+3200 3499 = Neck Armors (LEVEL ID 3)
+3500 3999 = Weapons (LEVEL ID 0)
4000 4999 = Pets
5000 5499 = Cards
5500 5999 = Card Groups (using item_group.conf)
-6000 6999 = Bows
-7000 7999 = Arrows
+6000 6999 = Bows (LEVEL ID 0)
+7000 7999 = Arrows (LEVEL ID 0)
8000 8499 = LEGACY merge items, generic or usable
*/
{
@@ -604,13 +605,14 @@ item_db: (
AegisName: "ElixirOfLife"
Name: "Elixir Of Life"
Type: "IT_HEALING"
- Buy: 5000
- Sell: 500
+ Buy: 50000
+ Sell: 5000
Weight: 20
Delay: 1000
UseEffect: "EFFECT_HEAL"
Script: <"
percentheal 100, 100;
+ sc_end SC_ALL;
">
},
{
@@ -2566,7 +2568,7 @@ item_db: (
Slots: 1
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 6
Refine: false
ViewSprite: 1000
BindOnEquip: false
@@ -2587,7 +2589,7 @@ item_db: (
Slots: 1
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
- EquipLv: 20
+ EquipLv: 46
Refine: false
ViewSprite: 1001
BindOnEquip: false
@@ -2608,7 +2610,7 @@ item_db: (
Slots: 1
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
- EquipLv: 32
+ EquipLv: 76
Refine: false
ViewSprite: 1002
BindOnEquip: false
@@ -2629,7 +2631,7 @@ item_db: (
Slots: 1
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
- EquipLv: 50
+ EquipLv: 96
Refine: false
ViewSprite: 1003
BindOnEquip: false
@@ -2650,7 +2652,7 @@ item_db: (
Slots: 1
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 16
Refine: false
ViewSprite: 1004
BindOnEquip: false
@@ -2671,7 +2673,7 @@ item_db: (
Slots: 2
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
- EquipLv: 25
+ EquipLv: 56
Refine: false
ViewSprite: 1005
BindOnEquip: false
@@ -2692,7 +2694,7 @@ item_db: (
Slots: 3
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
- EquipLv: 40
+ EquipLv: 86
Refine: false
ViewSprite: 1006
BindOnEquip: false
@@ -2713,7 +2715,7 @@ item_db: (
Slots: 4
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
- EquipLv: 60
+ EquipLv: 106
Refine: false
ViewSprite: 1007
BindOnEquip: false
@@ -2734,7 +2736,7 @@ item_db: (
Slots: 0
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 26
Refine: false
ViewSprite: 1008
BindOnEquip: false
@@ -2752,7 +2754,7 @@ item_db: (
Slots: 1
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
- EquipLv: 30
+ EquipLv: 66
Refine: false
ViewSprite: 1009
BindOnEquip: false
@@ -2773,7 +2775,7 @@ item_db: (
Slots: 2
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
- EquipLv: 50
+ EquipLv: 96
Refine: false
ViewSprite: 1010
BindOnEquip: false
@@ -2794,7 +2796,7 @@ item_db: (
Slots: 0
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
- EquipLv: 5
+ EquipLv: 1
Refine: false
ViewSprite: 1011
BindOnEquip: false // TODO: Hearts particle effect.
@@ -2812,7 +2814,7 @@ item_db: (
Slots: 0
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
- EquipLv: 15
+ EquipLv: 36
Refine: false
ViewSprite: 1012
BindOnEquip: false // TODO: Well, what exactly? Transform player into a Mouboo, or even a Moubi?
@@ -2830,7 +2832,7 @@ item_db: (
Slots: 0
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
- EquipLv: 25
+ EquipLv: 46
Refine: false
ViewSprite: 1013
BindOnEquip: false // TODO: Transform player into a skeleton.
@@ -2849,7 +2851,7 @@ item_db: (
Slots: 0
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 8
Refine: false
ViewSprite: 1100
BindOnEquip: false
@@ -2867,7 +2869,7 @@ item_db: (
Slots: 0
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 8
Refine: false
ViewSprite: 1101
BindOnEquip: false
@@ -2885,7 +2887,7 @@ item_db: (
Slots: 0
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 18
Refine: false
ViewSprite: 1102
BindOnEquip: false
@@ -2903,7 +2905,7 @@ item_db: (
Slots: 0
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 18
Refine: false
ViewSprite: 1103
BindOnEquip: false
@@ -2921,7 +2923,7 @@ item_db: (
Slots: 0
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 30
Refine: false
ViewSprite: 1104
BindOnEquip: false
@@ -2939,7 +2941,7 @@ item_db: (
Slots: 1
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 28
Refine: false
ViewSprite: 1105
BindOnEquip: false
@@ -2960,7 +2962,7 @@ item_db: (
Slots: 2
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
- EquipLv: 25
+ EquipLv: 48
Refine: false
ViewSprite: 1106
BindOnEquip: false
@@ -2982,7 +2984,7 @@ item_db: (
Slots: 2
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
- EquipLv: 40
+ EquipLv: 68
Refine: false
ViewSprite: 1107
BindOnEquip: false
@@ -3004,7 +3006,7 @@ item_db: (
Slots: 3
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
- EquipLv: 60
+ EquipLv: 88
Refine: false
ViewSprite: 1108
BindOnEquip: false
@@ -3026,7 +3028,7 @@ item_db: (
Slots: 1
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 38
Refine: false
ViewSprite: 1109
BindOnEquip: false
@@ -3047,7 +3049,7 @@ item_db: (
Slots: 2
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
- EquipLv: 25
+ EquipLv: 58
Refine: false
ViewSprite: 1110
BindOnEquip: false
@@ -3069,7 +3071,7 @@ item_db: (
Slots: 2
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
- EquipLv: 40
+ EquipLv: 78
Refine: false
ViewSprite: 1111
BindOnEquip: false
@@ -3091,7 +3093,7 @@ item_db: (
Slots: 3
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
- EquipLv: 60
+ EquipLv: 98
Refine: false
ViewSprite: 1112
BindOnEquip: false
@@ -3114,7 +3116,7 @@ item_db: (
Slots: 0
Loc: "EQP_ACC_L"
WeaponLv: 0
- EquipLv: 25
+ EquipLv: 59
Refine: false
ViewSprite: 1200
BindOnEquip: false // TODO: Add Buff.
@@ -3132,7 +3134,7 @@ item_db: (
Slots: 0
Loc: "EQP_ACC_L"
WeaponLv: 0
- EquipLv: 20
+ EquipLv: 19
Refine: false
ViewSprite: 1201
BindOnEquip: false
@@ -3153,7 +3155,7 @@ item_db: (
Slots: 0
Loc: "EQP_ACC_L"
WeaponLv: 0
- EquipLv: 45
+ EquipLv: 79
Refine: false
ViewSprite: 1202
BindOnEquip: false // TODO: Add Buff.
@@ -3171,7 +3173,7 @@ item_db: (
Slots: 0
Loc: "EQP_ACC_L"
WeaponLv: 0
- EquipLv: 30
+ EquipLv: 69
Refine: false
ViewSprite: 1203
BindOnEquip: false // TODO: Add Buff.
@@ -3189,7 +3191,7 @@ item_db: (
Slots: 0
Loc: "EQP_ACC_L"
WeaponLv: 0
- EquipLv: 70
+ EquipLv: 99
Refine: false
ViewSprite: 1204
BindOnEquip: false // TODO: Add Buff.
@@ -3207,7 +3209,7 @@ item_db: (
Slots: 0
Loc: "EQP_ACC_L"
WeaponLv: 0
- EquipLv: 50
+ EquipLv: 89
Refine: false
ViewSprite: 1205
BindOnEquip: false // TODO: Add Buff.
@@ -3225,11 +3227,12 @@ item_db: (
Slots: 0
Loc: "EQP_ACC_L"
WeaponLv: 0
- EquipLv: 20
+ EquipLv: 39
Refine: false
ViewSprite: 1206
BindOnEquip: false // TODO: Add Buff.
},
+// TODO: Lv 9 and Lv 29 charms
// Armor
{
Id: 1300
@@ -3351,7 +3354,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_MID"
WeaponLv: 0
- EquipLv: 17
+ EquipLv: 30
Refine: false
ViewSprite: 1306
BindOnEquip: false
@@ -3371,7 +3374,7 @@ item_db: (
Slots: 1
Loc: "EQP_HEAD_MID"
WeaponLv: 0
- EquipLv: 17
+ EquipLv: 10
Refine: false
ViewSprite: 1307
BindOnEquip: false
@@ -3416,7 +3419,7 @@ item_db: (
Slots: 1
Loc: "EQP_HEAD_MID"
WeaponLv: 0
- EquipLv: 35
+ EquipLv: 50
Refine: false
ViewSprite: 1309
BindOnEquip: false
@@ -3441,7 +3444,7 @@ item_db: (
Slots: 1
Loc: "EQP_HEAD_MID"
WeaponLv: 0
- EquipLv: 25
+ EquipLv: 30
Refine: false
ViewSprite: 1310
BindOnEquip: false
@@ -3493,7 +3496,7 @@ item_db: (
Slots: 1
Loc: "EQP_HEAD_MID"
WeaponLv: 0
- EquipLv: 30
+ EquipLv: 20
Refine: false
ViewSprite: 1312
BindOnEquip: false
@@ -3513,7 +3516,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_MID"
WeaponLv: 0
- EquipLv: 60
+ EquipLv: 90
Refine: false
ViewSprite: 1313
BindOnEquip: false
@@ -3530,7 +3533,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_MID"
WeaponLv: 0
- EquipLv: 55
+ EquipLv: 90
Refine: false
ViewSprite: 1314
BindOnEquip: false
@@ -3547,7 +3550,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_MID"
WeaponLv: 0
- EquipLv: 30
+ EquipLv: 40
Refine: false
ViewSprite: 1315
BindOnEquip: false
@@ -3564,7 +3567,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_MID"
WeaponLv: 0
- EquipLv: 70
+ EquipLv: 60
Refine: false
ViewSprite: 1316
BindOnEquip: false
@@ -3581,7 +3584,7 @@ item_db: (
Slots: 1
Loc: "EQP_HEAD_MID"
WeaponLv: 0
- EquipLv: 65
+ EquipLv: 80
Refine: false
ViewSprite: 1317
BindOnEquip: false
@@ -3618,7 +3621,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_MID"
WeaponLv: 0
- EquipLv: 33
+ EquipLv: 50
Refine: false
ViewSprite: 1319
BindOnEquip: false
@@ -3652,7 +3655,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_MID"
WeaponLv: 0
- EquipLv: 65
+ EquipLv: 40
Refine: false
ViewSprite: 1321
BindOnEquip: false
@@ -3669,7 +3672,7 @@ item_db: (
Slots: 1
Loc: "EQP_HEAD_MID"
WeaponLv: 0
- EquipLv: 55
+ EquipLv: 70
Refine: false
ViewSprite: 1322
BindOnEquip: false
@@ -3689,7 +3692,7 @@ item_db: (
Slots: 1
Loc: "EQP_HEAD_MID"
WeaponLv: 0
- EquipLv: 85
+ EquipLv: 80
Refine: false
ViewSprite: 1323
BindOnEquip: false
@@ -3743,7 +3746,7 @@ item_db: (
Type: "IT_ARMOR"
Buy: 12000
Sell: 650
- Weight:75
+ Weight: 75
Def: 4
Slots: 0
Loc: "EQP_SHOES"
@@ -4418,7 +4421,7 @@ item_db: (
Slots: 0
Loc: "EQP_HAND_L"
WeaponLv: 0
- EquipLv: 5
+ EquipLv: 37
Refine: false
ViewSprite: 2700
BindOnEquip: false
@@ -4438,7 +4441,7 @@ item_db: (
Weight: 100
Def: 50
Loc: "EQP_HAND_L"
- EquipLv: 5
+ EquipLv: 7
Refine: false
ViewSprite: 2701
BindOnEquip: false
@@ -4456,7 +4459,7 @@ item_db: (
Weight: 2450
Def: 100
Loc: "EQP_HAND_L"
- EquipLv: 12
+ EquipLv: 27
Refine: false
ViewSprite: 2702
BindOnEquip: false
@@ -4476,7 +4479,7 @@ item_db: (
Matk: -200
Slots: 1
Loc: "EQP_HAND_L"
- EquipLv: 20
+ EquipLv: 47
Refine: false
ViewSprite: 2703
BindOnEquip: false
@@ -4497,7 +4500,7 @@ item_db: (
Weight: 2450
Def: 180
Loc: "EQP_HAND_L"
- EquipLv: 35
+ EquipLv: 57
Refine: false
ViewSprite: 2704
BindOnEquip: false
@@ -4515,7 +4518,7 @@ item_db: (
Weight: 2450
Def: 100
Loc: "EQP_HAND_L"
- EquipLv: 50
+ EquipLv: 67
Refine: false
ViewSprite: 2705
BindOnEquip: false
@@ -4533,7 +4536,7 @@ item_db: (
Weight: 2450
Def: 210
Loc: "EQP_HAND_L"
- EquipLv: 65
+ EquipLv: 77
Refine: false
ViewSprite: 2706
BindOnEquip: false
@@ -4551,10 +4554,13 @@ item_db: (
Weight: 850
Def: 685
Loc: "EQP_HAND_L"
- EquipLv: 12
+ EquipLv: 17
Refine: false
ViewSprite: 2707
BindOnEquip: false
+ OnEquipScript: <"
+ bonus bAtkRange, -1;
+ ">
},
// Headgear
{
@@ -4603,7 +4609,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 4
+ EquipLv: 3
Refine: false
ViewSprite: 2902
BindOnEquip: false
@@ -4673,7 +4679,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 12
+ EquipLv: 30
Refine: false
ViewSprite: 2906
BindOnEquip: false
@@ -4692,7 +4698,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 16
+ EquipLv: 40
Refine: false
ViewSprite: 2907
BindOnEquip: false
@@ -4717,7 +4723,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 24
+ EquipLv: 50
Refine: false
ViewSprite: 2908
BindOnEquip: false
@@ -4810,7 +4816,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 20
Refine: false
ViewSprite: 2913
BindOnEquip: false
@@ -4863,7 +4869,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 20
+ EquipLv: 13
Refine: false
ViewSprite: 2916
BindOnEquip: false
@@ -4901,7 +4907,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 35
+ EquipLv: 33
Refine: false
ViewSprite: 2918
BindOnEquip: false
@@ -4946,7 +4952,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 5
+ EquipLv: 83
Refine: false
ViewSprite: 2920
BindOnEquip: false
@@ -5061,7 +5067,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 80
Refine: false
ViewSprite: 2925
BindOnEquip: false
@@ -5102,7 +5108,7 @@ item_db: (
Slots: 1
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 23
Refine: false
ViewSprite: 2927
BindOnEquip: false
@@ -5124,7 +5130,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 13
Refine: false
ViewSprite: 2928
BindOnEquip: false
@@ -5149,7 +5155,7 @@ item_db: (
Slots: 1
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 23
Refine: false
ViewSprite: 2929
BindOnEquip: false
@@ -5171,7 +5177,7 @@ item_db: (
Slots: 1
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 43
Refine: false
ViewSprite: 2930
BindOnEquip: false
@@ -5193,7 +5199,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 73
Refine: false
ViewSprite: 2931
BindOnEquip: false
@@ -5212,7 +5218,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 53
Refine: false
ViewSprite: 2932
BindOnEquip: false
@@ -5231,7 +5237,7 @@ item_db: (
Slots: 1
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 10
+ EquipLv: 63
Refine: false
ViewSprite: 2933
BindOnEquip: false
@@ -5253,7 +5259,7 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 50
+ EquipLv: 63
Refine: false
ViewSprite: 2934
BindOnEquip: false
@@ -5272,11 +5278,30 @@ item_db: (
Slots: 0
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
- EquipLv: 21
+ EquipLv: 83
Refine: false
ViewSprite: 2935
BindOnEquip: false
},
+{
+ Id: 2936
+ AegisName: "KnightHelmet"
+ Name: "Knight Helmet"
+ Type: "IT_ARMOR"
+ Buy: 15000
+ Sell: 1900
+ Weight: 200
+ Atk: 0
+ Matk: -5
+ Def: 7
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 53
+ Refine: false
+ ViewSprite: 2936
+ BindOnEquip: false
+},
// Scarfs
{
Id: 3200
diff --git a/db/re/job_db.conf b/db/re/job_db.conf
index 58de235f..770da909 100644
--- a/db/re/job_db.conf
+++ b/db/re/job_db.conf
@@ -51,7 +51,7 @@ Job_Name: { // Job names as in src/map/pc.c (they are hardcoded at the moment so
}
*/
//====================================================
-Viro: {
+Talpan: {
BaseExpGroup: "EvolClasses"
JobExpGroup: "EvolClasses"
MoveSpeed: 150
@@ -329,18 +329,18 @@ DarkRaijin: {
Inherit: ( "LightRaijin" ); // Base job from which this job will inherit its max weight, base ASPD set and HP/SP table.
}
-ArgaesViro: {
+ArgaesTalpan: {
BaseExpGroup: "EvolClasses"
JobExpGroup: "EvolClasses"
MoveSpeed: 150
- Inherit: ( "Viro" );
+ Inherit: ( "Talpan" );
}
-TonoriViro: {
+TonoriTalpan: {
BaseExpGroup: "EvolClasses"
JobExpGroup: "EvolClasses"
MoveSpeed: 150
- Inherit: ( "Viro" );
+ Inherit: ( "Talpan" );
}
LakeTritan: {
diff --git a/db/re/skill_db.conf b/db/re/skill_db.conf
index 91a25313..c4fc7ab8 100644
--- a/db/re/skill_db.conf
+++ b/db/re/skill_db.conf
@@ -19474,7 +19474,7 @@ skill_db: (
{
Id: 2023
Name: "GC_DARKILLUSION"
- Description: "Dark Illusion"
+ Description: "Sudden Attack"
MaxLevel: 5
Range: {
Lv1: 5
diff --git a/db/re/skill_tree.conf b/db/re/skill_tree.conf
index 8f26f66c..3ccf91ff 100644
--- a/db/re/skill_tree.conf
+++ b/db/re/skill_tree.conf
@@ -25,7 +25,7 @@ Job_Name: { // Job names as in src/map/pc.c (they are hardcoded at the moment so
*/
//====================================================
-Viro: {
+Talpan: {
skills: {
EVOL_CRAFTING: 0
SM_SWORD: 0
@@ -557,10 +557,10 @@ MountainUkar: {
inherit: ( "CaveUkar" );
}
-ArgaesViro: {
- inherit: ( "Viro" );
+ArgaesTalpan: {
+ inherit: ( "Talpan" );
}
-TonoriViro: {
- inherit: ( "Viro" );
+TonoriTalpan: {
+ inherit: ( "Talpan" );
}
diff --git a/maps/re/020-2-15.mcache b/maps/re/020-2-15.mcache
index 30e94454..7ad6addd 100644
--- a/maps/re/020-2-15.mcache
+++ b/maps/re/020-2-15.mcache
Binary files differ
diff --git a/npc/000-0/sailors.txt b/npc/000-0/sailors.txt
index e95d59eb..fed8d21c 100644
--- a/npc/000-0/sailors.txt
+++ b/npc/000-0/sailors.txt
@@ -4,6 +4,7 @@
// Qwerty Dragon
// Reid
// Vasily_Makarov
+// Jesusalva
// Description:
// Starting script of Evol Online.
@@ -14,7 +15,7 @@ OnTouch:
.@lang = requestlang();
if (.@lang >= 0 && .@lang <= MAX_LANG) Lang = .@lang;
- mesn "Narrator";
+ mesn l("Narrator");
mesc(l("You are on a raft, adrift in the sea."), 9);
next;
mesc(l("With hunger, thirst, and sleep as your only companions, you have the disturbing realization that you can't remember anything of your former life or identity."), 9);
@@ -29,22 +30,22 @@ OnTouch:
next;
setcamnpc "Sailors", -64, -32;
- mesn "Kralog Voice";
+ mesn l("Kralog Voice");
mesq lg("Hey Frenchy!");
next;
setcamnpc "Sailors", 0, -32;
- mesn "Viro Voice";
+ mesn l("Human Voice");
mesq lg("I think he's from the East...");
next;
setcamnpc "Sailors", 144, -80;
- mesn "Tritan Voice";
+ mesn l("Tritan Voice");
mesq lg("What are you guys saying ? It's a Yoiis!");
next;
setcamnpc;
- mesn "Raijin Voice";
+ mesn l("Raijin Voice");
mesq lg("You think she's from the East? As in... Ancea?", "You think he's from the East? As in... Ancea?");
next;
mesq l("Hey you! Can you hear us? Are you okay?");
@@ -74,7 +75,7 @@ OnTouch:
next;
restorecam;
- mesn "Narrator";
+ mesn l("Narrator");
mesc(l("The sailors take you aboard their ship."), 9);
next;
mesc(l("Click on the NPCs (Non-Player Characters) around you to continue the introduction."), 9);
diff --git a/npc/000-1/_import.txt b/npc/000-1/_import.txt
index f103452c..55b14a90 100644
--- a/npc/000-1/_import.txt
+++ b/npc/000-1/_import.txt
@@ -4,6 +4,7 @@
"npc/000-1/_warps.txt",
"npc/000-1/ale.txt",
"npc/000-1/astapolos.txt",
+"npc/000-1/boss.txt",
"npc/000-1/chest.txt",
"npc/000-1/couwan.txt",
"npc/000-1/darlin.txt",
diff --git a/npc/000-1/_mobs.txt b/npc/000-1/_mobs.txt
index 9bd9ea81..4a1f05b5 100644
--- a/npc/000-1/_mobs.txt
+++ b/npc/000-1/_mobs.txt
@@ -10,7 +10,6 @@
000-1,44,75,2,1 monster Little Blub 1007,2,25000,120000
000-1,61,64,7,10 monster Little Blub 1007,2,25000,120000
000-1,62,25,10,4 monster Little Blub 1007,2,25000,120000
-000-1,87,69,4,3 monster Blub 1008,1,60000,120000
000-1,85,33,2,3 monster Little Blub 1007,1,25000,120000
000-1,85,58,14,9 monster Little Blub 1007,2,35000,120000
000-1,48,61,9,6 monster Little Blub 1007,1,35000,120000
diff --git a/npc/000-1/boss.txt b/npc/000-1/boss.txt
new file mode 100644
index 00000000..1b2f4449
--- /dev/null
+++ b/npc/000-1/boss.txt
@@ -0,0 +1,43 @@
+// The Mana World Script
+// Author:
+// Jesusalva
+// Description:
+// Controls the boss on 000-1 and the Master Book Learning
+// see npc/items/master_skillbook.txt for explanation about variables
+
+000-1,0,0,0 script #BossCtrl_000-1 NPC_HIDDEN,{
+ end;
+
+// Test server: 15 minutes only
+OnTimer900000:
+ if (!debug)
+ end;
+
+// Otherwise, respawn every hour
+OnTimer3600000:
+ stopnpctimer;
+OnInit:
+ $@MB_0001=0;
+ monster "000-1", 87, 69, strmobinfo(1, Blub), Blub, 1, "#BossCtrl_000-1::OnBossDeath";
+ end;
+
+OnBossDeath:
+ initnpctimer;
+ BossSlain(.name$, "$@MB_0001");
+ end;
+
+OnBossCheck:
+ @mb_BossId=-1;
+ // TODO: Check if you really fought or was just lurking
+ // Check if party is correct
+ if (getcharid(1) != $@MB_0001)
+ end;
+OnBegin:
+ @mb_BossId=Blub;
+ @mb_SkillId=false;
+ @mb_ItemId=MagicFeather; // Placeholder
+ @mb_ItemAm=1;
+ addtimer(15000, "#MasterBook::OnUnset");
+ end;
+
+}
diff --git a/npc/000-2-0/julia.txt b/npc/000-2-0/julia.txt
index 0e95fdd9..3fb19179 100644
--- a/npc/000-2-0/julia.txt
+++ b/npc/000-2-0/julia.txt
@@ -151,37 +151,10 @@
mesn;
mesq l("Ok, done.");
- if (getq(ShipQuests_Julia) == 2)
- {
- next;
- mesq l("Do you have any other questions for me?");
- next;
- ynMenu;
- return;
- }
-
- next;
- mesq l("I'm sure that you've got some questions for me, feel free to ask them, but first I need to tell you the rules of proper social conduct on board.");
-
- mesq l("Here they are.");
- next;
-
- narrator S_LAST_NEXT,
- l("There is a paper with some rules written on it.");
-
- GameRules 8 | 4;
-
- mesn;
- mesq l("Oh, and I almost forgot! Do not give the password of your room to anybody! I am the only one who has the other key and I won't ask for yours so keep it secret and try not to use the same password for any other room in the future.");
- next;
- mesq l("If you want to read this page again, there is a copy up on the left wall.");
next;
- mesq l("You can also read The Book of Laws at any time to see the rules.");
- next;
- mesq l("I think I'm done with that now. Do you have any questions?");
+ mesq l("Do you have any other questions for me?");
next;
-
- setq ShipQuests_Julia, 2;
+ ynMenu;
return;
}
@@ -289,9 +262,24 @@ OnTouch:
next;
mesq lg("I'm glad to see you're okay.");
next;
- mesq lg("Could I ask you what your native language is? A sailor told me you're from Ancea, but another one told me you're from Aemil because of the logo that... never mind. I'm a bit lost, if you could tell me what language you speak I will register you on the ship passenger list just after that.");
+
+ mesq l("I'm sure that you've got some questions for me, feel free to ask them, but first I need to tell you the rules of proper social conduct on board.");
+
+ narrator S_LAST_NEXT,
+ l("There is a paper with some rules written on it.");
+
+ GameRules 8 | 4;
+
+ mesn;
+ mesq l("Oh, and I almost forgot! Do not give the password of your room to anybody! I am the only one who has the other key and I won't ask for yours so keep it secret and try not to use the same password for any other room in the future.");
+ next;
+ mesq l("If you want to read this page again, there is a copy up on the left wall.");
+ next;
+ mesq l("You can also read The Book of Laws at any time to see the rules.");
+ setq ShipQuests_Julia, 2;
+ next;
+ mesq l("I think I'm done with that now. Do you have any questions?");
next;
- chooseLang;
mainMenu;
end;
diff --git a/npc/001-1/chelios.txt b/npc/001-1/chelios.txt
index 1f2945fc..47c0ea26 100644
--- a/npc/001-1/chelios.txt
+++ b/npc/001-1/chelios.txt
@@ -1,6 +1,7 @@
// Evol scripts.
// Author:
// Reid
+// Jesusalva
// Description:
// Blacksmith's assistant of Artis
// Variables:
@@ -13,68 +14,11 @@
// 4 BlackSmith gave the sword.
001-1,95,109,0 script Chelios NPC_CHELIOS,{
-
- function give_small_quest {
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("Her sword... I'm having some trouble finishing it."),
- l("You see, Enora asked me to do a black iron sword, unfortunately I ran out of the material needed, and..."),
- l("Only Don and the Merchant Guild have that kind of material in stock. It's called black iron."),
- l("It's better to deal with the Merchant Guild than the old man, Don has this ability to hammer down your enthusiasm in sparkling fury!"),
- l("If Enora wants her sword now, I need to ask for your help.");
-
- switch (select(l("Let's not keep her waiting."),
- l("Not now.")))
- {
- case 1:
- break;
- case 2:
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- lg("I'll be here, come back when you'll be ready.");
-
- return;
- }
-
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("Thank you very much!"),
- l("Talk with Lloyd the Banker in the Merchant Guild, it's a big building in the northern side of Artis, at the top of the small hill.");
-
- setq ArtisQuests_Enora, 2;
-
- return;
- }
-
- function more_info {
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("It's the big building in northern Artis, at the top of a small hill."),
- l("Take the east road that goes to the north and follow it until you are on top of the cliff."),
- l("That part of the town is called the Gilded Hill, it's also where the Merchant Guild has its headquarters."), //rich hill
- l("Lloyd still owes me, but beware of those money-grabbers, or they might sell your own teeth to you!");
-
- return;
- }
-
- function quest_completed {
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("Oh... Awesome!"),
- l("You were gone so I thought you let me down."),
- l("Don gave me some black iron... after I asked him nearly ten times."),
- l("But thank you anyway! I can refund him now!"),
- l("Take the sword, and say hi to Enora for me!");
-
- setq ArtisQuests_Enora, 4;
-
- return;
- }
-
- function blacksmith_house{
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("Behind me? It's the Blacksmith House, the most renowned throughout Aemil."),
- l("There are two shops inside, they are independent from the Merchant Guild of Artis."),
- l("Now that I think about it, they are the only shops that are independent in Artis..."),
- l("...it might be because of Don... he is the master blacksmith of this place and a model to me!");
-
- return;
- }
+ function give_small_quest;
+ function more_info;
+ function quest_completed;
+ function blacksmith_house;
+ function explain_weapons;
speech S_LAST_NEXT, l("Can I be of any help?");
@@ -86,6 +30,7 @@
rif(.@enora == 3, l("I have your black iron.")),
rif(.@enora >= 2, l("Where is the Merchant Guild?")),
l("What is this building?"),
+ l("Why some of my weapons have a plus sign near them?"),
menuaction(l("Quit"));
switch (@menu)
@@ -109,9 +54,83 @@
goodbye;
close;
+
+function give_small_quest {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Her sword... I'm having some trouble finishing it."),
+ l("You see, Enora asked me to do a black iron sword, unfortunately I ran out of the material needed, and..."),
+ l("Only Don and the Merchant Guild have that kind of material in stock. It's called black iron."),
+ l("It's better to deal with the Merchant Guild than the old man, Don has this ability to hammer down your enthusiasm in sparkling fury!"),
+ l("If Enora wants her sword now, I need to ask for your help.");
+
+ switch (select(l("Let's not keep her waiting."),
+ l("Not now.")))
+ {
+ case 1:
+ break;
+ case 2:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ lg("I'll be here, come back when you'll be ready.");
+
+ return;
+ }
+
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Thank you very much!"),
+ l("Talk with Lloyd the Banker in the Merchant Guild, it's a big building in the northern side of Artis, at the top of the small hill.");
+
+ setq ArtisQuests_Enora, 2;
+
+ return;
+}
+
+function more_info {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("It's the big building in northern Artis, at the top of a small hill."),
+ l("Take the east road that goes to the north and follow it until you are on top of the cliff."),
+ l("That part of the town is called the Gilded Hill, it's also where the Merchant Guild has its headquarters."), //rich hill
+ l("Lloyd still owes me, but beware of those money-grabbers, or they might sell your own teeth to you!");
+
+ return;
+}
+
+function quest_completed {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Oh... Awesome!"),
+ l("You were gone so I thought you let me down."),
+ l("Don gave me some black iron... after I asked him nearly ten times."),
+ l("But thank you anyway! I can refund him now!"),
+ l("Take the sword, and say hi to Enora for me!");
+
+ setq ArtisQuests_Enora, 4;
+
+ return;
+}
+
+function blacksmith_house {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Behind me? It's the Blacksmith House, the most renowned throughout Aemil."),
+ l("There are two shops inside, they are independent from the Merchant Guild of Artis."),
+ l("Now that I think about it, they are the only shops that are independent in Artis..."),
+ l("...it might be because of Don... he is the master blacksmith of this place and a model to me!");
+
+ return;
+}
+
+function explain_weapons {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Weapons do not level up. But the more you use them, the more used to them you become."),
+ l("As you start to wield them better, you will be able to draw better their full potential."),
+ l("Your proeficiency with a certain weapon is noted at the side of it. Naturally, you cannot obtain proeficiency by purchasing someone else's weapon.");
+ mesn;
+ speech S_LAST_NEXT,
+ l("By the way, I'll explain you how crafting works when I become less lazy.");
+ return;
+}
+
OnInit:
.bodytype = BODYTYPE_3;
- .distance = 3;
+ .distance = 4;
end;
}
diff --git a/npc/001-1/enora.txt b/npc/001-1/enora.txt
index 73e81422..822cea2a 100644
--- a/npc/001-1/enora.txt
+++ b/npc/001-1/enora.txt
@@ -122,8 +122,8 @@
.@exp_reward = getarg(0);
.@zeny_reward = getarg(1);
- getexp .@exp_reward, 0;
- Zeny += .@zeny_reward;
+ quest_xp(.maxLevel, .@exp_reward);
+ quest_gp(.maxLevel, .@zeny_reward);
narrator S_LAST_NEXT,
l("You received @@ EXP and @@ E.", .@exp_reward, .@zeny_reward);
@@ -445,6 +445,7 @@
OnInit:
.bodytype = BODYTYPE_2;
.distance = 5;
+ .maxLevel = 20;
end;
}
diff --git a/npc/001-1/shop.txt b/npc/001-1/shop.txt
index 59dd8cd7..1bc028d4 100644
--- a/npc/001-1/shop.txt
+++ b/npc/001-1/shop.txt
@@ -242,7 +242,7 @@ OnInit:
sellitem ClothoLiquor, -1, 50;
sellitem LachesisBrew, -1, 30;
sellitem AtroposMixture, -1, 10;
- sellitem ElixirOfLife, -1, 2;
+ sellitem ElixirOfLife, -1, 1;
.bodytype = BODYTYPE_1;
.distance = 4;
diff --git a/npc/001-1/wateranimation.txt b/npc/001-1/wateranimation.txt
index 1a11a90e..eb9acc9d 100644
--- a/npc/001-1/wateranimation.txt
+++ b/npc/001-1/wateranimation.txt
@@ -5,29 +5,19 @@
// Description:
// Water animations, splash, fishes, etc...
-001-1,116,123,0 script #water_animation0 NPC_WATER_SPLASH,{
-
- fishing; // begin or continue fishing
- close;
-
-OnInit:
- .bodytype = BODYTYPE_1;
- .distance = 5;
- end;
-}
-
-001-1,119,102,0 duplicate(#water_animation0) #water_animation1 NPC_WATER_SPLASH
-001-1,167,82,0 duplicate(#water_animation0) #water_animation2 NPC_WATER_SPLASH
-001-1,167,40,0 duplicate(#water_animation0) #water_animation3 NPC_WATER_SPLASH
-001-1,104,127,0 duplicate(#water_animation0) #water_animation4 NPC_WATER_SPLASH
-001-1,166,123,0 duplicate(#water_animation0) #water_animation5 NPC_WATER_SPLASH
-001-1,181,119,0 duplicate(#water_animation0) #water_animation6 NPC_WATER_SPLASH
-001-1,202,114,0 duplicate(#water_animation0) #water_animation7 NPC_WATER_SPLASH
-001-1,187,86,0 duplicate(#water_animation0) #water_animation8 NPC_WATER_SPLASH
-001-1,32,57,0 duplicate(#water_animation0) #water_animation9 NPC_WATER_SPLASH
-001-1,40,144,0 duplicate(#water_animation0) #water_animation10 NPC_WATER_SPLASH
-001-1,58,131,0 duplicate(#water_animation0) #water_animation11 NPC_WATER_SPLASH
-001-1,76,137,0 duplicate(#water_animation0) #water_animation12 NPC_WATER_SPLASH
-001-1,109,132,0 duplicate(#water_animation0) #water_animation13 NPC_WATER_SPLASH
-001-1,141,93,0 duplicate(#water_animation0) #water_animation14 NPC_WATER_SPLASH
-001-1,168,57,0 duplicate(#water_animation0) #water_animation15 NPC_WATER_SPLASH
+001-1,116,123,0 duplicate(#fish_basic) #water_animation0 NPC_WATER_SPLASH
+001-1,119,102,0 duplicate(#fish_basic) #water_animation1 NPC_WATER_SPLASH
+001-1,167,82,0 duplicate(#fish_basic) #water_animation2 NPC_WATER_SPLASH
+001-1,167,40,0 duplicate(#fish_basic) #water_animation3 NPC_WATER_SPLASH
+001-1,104,127,0 duplicate(#fish_basic) #water_animation4 NPC_WATER_SPLASH
+001-1,166,123,0 duplicate(#fish_basic) #water_animation5 NPC_WATER_SPLASH
+001-1,181,119,0 duplicate(#fish_basic) #water_animation6 NPC_WATER_SPLASH
+001-1,202,114,0 duplicate(#fish_basic) #water_animation7 NPC_WATER_SPLASH
+001-1,187,86,0 duplicate(#fish_basic) #water_animation8 NPC_WATER_SPLASH
+001-1,32,57,0 duplicate(#fish_basic) #water_animation9 NPC_WATER_SPLASH
+001-1,40,144,0 duplicate(#fish_basic) #water_animation10 NPC_WATER_SPLASH
+001-1,58,131,0 duplicate(#fish_basic) #water_animation11 NPC_WATER_SPLASH
+001-1,76,137,0 duplicate(#fish_basic) #water_animation12 NPC_WATER_SPLASH
+001-1,109,132,0 duplicate(#fish_basic) #water_animation13 NPC_WATER_SPLASH
+001-1,141,93,0 duplicate(#fish_basic) #water_animation14 NPC_WATER_SPLASH
+001-1,168,57,0 duplicate(#fish_basic) #water_animation15 NPC_WATER_SPLASH
diff --git a/npc/001-2-2/moon.txt b/npc/001-2-2/moon.txt
index e0e42e4b..b0bd93d2 100644
--- a/npc/001-2-2/moon.txt
+++ b/npc/001-2-2/moon.txt
@@ -54,7 +54,8 @@
next;
mesq l("Here is your reward.");
setq ArtisQuests_Urchin, 2;
- getexp 1500, 100;
+ quest_xp(.maxLevel, 1500);
+ quest_jxp(.maxLevel, 100);
close2;
return 1;
}
@@ -203,6 +204,7 @@ OnHour00:
OnInit:
.bodytype = BODYTYPE_2;
.distance = 3;
+ .maxLevel = getmonsterinfo(Croc, MOB_LV) + 10;
initpath "move", 41, 30,
"dir", DOWN, 0,
"wait", 2, 0,
diff --git a/npc/001-2-27/don.txt b/npc/001-2-27/don.txt
index a35b9317..468111b9 100644
--- a/npc/001-2-27/don.txt
+++ b/npc/001-2-27/don.txt
@@ -1,63 +1,15 @@
// Evol scripts.
// Author:
// Reid
+// Jesusalva
// Description:
// Don the blacksmith of Artis
001-2-27,35,29,0 script Don#001-2-27 NPC_HUMAN_MALE_OLD,{
-
- function improve_equipment {
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("Different ways, each part of your equipment can be generally upgraded."),
- l("You have a level for each of your gear, by default when you buy or craft a piece, the level is set to 1."),
- l("You can also improve your equipment in a totally different way with the use of cards.");
- return;
- }
-
- function card_explanation {
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("There are two different kinds of cards, the first changes the style of your clothes, the second changes their stats."),
- l("I am not an expert of the first kind, but I know what I am talking about when it comes to improving equipment."),
- l("A stat card works on different pieces of equipment."),
- l("Each piece of equipment has a predefined slot number."),
- l("Each card improves your gear by a ratio or a fixed number on a predefined stat."),
- l("Like, a defensive mythril card can be used on any mythril equipment, and it will improve the defense by 5% of the latter."),
- l("You just have to select the card, then you choose which piece of equipment you want to use it on, and you are done.");
- return;
- }
-
- function take_apprentice {
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("I do not.");
- emotion E_UPSET;
-
- select(l("What about Chelios?"));
-
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("Chelios was stubborn in his youth, he never stopped annoying me with his questions while I was working at the forge."),
- l("He did not change while growing up, I repeatedly asked him to leave the forge but in the end he installed himself in front of it..."),
- l("He is mature and he rarely ask questions so I am fine. I can not stand the sight of a whiner anyway.");
- return;
- }
-
- function good_blacksmith {
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("I do not like to brag about it but you won't find a better blacksmith on the whole island."),
- l("If you need somebody to craft a weapon or a plate from diagrams I am the one that you need.");
-
- switch (select(l("Can I craft them myself?"),
- l("Ok.")))
- {
- case 1:
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("You can try, but your chance of success is lesser than a well trained smith and master craftsman.");
- break;
- case 2:
- break;
- }
-
- return;
- }
+ function improve_equipment;
+ function card_explanation;
+ function take_apprentice;
+ function good_blacksmith;
speech S_LAST_NEXT,
lg("Hi, what do you want kiddo?");
@@ -71,16 +23,16 @@
l("Nothing.")))
{
case 1:
- improve_equipment;
+ improve_equipment();
break;
case 2:
- card_explanation;
+ card_explanation();
break;
case 3:
- good_blacksmith;
+ good_blacksmith();
break;
case 4:
- take_apprentice;
+ take_apprentice();
break;
case 5:
break;
@@ -90,9 +42,72 @@
goodbye;
close;
+function improve_equipment {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Different ways, each part of your equipment can be generally upgraded."),
+ l("You rarely use the full potential of your equipment. As they say, a master weapon in a noob's hands is a noob weapon with wasted potential. But the more you use them, the better you can harness this power."),
+ l("Power obtained from proficiency will be noted down near the equipment name. There may be illegal ways to raise proficiency without hard work. But things obtained without hard work are not worth it."),
+ l("You can also improve your equipment in a totally different way with the use of cards."),
+ l("By last, a master craftsman can make equipment much better than a less skilled one. Equipment made by measure are much better than those bought at shops as well.");
+ return;
+}
+
+function card_explanation {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("There are two different kinds of cards, the first changes the style of your clothes, the second changes their stats."),
+ l("I am not an expert of the first kind, but I know what I am talking about when it comes to improving equipment."),
+ l("A stat card works on different pieces of equipment."),
+ l("Each piece of equipment has a predefined slot number."),
+ l("Each card improves your gear by a ratio or a fixed number on a predefined stat."),
+ l("Like, a defensive mythril card can be used on any mythril equipment, and it will improve the defense by 5% of the latter."),
+ l("You just have to select the card, then you choose which piece of equipment you want to use it on, and you are done."),
+ l("I am also aware that you can slot runestones and even gemstones to equipment as well. Some of them have magic properties.");
+ return;
+}
+
+function take_apprentice {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("I do not.");
+
+ emotion E_UPSET;
+
+ select(l("What about Chelios?"));
+
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Chelios was stubborn in his youth, he never stopped annoying me with his questions while I was working at the forge."),
+ l("He did not change while growing up, I repeatedly asked him to leave the forge but in the end he installed himself in front of it..."),
+ l("He is mature and he rarely ask questions so I am fine. I can not stand the sight of a whiner anyway.");
+ return;
+}
+
+function good_blacksmith {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("I do not like to brag about it but you won't find a better blacksmith on the whole island."),
+ l("If you need somebody to craft a weapon or a plate from diagrams I am the one that you need.");
+
+ switch (select(l("Can I craft them myself?"),
+ l("Ok.")))
+ {
+ case 1:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("You can try if you know the recipe, but your chance of success is lesser than a well trained smith and master craftsman.");
+ .@s = SmithSystem(CRAFT_SMITHERY);
+ if (.@s)
+ mesc l("Success!"), 3;
+ else
+ mesc l("That didn't work!"), 1;
+ next;
+ break;
+ case 2:
+ break;
+ }
+
+ return;
+}
+
OnInit:
.bodytype = BODYTYPE_3;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/001-2-27/kaylo.txt b/npc/001-2-27/kaylo.txt
index bead9ed8..355e6ca2 100644
--- a/npc/001-2-27/kaylo.txt
+++ b/npc/001-2-27/kaylo.txt
@@ -4,7 +4,7 @@
// Description:
// Kaylo is the Shield seller in Don's Blacksmith house on Artis.
-001-2-27,27,28,0 script Kaylo#001-2-27 NPC_KAYLO,{
+001-2-27,27,28,0 script Kaylo NPC_KAYLO,{
speech S_LAST_NEXT,
lg("Hi customer! What do you want today?");
diff --git a/npc/001-2-27/lydon.txt b/npc/001-2-27/lydon.txt
index 09bf503a..6be39671 100644
--- a/npc/001-2-27/lydon.txt
+++ b/npc/001-2-27/lydon.txt
@@ -4,7 +4,7 @@
// Description:
// Lydon is the Weapon seller in Don's Blacksmith house on Artis.
-001-2-27,43,28,0 script Lydon#001-2-27 NPC_LYDON,{
+001-2-27,43,28,0 script Lydon NPC_LYDON,{
speech S_LAST_NEXT,
lg("Hi customer! What do you want today?");
diff --git a/npc/001-2-40/_import.txt b/npc/001-2-40/_import.txt
index a7c7abb8..c8363c34 100644
--- a/npc/001-2-40/_import.txt
+++ b/npc/001-2-40/_import.txt
@@ -1,4 +1,4 @@
-// Map 001-2-40: unnamed
+// Map 001-2-40: Legion Basement
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/001-2-40/_warps.txt",
"npc/001-2-40/mapflags.txt",
diff --git a/npc/001-2-40/_warps.txt b/npc/001-2-40/_warps.txt
index ab895c3a..6a2994d5 100644
--- a/npc/001-2-40/_warps.txt
+++ b/npc/001-2-40/_warps.txt
@@ -1,5 +1,5 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
-// Map 001-2-40: unnamed warps
+// Map 001-2-40: Legion Basement warps
001-2-40,45,44,0 warp #001-2-40_45_44 2,0,001-2-33,43,39
001-2-40,27,44,0 warp #001-2-40_27_44 2,0,001-2-33,25,39
001-2-40,56,41,0 warp #001-2-40_56_41 0,0,001-3-0,56,44
diff --git a/npc/001-2-41/edouard.txt b/npc/001-2-41/edouard.txt
index abb764b7..0e11a53c 100644
--- a/npc/001-2-41/edouard.txt
+++ b/npc/001-2-41/edouard.txt
@@ -11,15 +11,15 @@ function script EdouardCheckChair {
if ((.@map$ != getarg(0)) || (.@x != getarg(1)) || (.@y != getarg(2)))
{
- doevent "Edouard#001-2-41::OnWrongPlace";
+ doevent "Edouard::OnWrongPlace";
}
else if (!issit())
{
- doevent "Edouard#001-2-41::OnNotSit";
+ doevent "Edouard::OnNotSit";
}
else
{
- doevent "Edouard#001-2-41::OnChair";
+ doevent "Edouard::OnChair";
}
close;
@@ -85,7 +85,7 @@ OnInit:
end;
}
-001-2-41,30,29,0 script Edouard#001-2-41 NPC_EDOUARD,{
+001-2-41,30,29,0 script Edouard NPC_EDOUARD,{
function tellStory;
//EdouardCheckChair();
if (!issit())
@@ -144,7 +144,7 @@ OnChair:
switch (@menu)
{
case 1:
- BarberSayStyle 3;
+ BarberSayStyle();
break;
case 2:
BarberChangeStyle;
diff --git a/npc/001-2-6/books.txt b/npc/001-2-6/books.txt
index f8eb231b..ea5868c9 100644
--- a/npc/001-2-6/books.txt
+++ b/npc/001-2-6/books.txt
@@ -151,7 +151,7 @@ OnInit:
narrator(S_FIRST_BLANK_LINE,
l("Aemil was once a magnificent land unknown to us all."),
l("Before the end of the Mana War, a band of adventurers formed in the Ancean region of Argaes from those who had lost their homes and families."),
- l("They sailed from Hurnscald to Tulimshar and then Nivalis, the last permanent settlements of viros."),
+ l("They sailed from Hurnscald to Tulimshar and then Nivalis, the last permanent settlements of talpans."),
l("There, they gathered merchants and warriors to join them in a journey to find a new land on which to live."),
l("The group found the support of Tulimshar's merchant lords and was given ships to sail east."),
l("They sailed past the Clear Sea and towards the Long Ocean which nobody had explored before."),
@@ -218,10 +218,10 @@ OnInit:
l("World Story For Dummies, Vol I - Ancean Era: From Keshlam to an Empire"),
l("The collection of four books entitled “World Story For Dummies” is based on the uncessable work from the Ukar scholars, thanks to whom this wouldn't be possible."),
l("The “Ancean Era” is a term used to defined the time period between the beginning of recorded history and the events at the Mana Tree, and thanks to Ukar scholars, this is widely accepted as year 1 on all Gasaron."),
- l("The first viro settlement to develop an advanced political structure and to become a city-state was Keshlam."),
+ l("The first talpan settlement to develop an advanced political structure and to become a city-state was Keshlam."),
l("Keshlam expanded rapidly under the rule of King Janeb the Founder, and soon annexed the whole Ancea continent - excluding solely the Land Of Fire - to its domains, creating the Platinum Kingdom."),
l("Three cities developed on the eastern side of Ancea: Tulimshar, Hurnscald and Nivalis."),
- l("The Platinum Kingdom grew and prospered, and drew most of the viro population to the safety of the walls of Keshlam, Tulimshar, Hurnscald and Nivalis."),
+ l("The Platinum Kingdom grew and prospered, and drew most of the talpan population to the safety of the walls of Keshlam, Tulimshar, Hurnscald and Nivalis."),
l("-- Continues on Volume II --"));
}
@@ -252,7 +252,7 @@ OnInit:
l("World Story For Dummies, Vol II - Ancean Era: Revolutions and Independence"),
l("On the year 206CCE, after a long crisis of succession, a minor noble only known as Queen Platyna the Red came to inherit the Platinum Crown."),
l("Due to neglect with day-to-day administration, which she delegated to her council, and uncontrolled expenses, the kingdom faced its first economic crisis."),
- l("With the growth of the Kingdom halted, slow maintenance, and two great famines which killed over half the viro population, the council decided to seize power and depose Platyna the Red."),
+ l("With the growth of the Kingdom halted, slow maintenance, and two great famines which killed over half the talpan population, the council decided to seize power and depose Platyna the Red."),
l("On March 213CCE, Chancellor Benjamin Frost, with support of the council, proclaimed the Republic of Ancea. This event would become known as the Blue Revolution."),
l("Frost held the title of Lord Prince of the Republic for eighteen months, when the council deposed him and declared itself head of the state."),
l("The Republic of Ancea ceased to exist officially in August 216CCE, when the cities of Tulimshar, Hurnscald and Nivalis installed their own independent governments."),
@@ -287,15 +287,15 @@ OnInit:
narrator(S_FIRST_BLANK_LINE | S_NO_NPC_NAME,
l("World Story For Dummies, Vol III - Aemilean Era: The Mana Tree and The Mana War"),
l("Aemilean Era. Tulimshar, Hurnscald and Nivalis held power of their surrounding lands, except for the Land Of Fire and Keshlam City."),
- l("All races were in peace until the Viros set forth to discover the Source of Magic, based on Ukar scholars studies."),
+ l("All races were in peace until the talpans set forth to discover the Source of Magic, based on Ukar scholars studies."),
l("Free Mana travels in many directions, and this search took several years before the expedition finally found the right direction to follow."),
l("A large tree was found in a deep cave underneath the island of Candor. Despise the darkness of the cave and absence of leaves, the tree grew strong. It gave light off itself and its energy empowered the wizards."),
l("The tree was entitled The Mana Tree, and the Wizard Order took control over Candor Island. They learnt to control the mana flow, and limited its use, claiming Magic to be too dangerous for public use."),
l("This action was met with widespread opposition from all races, and a war broke. The tritans led the offensive, in attempts to keep the tree untouched and mana available for all."),
- l("Unable to win, the tritans attacked Hurnscald. While viro troops moved in attempts to avoid its fall, the Kralog and Ukar joined the tritans and they took the city."),
+ l("Unable to win, the tritans attacked Hurnscald. While talpan troops moved in attempts to avoid its fall, the Kralog and Ukar joined the tritans and they took the city."),
l("The next and final battle happened at Candor. Wizards attacks from both sides near the Mana Tree provoked a Mana Storm. A Great Quake shook the earth of Ancea and the land began to split. Geography changed, and Keshlan vanished from the map."),
l("The Mana Tree was lost, the caves entrances destroyed, and the Wizard Order was split in two: One part was on Candor, and other at the Magic Tower."),
- l("After this war, the Raijin race was born. A race born of Magic. Viros encapsulated in a Mana storm and altered forever."),
+ l("After this war, the Raijin race was born. A race born of Magic. Talpans encapsulated in a Mana storm and altered forever."),
l("-- Continues on Volume IV --"));
}
@@ -325,7 +325,7 @@ OnInit:
narrator(S_FIRST_BLANK_LINE | S_NO_NPC_NAME,
l("World Story For Dummies, Vol IV - Aemilean Era: The Fleet of Ancea"),
l("After the Mana War, the Ancea continent was mostly destroyed. It would take years to nature start repairing the damage of the event."),
- l("A band of adventurers formed in Argaes from those who had lost their homes and families. They visited the three permanent viro settlements: Tulimshar, Hurnscald and Nivalis."),
+ l("A band of adventurers formed in Argaes from those who had lost their homes and families. They visited the three permanent talpan settlements: Tulimshar, Hurnscald and Nivalis."),
l("They gathered merchants and warriors to join them in a journey to find new lands to live in. Tulimshar's merchant lords gave them ships to sail east."),
l("The newly created Fleet of Ancea travelled so far that they were never heard from again. They found a continent, present on legends of explorers who never came back."),
l("They named this continent as Aemil, in honour of one of such explorers. The area they docked in was called Aurora, after its beautiful sunrise."),
diff --git a/npc/001-3-2/henry.txt b/npc/001-3-2/henry.txt
index f405907e..7a34357f 100644
--- a/npc/001-3-2/henry.txt
+++ b/npc/001-3-2/henry.txt
@@ -129,7 +129,8 @@ function reportFirstQuest {
mesn;
mesq l("Anyway, here's some gold. I might have another task for you if you want.");
// Reward Reference: Lv 10
- getexp 30*BaseLevel, 30;
+ quest_xp(.maxLevel_1, 30, BaseLevel);
+ quest_jxp(.maxLevel_1, 30);
Zeny+=300;
setq ThiefQuests_Artis, 3;
// Previous state already wiped this:
@@ -214,6 +215,7 @@ function reportSecondQuest {
// Obtain the map, quest is done
inventoryplace TreasureMap, 1;
getitem TreasureMap, 1;
+ quest_jxp(.maxLevel_2, 100);
setq1 ThiefQuests_Artis, 6;
// Override the treasure location, if already existing
@@ -329,7 +331,7 @@ function reportThirdQuest {
next;
mesn;
mesq l("I have other matters to attend do, so you'll have to excuse me.");
- getitem Lockpicks, 5;
+ quest_item(.maxLevel_3, Lockpicks, 5);
setq1 ThiefQuests_Artis, 9;
break;
}
@@ -348,6 +350,9 @@ function completedHenry {
OnInit:
.bodytype = BODYTYPE_3;
.distance = 3;
+ .maxLevel_1 = 15;
+ .maxLevel_2 = 25;
+ .maxLevel_3 = 35;
end;
OnGiantMaggot:
diff --git a/npc/008-1/_import.txt b/npc/008-1/_import.txt
index d7cdcec4..d09f8c88 100644
--- a/npc/008-1/_import.txt
+++ b/npc/008-1/_import.txt
@@ -20,10 +20,10 @@
"npc/008-1/oscar.txt",
"npc/008-1/rossy.txt",
"npc/008-1/sabine.txt",
+"npc/008-1/sergeant-ryan.txt",
"npc/008-1/shop.txt",
"npc/008-1/sign.txt",
"npc/008-1/snarfles.txt",
"npc/008-1/soul-menhir.txt",
"npc/008-1/voltain.txt",
"npc/008-1/wateranimation.txt",
-"npc/008-1/sergeant-ryan.txt",
diff --git a/npc/008-1/hinnak.txt b/npc/008-1/hinnak.txt
index 31343728..0f973acc 100644
--- a/npc/008-1/hinnak.txt
+++ b/npc/008-1/hinnak.txt
@@ -125,7 +125,7 @@
{
delitem .monster_drop, .drop_count;
getitem .reward_item, 1;
- Zeny += .reward_money;
+ quest_gp(.maxLevel, .reward_money);
//getexp .reward_exp, 0;
setq .quest, 3;
}
@@ -325,6 +325,7 @@ OnPCBaseLvUpEvent:
OnInit:
.min_level = 15; // min level to do the quest
+ .maxLevel = getiteminfo(Scythe, ITEMINFO_ELV) + 20;
.monster_id = Pinkie; // monster to kill
.monster_drop = PinkAntennae; // monster drop to collect
.drop_count = 10; // amount of that drop needed
diff --git a/npc/008-1/jack.txt b/npc/008-1/jack.txt
index fdce7fe6..5f486f23 100644
--- a/npc/008-1/jack.txt
+++ b/npc/008-1/jack.txt
@@ -224,7 +224,7 @@
delitem(.logs_item, .logs_amount);
getitem(.shield_item, 1);
Zeny -= .shield_cost;
- getexp(.shield_exp, 0);
+ quest_xp(.maxLevel, .shield_exp);
speech(
l("Enjoy your new shield!"));
@@ -294,6 +294,7 @@ OnInit:
.shield_cost = 5000; // XXX: maybe nlogn?
.shield_exp = 2500;
.shield_item = WoodenShield;
+ .maxLevel = getiteminfo(WoodenShield, ITEMINFO_ELV) + 20;
.quest_bow = HurnscaldQuests_ForestBow;
.quest_shield = HurnscaldQuests_WoodenShield;
diff --git a/npc/008-1/mikhail.txt b/npc/008-1/mikhail.txt
index 3d9441d1..74f11cf5 100644
--- a/npc/008-1/mikhail.txt
+++ b/npc/008-1/mikhail.txt
@@ -75,7 +75,7 @@
delitem .third_item, .third_item_qty;
setq .quest, 7;
- getexp .third_reward_exp, 0;
+ quest_xp(.maxLevel, .third_reward_exp);
close;
}
@@ -112,6 +112,7 @@ OnInit:
.third_item_qty = 5;
.third_item_mob = Maggot;
+ .maxLevel = 30;
.third_reward_exp = 100;
.quest = HurnscaldQuests_Soup;
@@ -119,13 +120,5 @@ OnInit:
.bodytype = BODYTYPE_3;
.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/rossy.txt b/npc/008-1/rossy.txt
index 8e63bd27..9d59fec4 100644
--- a/npc/008-1/rossy.txt
+++ b/npc/008-1/rossy.txt
@@ -160,7 +160,8 @@ function rossyBasket {
mesq l("You do, but that's not enough. I need %d %s.", .blueberries_amount, getitemlink(Blueberries));
}
delitem Blueberries, .blueberries_amount;
- getexp 2000, 500;
+ quest_xp(.maxLevel, 2000);
+ quest_jxp(.maxLevel, 500);
setq HurnscaldQuests_Rossy, 4;
// FIXME: Perhaps give player a [Berries Bag] item? Hmm.
mesn;
@@ -348,7 +349,8 @@ function rossyDeliverTulip {
mes "";
delitem ARedTulip, 15;
setq HurnscaldQuests_Rossy, 14;
- getexp 2500, 250;
+ quest_xp(.maxLevel, 2500);
+ quest_jxp(.maxLevel, 250);
mesn;
mesq l("That's better! Go and tell my mother that she is the nicest mother in the world.");
next;
@@ -385,5 +387,6 @@ OnInit:
// Quest conf
.blueberries_amount=30;
.minLevel_rescue = 60;
+ .maxLevel = 90;
end;
}
diff --git a/npc/008-1/soul-menhir.txt b/npc/008-1/soul-menhir.txt
index 2c57f0de..61112de5 100644
--- a/npc/008-1/soul-menhir.txt
+++ b/npc/008-1/soul-menhir.txt
@@ -1,62 +1,9 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// gumi
+// Jesusalva
// Description:
// place of power, mana refills faster when sitting nearby
-008-1,252,111,0 script Soul Menhir#hurnscald NPC_NO_SPRITE,{
- if (!@menhir_meditation_message)
- {
- dispbottom(l("You feel a strong magic aura. You want to sit near it and meditate."));
- @menhir_meditation_message=1;
- }
- end;
+008-1,252,111,0 duplicate(Soul Menhir) Soul Menhir#hurn_1_7_200 NPC_NO_SPRITE
-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/wateranimation.txt b/npc/008-1/wateranimation.txt
index 74ff5fd9..ce72d893 100644
--- a/npc/008-1/wateranimation.txt
+++ b/npc/008-1/wateranimation.txt
@@ -1,9 +1,21 @@
-// Evol scripts.
-// Author:
-// gumi
-// Reid
+// The Mana World scripts.
// Description:
// Water animations, splash, fishes, etc...
-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
+008-1,90,223,0 duplicate(#fish_river) #hurns_fish01 NPC_WATER_SPLASH
+008-1,86,177,0 duplicate(#fish_river) #hurns_fish02 NPC_WATER_SPLASH
+008-1,85,186,0 duplicate(#fish_river) #hurns_fish03 NPC_WATER_SPLASH
+008-1,89,208,0 duplicate(#fish_river) #hurns_fish04 NPC_WATER_SPLASH
+008-1,139,91,0 duplicate(#fish_river) #hurns_fish05 NPC_WATER_SPLASH
+008-1,64,36,0 duplicate(#fish_river) #hurns_fish06 NPC_WATER_SPLASH
+008-1,55,30,0 duplicate(#fish_river) #hurns_fish07 NPC_WATER_SPLASH
+008-1,46,35,0 duplicate(#fish_river) #hurns_fish08 NPC_WATER_SPLASH
+008-1,105,55,0 duplicate(#fish_river) #hurns_fish09 NPC_WATER_SPLASH
+008-1,214,155,0 duplicate(#fish_river) #hurns_fish10 NPC_WATER_SPLASH
+008-1,216,153,0 duplicate(#fish_river) #hurns_fish11 NPC_WATER_SPLASH
+008-1,225,26,0 duplicate(#fish_river) #hurns_fish12 NPC_WATER_SPLASH
+008-1,220,49,0 duplicate(#fish_river) #hurns_fish13 NPC_WATER_SPLASH
+008-1,220,57,0 duplicate(#fish_river) #hurns_fish14 NPC_WATER_SPLASH
+008-1,233,56,0 duplicate(#fish_river) #hurns_fish15 NPC_WATER_SPLASH
+008-1,230,51,0 duplicate(#fish_river) #hurns_fish16 NPC_WATER_SPLASH
+
diff --git a/npc/008-2-1/inspector.txt b/npc/008-2-1/inspector.txt
index 54d4b6aa..58ecdccb 100644
--- a/npc/008-2-1/inspector.txt
+++ b/npc/008-2-1/inspector.txt
@@ -147,7 +147,7 @@
close2;
setq(.quest, 16);
- getexp(.reward_exp, 0);
+ quest_xp(.maxLevel, .reward_exp);
end;
case 16:
@@ -169,7 +169,8 @@ OnPCBaseLvUpEvent:
end;
OnInit:
- .min_level = 20; // min level to do the quest
+ .min_level = 30; // min level to do the quest
+ .maxLevel = 60;
.reward_exp = 2500;
diff --git a/npc/008-2-1/selim.txt b/npc/008-2-1/selim.txt
index 2bdea97d..8730edc8 100644
--- a/npc/008-2-1/selim.txt
+++ b/npc/008-2-1/selim.txt
@@ -5,11 +5,14 @@
// Selim the Dyer.
// THIS IS A PLACEHOLDER!
-008-1,38,40,0 script Selim NPC_GUMI_THE_DYER,{
+008-2-1,38,40,0 script Selim NPC_GUMI_THE_DYER,{
speech
l("Oh hey!"),
l("Good you are here, you could be handy for me right now."),
- l("Or maybe later. Hmm, we'll see.");
+ l("Or maybe later. Hmm, we'll see."),
+ l("On the meanwhile...");
+
+ Barber(false);
close;
diff --git a/npc/008-2-13/lena.txt b/npc/008-2-13/lena.txt
index 74f47724..02690a63 100644
--- a/npc/008-2-13/lena.txt
+++ b/npc/008-2-13/lena.txt
@@ -1,20 +1,271 @@
// The Mana World scripts.
// Author:
// Micksha
+// Jesusalva
// Description:
// Lena the Bowwoman.
-// THIS IS A PLACEHOLDER!
008-2-13,27,27,0 script Lena NPC_LENA,{
+ .@q=getq(HurnscaldQuest_Bandits);
+ // Declare all functions
+ // Stage 1
+ function lenaTooWeak;
+ function lenaStart;
+ function lenaReturn;
+ // Stage 2
+ function lenaQuest;
+ function lenaCoinBag;
+ // Stage 3
+ function lenaBusy;
+ function lenaBusy2;
+ function lenaBanditLord;
+ function lenaFinish;
+ // Post stage
+ function lenaDaily;
+
+ switch (.@q) {
+ // Stage 1
+ case 0:
+ if (BaseLevel < .minLevel_1)
+ lenaTooWeak();
+ lenaStart();
+ break;
+ case 1:
+ lenaReturn();
+ break;
+ // Stage 2
+ case 2:
+ if (BaseLevel < .minLevel_2)
+ lenaTooWeak();
+ lenaQuest();
+ break;
+ case 3:
+ lenaCoinBag();
+ break;
+ // Stage 3
+ case 4:
+ if (BaseLevel < .minLevel_1)
+ lenaBusy();
+ lenaBanditLord();
+ break;
+ case 5:
+ case 6:
+ lenaBusy2();
+ break;
+ case 7:
+ lenaFinish();
+ break;
+ }
+ close;
+
+function lenaDaily {
+ // DailyQuest(lvl, cost, count, item)
+ DailyQuest(40, 4, 10, CoinBag);
+ return;
+}
+
+// ------------------------------------
+function lenaTooWeak {
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.");
+ lg("However, you are too weak to help me, so come back later.");
+ close;
+}
+function lenaBusy {
+ speech
+ l("Hey."),
+ l("Ah, I wish my dear friend Nickos could be here. He's one of the guards in Tulimshar and he'd know how to deal with those outlaws!"),
+ l("I will inform you when I have more information about the bandits.");
close;
+}
+
+function lenaBusy2 {
+ mesn;
+ mesq l("%s, we are counting on you! We, the whole Hurnscald town!", strcharinfo(0));
+ close;
+}
+
+// ------------------------------------ Stage 1
+function lenaStart {
+ mesn;
+ mesq l("Ah, hello.");
+ next;
+ mesn;
+ mesq l("We actually have a problem. Bandits ransacked Hurnscald, and took a huge loot.");
+ next;
+ mesn;
+ mesq l("We pursued them until the mines, slayed them, and took the chests where they locked our stuff into.");
+ next;
+ mesn;
+ mesq l("The problem is... The slimes ate the keys for the chests. This is not the first time such thing happens.");
+ next;
+ mesn;
+ mesq l("If you bring us %d %s, we'll be forever grateful.", .numKeys, getitemlink(TreasureKey));
+ select
+ l("Don't worry ma'm, I'll recover the Treasure Keys at once."),
+ l("Ah... Slimes... Sorry, not my cup of tea...");
+ mes "";
+ if (@menu == 2)
+ close;
+ setq HurnscaldQuest_Bandits, 1;
+ mesn;
+ mesq l("Wonderful! I'll be expecting you back.");
+ return;
+}
+
+function lenaReturn {
+ mesn;
+ mesq lg("Adventurer, did you brought me what I asked? I see you have %d/%d %s.","Adventurer, did you brought me what I asked? I see you have %d/%d %s.", countitem(TreasureKey), .numKeys, getitemlink(TreasureKey));
+ mes "";
+ select
+ rif(countitem(TreasureKey) >= .numKeys, l("Yes, take it.")),
+ rif(countitem(TreasureKey) < .numKeys, l("No, I'll be back with them.")),
+ l("Hm, can we talk again later?");
+ mes "";
+ if (@menu != 1)
+ close;
+ delitem TreasureKey, .numKeys;
+ quest_gp(.maxLevel_1, 1000);
+ quest_xp(.maxLevel_1, 1599); // 20% from needed exp
+ setq HurnscaldQuest_Bandits, 2;
+ mesn;
+ mesq l("Hey hey... Good job! We can now use again the stuff we recovered from the bandits.");
+ next;
+ mesn;
+ mesq l("Here is some GP for your efforts. Thanks for making Hurnscald a better place to live.");
+ next;
+ mesn;
+ mesq l("This happens quite often, too. My friends and I are always collecting keys to reduce beer price on Hurnscald. %%2");
+ return;
+}
+
+// ------------------------------------ Stage 2
+function lenaQuest {
+ mesn;
+ mesq l("Ah, %s, good thing you are here.", strcharinfo(0));
+ next;
+ mesn;
+ mesq l("Bandits are a huge threat to Hurnscald. We're just a small farming town, and they're countless.");
+ next;
+ mesn;
+ mesq l("Unlike the thieves guild, they are ruthless, and break everything. We lose more repairing damage than actually stolen.");
+ next;
+ mesn;
+ mesq l("Last time I went to fight the Bandit Lord, I was severely wounded.");
+ next;
+ mesn;
+ mesq l("I will reward whoever kills the current bandit leader, of course.");
+ select
+ l("I would gladly aid you to get rid of that scourge."),
+ l("Sorry, I forgot my courage on my other set of pants.");
+ mes "";
+ if (@menu == 2)
+ close;
+ setq HurnscaldQuest_Bandits, 3;
+ mesn;
+ mesq l("Wonderful! So, how about a warm up?");
+ next;
+ mesn;
+ mesq l("Bring me %d %s. This should help us amending the damage they caused and is a good warm-up exercise.", .numCoins, getitemlink(CoinBag));
+ return;
+}
+
+function lenaCoinBag {
+ mesn;
+ mesq lg("Adventurer, did you brought me what I asked? I see you have %d/%d %s.","Adventurer, did you brought me what I asked? I see you have %d/%d %s.", countitem(CoinBag), .numCoins, getitemlink(CoinBag));
+ mes "";
+ select
+ rif(countitem(CoinBag) >= .numCoins, l("Yes, take it.")),
+ rif(countitem(CoinBag) < .numCoins, l("No, I'll be back with them.")),
+ l("Hm, can we talk again later?");
+ mes "";
+ if (@menu != 1)
+ close;
+ inventoryplace FairyHat, 1;
+ delitem CoinBag, .numCoins;
+ .@gp=getiteminfo(CoinBag, ITEMINFO_SELLPRICE) * .numCoins * 15 / 10;
+ quest_gp(.maxLevel_2, .@gp); // +50% of base sell price
+ quest_xp(.maxLevel_2, 6842); // 20% from needed exp
+ getitem FairyHat, 1;
+ setq HurnscaldQuest_Bandits, 4;
+ mesn;
+ mesq l("Hey hey... Good job! This help us more than you think. Here is a hat like mine.");
+ next;
+ mesn;
+ mesq l("Unfortunately, I feel this bandit threat may have grown. Come back later, I'll talk with the Brotherhood for a while and probably will need your help again.");
+ return;
+}
+// ------------------------------------ Stage 3
+function lenaBanditLord {
+ mesn;
+ mesq l("So... I won't say you can't do it, %s. I will just say killing the Bandit Lord is no easy task.", strcharinfo(0));
+ next;
+ mesn;
+ mesq l("The %s is not only a fearsome and ruthless leader. He is strong, and he have tricks on his sleeve.", getmonsterlink(BanditLord));
+ next;
+ mesn;
+ mesq l("He will summon allies if he think you have the upper hand. So take care if you are going ranged.");
+ next;
+ mesn;
+ mesq l("I know another Bandit Lord will take up his place, but the loss of their leader will make bandits scatter long enough.");
+ next;
+ mesn;
+ mesq l("Will you help me- no, I mean, will you help us, the whole town of Hurnscald?");
+ next;
+ select
+ l("Sorry, I need to better prepare myself."),
+ l("I would gladly give my life for such noble goal.");
+ mes "";
+ if (@menu == 1)
+ close;
+ setq HurnscaldQuest_Bandits, 5;
+ mesn;
+ mesq l("...You have courage. Many people tried and failed.");
+ next;
+ mesn;
+ mesq l("I know where the Bandit Lord room is, and I have a guard stationed not far from there. Ask him for the key.");
+ next;
+ mesn;
+ mesq l("One last thing... Good luck. This bandit threat needs to be pushed back.");
+ return;
+}
+
+function lenaFinish {
+ mesn;
+ mesq l("Ah... You did it!");
+ next;
+ mesn;
+ mesq l("That's easy to know, because the bandits are less coordinated. Perhaps we will be able to sleep in peace this night!");
+ next;
+ inventoryplace ForestArmor, 1;
+ getitem ForestArmor, 1;
+ quest_xp(.maxLevel_3, 5842); // 10% from needed exp
+ quest_jxp(.maxLevel_3, 93); // + JExp level 6
+ setq HurnscaldQuest_Bandits, 8;
+ mesn;
+ mesq l("Here is the %s, like my armor, and one of the best for rangers.", getitemlink(ForestArmor));
+ next;
+ mesn;
+ mesq l("Any friend of Hurnscald is my friend too. Come to me again, if you want to do daily quests!");
+ return;
+}
OnInit:
.bodytype = BODYTYPE_2;
.distance = 4;
+
+ // Quest configuration
+ .minLevel_1=15;
+ .maxLevel_1=35;
+ .numKeys = 15;
+
+ .minLevel_2=30;
+ .maxLevel_2=50;
+ .numCoins = 20;
+
+ .minLevel_3=35;
+ .maxLevel_3=55;
end;
}
diff --git a/npc/008-2-16/yannika.txt b/npc/008-2-16/yannika.txt
index ecf9551a..530105c5 100644
--- a/npc/008-2-16/yannika.txt
+++ b/npc/008-2-16/yannika.txt
@@ -441,7 +441,8 @@
break;
delitem SeafoodPlate, 1;
getitem EmptyPlate, 1;
- getexp 10000, 1000;
+ quest_xp(.maxLevel, 10000);
+ quest_jxp(.maxLevel, 1000);
setq1 General_Cooking, 19;
mesn;
mesq l("Ah - Many thanks. Here, I'll return you a plate.");
@@ -460,6 +461,7 @@
}
OnInit:
+ .maxLevel = 40;
.bodytype = BODYTYPE_2;
.distance = 4;
.quest=General_Cooking;
diff --git a/npc/008-2-2/kfahr.txt b/npc/008-2-2/kfahr.txt
index 8788620a..8d593270 100644
--- a/npc/008-2-2/kfahr.txt
+++ b/npc/008-2-2/kfahr.txt
@@ -756,7 +756,7 @@ function bone_quest_final_check {
setq HurnscaldQuests_Kfahr, 3;
delitem BlackScorpionStinger, .BLACK_STINGERS_NR;
delitem SmallMushroom, .MUSHROOMS_NR;
- getexp .KNIFE_QUEST_XP, 0;
+ quest_xp(.KNIFE_MAXLV, .KNIFE_QUEST_XP);
getitem BoneKnife, 1;
next;
@@ -777,6 +777,8 @@ OnInit:
.SNAKE_SKINS_NR = 10;
.KNIFE_QUEST_XP = 50000;
.STINGER_QUEST_XP = 80000;
+ .KNIFE_MAXLV = getiteminfo(BoneKnife, ITEMINFO_ELV) + 20;
+ //.STINGER_MAXLV = 100;
.bodytype = BODYTYPE_3;
.distance = 4;
diff --git a/npc/008-2-24/troupe-leader.txt b/npc/008-2-24/troupe-leader.txt
index 47956d4b..1c6f204a 100644
--- a/npc/008-2-24/troupe-leader.txt
+++ b/npc/008-2-24/troupe-leader.txt
@@ -73,7 +73,7 @@
}
setq(.quest_inspector, 15);
- getexp(.reward_exp, 0);
+ quest_xp(.maxLevel, .reward_exp);
getitem(.reward_item, 1);
speech(
@@ -99,8 +99,9 @@
close;
OnInit:
- .reward_item = NohMask; // FIXME: change this when we get NohMask
+ .reward_item = NohMask;
.reward_exp = 1500;
+ .maxLevel = 60;
.quest_inspector = HurnscaldQuests_Inspector;
.quest_debug = .quest_inspector;
diff --git a/npc/008-2-4/bernard.txt b/npc/008-2-4/bernard.txt
index 8ba6a18c..fa3b1dc3 100644
--- a/npc/008-2-4/bernard.txt
+++ b/npc/008-2-4/bernard.txt
@@ -96,8 +96,8 @@
close;
delitem .first_item, 1;
- getitem .first_reward_item, .first_reward_amount;
- getexp .first_reward_exp, 0;
+ quest_item(.maxLevel, .first_reward_item, .first_reward_amount);
+ quest_xp(.maxLevel, .first_reward_exp);
setq .quest, 3;
speech 8,
@@ -140,8 +140,8 @@
close;
delitem .second_item, .second_item_qty;
- getitem .second_reward_item, .second_reward_amount;
- getexp .second_reward_exp, 0;
+ quest_item(.maxLevel, .second_reward_item, .second_reward_amount);
+ quest_xp(.maxLevel, .second_reward_exp);
setq .quest, 5;
close;
@@ -201,6 +201,7 @@ OnPCBaseLvUpEvent:
OnInit:
.min_level = 10; // min level to do the quest
+ .maxLevel = 30;
.first_item = RoastedMaggot;
.first_reward_item = CherryCake;
@@ -218,13 +219,5 @@ OnInit:
.bodytype = BODYTYPE_3;
.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
index c8eceed7..f07c882f 100644
--- a/npc/008-2-4/olana.txt
+++ b/npc/008-2-4/olana.txt
@@ -197,8 +197,9 @@ function olanaDeliverBerries {
return;
mesn;
mesq l("Ohhh... How sweet... Sometimes Rossy impresses me with her kindness. Here... You are spending so much time helping us, and we give nothing back. Take this as a small reward.");
- getexp 2000, 200;
- Zeny+=10000;
+ quest_xp(.maxLevel, 2000);
+ quest_jxp(.maxLevel, 200);
+ quest_gp(.maxLevel, 10000);
setq HurnscaldQuests_Rossy, 5;
next;
mesn;
@@ -316,5 +317,6 @@ OnInit:
.bodytype = BODYTYPE_3;
.distance = 4;
.minLevel = 40;
+ .maxLevel = 80; // Differs from Juliet/Rossy
end;
}
diff --git a/npc/008-2-6/alan.txt b/npc/008-2-6/alan.txt
index 368b3f1e..08edf0f9 100644
--- a/npc/008-2-6/alan.txt
+++ b/npc/008-2-6/alan.txt
@@ -158,7 +158,7 @@
setq(.quest_bow, 6);
Zeny -= .req_esp;
getitem(.reward_item, 1);
- getexp(.reward_exp, 0);
+ quest_xp(.maxLevel, .reward_exp);
speech(
l("Here you go - have fun with it."));
@@ -291,6 +291,7 @@ OnPCBaseLvUpEvent:
OnInit:
.min_level = 25; // min level to do the quest
+ .maxLevel = 50; // max level to obtain full rewards
.req_item = RawLog; // item required to make the bow
.req_esp = 10000; // amount of Esperin required to make the bow
@@ -307,14 +308,5 @@ OnInit:
.quest_debug = .quest_bow;
.bodytype = BODYTYPE_3;
.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-7/wyara.txt b/npc/008-2-7/wyara.txt
index 5a05a008..a0dfd772 100644
--- a/npc/008-2-7/wyara.txt
+++ b/npc/008-2-7/wyara.txt
@@ -1,80 +1,27 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
// Wyara the witch.
// TODO: Buy or make plushroom potions
-// TODO: Should she ask for a money comission when resetting status?
008-2-7,27,28,0 script Wyara NPC_DARK_DRUID,{
- function confirmStatusReset;
- function doStatusReset;
speech
l("What? Is there someone?"),
- l("Please, leave me alone. I have to pixel potions."),
+ l("Please, leave me alone. I have to pixel- erm, brew potions."),
lg("I will sell some when you return a bit later."),
l("Unless you are interested in a status reset?");
next;
- do
- {
- select
- l("I'm fine, thanks."),
- l("I actually could use a status reset!");
- switch (@menu) {
- case 2:
- @plush_count = lognbaselvl(1, 10);
- @plush_count = @plush_count*12/10;
- if (confirmStatusReset())
- doStatusReset();
- break;
- }
- } while (@menu != 1);
- // Note: There is some dark magic here, because confirmStatusReset() overrides @menu.
- close;
-
-function confirmStatusReset {
- mesn;
- mesq l("Let me just have a quick look at you. Hm... I will need @@ @@s to reset your stats.", @plush_count, getitemlink(Plushroom));
- next;
- mesn;
- mesq l("Also, status point reset can't be undone. Do you really want this?");
- next;
- if (askyesno() == ASK_YES)
- {
- if (countitem(Plushroom) >= @plush_count)
- return 1;
- mesn;
- mesq l("Alright, but... You only have @@ @@, and I need @@ to do the status reset for you!", countitem(Plushroom), getitemlink(Plushroom), @plush_count);
- }
- return 0;
-}
-
-function doStatusReset {
- delitem Plushroom, @plush_count;
-
- .@wasSP = StatusPoint;
- resetstatus;
-
- // Everything was done before dialog in case of forced disconnection
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("Thank you."),
- l("Now stand still... It should not take much time...");
- if (StatusPoint == .@wasSP)
- {
- speech
- l("It seems that you have no status points to reset!"),
- l("I'll return the plushroom to you, but please, do not waste my time.");
- getitem Plushroom, @plush_count;
+ select
+ l("I'm fine, thanks."),
+ l("I actually could use a status reset!");
+ mes "";
+ switch (@menu) {
+ case 2:
+ ConfirmStatusReset();
+ break;
}
- else
- {
- speech
- l("Let's see... @@ of your status points have just been reset!", StatusPoint - .@wasSP),
- l("Spend it wisely this time."),
- lg("But you are welcome to reset your stats again if you bring me some more plushrooms!");
- }
- return;
-}
+ close;
OnInit:
.bodytype = BODYTYPE_2;
diff --git a/npc/008-3-0/juliet.txt b/npc/008-3-0/juliet.txt
index c4f15fc0..67a4b9ca 100644
--- a/npc/008-3-0/juliet.txt
+++ b/npc/008-3-0/juliet.txt
@@ -607,9 +607,10 @@ OnInstanceInit:
next;
mesn;
mesq lg("Here you go, miss!", "Here you go, mister!");
- getitem .@rune, 1;
getitem .@gems, 1;
- getexp 100000, 10000;
+ quest_item(.@rune, 1);
+ quest_xp(.maxLevel, 100000);
+ quest_jxp(.maxLevel, 10000);
setq HurnscaldQuests_Rossy, 17, 0, .@inst;
next;
mesn;
@@ -643,11 +644,13 @@ OnInstanceInit:
OnInit:
disablenpc "Juliet";
.distance=4;
+ .maxLevel=80;
end;
OnInstanceInit:
disablenpc instance_npcname("Juliet");
.distance=4;
+ .maxLevel=90;
end;
}
diff --git a/npc/008-3-1/_import.txt b/npc/008-3-1/_import.txt
index 36cd6d97..fa138e1f 100644
--- a/npc/008-3-1/_import.txt
+++ b/npc/008-3-1/_import.txt
@@ -2,3 +2,4 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-3-1/_mobs.txt",
"npc/008-3-1/_warps.txt",
+"npc/008-3-1/arkim.txt",
diff --git a/npc/008-3-1/arkim.txt b/npc/008-3-1/arkim.txt
new file mode 100644
index 00000000..220c79ae
--- /dev/null
+++ b/npc/008-3-1/arkim.txt
@@ -0,0 +1,57 @@
+// The Mana World scripts.
+// Author:
+// Jesusalva
+// Description:
+// Arkim the mad hermit and Mirak's brother
+
+008-3-1,41,34,0 script Arkim NPC_TERRY,{
+ function arkimDaily;
+ mesn;
+ mesq l("Do you want help me with bats?");
+ next;
+ select
+ l("Yes, please!"),
+ l("Bats? Actually... Why do you live here?"); // Who said they live here?
+ mes "";
+ if (@menu == 1)
+ arkimDaily();
+ mesn;
+ mesq l("Oh my, never really thought about it!");
+ next;
+ mesn;
+ mesq l("I guess mostly I enjoy experimenting with the bats here.");
+ next;
+ select
+ l("I see... Ehm... I have to go..."),
+ l("What type of experimenting?");
+ mes "";
+ if (@menu == 1)
+ close;
+ mesn;
+ mesq l("Never really thought about it either...");
+ next;
+ mesn;
+ mesc l("You watch as the hermit's old, lazy eyes open wide, and the old man comes alive with energy.");
+ mesq l("I GUESS I REALLY LIKE CUTTING THEM UP TO SEE HOW THEY WORK!! HAHAHA!");
+ next;
+ select
+ l("YOU'RE CRAZY!"),
+ l("Right... me too! Can I help?");
+ mes "";
+ if (@menu == 2)
+ arkimDaily();
+ close;
+
+function arkimDaily {
+ // DailyQuest(lvl, cost, count, item)
+ DailyQuest(20, 4, 3, BatWing);
+ close;
+}
+
+OnInit:
+ .bodytype = BODYTYPE_1;
+ .distance = 4;
+ end;
+
+}
+
diff --git a/npc/008-3-2/boss.txt b/npc/008-3-2/boss.txt
index 5a296ce9..0634358d 100644
--- a/npc/008-3-2/boss.txt
+++ b/npc/008-3-2/boss.txt
@@ -1,4 +1,4 @@
-// Evol Script
+// The Mana World Script
// Author:
// Jesusalva
// Description:
@@ -23,22 +23,7 @@ OnInit:
OnBossDeath:
initnpctimer;
- // Only the party which defeated the boss can learn the skill
- getmapxy(.@m$, .@x, .@y, 0);
- .@party=getcharid(1);
- if (.@party > 0)
- {
- $@MB_00832=.@party;
- areatimer("008-3-2", .@x-15, .@y-15, .@x+15, .@y+15, 10, "#BossCtrl_008-3-2::OnBossCheck");
- mapannounce "008-3-2", "Boss deafeated by Party: " + getpartyname(.@party), bc_all;
- }
- else
- {
- $@MB_00832=-2;
- areatimer("008-3-2", .@x-15, .@y-15, .@x+15, .@y+15, 10, "#BossCtrl_008-3-2::OnBossCheck");
- addtimer(20, "#BossCtrl_008-3-2::OnBegin");
- mapannounce "008-3-2", "Boss deafeated by: " + strcharinfo(0), bc_all;
- }
+ BossSlain(.name$, "$@MB_00832");
end;
OnBossCheck:
@@ -52,14 +37,7 @@ OnBegin:
@mb_SkillId=TF_POISON;
@mb_ItemId=MagicFeather; // Placeholder
@mb_ItemAm=1;
- addtimer(15000, "#BossCtrl_008-3-2::OnFinish");
- end;
-
-OnFinish:
- @mb_BossId=0;
- @mb_SkillId=0;
- @mb_ItemId=0;
- @mb_ItemAm=0;
+ addtimer(15000, "#MasterBook::OnUnset");
end;
}
diff --git a/npc/008-3-5/_import.txt b/npc/008-3-5/_import.txt
index 5113781e..cb743792 100644
--- a/npc/008-3-5/_import.txt
+++ b/npc/008-3-5/_import.txt
@@ -2,4 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-3-5/_mobs.txt",
"npc/008-3-5/_warps.txt",
+"npc/008-3-5/bryant.txt",
+"npc/008-3-5/lordcave.txt",
"npc/008-3-5/nunia.txt",
diff --git a/npc/008-3-5/bryant.txt b/npc/008-3-5/bryant.txt
new file mode 100644
index 00000000..acef6f09
--- /dev/null
+++ b/npc/008-3-5/bryant.txt
@@ -0,0 +1,80 @@
+// TMW2 Script.
+// Author:
+// Jesusalva
+// Description:
+// Part of Helena's quest
+// Gives spoilers about what Jesusalva plans in doing with Bryant
+
+008-3-5,101,85,0 script Bryant NPC_CRASMANDE,{
+ function bryantBanditLord;
+ function bryantSilverKey;
+ function bryantComplete;
+ .@q=getq(HurnscaldQuest_Bandits);
+ if (.@q == 5) bryantSilverKey();
+ if (.@q == 6) bryantBanditLord();
+ if (.@q >= 7) bryantComplete();
+ mesn;
+ mesq lg("Welcome.");
+ next;
+ mesn;
+ mesq l("I'm looking everywhere for the bandit leader. I can't seem to find him. So I stopped here to rest a bit.");
+ close;
+
+function bryantSilverKey {
+ mesn;
+ mesq l("Don't say anything, I can smell the scent of Lena's hair on you.");
+ next;
+ inventoryplace PiberriesInfusion, 3;
+ getitem PiberriesInfusion, 3;
+ setq HurnscaldQuest_Bandits, 6;
+ mesn;
+ mesq l("I guess she sent you to kill the Bandit Lord, right? I'll lure him for you.");
+ next;
+ mesn;
+ mesq l("It is pretty close to here. I advise you to use a good sword, and heal yourself often.");
+ next;
+ mesn;
+ mesq l("I will give you 3 @@. Use them on this fight, or you're doomed to fail.", getitemlink(PiberriesInfusion));
+ close;
+}
+
+function bryantBanditLord {
+ mesn;
+ mesq l("What are you waiting for? Go kill the bandit lord.");
+ next;
+ mesn strcharinfo(0);
+ select
+ l("I'm going, don't worry."),
+ l("There was nobody on the Bandit Lord's room.");
+ if (@menu == 1)
+ close;
+ mes "";
+ mesn;
+ mesq l("...Have you ever gone there yet?");
+ next;
+ mesn;
+ mesq l("Go kill the Bandit Lord!");
+ close;
+}
+
+function bryantComplete {
+ mesn;
+ mesq l("Good job defeating the Bandit Lord.");
+ close;
+}
+
+OnInit:
+ /*
+ .@npcId = getnpcid(.name$);
+ setunitdata(.@npcId, UDT_HEADTOP, FairyHat);
+ setunitdata(.@npcId, UDT_HEADMIDDLE, ForestArmor);
+ setunitdata(.@npcId, UDT_HEADBOTTOM, JeansChaps);
+ setunitdata(.@npcId, UDT_WEAPON, DeepBlackBoots);
+ setunitdata(.@npcId, UDT_HAIRSTYLE, 24);
+ setunitdata(.@npcId, UDT_HAIRCOLOR, 1);
+ */
+
+ .bodytype = BODYTYPE_1;
+ .distance = 5;
+ end;
+}
diff --git a/npc/008-3-5/lordcave.txt b/npc/008-3-5/lordcave.txt
new file mode 100644
index 00000000..906cd8ad
--- /dev/null
+++ b/npc/008-3-5/lordcave.txt
@@ -0,0 +1,101 @@
+// TMW2 Script
+// Author:
+// Jesusalva
+// FIXME:
+// Create a party instance for this
+
+008-3-5,83,49,0 script #BanditLordDen NPC_HIDDEN,0,5,{
+ function lordCleanup;
+ end;
+
+function lordCleanup {
+ // Bug
+ if (!.lock) {
+ consolemes(CONSOLEMES_ERROR, "No lock passed to Lord Cave during cleanup");
+ end;
+ }
+
+ // Cleanup
+ .lock = false;
+ delcells "BanditLordDenWall";
+ killmonster("008-3-5", "#BanditLordDen::OnLordDeath");
+ stopnpctimer;
+ return;
+}
+
+OnInit:
+ .maxLevel = 55;
+ .lock=false;
+ end;
+
+OnTouch:
+ .@q=getq(HurnscaldQuest_Bandits);
+ if (.@q != 6) end;
+
+ // Oooh, we got a challenger!
+
+ // But the Lord is busy? Oh well, try again later
+ if (.lock) {
+ dispbottom l("%s came here first, you should wait for them.", strcharinfo(0, "Someone", .lock));
+ slide 92, 52;
+ end;
+ }
+
+ // Block the NPC
+ .lock=getcharid(3);
+ slide 80, 49;
+
+ // Block the passage
+ mapannounce "008-3-5", "A minor earthquake happens.", bc_map;
+ setcells "008-3-5", 82, 48, 83, 51, 2, "BanditLordDenWall";
+ initnpctimer;
+
+ // Summon
+ if (mobcount("008-3-5", "#BanditLordDen::OnLordDeath") == 0)
+ monster "008-3-5", 48, 35, "Bandit Lord", BanditLord, 1, "#BanditLordDen::OnLordDeath";
+ end;
+
+OnLordDeath:
+ // Unlock
+ lordCleanup();
+
+ // If killed by a monster, GM, whatever, abort
+ if (!playerattached())
+ end;
+
+ // Complete quest (if PC is attached and doing quest)
+ .@q=getq(HurnscaldQuest_Bandits);
+ if (.@q == 6 && !ispcdead()) {
+ setq HurnscaldQuest_Bandits, 7;
+ quest_xp(.maxLevel, 2500);
+ dispbottom l("Phew! The Bandit Lord was killed.");
+ } else {
+ dispbottom l("I killed the Bandit Lord! ...Why I did that, again?");
+ }
+ end;
+
+OnTimer5000:
+ .@pc=attachrid(.lock);
+
+ // Player logged out
+ if (!.@pc) {
+ lordCleanup();
+ end;
+ }
+
+ // Player killed in combat
+ if (ispcdead()) {
+ lordCleanup();
+ end;
+ }
+
+ // Player changed map
+ if (getmap() != "008-3-5") {
+ lordCleanup();
+ end;
+ }
+
+ // Battle ongoing, restart timer
+ initnpctimer;
+ end;
+}
diff --git a/npc/008-3-5/nunia.txt b/npc/008-3-5/nunia.txt
index e58df875..fb5238f2 100644
--- a/npc/008-3-5/nunia.txt
+++ b/npc/008-3-5/nunia.txt
@@ -5,7 +5,7 @@
// Nunia, Henry's friend and Woodland's master thief.
// THIS IS A PLACEHOLDER!
-008-3-5,50,35,0 script Nunia NPC_NUNIA,{
+008-3-5,35,65,0 script Nunia NPC_NUNIA,{
function nuniaIntruder;
function nuniaHenry;
function nuniaBegin;
diff --git a/npc/009-1/_import.txt b/npc/009-1/_import.txt
index a6738b93..0d4e3164 100644
--- a/npc/009-1/_import.txt
+++ b/npc/009-1/_import.txt
@@ -2,3 +2,9 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/009-1/_mobs.txt",
"npc/009-1/_warps.txt",
+"npc/009-1/blackwin.txt",
+"npc/009-1/forwin.txt",
+"npc/009-1/hamond.txt",
+"npc/009-1/soul-menhir.txt",
+"npc/009-1/thurstan.txt",
+"npc/009-1/wateranimation.txt",
diff --git a/npc/009-1/blackwin.txt b/npc/009-1/blackwin.txt
new file mode 100644
index 00000000..7ad7f39b
--- /dev/null
+++ b/npc/009-1/blackwin.txt
@@ -0,0 +1,30 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Blackwin, guardian of Asphodel Moors, disciple of Golbenez. Twice. It is magic.
+// THIS IS A PLACEHOLDER!
+
+009-1,75,144,0 script Blackwin#1 NPC_UNDEAD_GUARD,{
+ speech
+ l("..."),
+ l("Heed my warning, young %s. My master will suffer no fools here.", get_race(GETRACE_RACE)),
+ l("He created this as a place of leisure, and we are here to ensure that it remains undisturbed.");
+ close;
+
+OnInit:
+ .distance = 4;
+ end;
+}
+
+009-1,105,173,0 script Blackwin#2 NPC_UNDEAD_GUARD,{
+ speech
+ l("..."),
+ l("Heed my warning, young %s. My master will suffer no fools here.", get_race(GETRACE_RACE)),
+ l("He created this as a place of leisure, and we are here to ensure that it remains undisturbed.");
+ close;
+
+OnInit:
+ .distance = 4;
+ end;
+}
diff --git a/npc/009-1/forwin.txt b/npc/009-1/forwin.txt
new file mode 100644
index 00000000..0d226b3b
--- /dev/null
+++ b/npc/009-1/forwin.txt
@@ -0,0 +1,25 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Martha, sort of Brotherhood Leader in Tulimshar.
+// THIS IS A PLACEHOLDER!
+
+009-1,48,171,0 script Forwin NPC_UNDEAD_GUARD,{
+ mesn;
+ mesq l("%s...", strcharinfo(0));
+ next;
+ mesn;
+ mesq l("I am your father...");
+ next;
+ mesc l("There is an awkward pause, and then the guard bursts out laughing.");
+ mes "";
+ mesn;
+ mesq l("Just kidding! Can you imagine Golbenez's reaction if we had such puny offspring?");
+ close;
+
+OnInit:
+ .bodytype = BODYTYPE_2;
+ .distance = 4;
+ end;
+}
diff --git a/npc/009-1/hamond.txt b/npc/009-1/hamond.txt
new file mode 100644
index 00000000..cb203fc6
--- /dev/null
+++ b/npc/009-1/hamond.txt
@@ -0,0 +1,19 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Hamond, Reid's Husband
+// THIS IS A PLACEHOLDER!
+
+009-1,37,170,0 script Hamond NPC_HAMOND,{
+ speech
+ l("Hello, my name is Hamond."),
+ l("I run the inn together with my beautiful wife Reid."),
+ l("If there is anything I can do for you, please let me know.");
+ close;
+
+OnInit:
+ .bodytype = BODYTYPE_2;
+ .distance = 4;
+ end;
+}
diff --git a/npc/009-1/soul-menhir.txt b/npc/009-1/soul-menhir.txt
new file mode 100644
index 00000000..76c5be11
--- /dev/null
+++ b/npc/009-1/soul-menhir.txt
@@ -0,0 +1,7 @@
+// The Mana World scripts.
+// Description:
+// place of power, mana refills faster when sitting nearby
+
+// Soul Menhir#town_rate_dist_timer
+009-1,51,173,0 duplicate(Soul Menhir) Soul Menhir#moor_1_7_300 NPC_NO_SPRITE
+
diff --git a/npc/009-1/thurstan.txt b/npc/009-1/thurstan.txt
new file mode 100644
index 00000000..1e430d98
--- /dev/null
+++ b/npc/009-1/thurstan.txt
@@ -0,0 +1,23 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Thurstan, a headless man (because Golbenez, for sure)
+// THIS IS A PLACEHOLDER!
+
+009-1,84,169,0 script Thurstan NPC_THURSTAN,{
+ mesc l("You see a man, propped up against the foot of the tree.");
+ mesc l("In his hand, he is holding what you assume to be his own head.");
+ next;
+ mesc l("You jump back a bit, startled, as the head starts talking to you!");
+ mesc l("It's a little strange watching him talk, but it's better than looking at what's left of his neck.");
+ next;
+ mesn;
+ mesq l("Greetings! Do you have any duck tape?"); // Perhaps duct tape?
+ close;
+
+OnInit:
+ .bodytype = BODYTYPE_2;
+ .distance = 4;
+ end;
+}
diff --git a/npc/009-1/wateranimation.txt b/npc/009-1/wateranimation.txt
new file mode 100644
index 00000000..d6912af7
--- /dev/null
+++ b/npc/009-1/wateranimation.txt
@@ -0,0 +1,10 @@
+// The Mana World scripts.
+// Description:
+// Water animations, splash, fishes, etc...
+
+009-1,109,56,0 duplicate(#fish_river) #swamp_fish01 NPC_WATER_SPLASH
+009-1,114,74,0 duplicate(#fish_river) #swamp_fish02 NPC_WATER_SPLASH
+009-1,97,82,0 duplicate(#fish_river) #swamp_fish03 NPC_WATER_SPLASH
+009-1,97,74,0 duplicate(#fish_river) #swamp_fish04 NPC_WATER_SPLASH
+009-1,110,65,0 duplicate(#fish_river) #swamp_fish05 NPC_WATER_SPLASH
+
diff --git a/npc/009-2-3/_import.txt b/npc/009-2-3/_import.txt
index 7e647857..3fa1bf43 100644
--- a/npc/009-2-3/_import.txt
+++ b/npc/009-2-3/_import.txt
@@ -1,4 +1,6 @@
// Map 009-2-3: Reid's Inn
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/009-2-3/_warps.txt",
+"npc/009-2-3/barbara.txt",
"npc/009-2-3/chef.txt",
+"npc/009-2-3/reid.txt",
diff --git a/npc/009-2-3/barbara.txt b/npc/009-2-3/barbara.txt
new file mode 100644
index 00000000..49eb2474
--- /dev/null
+++ b/npc/009-2-3/barbara.txt
@@ -0,0 +1,17 @@
+// The Mana World scripts.
+// Author:
+// Micksha
+// Description:
+// ???
+// THIS IS A PLACEHOLDER!
+
+009-2-3,41,30,0 script Barbara Grey NPC_UNDEAD_RECPTION,{
+ speech
+ lg("Don't be shy, darling."),
+ l("Come on in and have a nice long... long slumber...");
+ close;
+
+OnInit:
+ .distance = 4;
+ end;
+}
diff --git a/npc/009-2-3/chef.txt b/npc/009-2-3/chef.txt
index 51e0a5eb..abe3f143 100644
--- a/npc/009-2-3/chef.txt
+++ b/npc/009-2-3/chef.txt
@@ -4,7 +4,7 @@
// Description:
// The nameless chef of Reid's Inn
-009-2-3,27,41,0 script Chef#Reid NPC_CHEF_LEGACY,{
+009-2-3,27,41,0 script Chef#Reid NPC_REIDCHEF,{
function cookingIntro;
function cookingDeal;
.@q=getq(General_Cooking);
diff --git a/npc/009-2-3/reid.txt b/npc/009-2-3/reid.txt
new file mode 100644
index 00000000..4445759b
--- /dev/null
+++ b/npc/009-2-3/reid.txt
@@ -0,0 +1,22 @@
+// The Mana World scripts.
+// Author:
+// Micksha
+// Description:
+// Reid is Hamond's wife. She secretly had an affair with Savaric.
+// THIS IS A PLACEHOLDER!
+
+009-2-3,42,30,0 script Reid NPC_REID,{
+ mesc l("You see a dead woman lying on the floor and something that appears to be her ghost floating above her dead body.");
+ next;
+ mesn l("Ghost");
+ mesq l("He- I - What - Oh -");
+ mesc l("The womans ghost seems to be confused.");
+ next;
+ mesn;
+ mesq l("Oh, I'm sorry. Welcome to Reid's Inn. My name is Reid, I am the innkeeper of this wonderful place of leisure. Please enjoy your visit here!");
+ close;
+
+OnInit:
+ .distance = 4;
+ end;
+}
diff --git a/npc/009-2-4/_import.txt b/npc/009-2-4/_import.txt
index 480c5419..0c8dd0be 100644
--- a/npc/009-2-4/_import.txt
+++ b/npc/009-2-4/_import.txt
@@ -1,3 +1,5 @@
// Map 009-2-4: Reid's Inn Basement
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/009-2-4/_warps.txt",
+"npc/009-2-4/aldred.txt",
+"npc/009-2-4/golbenez.txt",
diff --git a/npc/009-2-4/aldred.txt b/npc/009-2-4/aldred.txt
new file mode 100644
index 00000000..a08a745a
--- /dev/null
+++ b/npc/009-2-4/aldred.txt
@@ -0,0 +1,18 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Aldred is Hamond's and Reid's son.
+// THIS IS A PLACEHOLDER!
+
+009-2-4,50,35,0 script Aldred NPC_UNDEAD_WEPPER,{
+ mesn;
+ mesq l("Waaahhhhh!");
+ close;
+
+OnInit:
+ .bodytype = BODYTYPE_2;
+ .distance = 4;
+ end;
+}
+
diff --git a/npc/009-2-4/golbenez.txt b/npc/009-2-4/golbenez.txt
new file mode 100644
index 00000000..d87d643c
--- /dev/null
+++ b/npc/009-2-4/golbenez.txt
@@ -0,0 +1,52 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description (SPOILERS):
+// Golbenez, a very dangerous, evil AND cruel woman from a parallel dimension.
+// After being summoned by Savaric, she betrayed him and made the Inn in her
+// leisure place. Later, she invaded The Mana World, kidnapped Santa to obtain
+// enough spiritual energy, and brought the whole Inn to The Mana World.
+//
+// At time of writing, it is unknown how Asphodel Moors came to be.
+// It is possible that Golbenez cannot return to her original dimension,
+// And it is also possible that her attempt resulted in she ending up in TMW.
+//
+// (It is also possible that due the summoning ritual, Golbenez is somehow
+// bound to Savaric and like monster summons, cannot remain in existence if
+// the summoner is dead. If proven, this could change completely the reason
+// why Golbenez kept the whole Inn alive and brought it with her.)
+//
+// At time of writing, It is unknown if she is alive, undead, or neither and
+// is a spirit.
+// Other NPCs cannot comprehend and will always treat her as a "him".
+// Most other NPCs cannot say Golbenez' name properly, and will say "Golbanez",
+// "Galvanes", "Gilbenos", "Golbinos" and/or "Galvanis".
+// This is part of lore, please do not try to "fix" it in other NPCs as well.
+// THIS IS A PLACEHOLDER!
+
+009-2-4,30,32,0 script Golbenez NPC_GOLBENEZ,{
+ mesn;
+ mesq l("How do you like my place of leisure, mortal?");
+ select
+ l("What is this place? Why is it full of dead people?"),
+ l("You look different here. Nice horns."),
+ l("I'm enjoying myself, thanks for asking.");
+ mes "";
+ switch (@menu) {
+ case 1:
+ mesn;
+ mesq l("Mortal, this is beyond your comprehension. Do not worry about it and enjoy your time.");
+ break;
+ case 2:
+ mesn;
+ mesc l("%s bursts out with laughter.", .name$);
+ mesq l("Mortals! They never stop surprising me.");
+ break;
+ }
+ close;
+
+OnInit:
+ .bodytype = BODYTYPE_2;
+ .distance = 4;
+ end;
+}
diff --git a/npc/009-2-5/_import.txt b/npc/009-2-5/_import.txt
index 424539d2..fcaccd3f 100644
--- a/npc/009-2-5/_import.txt
+++ b/npc/009-2-5/_import.txt
@@ -1,3 +1,5 @@
// Map 009-2-5: Reid's Inn First Floor
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/009-2-5/_warps.txt",
+"npc/009-2-5/lovers.txt",
+"npc/009-2-5/savaric.txt",
diff --git a/npc/009-2-5/lovers.txt b/npc/009-2-5/lovers.txt
new file mode 100644
index 00000000..463742b9
--- /dev/null
+++ b/npc/009-2-5/lovers.txt
@@ -0,0 +1,29 @@
+// The Mana World scripts.
+// Author:
+// Micksha
+// Description:
+// Useless NPC. Possibly it is a memory fragment of Savaric and Reid?
+// THIS IS A PLACEHOLDER!
+
+009-2-5,27,27,0 script Lovers NPC_LOVERS,{
+ mesc l("You see a man and a woman holding each other very tight.");
+ next;
+ mesc l("They are kissing and whispering things to each other you can't hear.");
+ next;
+ mesc l("Now the woman giggles. They don't notice you.");
+ next;
+ select
+ l("Maybe it's better not to bother them."),
+ l("*ahem* Hello...?");
+ mes "";
+ if (@menu == 1)
+ close;
+ mesc l("They do not hear you. It is as if they were not real.");
+ next;
+ mesc l("This is certainly a strange place.");
+ close;
+
+OnInit:
+ .distance = 4;
+ end;
+}
diff --git a/npc/009-2-5/savaric.txt b/npc/009-2-5/savaric.txt
new file mode 100644
index 00000000..dc1f08ab
--- /dev/null
+++ b/npc/009-2-5/savaric.txt
@@ -0,0 +1,20 @@
+// The Mana World scripts.
+// Author:
+// Micksha
+// Description:
+// Savaric had an affair with Reid and ultimately brought death to the whole Inn.
+// THIS IS A PLACEHOLDER!
+
+009-2-5,31,41,0 script Savaric NPC_SAVARIC,{
+ mesc l("You see a dead man hanging. This place is creepy!");
+ next;
+ mesc l("Suddenly the man opens his eyes and looks at you.");
+ next;
+ mesn l("Hanged Man");
+ mesq l("Oh, hello. Nice to see you - I seem to be dead, but I don't know why and why I'm still consciousness. This is very interesting.");
+ close;
+
+OnInit:
+ .distance = 4;
+ end;
+}
diff --git a/npc/009-2-6/_import.txt b/npc/009-2-6/_import.txt
index 774558a8..f9cec10c 100644
--- a/npc/009-2-6/_import.txt
+++ b/npc/009-2-6/_import.txt
@@ -1,3 +1,5 @@
// Map 009-2-6: Small House
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/009-2-6/_warps.txt",
+"npc/009-2-6/eurni.txt",
+"npc/009-2-6/jpmorbid.txt",
diff --git a/npc/009-2-6/eurni.txt b/npc/009-2-6/eurni.txt
new file mode 100644
index 00000000..44bbf953
--- /dev/null
+++ b/npc/009-2-6/eurni.txt
@@ -0,0 +1,22 @@
+// The Mana World scripts.
+// Author:
+// Jesusalva
+// Description:
+// Eurni the Surgeon
+
+009-2-6,32,30,0 script Eurni NPC_EURNI,{
+ mesn;
+ mesq l("Are you tired of who you are?");
+ next;
+ mesn;
+ mesq l("Would you be interested in changing your... appearance?");
+ next;
+ Barber(false);
+
+ close;
+
+OnInit:
+ .distance = 4;
+ end;
+}
+
diff --git a/npc/009-2-7/jpmorbid.txt b/npc/009-2-6/jpmorbid.txt
index 9c8cf768..473b337d 100644
--- a/npc/009-2-7/jpmorbid.txt
+++ b/npc/009-2-6/jpmorbid.txt
@@ -3,9 +3,8 @@
// Jesusalva
// Description:
// J.P.Morbid the Asphodel Moors storage guy.
-// THIS IS A PLACEHOLDER!
-009-2-7,44,30,0 script J.P. Morbid NPC_LLOYD,{
+009-2-6,27,30,0 script J.P. Morbid NPC_JPMORBID,{
// Storage/Banking function not unlocked in Artis
if (!getq(ArtisQuests_Lloyd)) {
speech
diff --git a/npc/009-2-7/_import.txt b/npc/009-2-7/_import.txt
index 745de620..5460b7d6 100644
--- a/npc/009-2-7/_import.txt
+++ b/npc/009-2-7/_import.txt
@@ -1,4 +1,5 @@
// Map 009-2-7: Shop
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/009-2-7/_warps.txt",
-"npc/009-2-7/jpmorbid.txt",
+"npc/009-2-7/leofwin.txt",
+"npc/009-2-7/umfrey.txt",
diff --git a/npc/009-2-7/leofwin.txt b/npc/009-2-7/leofwin.txt
new file mode 100644
index 00000000..c634b9fb
--- /dev/null
+++ b/npc/009-2-7/leofwin.txt
@@ -0,0 +1,18 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Leofwin is now the status reset NPC
+// THIS IS A PLACEHOLDER!
+
+009-2-7,36,30,0 script Leofwin NPC_LEOFWIN,{
+ speech
+ l("Do you want a Status Reset?");
+
+ ConfirmStatusReset();
+ close;
+
+OnInit:
+ .distance = 4;
+ end;
+}
diff --git a/npc/009-2-7/umfrey.txt b/npc/009-2-7/umfrey.txt
new file mode 100644
index 00000000..5463f7e2
--- /dev/null
+++ b/npc/009-2-7/umfrey.txt
@@ -0,0 +1,25 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Umfrey is the general shopkeeper of Asphodel Moors
+// THIS IS A PLACEHOLDER!
+
+009-2-7,44,30,0 script Umfrey NPC_UMFREY,{
+ closeclientdialog;
+ shop .name$;
+ close;
+
+OnInit:
+ .distance = 4;
+ tradertype(NST_MARKET);
+
+ sellitem TrainingArrow, -1, 20000;
+ sellitem DeathPotion, -1, 1;
+ end;
+
+OnClock0009:
+ restoreshopitem TrainingArrow, 20000;
+ restoreshopitem DeathPotion, 1;
+ end;
+}
diff --git a/npc/009-2-8/_import.txt b/npc/009-2-8/_import.txt
index 65356779..8488166f 100644
--- a/npc/009-2-8/_import.txt
+++ b/npc/009-2-8/_import.txt
@@ -1,3 +1,4 @@
// Map 009-2-8: Blacksmith
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/009-2-8/_warps.txt",
+"npc/009-2-8/cerhan.txt",
diff --git a/npc/009-2-8/cerhan.txt b/npc/009-2-8/cerhan.txt
new file mode 100644
index 00000000..927ba2a8
--- /dev/null
+++ b/npc/009-2-8/cerhan.txt
@@ -0,0 +1,19 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Cerhan is the armory guy from Asphodel Moors.
+// Relation with Ms. Golbenez is unknown?
+// THIS IS A PLACEHOLDER!
+
+009-2-8,39,30,0 script Cerhan NPC_CHELIOS,{
+ speech
+ l("Ah, hello! It's good to see another normal %s at this strange place!", get_race(GETRACE_RACE)),
+ l("I'm an experienced weapon master and I was thinking about establishing a smithy here. I'll need some more equipment, though."),
+ l("So, I'll talk to you later!");
+ close;
+
+OnInit:
+ .distance = 4;
+ end;
+}
diff --git a/npc/012-1/_import.txt b/npc/012-1/_import.txt
index d12bbabf..118dc1b3 100644
--- a/npc/012-1/_import.txt
+++ b/npc/012-1/_import.txt
@@ -14,4 +14,5 @@
"npc/012-1/prawors.txt",
"npc/012-1/tiki.txt",
"npc/012-1/vincent.txt",
+"npc/012-1/wateranimation.txt",
"npc/012-1/zegas.txt",
diff --git a/npc/012-1/wateranimation.txt b/npc/012-1/wateranimation.txt
new file mode 100644
index 00000000..ad1b41e4
--- /dev/null
+++ b/npc/012-1/wateranimation.txt
@@ -0,0 +1,12 @@
+// The Mana World scripts.
+// Description:
+// Water animations, splash, fishes, etc...
+
+012-1,87,92,0 duplicate(#fish_river2) #candor_fish01 NPC_WATER_SPLASH
+012-1,86,85,0 duplicate(#fish_river2) #candor_fish02 NPC_WATER_SPLASH
+012-1,98,74,0 duplicate(#fish_river2) #candor_fish03 NPC_WATER_SPLASH
+012-1,94,76,0 duplicate(#fish_river2) #candor_fish04 NPC_WATER_SPLASH
+012-1,61,73,0 duplicate(#fish_river2) #candor_fish05 NPC_WATER_SPLASH
+012-1,65,74,0 duplicate(#fish_river2) #candor_fish06 NPC_WATER_SPLASH
+012-1,58,64,0 duplicate(#fish_river2) #candor_fish07 NPC_WATER_SPLASH
+
diff --git a/npc/012-2-4/morgan.txt b/npc/012-2-4/morgan.txt
index 6510960e..b32677f7 100644
--- a/npc/012-2-4/morgan.txt
+++ b/npc/012-2-4/morgan.txt
@@ -10,8 +10,10 @@
l("Hello Wanderer."),
l("I am Morgan, the alchemist."),
l("(People do not like to hear the word 'witch' so much, as we live close to Hurnscald)."),
- l("Unfortunately my apprentice Zitoni does not bring me fresh potions, so if you need something you should come back later.");
+ l("Unfortunately my apprentice Zitoni does not bring me fresh potions, so if you need something you should come back later."),
+ l("Unless you want a Status Reset?");
+ ConfirmStatusReset();
close;
OnInit:
diff --git a/npc/012-2-7/_import.txt b/npc/012-2-7/_import.txt
index fe642729..5224df90 100644
--- a/npc/012-2-7/_import.txt
+++ b/npc/012-2-7/_import.txt
@@ -2,3 +2,4 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/012-2-7/_savepoints.txt",
"npc/012-2-7/_warps.txt",
+"npc/012-2-7/marazor.txt",
diff --git a/npc/012-2-7/marazor.txt b/npc/012-2-7/marazor.txt
new file mode 100644
index 00000000..a46cafde
--- /dev/null
+++ b/npc/012-2-7/marazor.txt
@@ -0,0 +1,17 @@
+// The Mana World scripts.
+// Author:
+// Livio
+// Description:
+// Marazor the barber
+// THIS IS A PLACEHOLDER!
+
+012-2-7,33,29,0 script Marazor NPC_GUMI_THE_DYER,{
+ Barber(true);
+
+ close;
+
+OnInit:
+ .bodytype = BODYTYPE_3;
+ .distance = 4;
+ end;
+}
diff --git a/npc/020-1/_import.txt b/npc/020-1/_import.txt
index 58eebf87..a993b5ed 100644
--- a/npc/020-1/_import.txt
+++ b/npc/020-1/_import.txt
@@ -6,6 +6,7 @@
"npc/020-1/aisha.txt",
"npc/020-1/anwar.txt",
"npc/020-1/bodyguard.txt",
+"npc/020-1/boss.txt",
"npc/020-1/budifis.txt",
"npc/020-1/cyndala.txt",
"npc/020-1/ekinu.txt",
@@ -14,7 +15,9 @@
"npc/020-1/harper.txt",
"npc/020-1/hocus.txt",
"npc/020-1/inar.txt",
+"npc/020-1/issay.txt",
"npc/020-1/itka.txt",
+"npc/020-1/joaquim.txt",
"npc/020-1/joelin.txt",
"npc/020-1/jossy.txt",
"npc/020-1/mahoud.txt",
@@ -33,3 +36,4 @@
"npc/020-1/sander.txt",
"npc/020-1/tindris.txt",
"npc/020-1/vaspina.txt",
+"npc/020-1/wateranimation.txt",
diff --git a/npc/020-1/_mobs.txt b/npc/020-1/_mobs.txt
index 23449fcd..27d030e0 100644
--- a/npc/020-1/_mobs.txt
+++ b/npc/020-1/_mobs.txt
@@ -8,7 +8,6 @@
020-1,92,189,58,56 monster Desert Snake 1077,8,18000,72000
020-1,60,174,23,29 monster Black Slime 1079,4,8500,36000
020-1,188,216,84,32 monster Maggot 1026,20,5000,10000
-020-1,157,252,9,3 monster Golden Scorpion 1110,1,120000,120000
020-1,167,81,21,11 monster Brotherhood Fighter 1081,3,6000,18000
020-1,279,96,13,15 monster Legion Swordswoman 1066,3,6000,18000
020-1,74,185,23,46 monster Yellow Slime 1073,6,13500,60000
diff --git a/npc/020-1/adrian.txt b/npc/020-1/adrian.txt
index ca4b1a3f..65bfd6de 100644
--- a/npc/020-1/adrian.txt
+++ b/npc/020-1/adrian.txt
@@ -32,7 +32,7 @@
mesn;
mesc l("%s hands you a very heavy suitcase.", .name$);
mesq l("Here it is. Good luck carrying that thing.");
- setq TonoriQuest_Kylian, 2;
+ setq1 TonoriQuest_Kylian, 2;
getitembound Suitcase, 1, IBT_CHARACTER;
close;
diff --git a/npc/020-1/anwar.txt b/npc/020-1/anwar.txt
index 63355ab6..ad056e1f 100644
--- a/npc/020-1/anwar.txt
+++ b/npc/020-1/anwar.txt
@@ -1,20 +1,149 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
+// Jesusalva
// Description:
// Anwar, the farmer in Tulimshar.
-// THIS IS A PLACEHOLDER!
020-1,178,196,0 script Anwar NPC_ANWAR,{
+ // This code is from Moubootaur Legends and needs cleaning up
+ .@q=getq(TulimsharQuest_AnwarField);
+ if (BaseLevel < 18) {
+ hello;
+ end;
+ }
+
+ if (.@q > 10) goto L_Complete;
+ if (.@q == 10) goto L_SecondReward;
+ if (.@q == 9) goto L_FirstReward;
+ if (.@q == 8) goto L_SecondTry;
+ if (.@q == 7) goto L_AnwarField;
+ if (.@q == 6) goto L_FirstTry;
+ if (.@q == 5) goto L_TryIt;
+ if (.@q >= 1) goto L_FirstTry;
+ // TODO: "What is this contraband fake potion you have there?! I do not accept potions without the seal of the Magic Academy. They might not work and I won't have warranty."
+
speech
l("Hi there."),
l("Nothing grows in this stupid desert."),
l("I could try to water it, but where to get water.. also a fertility potion could help."),
- l("But I have no water, no potion, no script. *cries* ");
+ l("Maybe you can do a small errand for me?");
+ //l("But I have no water, no potion, no script. *cries* ");
+ select
+ l("Sure!"),
+ l("I'm busy, sorry.");
+ mes "";
+ if (@menu == 1)
+ goto L_Sure;
+ close;
+
+L_Complete:
+ mesn;
+ mesq l("Thanks for saving Tulimshar from a famine. I'll be forever grateful.");
+ next;
+ mesn;
+ mesq l("Dealing with raijin is too bothersome to me.");
+ close;
+
+L_AnwarField:
+ mesn;
+ mesq l("My crops! Hurry up, and talk to Hocus!!");
+ close;
+
+L_Sure:
+ mes "";
+ mesn;
+ mesq l("Great! Hocus, the magic academy grandmaster, is a real Nature mage. He probably makes fertilizers.");
+ next;
+ mesn;
+ mesq l("Please, talk to him. I am too busy tending the crops to go myself.");
+ setq TulimsharQuest_AnwarField, 1;
+ close;
+
+L_FirstTry:
+ mesn;
+ mesq l("Good luck getting the fertilizer from Hocus!");
+ if (countitem(FertilityPotion))
+ mesc l("Anwar will only accept fertility potions certified by the Magic Academy.");
+ close;
+
+L_TryIt:
+ .@q2=getq2(TulimsharQuest_AnwarField);
+ if (!countitem(FertilityPotion)) {
+ mesn;
+ mesq l("Bring me the fertilizer!");
+ close;
+ }
+ mesn;
+ mesq l("You've brought me fertilizer! Let me see if it works...");
+ next;
+ delitem FertilityPotion, 1;
+ setq2 TulimsharQuest_AnwarField, .@q2+1;
+
+ // Fail chances are 100% - 13% per attempt
+ if (rand2(0,100) < 100-(.@q2*13)) {
+ setq1 TulimsharQuest_AnwarField, 6;
+ mesc l("Nothing happens.");
+ next;
+ mesn;
+ mesq l("Uhm, it was not enough. Please bring me another one.");
+ } else {
+ setq1 TulimsharQuest_AnwarField, 7;
+ mesc l("Evil worms crawl from earth and starts devouring the plants!");
+ // Okay, maybe Galimatia's potion was a better idea.
+ next;
+ mesn;
+ mesq l("Uh... That should not happen, right? RIGHT?");
+ next;
+ mesn;
+ mesq l("Don't just stand here! Go fetch help, NOW!!");
+ }
+
+ close;
+
+L_SecondTry:
+ if (!countitem(PurificationPotion)) {
+ mesn;
+ mesq l("Bring me the bug bomb or whatever!");
+ close;
+ }
+ mesn strcharinfo(0);
+ mesq l("Here is a certified(R) purification potion! Hocus just gave me. Hurry up!");
+ next;
+ delitem PurificationPotion, 1;
+ getexp 20, 0;
+ specialeffect(51);
+ setq TulimsharQuest_AnwarField, 9;
+ mesn;
+ mesq l("Thanks God... The crops are safe. Not only that, but the fertilizer works!");
+ next;
+ mesn;
+ mesq l("Ah, that was tiresome... I'll go make a reward for them, talk to me again later.");
+ close;
+
+L_FirstReward:
+ mesn;
+ mesq l("Here are two %s. Please deliver it to them. I hope they'll like it.", getitemlink(SilverBell));
+ setq TulimsharQuest_AnwarField, 10, 0;
+ getitembound(SilverBell, 2, 4); // Prevent accidental item loss
+ close;
+
+L_SecondReward:
+ .@q2=getq2(TulimsharQuest_AnwarField);
+ if (.@q2 < 3){
+ mesn;
+ mesq l("Please deliver the two %s to Eomie and Hocus, and then I'll give you something for your help.", getitemlink(SilverBell));
+ close;
+ }
+ setq TulimsharQuest_AnwarField, 11, 0;
+ getitem SilkPants, 1;
+ getexp 750, 0;
+ mesn;
+ mesq l("Many thanks for your help! Here, take this. I'm sure it can be very useful later. It always is.");
close;
OnInit:
- .bodytype = BODYTYPE_2;
+ .bodytype = BODYTYPE_1;
.distance = 4;
end;
}
diff --git a/npc/020-1/boss.txt b/npc/020-1/boss.txt
new file mode 100644
index 00000000..e45eebed
--- /dev/null
+++ b/npc/020-1/boss.txt
@@ -0,0 +1,43 @@
+// The Mana World Script
+// Author:
+// Jesusalva
+// Description:
+// Controls the boss on 020-1 and the Master Book Learning
+// see npc/items/master_skillbook.txt for explanation about variables
+
+020-1,0,0,0 script #BossCtrl_020-1 NPC_HIDDEN,{
+ end;
+
+// Test server: 5 minutes only
+OnTimer300000:
+ if (!debug)
+ end;
+
+// Otherwise, respawn every 15 minutes
+OnTimer900000:
+ stopnpctimer;
+OnInit:
+ $@MB_0201=0;
+ monster "020-1", 160, 254, strmobinfo(1, GoldenScorpion), GoldenScorpion, 1, "#BossCtrl_020-1::OnBossDeath";
+ end;
+
+OnBossDeath:
+ initnpctimer;
+ BossSlain(.name$, "$@MB_0201");
+ end;
+
+OnBossCheck:
+ @mb_BossId=-1;
+ // TODO: Check if you really fought or was just lurking
+ // Check if party is correct
+ if (getcharid(1) != $@MB_0201)
+ end;
+OnBegin:
+ @mb_BossId=GoldenScorpion;
+ @mb_SkillId=GC_DARKILLUSION;
+ @mb_ItemId=MagicFeather; // Placeholder
+ @mb_ItemAm=1;
+ addtimer(15000, "#MasterBook::OnUnset");
+ end;
+
+}
diff --git a/npc/020-1/eomie.txt b/npc/020-1/eomie.txt
index c96389ca..fad51c21 100644
--- a/npc/020-1/eomie.txt
+++ b/npc/020-1/eomie.txt
@@ -1,15 +1,189 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
+// Jesusalva
// Description:
// Eomie, the real Nature Mage. Whatever Hocus is saying.
-// THIS IS A PLACEHOLDER!
+// ANWAR QUEST PART IS COPY-PASTA FROM MOUBOOTAUR LEGENDS
+// THIS IS A PLACEHOLDER!! The Nature Magic questline is missing.
020-1,76,96,0 script Eomie NPC_EOMIE,{
+ .@q=getq(TulimsharQuest_AnwarField);
+
+ // Results: 6 - nothing. 7- bug feast.
+ // On status 7, you need to talk to Hocus.
+ // Then Hocus will finish stuff for you, and it's reward time.
+ if (.@q == 10) goto L_Gift;
+ if (.@q == 7) goto L_Success;
+ if (.@q == 6) goto L_Fail;
+ if (.@q == 4) goto L_Craft;
+ if (.@q == 3) goto L_Back;
+ if (.@q == 2) goto L_Start;
+ if (.@q == 1) goto L_Refuse;
+
+ // Placeholder dialog
+ if (.@q == 5)
+ mesc l("I still have Anwar's fertilizer with me.");
speech
l("Hi!"),
l("Did you talk to Hocus already? He will tell you about salad, again."),
- l("Sometimes I think he is more a chef but a mage, but oh well, everybody should do what suits him best.");
+ l("Sometimes I think he is more a chef than a mage, but oh well, everybody should do what suits them best.");
+ close;
+
+// READ THE HOLY DIALOGS!!
+L_Refuse:
+ mesn strcharinfo(0);
+ mesq l("Hello! Anwar sent me to get fertilizer to save Tulimshar from famine, could you help me?");
+ next;
+ mesn;
+ mesq l("Not now, I'm busy tending the garden.");
+ close;
+
+L_Start:
+ mesn strcharinfo(0);
+ mesq l("Hello, could I help you in exchange for fertilizer?");
+ next;
+ mesn;
+ mesq l("Actually, yes. The birthday of me and my boyfriend is coming up. He always give me chocolate cake, so I want to surprise him for once. Bring me 12 @@ and I'll make the fertilizer for you.", getitemlink(CherryCake));
+ setq TulimsharQuest_AnwarField, 3;
+ close;
+
+L_Back:
+ mesn;
+ mesq l("So, did you brought me the twelve cherry cakes?");
+ mes "";
+ mesn strcharinfo(0);
+ if (askyesno() != ASK_YES) {
+ close;
+ }
+ mes "";
+ if (countitem("CherryCake") < 12)
+ goto L_Lying;
+
+ delitem CherryCake, 12;
+ getexp 200, 5;
+ setq TulimsharQuest_AnwarField, 4;
+ mesn;
+ mesq l("Okay, that is very useful. However, I do need a few reagents to make it.");
+ next;
+ mesn;
+ mesq l("Please, come back later. I'll see whatever I can fetch for that.");
+ close;
+
+L_Craft:
+ mesn;
+ mesq l("So, for the fertilizer. The thing is, all that thing is unstable.");
+ next;
+ mesn;
+ mesq l("This fertilizer is projected to protect the plants from plagues, bugs, scorpions and maggots, trying to not be a plague itself.");
+ next;
+ mesn;
+ mesq l("I have no way to know how much fertilizer you'll be needing. I need @@ @@ and @@ @@ to make a Certified Fertility Potion for you.", 3, getitemlink(Plushroom), 9, getitemlink(MaggotSlime));
+ next;
+ mesn;
+ mesq l("Give that to whoever needs them, and see if it works. Then come tell me the result. Do you have the reagents?");
+ if (askyesno() != ASK_YES)
+ close;
+ mes "";
+
+ if (countitem(Plushroom) < 3||
+ countitem(MaggotSlime) < 9)
+ goto L_Lying;
+
+ inventoryplace FertilityPotion, 1;
+ delitem Plushroom, 3;
+ delitem MaggotSlime, 9;
+ getitembound(FertilityPotion, 1, IBT_CHARACTER);
+ setq1 TulimsharQuest_AnwarField, 5;
+
+ mesn;
+ mesq l("Here it is. Come back to report the results.");
+ close;
+
+L_Fail:
+ setq1 TulimsharQuest_AnwarField, 4;
+ .@q2=getq2(TulimsharQuest_AnwarField);
+ if (.@q2 < 10)
+ getexp 180-(.@q2*10), 0;
+ else
+ getexp 90, 0;
+ mesn;
+ switch (.@q2) {
+ case 1:
+ mesq l("Well, that could not be enough, I said. Here is some experience.");
+ break;
+ case 2:
+ mesq l("Don't worry, third time is the charm. Here is some experience. Let's try again.");
+ break;
+ case 3:
+ mesq l("Okay, here is some experience, and forgot what I've said before. We can try again.");
+ break;
+ case 4:
+ mesq l("Don't worry, I've tweaked my formula this time. Here is some experience and let's try again!");
+ break;
+ case 5:
+ mesq l("I'm sorry, I just... Maybe if...? Aha! Here's the EXP, ready for a next go?");
+ break;
+ case 6:
+ mesq l("Uhm, maybe I mashed the Plushroom too hard this time. Here's EXP as usual, let's try again?");
+ break;
+ case 7:
+ mesq l("I shall not fail any further, I think my new formula is perfect! Here's the EXP, but I need material to use it!");
+ break;
+ case 8:
+ mesq l("I never knew you could fail THAT hard. I've took Saulc's Fertilizer's recipe, success chance is of 100% if you want to try again.");
+ break;
+ default:
+ mesq l("Well, that could fail, I said. Here is some experience.");
+ break;
+ }
+ next;
+ if (countitem(Plushroom) >= 3 &&
+ countitem(MaggotSlime) >= 9)
+ goto L_Craft;
+ mesn;
+ mesq l("Now go, and fetch the materials again. I'll make another fertilizer for you.");
+ close;
+
+L_Success:
+ mesn;
+ mesq l("WHAT? The farm is plagued with insects?!");
+ next;
+ mesn;
+ mesq l("Quick, tell that to Hocus. No one is better at Nature Magic than Hocus, I'm sure he can help.");
+ close;
+
+L_Gift:
+ .@q2=getq2(TulimsharQuest_AnwarField);
+ if (.@q2 & 1) {
+ mesn;
+ mesq l("Thanks for the nice gift!");
+ close;
+ }
+ // Tip. WHAT DID YOU DID WITH THE BOUND ITEM? IT SHOULD BE HARD TO GET RID OF IT...
+ if (countitem(SilverBell) < 1) {
+ mesn;
+ mesq l("Ah, I wish I got something for helping people out...");
+ close;
+ }
+ mesn strcharinfo(0);
+ mesq l("Anwar sent you this, erm, hum... @@.", getitemlink(SilverBell));
+ next;
+ setq2 TulimsharQuest_AnwarField, .@q2+1;
+ delitem SilverBell, 1;
+ getexp 95, 1;
+ mesn;
+ mesq l("WOW, THIS IS AWESOME! Many, many thanks!!");
+ close;
+
+L_Lying:
+ mesn;
+ mesq l("Ah, so you think you can fool me?");
+ next;
+ percentheal -5, -5;
+ warp "Save", 0, 0;
+ dispbottom l("Ah... Was I warped?");
+ closedialog;
close;
OnInit:
@@ -17,5 +191,3 @@ OnInit:
.distance = 4;
end;
}
-
-
diff --git a/npc/020-1/hocus.txt b/npc/020-1/hocus.txt
index aee036e5..b2202e92 100644
--- a/npc/020-1/hocus.txt
+++ b/npc/020-1/hocus.txt
@@ -7,6 +7,11 @@
// THIS IS A PLACEHOLDER!
020-1,73,91,0 script Hocus NPC_MAGE_BROWN,{
+ function anwarNotMe;
+ function anwarFirstAid;
+ function anwarGift;
+
+ setq2 TonoriQuest_Kylian, getq2(TonoriQuest_Kylian) | KYLIAN_HOCUS;
speech
l("Hi!"),
l("You should eat more salad. I see in your face that your nutrition is not good."),
@@ -20,6 +25,9 @@
select
rif(getq(General_Cooking) == 15, l("Please enlighten me, O Grandmaster, where can I find Salad to improve my eating habits?")),
rif(getq(General_Cooking) == 16, l("I've brought you the promised.")),
+ rif(getq(TulimsharQuest_AnwarField) == 1, l("Hello, do you make Fertility Potions?")),
+ rif(getq(TulimsharQuest_AnwarField) == 7, l("HELP! Anwar field is under worm attack!!")),
+ rif(getq(TulimsharQuest_AnwarField) == 10, l("Anwar sent you a gift.")),
l("Thanks for your wise words.");
mes "";
switch (@menu) {
@@ -64,9 +72,92 @@
getitem BlueberryCake, 1;
setq1 General_Cooking, 17;
break;
+ // Anwar Quest
+ case 3:
+ anwarNotMe();
+ break;
+ case 4:
+ anwarFirstAid();
+ break;
+ case 5:
+ anwarGift();
+ break;
}
close;
+function anwarNotMe {
+ mesn strcharinfo(0);
+ mesq l("Hello Mr. Hocus, kind sir Anwar sent me to fetch some fertilizers to save Tulimshar from famine, if you may?");
+ next;
+ mesn;
+ mesq lg("Sorry kind lady @@, but no.", "Sorry kind sir @@, but no.", strcharinfo(0));
+ next;
+ mesn;
+ mesq l("Or rather, I can't. I would love to help you, just like everybody else, but I don't know how to make fertilizers, only Salad.");
+ next;
+ mesn;
+ mesq l("Eomie probably could do that, she is young but very talented. If you help her, she'll likely help you back.");
+ setq TulimsharQuest_AnwarField, 2;
+ return;
+}
+
+function anwarFirstAid {
+ mesn;
+ mesq l("The crops are under attack? That's terrible!");
+ next;
+ mesn;
+ mesq l("I can do a Certified Purification Potion right away, the warranty covers it. But I still need a few things for it!");
+ next;
+ mesn;
+ mesq l("Do you, perchance, have 2 @@, 2 @@ and 3 @@?", getitemlink(LeftScorpionClaw), getitemlink(RightScorpionClaw), getitemlink(Moss));
+ if (askyesno() != ASK_YES)
+ close;
+ mes "";
+
+ if (countitem(LeftScorpionClaw) < 2 ||
+ countitem(RightScorpionClaw) < 2 ||
+ countitem(Moss) < 3) {
+ mesn;
+ mesq l("Why are you lying? We must cooperate with each other if we want to strive. Otherwise, just like the plants, we will wither and die out. Go fetch the items!");
+ close;
+ }
+
+ inventoryplace PurificationPotion, 1;
+ delitem LeftScorpionClaw, 2;
+ delitem RightScorpionClaw, 2;
+ delitem Moss, 3;
+ getitembound(PurificationPotion, 1, IBT_CHARACTER);
+ setq TulimsharQuest_AnwarField, 8;
+
+ mesn;
+ mesq l("Quick, deliver this to Anwar!");
+ return;
+}
+
+function anwarGift {
+ .@q2=getq2(TulimsharQuest_AnwarField);
+ if (.@q2 & 2) {
+ mesn;
+ mesq l("Thanks for the nice gift!");
+ close;
+ }
+ // Tip. WHAT DID YOU DID WITH THE BOUND ITEM? IT SHOULD BE HARD TO GET RID OF IT...
+ if (countitem(SilverBell) < 1) {
+ mesn;
+ mesq l("Ah, I wish I got something for helping people out...");
+ close;
+ }
+ mesn strcharinfo(0);
+ mesq l("Anwar sent you this, erm, hum... @@.", getitemlink(SilverBell));
+ next;
+ setq2 TulimsharQuest_AnwarField, .@q2+2;
+ delitem SilverBell, 1;
+ getexp 75, 10;
+ mesn;
+ mesq l("WOW, THIS IS AWESOME! Many, many thanks!!");
+ return;
+}
+
OnInit:
.bodytype = BODYTYPE_2;
.distance = 4;
diff --git a/npc/020-1/issay.txt b/npc/020-1/issay.txt
new file mode 100644
index 00000000..5560358c
--- /dev/null
+++ b/npc/020-1/issay.txt
@@ -0,0 +1,16 @@
+// The Mana World scripts.
+// Author:
+// Micksha
+// Description:
+// Issay the Barber.
+// THIS IS A PLACEHOLDER!
+
+020-1,227,179,0 script Issay the Barber NPC_GUMI_THE_DYER,{
+ Barber();
+ close;
+
+OnInit:
+ .bodytype = BODYTYPE_3;
+ .distance = 4;
+ end;
+}
diff --git a/npc/020-1/itka.txt b/npc/020-1/itka.txt
index 679c1792..c332ee5f 100644
--- a/npc/020-1/itka.txt
+++ b/npc/020-1/itka.txt
@@ -10,6 +10,36 @@
l("Hi there."),
l("Come to the bakery! Come to the Market! Come to Prison!"),
l("I will improve, promised. Come to the Academy! Come to Oasis!");
+ do
+ {
+ next;
+ select
+ l("Where is the bakery?"),
+ l("Where is the market?"),
+ l("Where is the prison?"),
+ l("Where is the academy?"),
+ l("Where is the oasis?"),
+ l("Why are you doing this?"),
+ l("Okay... Spammy little girl.");
+ mes "";
+ switch (@menu) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ mesn;
+ mesq l("I don't know! %%Q");
+ break;
+ case 6:
+ mesn;
+ mesq l("To pay my studies!");
+ break;
+ default:
+ close;
+ break;
+ }
+ } while (true);
close;
OnInit:
diff --git a/npc/020-1/joaquim.txt b/npc/020-1/joaquim.txt
new file mode 100644
index 00000000..ad462df0
--- /dev/null
+++ b/npc/020-1/joaquim.txt
@@ -0,0 +1,201 @@
+// The Mana World Script, ported from Moubootaur Legends
+// TMW2 Script, ported from TMW-BR
+// TMW2 Author: Jesusalva
+//
+// Creator: Cardinalli
+// Review: Lunovox <rui.gravata@gmail.com>
+//
+// Description:
+// A rather easy quest to give players what to kill.
+// Reward:
+// Mouboo pendant + 20% exp of level 55
+
+020-1,95,133,4 script Joaquim NPC_MAGE_BLUE,{
+ function joaquimTooWeak;
+ function joaquimWeak;
+ function joaquimComplete;
+ function joaquimFinish;
+ function joaquimDoIt;
+ function joaquimReturn;
+ function joaquimRecipe;
+ function joaquimFound;
+ function joaquimMissing;
+ function joaquimStart;
+
+ .@q=getq(TonoriQuest_Joaquim);
+ if (BaseLevel < 36) joaquimTooWeak();
+ if (BaseLevel < 55) joaquimWeak();
+ switch (.@q) {
+ case 0: joaquimStart(); break;
+ case 1: joaquimFound(); break;
+ case 2: joaquimReturn(); break;
+ case 3: joaquimDoIt(); break;
+ case 4: joaquimFinish(); break;
+ default: joaquimComplete(); break;
+ }
+ close;
+
+function joaquimTooWeak {
+ mesn;
+ mesq l("Hmm, why can't I find swamp yellowherb here in the desert...?");
+ close;
+}
+
+function joaquimWeak {
+ mesn;
+ .@r=rand2(1,5);
+ switch (.@r) {
+ case 1:
+ mesq l("Watch out! My wife was gravely wounded the other day. Tonori monsters are no child play!");
+ break;
+ case 2:
+ mesq l("Ah, I hate mushrooms. Perhaps in future, I could use their spikes and mushies.");
+ break;
+ case 3:
+ mesq l("Ah, I hate snakes. Perhaps in future, I could use their tongues.");
+ break;
+ case 4:
+ mesq l("Ah, I love mouboos. But their steaks, hmm. Ah, no, I shouldn't eat that...");
+ break;
+ case 5:
+ mesq l("You should never sell your Cactus Drinks. They have many uses.");
+ break;
+ }
+ close;
+}
+
+function joaquimComplete {
+ mesn;
+ mesq l("Thanks for helping my wife, I'll be forever grateful.");
+ return;
+}
+
+function joaquimFinish {
+ inventoryplace ElixirOfLife, 1, MoubooPendant, 1;
+ getitem ElixirOfLife, 1;
+ getitem MoubooPendant, 1;
+ quest_xp(.maxLevel, 39260);
+ quest_jxp(.maxLevel, 75);
+ setq TonoriQuest_Joaquim, 5;
+ mesn;
+ mesq l("Take this spare @@ I did. It heals fully and instantly, so don't hesit to use it if you're about to die.", getitemlink(ElixirOfLife));
+ next;
+ mesn;
+ mesq l("Thanks for helping my wife! Here is, an %s. May the Mouboo watch over you! o.o", getitemlink(MoubooPendant));
+ return;
+}
+
+function joaquimDoIt {
+ mesn;
+ mesq l("Please help my wife Yumi, on the Clinic!");
+ return;
+}
+
+// Quest Core
+function joaquimStart {
+ mesn;
+ mesq l("Ohhhhh..... Please, help me!!! My wife is gravely wounded!!");
+ next;
+ mesn strcharinfo(0);
+ mesq l("Calm down! How can I help you?");
+ next;
+ mesn;
+ mesq l("My grandmother gave me a recipe of the %s, it can cure anything but death.", getitemlink(ElixirOfLife));
+ next;
+ mesn;
+ mesq l("I don't remember what I need now, but if you give me a moment, I'll get the list.");
+ setq TonoriQuest_Joaquim, 1;
+ return;
+}
+
+function joaquimFound {
+ mesn;
+ mesq l("I can make an %s, I still have a bottle of fairy blood, a few mana pearls, and some other rare ingredients.", getitemlink(ElixirOfLife));
+ mesq l("It is the non-rare ingredients I actually need help with!");
+ next;
+ joaquimRecipe();
+ next;
+ select
+ l("I will do it, don't worry."),
+ rif(countitem(ElixirOfLife), l("I have one here...")),
+ l("Ahh, too many items. Sorry.");
+ mes "";
+ mesn;
+ if (@menu == 1) {
+ mes lg("Thanks! Thanks! Savior! Hurry up!");
+ setq TonoriQuest_Joaquim, 2;
+ } else if (@menu == 2) {
+ mes l("Uhm, sorry, I don't trust stuff you get at market. You know.");
+ mes l("Full of agrotoxins, transgenics and whatever. Not safe.");
+ } else {
+ mes l("Oh noes, who nows can help my wife? Please reconsider!");
+ }
+ return;
+}
+
+function joaquimReturn {
+ joaquimRecipe();
+ next;
+ select
+ l("I'll be back later with all ingredients."),
+ l("They're with me.");
+ mes "";
+ if (@menu == 1)
+ close;
+
+ if (countitem(CactusDrink) < 100 ||
+ countitem(HardSpike) < 60 ||
+ countitem(SmallMushroom) < 45 ||
+ countitem(SnakeTongue) < 40 ||
+ countitem(BottleOfWater) < 30 ||
+ countitem(BugLeg) < 20 ||
+ countitem(MoubooSteak) < 15)
+ joaquimMissing();
+
+ inventoryplace ElixirOfLife, 1;
+
+ delitem CactusDrink, 100;
+ delitem HardSpike, 60;
+ delitem SmallMushroom, 45;
+ delitem SnakeTongue, 40;
+ delitem BottleOfWater, 30;
+ delitem BugLeg, 20;
+ delitem MoubooSteak, 15;
+ getitem ElixirOfLife, 1;
+ setq TonoriQuest_Joaquim, 3;
+ mesn;
+ mesq l("Thanks, I'll just bake the Elixir right away...!");
+ next;
+ mesc l("%s goes away for a while and returns briefly.", .name$);
+ next;
+ mesn;
+ mesq l("Here, take the Elixir. Please, bring it to my wife! I am counting on you!!");
+ return;
+}
+
+function joaquimMissing {
+ mesn strcharinfo(0);
+ mesq l("Except they're not. I'll be back later.");
+ next;
+ mesn;
+ mesq l("Please, %s! Hurry up!", strcharinfo(0));
+ close;
+}
+
+function joaquimRecipe {
+ mesn l("%s Recipe", getitemlink(ElixirOfLife));
+ mesc l("%d/%d %s", countitem(CactusDrink), 100, getitemlink(CactusDrink));
+ mesc l("%d/%d %s", countitem(HardSpike), 60, getitemlink(HardSpike));
+ mesc l("%d/%d %s", countitem(SmallMushroom), 45, getitemlink(SmallMushroom));
+ mesc l("%d/%d %s", countitem(SnakeTongue), 40, getitemlink(SnakeTongue));
+ mesc l("%d/%d %s", countitem(BottleOfWater), 30, getitemlink(BottleOfWater));
+ mesc l("%d/%d %s", countitem(BugLeg), 20, getitemlink(BugLeg));
+ mesc l("%d/%d %s", countitem(MoubooSteak), 15, getitemlink(MoubooSteak));
+ return;
+}
+
+OnInit:
+ .maxLevel = 75;
+ .distance = 5;
+ end;
+}
diff --git a/npc/020-1/malivox.txt b/npc/020-1/malivox.txt
index 9f2b7787..7d56d77e 100644
--- a/npc/020-1/malivox.txt
+++ b/npc/020-1/malivox.txt
@@ -10,7 +10,11 @@
l("Hi there."),
l("You wonder why here are so many idle market stalls, right?"),
l("This is due to lazyness of Micksha to prepare placeholders."),
- l("Don't steal stuff from them, though. Or you will be imprisoned.");
+ l("Don't steal stuff from them, though. Or you will be imprisoned."),
+ l("What I sell? Well, you can see Mananas... Aquadas... Croc claws..."),
+ l("But they are not for sale! I use them for my custom brew of status reset potions. Are you interested?");
+
+ ConfirmStatusReset();
close;
OnInit:
diff --git a/npc/020-1/martha.txt b/npc/020-1/martha.txt
index 9b22e80e..70eaf1fe 100644
--- a/npc/020-1/martha.txt
+++ b/npc/020-1/martha.txt
@@ -1,4 +1,4 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
diff --git a/npc/020-1/noke.txt b/npc/020-1/noke.txt
index 561cbb74..7365886f 100644
--- a/npc/020-1/noke.txt
+++ b/npc/020-1/noke.txt
@@ -14,7 +14,7 @@
close;
OnInit:
- .bodytype = BODYTYPE_2;
+ .bodytype = BODYTYPE_1;
.distance = 4;
end;
}
diff --git a/npc/020-1/wateranimation.txt b/npc/020-1/wateranimation.txt
new file mode 100644
index 00000000..a539a944
--- /dev/null
+++ b/npc/020-1/wateranimation.txt
@@ -0,0 +1,20 @@
+// The Mana World scripts.
+// Description:
+// Water animations, splash, fishes, etc...
+
+020-1,103,141,0 duplicate(#fish_seawater) #tulim_fish01 NPC_WATER_SPLASH
+020-1,98,144,0 duplicate(#fish_seawater) #tulim_fish02 NPC_WATER_SPLASH
+020-1,94,148,0 duplicate(#fish_seawater) #tulim_fish03 NPC_WATER_SPLASH
+020-1,181,70,0 duplicate(#fish_seawater) #tulim_fish04 NPC_WATER_SPLASH
+020-1,191,94,0 duplicate(#fish_seawater) #tulim_fish05 NPC_WATER_SPLASH
+020-1,182,117,0 duplicate(#fish_seawater) #tulim_fish06 NPC_WATER_SPLASH
+020-1,187,126,0 duplicate(#fish_seawater) #tulim_fish07 NPC_WATER_SPLASH
+020-1,227,159,0 duplicate(#fish_seawater) #tulim_fish08 NPC_WATER_SPLASH
+020-1,238,158,0 duplicate(#fish_seawater) #tulim_fish09 NPC_WATER_SPLASH
+020-1,247,146,0 duplicate(#fish_seawater) #tulim_fish10 NPC_WATER_SPLASH
+020-1,257,127,0 duplicate(#fish_seawater) #tulim_fish11 NPC_WATER_SPLASH
+020-1,263,126,0 duplicate(#fish_seawater) #tulim_fish12 NPC_WATER_SPLASH
+020-1,268,87,0 duplicate(#fish_seawater) #tulim_fish13 NPC_WATER_SPLASH
+020-1,217,155,0 duplicate(#fish_seawater) #tulim_fish14 NPC_WATER_SPLASH
+020-1,295,74,0 duplicate(#fish_seawater) #tulim_fish15 NPC_WATER_SPLASH
+
diff --git a/npc/020-2-10/hetchel.txt b/npc/020-2-10/hetchel.txt
index 5114124e..20084961 100644
--- a/npc/020-2-10/hetchel.txt
+++ b/npc/020-2-10/hetchel.txt
@@ -6,11 +6,25 @@
// THIS IS A PLACEHOLDER!
020-2-10,45,27,0 script Hetchel NPC_HETCHEL,{
+ setq2 TonoriQuest_Kylian, getq2(TonoriQuest_Kylian) | KYLIAN_HETCHEL;
speech
l("Hi there. I am Hetchel, I weave fine textiles."),
l("My best client is Lora Tay, at Dimond's."),
l("So if you want, you can talk to her instead."),
- l("Tailoring is in decline and I have nothing to sell nor teach.");
+ l("Tailoring is in decline and I have nothing to sell nor teach."),
+ l("Unless you want to try doing it yourself?");
+ next;
+ do
+ {
+ mes "";
+ .@s = SmithSystem(CRAFT_TAILORING);
+ if (.@s)
+ mesc l("Success!"), 3;
+ else
+ mesc l("That didn't work!"), 1;
+ next;
+ mesc l("Do you want to continue?");
+ } while (askyesno() != ASK_YES);
close;
OnInit:
diff --git a/npc/020-2-15/_import.txt b/npc/020-2-15/_import.txt
index d6549d49..fba37df5 100644
--- a/npc/020-2-15/_import.txt
+++ b/npc/020-2-15/_import.txt
@@ -1,3 +1,7 @@
-// Map 020-2-15: Large Slum Hut
+// Map 020-2-15: Tulimshar Clinic
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/020-2-15/_warps.txt",
+"npc/020-2-15/eleanore.txt",
+"npc/020-2-15/kadiya.txt",
+"npc/020-2-15/memoriam.txt",
+"npc/020-2-15/yumi.txt",
diff --git a/npc/020-2-15/_warps.txt b/npc/020-2-15/_warps.txt
index a6467391..7e260483 100644
--- a/npc/020-2-15/_warps.txt
+++ b/npc/020-2-15/_warps.txt
@@ -1,3 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
-// Map 020-2-15: Large Slum Hut warps
+// Map 020-2-15: Tulimshar Clinic warps
020-2-15,45,33,0 warp #020-2-15_45_33 0,0,020-1,267,182
diff --git a/npc/020-2-15/eleanore.txt b/npc/020-2-15/eleanore.txt
new file mode 100644
index 00000000..f650d96e
--- /dev/null
+++ b/npc/020-2-15/eleanore.txt
@@ -0,0 +1,16 @@
+// The Mana World Script
+// Author:
+// Jesusalva
+// Description:
+// Elenaore the Healer (aka. Elanore)
+// THIS IS A PLACEHOLDER!
+
+020-2-15,43,27,0 script Eleanore NPC_REBECCA,{
+ mesn;
+ mesq l("Please do not disturb the patients.");
+ close;
+
+OnInit:
+ .distance = 4;
+ end;
+}
diff --git a/npc/020-2-15/kadiya.txt b/npc/020-2-15/kadiya.txt
new file mode 100644
index 00000000..e25ffed0
--- /dev/null
+++ b/npc/020-2-15/kadiya.txt
@@ -0,0 +1,22 @@
+// The Mana World Script
+// Author:
+// Jesusalva
+// Description:
+// Kadiya, Omar's sick daughter
+// THIS IS A PLACEHOLDER!
+
+020-2-15,39,26,0 script Kadiya NPC_TANISHA,{
+ mesn;
+ mesc l("*cough cough*");
+ mesq l("Hello there.");
+ next;
+ mesn;
+ mesc l("*cough cough*");
+ mesq l("Have you seen my father Omar? I bet Micksha took him to drink.");
+ close;
+
+OnInit:
+ .bodytype = BODYTYPE_2;
+ .distance = 4;
+ end;
+}
diff --git a/npc/020-2-15/memoriam.txt b/npc/020-2-15/memoriam.txt
new file mode 100644
index 00000000..041c659a
--- /dev/null
+++ b/npc/020-2-15/memoriam.txt
@@ -0,0 +1,19 @@
+// The Mana World Script
+// Author:
+// Jesusalva
+// Description:
+// Irene Memorial
+
+020-2-15,41,25,0 script Memoriam NPC_PAPER_NOTE,{
+ mes ".:: In Memoriam ::.";
+ mes "";
+ mes "~ Irene Christina ~";
+ mes l("The song in this clinic is dedicated to Irene.");
+ next;
+ mes l("She had seen only twenty hours of this world when she died in her father's arms.");
+ close;
+
+OnInit:
+ .distance = 3;
+ end;
+}
diff --git a/npc/020-2-15/yumi.txt b/npc/020-2-15/yumi.txt
new file mode 100644
index 00000000..8ab5a612
--- /dev/null
+++ b/npc/020-2-15/yumi.txt
@@ -0,0 +1,55 @@
+// TMW2 Script
+// Author: Jesusalva
+// Description:
+// Joaquim's wife.
+// TODO sprite on the bed
+
+020-2-15,33,26,0 script Yumi NPC_EOMIE,{
+ .@q=getq(TonoriQuest_Joaquim);
+ if (.@q > 3) goto L_PostAid;
+ if (.@q == 3) goto L_DoIt;
+ if (BaseLevel > 36) goto L_PreAid;
+
+ mesn;
+ mesq l("Hello. Take care with the Snakes, they're highly poisonous!");
+ close;
+
+L_PreAid:
+ mesn;
+ mesq l("Please... Speak low... I am dying........");
+ next;
+ mesn;
+ mesq l("The nurse... Eleanore is... Doing all she can... To help me, though.");
+ close;
+
+L_PostAid:
+ mesn;
+ mesq l("Ah, I am lively again. I wish I could just raise from this bed and do some exercise, but Eleanore refuses to let me go.");
+ // There could be another quest stage her
+ close;
+
+L_DoIt:
+ if (countitem(ElixirOfLife) < 1)
+ goto L_PreAid;
+
+ inventoryplace ElixirOfLife, 1;
+ delitem ElixirOfLife, 1;
+ quest_xp(.maxLevel, 1000);
+ setq TonoriQuest_Joaquim, 4;
+ mesc l("*gulp* *gulp* *gulp*");
+ next;
+ mesn;
+ mesq l("AAAAAAAHHHHH, Thanks, I am lively again!");
+ next;
+ mesn;
+ mesq l("In fact, I am cured! Hooray!!");
+ close;
+
+OnInit:
+ .minLevel = 36;
+ .maxLevel = 66;
+
+ .bodytype = BODYTYPE_2;
+ .distance = 5;
+ end;
+}
diff --git a/npc/020-2-24/kylian.txt b/npc/020-2-24/kylian.txt
index 446f17bb..cc6bccc0 100644
--- a/npc/020-2-24/kylian.txt
+++ b/npc/020-2-24/kylian.txt
@@ -3,9 +3,16 @@
// Jesusalva
// Description:
// Rich merchant
+// Variables:
+// TonoriQuest_Kylian
+// q1 - State of the Quest
+// q2 - "Know" mask
+// q3 - Timer to return
020-2-24,35,24,0 script Kylian NPC_KPG_MANAGER,{
function kylianLuggage;
+ function kylianGiveLuggage;
+ function kylianLicense;
.@q=getq(TonoriQuest_Kylian);
switch (.@q) {
case 0:
@@ -15,12 +22,15 @@
mesn;
mesq l("Please show Adrian the luggage ticket I gave you.");
break;
+ case 2:
+ kylianGiveLuggage();
+ break;
+ case 3:
+ kylianLicense();
+ break;
default:
mesn;
- mesq l("My name is Kylian. I have some purpose in this world but I don't know what it is yet because devs are too scared to write it.");
- next;
- mesn;
- mesq l("I just dont know what to do. I wish I could take a nap, instead.");
+ mesq l("I wish to take a nap now, so please do not disturb me.");
break;
}
close;
@@ -49,14 +59,72 @@ function kylianLuggage {
mesn;
mesq l("I need you to get my luggage from the docks. Just show this paper to the sailor who's watching the luggage.");
mesc l("%s gives you his ticket, which you promptly store in a safe pocket outside of your inventory.", .name$);
- setq TonoriQuest_Kylian, 1;
+ setq1 TonoriQuest_Kylian, 1;
next;
mesn;
mesq l("I'll be waiting your return.");
return;
}
+function kylianGiveLuggage {
+ if (!countitem(Suitcase)) {
+ mesn;
+ mesq l("Please come back with my %s.", getitemlink(Suitcase));
+ return;
+ }
+ mesn;
+ mesq l("Did you get my luggage from the docks?");
+ select
+ l("Here it is."),
+ l("Don't worry; I'm on my way.");
+ mes "";
+ if (@menu == 2)
+ return;
+ delitem Suitcase, 1;
+ quest_gp(.maxLevel, 100);
+ quest_item(.maxLevel, Acorn, 12);
+ setq1 TonoriQuest_Kylian, 3;
+ mesn;
+ mesq l("Ah! Very good. I have some urgent paperwork that I've been needing to attend to.");
+ next;
+ mesn;
+ mesq l("Before you go, I also happen to have some acorns left over from my trip. You can have them if you wish; they're rather tasty.");
+ mesc l("He gives you some money and acorns.");
+ next;
+ mesn;
+ mesq l("If, however, you don't like them, you could take them to the %s. I heard they use them to make a special kind of flour.", b(l("Tulimshar bakery")));
+ next;
+ kylianLicense();
+ return;
+}
+
+function kylianLicense {
+ mesn;
+ mesq l("I'm a merchant and came to Tulimshar because I'm thinking about establishing a shop here.");
+ next;
+ mesn;
+ mesq l("While I'm going through my papers, could you find out whom I have to talk to about opening up a shop in this city?");
+ if (!(getq2(TonoriQuest_Kylian) & KYLIAN_YANIS))
+ return;
+ next;
+ select
+ l("You need to go and talk to Yanis in the government building."),
+ l("I'll see what I can do.");
+ mes "";
+ if (@menu == 2)
+ return;
+ mesc l("You explain Kylian how to reach the Townhall.");
+ next;
+ quest_gp(.maxLevel, 50);
+ setq1 TonoriQuest_Kylian, 4;
+ setq3 TonoriQuest_Kylian, gettimetick(2)+900; // 15 minutes
+ mesn;
+ mesq l("Ah... excellent! That's very helpful. I need to prepare my papers now. I might have some more questions later on though.");
+ return;
+}
+
OnInit:
+ .maxLevel = 35;
.bodytype = BODYTYPE_3;
.distance = 4;
end;
diff --git a/npc/020-2-34/casino.txt b/npc/020-2-34/casino.txt
index 63a17c9f..06d25fc4 100644
--- a/npc/020-2-34/casino.txt
+++ b/npc/020-2-34/casino.txt
@@ -6,3 +6,12 @@
020-2-34,45,22,0 duplicate(High Lower) Gambler#T1 NPC_HUMAN_MALE_BROTHERHOOD
+// Hot point for Kylian's Quest
+020-2-34,37,34,0 script #HeyCasino NPC_HIDDEN,0,0,{
+ end;
+OnTouch:
+ // TODO: "Donutello : Hey stop there! You are underlevel, you cannot enter!"
+ setq2 TonoriQuest_Kylian, getq2(TonoriQuest_Kylian) | KYLIAN_CASINO;
+ end;
+}
+
diff --git a/npc/020-2-8/_import.txt b/npc/020-2-8/_import.txt
index 410f0b3e..d7122dcb 100644
--- a/npc/020-2-8/_import.txt
+++ b/npc/020-2-8/_import.txt
@@ -1,3 +1,5 @@
// Map 020-2-8: Tulimshar Blacksmith
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/020-2-8/_warps.txt",
+"npc/020-2-8/heathin.txt",
+"npc/020-2-8/jhedia.txt",
diff --git a/npc/020-2-9/heathin.txt b/npc/020-2-8/heathin.txt
index 7c0e1a57..6f1a9f26 100644
--- a/npc/020-2-9/heathin.txt
+++ b/npc/020-2-8/heathin.txt
@@ -5,7 +5,7 @@
// Heathin, Tulimshar's smith.
// THIS IS A PLACEHOLDER!
-020-2-9,36,23,0 script Heathin NPC_ANGUS_THE_SMITH,{
+020-2-8,36,23,0 script Heathin NPC_ANGUS_THE_SMITH,{
speech
l("Hi there."),
l("Looks like someone ran out of ideas for placeholder NPCs."),
diff --git a/npc/020-2-9/jhedia.txt b/npc/020-2-8/jhedia.txt
index 3f24d448..ee412001 100644
--- a/npc/020-2-9/jhedia.txt
+++ b/npc/020-2-8/jhedia.txt
@@ -1,11 +1,11 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
// Jhedia, Apprentice of Tulimshar's smith Heathin.
// THIS IS A PLACEHOLDER!
-020-2-9,42,26,0 script Jhedia NPC_YOUNG_MAN_IN_PINK,{
+020-2-8,42,24,0 script Jhedia NPC_YOUNG_MAN_IN_PINK,{
speech
l("Hi there."),
l("Looks like someone ran out of ideas for placeholder NPCs."),
@@ -14,7 +14,6 @@
close;
OnInit:
- .bodytype = BODYTYPE_2;
.distance = 4;
end;
}
diff --git a/npc/020-2-9/_import.txt b/npc/020-2-9/_import.txt
index d8d9c07d..bd0771e3 100644
--- a/npc/020-2-9/_import.txt
+++ b/npc/020-2-9/_import.txt
@@ -1,6 +1,5 @@
// Map 020-2-9: Tulimshar Townhall
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/020-2-9/_warps.txt",
-"npc/020-2-9/heathin.txt",
"npc/020-2-9/hydusun.txt",
-"npc/020-2-9/jhedia.txt",
+"npc/020-2-9/yanis.txt",
diff --git a/npc/020-2-9/yanis.txt b/npc/020-2-9/yanis.txt
new file mode 100644
index 00000000..d5c8ea53
--- /dev/null
+++ b/npc/020-2-9/yanis.txt
@@ -0,0 +1,18 @@
+// The Mana World scripts.
+// Author:
+// Jesusalva
+// Description:
+// Yanis, town bureaucrat
+// THIS IS A PLACEHOLDER!
+
+020-2-9,44,27,0 script Yanis NPC_ELVEN_MAN_STANDING,{
+ setq2 TonoriQuest_Kylian, getq2(TonoriQuest_Kylian) | KYLIAN_YANIS;
+ mesn;
+ mesq l("Welcome. I'm handling issues with trading licenses for the shop owners in Tulimshar. Can I help you?");
+ // TODO: Livio and mifristcher are working here so I'll not write this script.
+ close;
+
+OnInit:
+ .distance = 4;
+ end;
+}
diff --git a/npc/commands/music.txt b/npc/commands/music.txt
index 4803e7eb..b817b949 100644
--- a/npc/commands/music.txt
+++ b/npc/commands/music.txt
@@ -23,13 +23,29 @@ OnCall:
// TODO: tmw-like argv splitter
.@map$ = getmap();
- .@key$ = strtolower(.@atcmd_parameters$[0]);
- .@m$ = htget(.hash, .@key$, "Not found");
+ .@m$ = strtolower(.@atcmd_parameters$[0]);
- if (.@m$ == "Not found")
+ // GMs might not know and want a list of musics
+ if (.@m$ == "" || .@m$ == "list") {
+ .@r$="list";
+
+ freeloop(true);
+ .@size=getarraysize($MUSIC_ARRAY$);
+ for (.@i = 0; .@i < .@size; ++.@i) {
+ .@r$+=", "+$MUSIC_ARRAY$[.@i];
+ }
+ freeloop(false);
+
+ dispbottom("Music list: "+.@r$);
+ end;
+ }
+
+ .@key = array_exists($MUSIC_ARRAY$, .@m$);
+
+ if (!.@key)
{
- .@m$ = implode(.@atcmd_parameters$[0], " ");
- message(getcharid(CHAR_ID_ACCOUNT), sprintf("Can't broadcast: %s", .@m$));
+ //.@m$ = implode(.@atcmd_parameters$[0], " ");
+ message(getcharid(CHAR_ID_ACCOUNT), sprintf("Can't broadcast: %s.ogg", .@m$));
} else {
message(getcharid(CHAR_ID_ACCOUNT), sprintf("Now broadcasting: %s", .@m$));
changemusic .@map$, .@m$ + ".ogg";
@@ -37,13 +53,15 @@ OnCall:
end;
OnMyself:
- .@key$ = strtolower(.@atcmd_parameters$[0]);
- .@m$ = htget(.hash, .@key$, "Not found");
+ .@m$ = strtolower(.@atcmd_parameters$[0]);
+ .@key = array_exists($MUSIC_ARRAY$, .@m$);
+
+ // TODO: Check if you have the music unlocked? Bitmask? Array?
- if (.@m$ == "Not found")
+ if (!.@key)
{
- .@m$ = implode(.@atcmd_parameters$[0], " ");
- message(getcharid(CHAR_ID_ACCOUNT), sprintf("Can't play: %s", .@m$));
+ //.@m$ = implode(.@atcmd_parameters$[0], " ");
+ message(getcharid(CHAR_ID_ACCOUNT), sprintf("Can't play: %s.ogg", .@m$));
} else {
message(getcharid(CHAR_ID_ACCOUNT), sprintf("Now playing: %s", .@m$));
changeplayermusic .@m$ + ".ogg";
@@ -53,11 +71,5 @@ OnMyself:
OnInit:
bindatcmd "music", "@music::OnCall", 0, 99, 1;
bindatcmd "jukebox", "@music::OnMyself", 0, 50, 0;
-
- .hash = htnew; // create hashtable
- htput(.hash, "forest", "bartk - in the forest of the birches");
- htput(.hash, "adventure", "bartk - the adventure begins");
- htput(.hash, "fun", "eric matyas - ghoulish fun");
- htput(.hash, "surreal", "eric matyas - surreal place");
- htput(.hash, "ocean", "ezili - ocean sounds");
+ end;
}
diff --git a/npc/functions/barber.txt b/npc/functions/barber.txt
index 3d2e3014..54402750 100644
--- a/npc/functions/barber.txt
+++ b/npc/functions/barber.txt
@@ -7,6 +7,8 @@
// Description:
// Function for supporting barber NPC.
+// BarberSayStyle({what})
+// what: 1 = Style; 2 = Color; 3 = Style + Color in dialog
function script BarberSayStyle {
.@get_color = getlook(LOOK_HAIR_COLOR);
@@ -14,7 +16,7 @@ function script BarberSayStyle {
.@style_name$ = $@hairstyle$[.@get_look];
.@color_name$ = $@haircolor$[.@get_color];
- switch (getarg(0))
+ switch (getarg(0, 3))
{
case 1:
message strcharinfo(0), l("@@", .@style_name$);
@@ -59,7 +61,7 @@ function script BarberChangeStyle {
} while (.@rand_hair == getlook(LOOK_HAIR));
setlook LOOK_HAIR, .@rand_hair;
setlook LOOK_HAIR_COLOR, getlook(LOOK_HAIR_COLOR);
- BarberSayStyle 1;
+ BarberSayStyle(1);
break;
default:
// and here "- 1" because the first choice is taken by the random
@@ -98,7 +100,7 @@ function script BarberChangeColor {
.@rand_color = rand(0, .@hairsizearray);
} while (.@rand_color == getlook(LOOK_HAIR_COLOR));
setlook LOOK_HAIR_COLOR, .@rand_color;
- BarberSayStyle 2;
+ BarberSayStyle(2);
break;
default:
setlook LOOK_HAIR_COLOR, (@menu - 2);
@@ -138,9 +140,9 @@ function script BarberChangeRace {
mes l("What's your race?");
menuint
- get_race(GETRACE_FULL, KaizeiViro), KaizeiViro,
- get_race(GETRACE_FULL, ArgaesViro), ArgaesViro,
- get_race(GETRACE_FULL, TonoriViro), TonoriViro,
+ get_race(GETRACE_FULL, KaizeiTalpan), KaizeiTalpan,
+ get_race(GETRACE_FULL, ArgaesTalpan), ArgaesTalpan,
+ get_race(GETRACE_FULL, TonoriTalpan), TonoriTalpan,
get_race(GETRACE_FULL, CaveUkar), CaveUkar,
get_race(GETRACE_FULL, MountainUkar), MountainUkar,
get_race(GETRACE_FULL, SeaTritan), SeaTritan,
@@ -163,3 +165,56 @@ function script BarberChangeRace {
jobchange(@menuret); // STUPID idea, but imposed by Hercules
return;
}
+
+// Jack of all trades
+// Barber({intro=True})
+function script Barber {
+ if (getarg(0, true)) {
+ mesn;
+ mesq lg("Hello, young lady.", "Hello, young man.");
+ next;
+ }
+ mesq l("What would you like me to do?");
+ next;
+ do
+ {
+ select
+ l("What is my current hairstyle and hair color?"),
+ l("I'd like to get a different style."),
+ l("Can you do something with my color?"),
+ l("How about changing my body type?"),
+ l("I'm fine for now, thank you.");
+
+ switch (@menu)
+ {
+ case 1:
+ BarberSayStyle();
+ break;
+ case 2:
+ BarberChangeStyle;
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Enjoy your new style."),
+ l("Anything else?");
+ break;
+ case 3:
+ BarberChangeColor;
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("I hope you like this color."),
+ l("Anything else?");
+ break;
+ case 4:
+ BarberChangeBodyType();
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("You look fantastic."),
+ l("Anything else?");
+ break;
+ case 5:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Feel free to come visit me another time.");
+
+ goodbye;
+ }
+ } while (true);
+ return;
+}
+
diff --git a/npc/functions/crafting.txt b/npc/functions/crafting.txt
index 05a9d9a6..fa5fa84e 100644
--- a/npc/functions/crafting.txt
+++ b/npc/functions/crafting.txt
@@ -1,6 +1,7 @@
// Moubootaur Legends Script
// Author:
// Jesusalva
+// Gumi
// Description:
// Smith System (Unified)
// Notes:
@@ -80,7 +81,8 @@ function script SmithSystem {
// I'm using the same EXP formula from Moubootaur Legends
// Which is based on the item sell price
.@xp=getiteminfo(.@it, ITEMINFO_SELLPRICE);
- getexp .@xp+BaseLevel, (.@xp/3)+BaseLevel+JobLevel;
+ quest_xp(.@lv+10, .@xp+BaseLevel);
+ quest_jxp(.@lv+10, (.@xp/3)+BaseLevel+JobLevel);
.success=true;
} else {
.success=false;
diff --git a/npc/functions/fishing.txt b/npc/functions/fishing.txt
index fee0acb7..4dcb4882 100644
--- a/npc/functions/fishing.txt
+++ b/npc/functions/fishing.txt
@@ -3,6 +3,8 @@
// gumi
// omatt
// Travolta
+// Reid
+// Jesusalva
// Description:
// Fishing functions.
// Variable
@@ -287,3 +289,113 @@ function script fishing {
return 0;
}
+
+
+////////////////////
+// Fishing Templates
+
+// #fish_basic - has only carps (freshwater)
+- script #fish_basic NPC_WATER_SPLASH,{
+
+ fishing(); // begin or continue fishing
+ close;
+
+OnInit:
+ .distance = 5;
+ setarray .fish_ids, 0,
+ CommonCarp, 25,
+ GrassCarp, 1;
+ .fishing_rod = FishingRod; // Equipment to fish here
+ .catch_time = 5000; // must catch the fish within X ms after the line sinks
+ .wait_time_min = 4000; // min amount of time to wait for the line to sink
+ .wait_time_max = 18000; // max amount of time to wait for the line to sink
+ end;
+}
+
+
+// #fish_seawater - has only tuna
+- script #fish_seawater NPC_WATER_SPLASH,{
+
+ fishing(); // begin or continue fishing
+ close;
+
+OnInit:
+ .distance = 5;
+ setarray .fish_ids, 0,
+ Tuna, 15,
+ Salmon, 1;
+ .fishing_rod = FishingRod; // Equipment to fish here
+ .catch_time = 4000; // must catch the fish within X ms after the line sinks
+ .wait_time_min = 8000; // min amount of time to wait for the line to sink
+ .wait_time_max = 18000; // max amount of time to wait for the line to sink
+ end;
+}
+
+
+
+// #fish_river - A balanced fishing spot for Woodlands (Trout)
+- script #fish_river NPC_WATER_SPLASH,{
+
+ fishing(); // begin or continue fishing
+ close;
+
+OnInit:
+ .distance = 5;
+ setarray .fish_ids, 0,
+ CommonCarp, 25,
+ Trout, 20,
+ GrassCarp, 5,
+ Salmon, 1;
+ .fishing_rod = FishingRod; // Equipment to fish here
+ .catch_time = 5500; // must catch the fish within X ms after the line sinks
+ .wait_time_min = 5000; // min amount of time to wait for the line to sink
+ .wait_time_max = 16000; // max amount of time to wait for the line to sink
+ end;
+}
+
+
+
+
+// #fish_river2 - A balanced fishing spot for Candor (Salmon)
+- script #fish_river2 NPC_WATER_SPLASH,{
+
+ fishing(); // begin or continue fishing
+ close;
+
+OnInit:
+ .distance = 5;
+ setarray .fish_ids, 0,
+ CommonCarp, 25,
+ Salmon, 20,
+ GrassCarp, 5,
+ Trout, 1;
+ .fishing_rod = FishingRod; // Equipment to fish here
+ .catch_time = 5500; // must catch the fish within X ms after the line sinks
+ .wait_time_min = 5000; // min amount of time to wait for the line to sink
+ .wait_time_max = 16000; // max amount of time to wait for the line to sink
+ end;
+}
+
+
+
+
+// #fish_frozen - A fishing spot with cold waters (for Nivalis)
+- script #fish_frozen NPC_WATER_SPLASH,{
+
+ fishing(); // begin or continue fishing
+ close;
+
+OnInit:
+ .distance = 5;
+ setarray .fish_ids, 0,
+ CommonCarp, 25,
+ Codfish, 20,
+ GrassCarp, 5,
+ Salmon, 1;
+ .fishing_rod = FishingRod; // Equipment to fish here
+ .catch_time = 5500; // must catch the fish within X ms after the line sinks
+ .wait_time_min = 5000; // min amount of time to wait for the line to sink
+ .wait_time_max = 16000; // max amount of time to wait for the line to sink
+ end;
+}
+
diff --git a/npc/functions/main.txt b/npc/functions/main.txt
index 3be6b6fb..28b61c7c 100644
--- a/npc/functions/main.txt
+++ b/npc/functions/main.txt
@@ -289,7 +289,7 @@ function script get_race {
// We also allow this to run without player attached for... science.
if (playerattached())
{
- setarray .@allraces$, l("Viro"), l("Viro"), l("Viro"),
+ setarray .@allraces$, l("Human"), l("Human"), l("Human"),
l("Ukar"), l("Ukar"),
l("Tritan"), l("Tritan"),
l("Raijin"), l("Raijin"),
@@ -302,7 +302,7 @@ function script get_race {
}
else
{
- setarray .@allraces$, ("Viro"), ("Viro"), ("Viro"),
+ setarray .@allraces$, ("Human"), ("Human"), ("Human"),
("Ukar"), ("Ukar"),
("Tritan"), ("Tritan"),
("Raijin"), ("Raijin"),
@@ -365,3 +365,81 @@ function script getmap {
return getmapname();
}
+// Quest Rewards
+// quest_xp(maxLevel, reward, {multiplier=1})
+function script quest_xp {
+ //.@minLevel=getarg(0);
+ .@maxLevel=getarg(0);
+ .@reward=getarg(1);
+ .@mult=getarg(2, 1);
+ if (BaseLevel <= .@maxLevel) {
+ getexp .@reward*.@mult, 0;
+ return;
+ }
+ // You'll forsake 2% every over level
+ .@mult*=100;
+ .@mult-=((BaseLevel - .@maxLevel) * 2);
+ .@mult=max(10, .@mult);
+ getexp .@reward*.@mult/100, 0;
+ return;
+}
+
+// quest_jxp(maxLevel, reward, {multiplier=1})
+function script quest_jxp {
+ //.@minLevel=getarg(0);
+ .@maxLevel=getarg(0);
+ .@reward=getarg(1);
+ .@mult=getarg(2, 1);
+ if (BaseLevel < .@maxLevel) {
+ getexp 0, .@reward*.@mult;
+ return;
+ }
+ // You'll forsake 2% every over level
+ .@mult*=100;
+ .@mult-=((BaseLevel - .@maxLevel) * 2);
+ .@mult=max(10, .@mult);
+ getexp 0, .@reward*.@mult/100;
+ return;
+}
+
+// quest_gp(maxLevel, reward, {multiplier=1})
+function script quest_gp {
+ //.@minLevel=getarg(0);
+ .@maxLevel=getarg(0);
+ .@reward=getarg(1);
+ .@mult=getarg(2, 1);
+ if (BaseLevel <= .@maxLevel) {
+ Zeny+=.@reward*.@mult;
+ return;
+ }
+ // You'll forsake 2% every over level
+ .@mult*=100;
+ .@mult-=((BaseLevel - .@maxLevel) * 2);
+ .@mult=max(10, .@mult);
+ Zeny+=.@reward*.@mult/100;
+ return;
+}
+
+// quest_item(maxLevel, item, {amount=1}, {bound=0})
+function script quest_item {
+ //.@minLevel=getarg(0);
+ .@maxLevel=getarg(0);
+ .@reward=getarg(1);
+ .@mult=getarg(2, 1);
+ .@bind=getarg(3, 0);
+ // Item will not be obtained if you are overlevel
+ if (BaseLevel > .@maxLevel && .@mult <= 1)
+ return;
+ // If it comes in pairs, you'll only get 1
+ if (BaseLevel > .@maxLevel)
+ .@mult=1;
+ // Obtain item bound if needed
+ if (.@bind)
+ getitembound .@reward, .@mult, .@bind;
+ else
+ getitem .@reward, .@mult;
+ return;
+}
+
+
+
diff --git a/npc/functions/music.txt b/npc/functions/music.txt
index c8937583..18a8fbe7 100644
--- a/npc/functions/music.txt
+++ b/npc/functions/music.txt
@@ -2,6 +2,7 @@
// Author:
// Jesusalva
// Gumi
+// Ledmitz
// Description:
// Music functions
//
@@ -11,18 +12,19 @@
// "jukebox"::HurnscaldPrompt(); → Makes a menuint for selecting hurns tracks
// "jukebox"::JukeboxMusic(ID); → Changes music based on prompted ID
// "jukebox"::BroadcastMusic(MAP, ID); → Changes music based on prompted ID
+// TODO: Check if you have the music unlocked? Bitmask? Array?
- script jukebox 32767,{
end;
// Helpers
public function JukeboxMusic {
- changeplayermusic .MUSIC_ARRAY[getarg(0)];
+ changeplayermusic $MUSIC_ARRAY$[getarg(0)] + ".ogg";
return;
}
public function BroadcastMusic {
- changemusic getarg(0), .MUSIC_ARRAY[getarg(1)];
+ changemusic getarg(0), $MUSIC_ARRAY$[getarg(1)] + ".ogg";
return;
}
@@ -32,9 +34,10 @@ public function BroadcastMusic {
public function HurnscaldPrompt {
menuint
"Cancel", -1,
- "Forest of Birches", 0,
- "Adventure Begins", 1,
- "Magick Real", 5;
+ "Johanne - Forest of Birches", 0,
+ "Artis - Adventure Begins", 1,
+ "Argaes - Dariunas' Forest", 20,
+ "Hurnscald - Magick Real", 5;
mes "";
if (@menuret == -1)
close;
@@ -43,15 +46,42 @@ public function HurnscaldPrompt {
// Initialize stuff which will be needed
OnInit:
- .MUSIC_ARRAY[0] = "bartk - in the forest of the birches.ogg";
- .MUSIC_ARRAY[1] = "bartk - the adventure begins.ogg";
- .MUSIC_ARRAY[2] = "eric matyas - ghoulish fun.ogg";
- .MUSIC_ARRAY[3] = "eric matyas - surreal place.ogg";
- .MUSIC_ARRAY[4] = "ezili - ocean sounds.ogg";
- .MUSIC_ARRAY[5] = "magick - real.ogg";
+ $MUSIC_ARRAY$[0] = "johanne";
+ $MUSIC_ARRAY$[1] = "artis";
+ $MUSIC_ARRAY$[2] = "ghoulish";
+ $MUSIC_ARRAY$[3] = "surreal";
+ $MUSIC_ARRAY$[4] = "ocean";
+ $MUSIC_ARRAY$[5] = "real";
+ $MUSIC_ARRAY$[6] = "academy";
+ $MUSIC_ARRAY$[7] = "bandit";
+ $MUSIC_ARRAY$[8] = "barbarians";
+ $MUSIC_ARRAY$[9] = "botcheck";
+ $MUSIC_ARRAY$[10] = "candor";
+ $MUSIC_ARRAY$[11] = "cavesong";
+ $MUSIC_ARRAY$[12] = "chilling";
+ $MUSIC_ARRAY$[13] = "cloudcall";
+ $MUSIC_ARRAY$[14] = "crypt";
+ $MUSIC_ARRAY$[15] = "despair";
+ $MUSIC_ARRAY$[16] = "dimond";
+ $MUSIC_ARRAY$[17] = "explorer";
+ $MUSIC_ARRAY$[18] = "faith";
+ $MUSIC_ARRAY$[19] = "fire";
+ $MUSIC_ARRAY$[20] = "forest";
+ $MUSIC_ARRAY$[21] = "graveyard";
+ $MUSIC_ARRAY$[22] = "hurns";
+ $MUSIC_ARRAY$[23] = "marine";
+ $MUSIC_ARRAY$[24] = "mystique";
+ $MUSIC_ARRAY$[25] = "nightcall";
+ $MUSIC_ARRAY$[26] = "nivalis";
+ $MUSIC_ARRAY$[27] = "ocean";
+ $MUSIC_ARRAY$[28] = "peace";
+ $MUSIC_ARRAY$[29] = "reid";
+ $MUSIC_ARRAY$[30] = "sewer";
+ $MUSIC_ARRAY$[31] = "store";
+ $MUSIC_ARRAY$[32] = "swamp";
+ $MUSIC_ARRAY$[33] = "thunderstorm";
+ $MUSIC_ARRAY$[34] = "waterlude";
+ $MUSIC_ARRAY$[35] = "xmas";
end;
}
-
-
-
diff --git a/npc/functions/resetstatus.txt b/npc/functions/resetstatus.txt
new file mode 100644
index 00000000..bb4b22b4
--- /dev/null
+++ b/npc/functions/resetstatus.txt
@@ -0,0 +1,117 @@
+// Moubootaur Legends Script.
+// Authors:
+// Vasily_Makarov (original from Evol)
+// Jesusalva
+// Description:
+// Status Reset NPC utils
+
+// Reset status and return permanent bonuses
+// StatusResetReinvest( {script=True} )
+function script StatusResetReinvest {
+ /* XXX: Uncommment this for ML Permanent Boost Status Fruit System :XXX
+ // Compulsory check
+ if (getarg(0, true)) {
+ inventoryplace NPCEyes, 6;
+ } else if (!checkweight(NPCEyes, 6)) {
+ getitembound StatusResetPotion, 1, 4;
+ dispbottom l("You cannot carry the fruits.");
+ end; // Die
+ }
+
+ // Permanent boosts were now lost, return the fruits
+ if (STATUSUP_STR) {
+ getitembound StrengthFruit, STATUSUP_STR, 4;
+ STATUSUP_STR=0;
+ }
+ if (STATUSUP_AGI) {
+ getitembound AgilityFruit, STATUSUP_AGI, 4;
+ STATUSUP_AGI=0;
+ }
+ if (STATUSUP_VIT) {
+ getitembound VitalityFruit, STATUSUP_VIT, 4;
+ STATUSUP_VIT=0;
+ }
+ if (STATUSUP_INT) {
+ getitembound IntelligenceFruit, STATUSUP_INT, 4;
+ STATUSUP_INT=0;
+ }
+ if (STATUSUP_DEX) {
+ getitembound DexterityFruit, STATUSUP_DEX, 4;
+ STATUSUP_DEX=0;
+ }
+ if (STATUSUP_LUK) {
+ getitembound LuckFruit, STATUSUP_LUK, 4;
+ STATUSUP_LUK=0;
+ }
+ */
+ resetstatus();
+ return true;
+}
+
+// Return wasSP on success, 0 on failure
+// ConfirmReset( {price} )
+function script ConfirmStatusReset {
+ if (BaseLevel >= 15)
+ .@raw_price=(1000-BaseLevel*10+(BaseLevel*18));
+ else if (BaseLevel >= 10)
+ .@raw_price=(BaseLevel*210-(10*210))/(BaseLevel/10);
+ else
+ .@raw_price=1;
+
+ if (getarg(0,-1) >= 0)
+ .@raw_price=getarg(0,-1);
+
+ //mesc l("WARNING: Permanent boosts will return to their fruit form."), 1;
+ mesc l("WARNING: Status resets cannot be reverted!"), 1;
+
+ switch (select(lg("Yes, I am sure. Please reset my status!"),
+ lg("I need to think about it..."),
+ lg("I won't need it, thank you.")))
+ {
+ case 1:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Let me just have a quick look at you. Hm... I will need %d GP to reset your stats.", .@raw_price);
+
+ select
+ rif(Zeny >= .@raw_price, l("Here, take as much as you need, I have plenty!")),
+ rif(Zeny > 0 && Zeny < .@raw_price, l("I don't have enough money...")),
+ rif(Zeny == 0, l("Oh no, I don't have any money on me right now.")),
+ l("I have to go, sorry.");
+
+ if (@menu > 1) {
+ return 0;
+ }
+
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Thank you."),
+ l("Now stand still... It should not take much time...");
+
+ // Reset status have an inventorycheck, so we charge later.
+ .@wasSP = StatusPoint;
+ StatusResetReinvest();
+
+ // Nothing to do: Do not charge (eg. you just got the fruits back)
+ if (StatusPoint == .@wasSP) {
+ speech S_LAST_NEXT,
+ l("It seems that you have no status points to reset!"),
+ l("Come back when you will really need me.");
+ } else {
+ Zeny-=.@raw_price;
+ speech S_LAST_NEXT,
+ l("Let's see... @@ of your status points have just been reset!", StatusPoint - .@wasSP),
+ l("Spend it wisely this time."),
+ l("But you are welcome to reset your stats again! I need the money.");
+ }
+ return .@wasSP;
+
+ case 2:
+ return 0;
+ case 3:
+ return 0;
+ }
+ //Exception("Unknown Error: ConfirmStatusReset() failed");
+ consolemes(CONSOLEMES_ERROR, "Unknown Error: ConfirmStatusReset() failed");
+ return 0;
+
+}
+
diff --git a/npc/functions/soul-menhir.txt b/npc/functions/soul-menhir.txt
new file mode 100644
index 00000000..3d4344c9
--- /dev/null
+++ b/npc/functions/soul-menhir.txt
@@ -0,0 +1,75 @@
+// Evol scripts.
+// Author:
+// gumi
+// Jesusalva
+// Description:
+// place of power, mana refills faster when sitting nearby
+
+- script Soul Menhir NPC_HIDDEN,{
+ if (!@menhir_meditation_message)
+ {
+ dispbottom(l("You feel a strong magic aura. You want to sit near it and meditate."));
+ @menhir_meditation_message=1;
+ }
+ 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:
+ // Placeholder menhir doesn't have to run
+ if (.name$ == "Soul Menhir")
+ end;
+
+ // "Next-Generation" parsing system
+ // Syntax: RATE_DISTANCE_TIMER
+ // Soul Menhir#town_rate_dist_timer
+ // example
+ // Soul Menhir#hurns_1_7_200
+ .@n$=strnpcinfo(0, "_0_0_0");
+ explode(.@ni$, .@n$, "_");
+ .refill_rate=atoi(.@ni$[1]);
+ .refill_distance=atoi(.@ni$[2]);
+ .refill_timer=atoi(.@ni$[3]);
+
+ // number of SP to give every refill
+ if (!.refill_rate)
+ .refill_rate = 1;
+ // max distance
+ if (.refill_distance < 0)
+ .refill_distance = 7;
+ // wait rand(X) ms before refill
+ if (.refill_timer < 1)
+ .refill_timer = 200;
+
+ initnpctimer();
+ end;
+}
diff --git a/npc/items/master_skillbook.txt b/npc/items/master_skillbook.txt
index efd582a4..b191ad9e 100644
--- a/npc/items/master_skillbook.txt
+++ b/npc/items/master_skillbook.txt
@@ -1,4 +1,4 @@
-// Evol script.
+// The Mana World script.
// Author:
// Jesusalva
// Elvano
@@ -82,6 +82,7 @@
// Allow you to check which skills are here to learn
mes "";
mesc l("You have: @@/@@ @@", countitem(@mb_ItemId), @mb_ItemAm, getitemlink(@mb_ItemId));
+ mesc l("Skill Available: %s", getskillname(@mb_SkillId));
select
rif(!getskilllv(@mb_SkillId), l("Learn Skill")),
l("Do not learn");
@@ -126,4 +127,39 @@ OnInit:
.bodytype = BODYTYPE_1;
.distance = 1;
end;
+
+OnUnset:
+ @mb_BossId=0;
+ @mb_SkillId=0;
+ @mb_ItemId=0;
+ @mb_ItemAm=0;
+ end;
+}
+
+// Script Helper
+// BossSlain(npcname, "variable")
+function script BossSlain {
+ .@n$=getarg(0);
+ // Error
+ if (!playerattached())
+ return;
+ // Only the party which defeated the boss can learn the skill
+ getmapxy(.@m$, .@x, .@y, 0);
+ .@party=getcharid(1);
+ if (.@party > 0)
+ {
+ setd(getarg(1), .@party);
+ areatimer(.@m$, .@x-15, .@y-15, .@x+15, .@y+15, 10, .@n$+"::OnBossCheck");
+ mapannounce .@m$, "Boss deafeated by Party: " + getpartyname(.@party), bc_all;
+ }
+ else
+ {
+ setd(getarg(1), -2);
+ areatimer(.@m$, .@x-15, .@y-15, .@x+15, .@y+15, 10, .@n$+"::OnBossCheck");
+ addtimer(20, .@n$+"::OnBegin");
+ mapannounce .@m$, "Boss deafeated by: " + strcharinfo(0), bc_all;
+ }
+ return;
}
+
+
diff --git a/npc/scripts.conf b/npc/scripts.conf
index 514339c2..210a1d78 100644
--- a/npc/scripts.conf
+++ b/npc/scripts.conf
@@ -22,10 +22,10 @@
"npc/functions/vault.txt",
"npc/functions/player-cache.txt",
"npc/functions/asleep.txt",
-"npc/functions/barber.txt",
"npc/functions/clientversion.txt",
"npc/functions/doors.txt",
"npc/functions/goodbye.txt",
+"npc/functions/barber.txt",
"npc/functions/global_event_handler.txt",
"npc/functions/hammocks.txt",
"npc/functions/harbours.txt",
@@ -55,6 +55,7 @@
"npc/functions/confused-tree-dict.txt",
"npc/functions/treasure.txt",
"npc/functions/afk.txt",
+"npc/functions/resetstatus.txt",
// May rely on custom functions and thus must be handled by last
"npc/functions/util.txt",
@@ -69,6 +70,7 @@
"npc/functions/casino.txt",
"npc/functions/daily.txt",
"npc/functions/libquest.txt",
+"npc/functions/soul-menhir.txt",
// Quest debug
"npc/functions/quest-debug/functions.txt",