summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesusaves <cpntb1@ymail.com>2020-10-24 12:48:53 +0000
committerJesusaves <cpntb1@ymail.com>2020-10-24 12:48:53 +0000
commit1a3d323af19764546552b1d621c65303c1fb3005 (patch)
tree5e70a62dc756d5a10fe558fe6e3efefcf5ef1a97
parent8077efb70e0af1c54a84859f73c96de21c60107b (diff)
downloadserverdata-1a3d323af19764546552b1d621c65303c1fb3005.tar.gz
serverdata-1a3d323af19764546552b1d621c65303c1fb3005.tar.bz2
serverdata-1a3d323af19764546552b1d621c65303c1fb3005.tar.xz
serverdata-1a3d323af19764546552b1d621c65303c1fb3005.zip
CONTENT III SUPER MERGE REQUEST
Included: * Tulimshar Casino * Placeholder fixing/filling * Food Questline * Rossy Quest * Galimatia Quest (mostly by Livio) * Edourard bugs * Blood Donor Quest (from Moubootaur Legends) * Merchant Guild Quest * Mundane Bugfix * La Marine * Hurns Doctor easter eggs * Sailing to Argaes with Legion * Other things not relevant enough to be noted down, I guess
-rw-r--r--conf/map/maps.conf5
-rw-r--r--db/constants.conf98
-rw-r--r--db/map_index.txt23
-rw-r--r--db/quest_db.conf50
-rw-r--r--db/re/item_db.conf17
-rw-r--r--maps/re/001-1.mcachebin3198 -> 3203 bytes
-rw-r--r--maps/re/008-1.mcachebin6901 -> 6937 bytes
-rw-r--r--maps/re/008-2-2.mcachebin119 -> 119 bytes
-rw-r--r--maps/re/009-1.mcachebin5335 -> 5338 bytes
-rw-r--r--maps/re/009-2-0.mcachebin80 -> 112 bytes
-rw-r--r--maps/re/009-2-1.mcachebin70 -> 141 bytes
-rw-r--r--maps/re/009-2-2.mcachebin66 -> 87 bytes
-rw-r--r--maps/re/009-2-3.mcachebin90 -> 163 bytes
-rw-r--r--maps/re/009-2-4.mcachebin85 -> 151 bytes
-rw-r--r--maps/re/009-2-5.mcachebin117 -> 165 bytes
-rw-r--r--maps/re/012-1.mcachebin1425 -> 1425 bytes
-rw-r--r--maps/re/020-1.mcachebin4791 -> 4793 bytes
-rw-r--r--maps/re/020-2-20.mcachebin77 -> 80 bytes
-rw-r--r--maps/re/020-2-34.mcachebin0 -> 149 bytes
-rw-r--r--maps/re/botcheck.mcachebin0 -> 63 bytes
-rw-r--r--maps/re/fermi.mcachebin0 -> 63 bytes
-rw-r--r--maps/re/marine-2.mcachebin0 -> 101 bytes
-rw-r--r--maps/re/marine.mcachebin0 -> 94 bytes
-rw-r--r--npc/000-0-1/narrator.txt2
-rw-r--r--npc/000-2-1/chefgado.txt15
-rw-r--r--npc/001-1/_import.txt1
-rw-r--r--npc/001-1/doors.txt6
-rw-r--r--npc/001-1/enora.txt2
-rw-r--r--npc/001-1/eugene.txt2
-rw-r--r--npc/001-1/koga.txt5
-rw-r--r--npc/001-1/marine.txt17
-rw-r--r--npc/001-1/rowboat.txt9
-rw-r--r--npc/001-2-19/lloyd.txt12
-rw-r--r--npc/001-2-22/chefgado.txt93
-rw-r--r--npc/001-2-32/serena.txt7
-rw-r--r--npc/001-2-33/lozerk.txt8
-rw-r--r--npc/001-2-36/hector.txt4
-rw-r--r--npc/001-2-39/qanon.txt34
-rw-r--r--npc/001-2-41/edouard.txt38
-rw-r--r--npc/001-3-0/mundane.txt2
-rw-r--r--npc/001-3-2/smuggler.txt11
-rw-r--r--npc/008-1-1/_import.txt2
-rw-r--r--npc/008-1-1/_mobs.txt16
-rw-r--r--npc/008-1-1/_warps.txt1
-rw-r--r--npc/008-1-1/galimatia.txt107
-rw-r--r--npc/008-1-1/hal.txt2
-rw-r--r--npc/008-1-1/koga.txt15
-rw-r--r--npc/008-1-1/morcant.txt8
-rw-r--r--npc/008-1-1/soldiers.txt4
-rw-r--r--npc/008-1/_import.txt4
-rw-r--r--npc/008-1/_mobs.txt23
-rw-r--r--npc/008-1/auldsbel.txt6
-rw-r--r--npc/008-1/banu.txt6
-rw-r--r--npc/008-1/blossom.txt77
-rw-r--r--npc/008-1/confused-tree.txt4
-rw-r--r--npc/008-1/crane.txt93
-rw-r--r--npc/008-1/doors.txt43
-rw-r--r--npc/008-1/marine.txt17
-rw-r--r--npc/008-1/oscar.txt10
-rw-r--r--npc/008-1/rossy.txt389
-rw-r--r--npc/008-1/snarfles.txt86
-rw-r--r--npc/008-1/voltain.txt6
-rw-r--r--npc/008-2-0/celestia.txt4
-rw-r--r--npc/008-2-1/richard.txt57
-rw-r--r--npc/008-2-1/selim.txt9
-rw-r--r--npc/008-2-10/airlia.txt8
-rw-r--r--npc/008-2-12/nurse.txt109
-rw-r--r--npc/008-2-13/lena.txt6
-rw-r--r--npc/008-2-14/doctor.txt61
-rw-r--r--npc/008-2-16/yannika.txt401
-rw-r--r--npc/008-2-17/angus.txt6
-rw-r--r--npc/008-2-17/caul.txt6
-rw-r--r--npc/008-2-19/books.txt2
-rw-r--r--npc/008-2-2/kfahr.txt2
-rw-r--r--npc/008-2-2/melania.txt2
-rw-r--r--npc/008-2-20/valia.txt6
-rw-r--r--npc/008-2-24/_import.txt1
-rw-r--r--npc/008-2-24/chef.txt270
-rw-r--r--npc/008-2-4/olana.txt317
-rw-r--r--npc/008-2-6/donald.txt4
-rw-r--r--npc/008-2-7/shop.txt2
-rw-r--r--npc/008-2-7/simon.txt4
-rw-r--r--npc/008-2-7/wyara.txt4
-rw-r--r--npc/008-3-0/_import.txt2
-rw-r--r--npc/008-3-0/_warps.txt2
-rw-r--r--npc/008-3-0/clauquer.txt139
-rw-r--r--npc/008-3-0/juliet.txt654
-rw-r--r--npc/008-3-5/nunia.txt2
-rw-r--r--npc/009-1/_mobs.txt18
-rw-r--r--npc/009-2-3/_import.txt1
-rw-r--r--npc/009-2-3/chef.txt92
-rw-r--r--npc/009-2-7/_import.txt1
-rw-r--r--npc/009-2-7/jpmorbid.txt63
-rw-r--r--npc/012-1/_import.txt2
-rw-r--r--npc/012-1/_mobs.txt4
-rw-r--r--npc/012-1/marine.txt17
-rw-r--r--npc/012-1/prawors.txt2
-rw-r--r--npc/012-1/tiki.txt151
-rw-r--r--npc/012-2-3/cynric.txt11
-rw-r--r--npc/020-1/_import.txt31
-rw-r--r--npc/020-1/_mobs.txt7
-rw-r--r--npc/020-1/adrian.txt35
-rw-r--r--npc/020-1/aisha.txt2
-rw-r--r--npc/020-1/anwar.txt2
-rw-r--r--npc/020-1/bodyguard.txt39
-rw-r--r--npc/020-1/budifis.txt2
-rw-r--r--npc/020-1/cyndala.txt6
-rw-r--r--npc/020-1/ekinu.txt2
-rw-r--r--npc/020-1/eomie.txt2
-rw-r--r--npc/020-1/froma.txt6
-rw-r--r--npc/020-1/harper.txt2
-rw-r--r--npc/020-1/hocus.txt59
-rw-r--r--npc/020-1/inar.txt2
-rw-r--r--npc/020-1/itka.txt2
-rw-r--r--npc/020-1/joelin.txt2
-rw-r--r--npc/020-1/jossy.txt5
-rw-r--r--npc/020-1/mahoud.txt2
-rw-r--r--npc/020-1/malivox.txt2
-rw-r--r--npc/020-1/marikel.txt2
-rw-r--r--npc/020-1/marine.txt17
-rw-r--r--npc/020-1/martha.txt2
-rw-r--r--npc/020-1/neko.txt8
-rw-r--r--npc/020-1/nickos.txt2
-rw-r--r--npc/020-1/noke.txt6
-rw-r--r--npc/020-1/odonell.txt2
-rw-r--r--npc/020-1/philip.txt5
-rw-r--r--npc/020-1/popaul.txt8
-rw-r--r--npc/020-1/pusco.txt2
-rw-r--r--npc/020-1/ryan.txt2
-rw-r--r--npc/020-1/sander.txt4
-rw-r--r--npc/020-1/tindris.txt4
-rw-r--r--npc/020-1/vaspina.txt2
-rw-r--r--npc/020-2-0/_import.txt1
-rw-r--r--npc/020-2-0/kaizer.txt2
-rw-r--r--npc/020-2-10/_import.txt1
-rw-r--r--npc/020-2-10/hetchel.txt10
-rw-r--r--npc/020-2-18/_import.txt1
-rw-r--r--npc/020-2-18/inya.txt2
-rw-r--r--npc/020-2-20/_import.txt2
-rw-r--r--npc/020-2-20/_warps.txt1
-rw-r--r--npc/020-2-20/drabur.txt47
-rw-r--r--npc/020-2-20/riskim.txt141
-rw-r--r--npc/020-2-24/_import.txt1
-rw-r--r--npc/020-2-24/kylian.txt63
-rw-r--r--npc/020-2-26/_import.txt1
-rw-r--r--npc/020-2-26/receptionist.txt3
-rw-r--r--npc/020-2-28/_import.txt1
-rw-r--r--npc/020-2-28/pauline.txt21
-rw-r--r--npc/020-2-3/_import.txt1
-rw-r--r--npc/020-2-3/inac.txt2
-rw-r--r--npc/020-2-30/_import.txt1
-rw-r--r--npc/020-2-30/david.txt43
-rw-r--r--npc/020-2-34/_import.txt5
-rw-r--r--npc/020-2-34/_warps.txt3
-rw-r--r--npc/020-2-34/casino.txt8
-rw-r--r--npc/020-2-34/donutello.txt167
-rw-r--r--npc/020-2-5/_import.txt2
-rw-r--r--npc/020-2-5/dausen.txt10
-rw-r--r--npc/020-2-5/filipa.txt8
-rw-r--r--npc/020-2-7/_import.txt1
-rw-r--r--npc/020-2-7/manoli.txt2
-rw-r--r--npc/020-2-9/_import.txt3
-rw-r--r--npc/020-2-9/hydusun.txt63
-rw-r--r--npc/020-2-9/jhedia.txt2
-rw-r--r--npc/_anchors.txt4
-rw-r--r--npc/_import.txt5
-rw-r--r--npc/botcheck/_import.txt2
-rw-r--r--npc/commands/debug-quest.txt28
-rw-r--r--npc/commands/scheduled-broadcasts.txt2
-rw-r--r--npc/config/location.txt83
-rw-r--r--npc/fermi/_import.txt3
-rw-r--r--npc/fermi/_warps.txt3
-rw-r--r--npc/functions/bank.txt163
-rw-r--r--npc/functions/barber.txt3
-rw-r--r--npc/functions/bitwise.txt20
-rw-r--r--npc/functions/casino.txt254
-rw-r--r--npc/functions/daily.txt154
-rw-r--r--npc/functions/faction.txt10
-rw-r--r--npc/functions/global_event_handler.txt3
-rw-r--r--npc/functions/main.txt4
-rw-r--r--npc/functions/quest-debug/055-General_Cooking.txt73
-rw-r--r--npc/functions/quest-debug/059-HurnscaldQuests_Rossy.txt43
-rw-r--r--npc/functions/scoreboards.txt34
-rw-r--r--npc/functions/time.txt8
-rw-r--r--npc/items/shovel.txt2
-rw-r--r--npc/marine-2/_import.txt4
-rw-r--r--npc/marine-2/_mobs.txt4
-rw-r--r--npc/marine-2/main.txt60
-rw-r--r--npc/marine/_import.txt4
-rw-r--r--npc/marine/_mobs.txt3
-rw-r--r--npc/marine/saluc.txt138
-rw-r--r--npc/scripts.conf4
192 files changed, 5366 insertions, 469 deletions
diff --git a/conf/map/maps.conf b/conf/map/maps.conf
index 1cdb2d88..0e0ab13c 100644
--- a/conf/map/maps.conf
+++ b/conf/map/maps.conf
@@ -160,12 +160,17 @@ map_list: (
"020-2-31",
"020-2-32",
"020-2-33",
+ "020-2-34",
"020-2-4",
"020-2-5",
"020-2-6",
"020-2-7",
"020-2-8",
"020-2-9",
+ "botcheck",
+ "fermi",
+ "marine-2",
+ "marine",
"sec_pri",
"test",
"testbg",
diff --git a/db/constants.conf b/db/constants.conf
index 51a00953..76541432 100644
--- a/db/constants.conf
+++ b/db/constants.conf
@@ -4953,22 +4953,24 @@ more than one separator can be used in a row (so 12_3___456 is illegal).
NPC_MANATREE: 210
NPC_HENRY: 211
NPC_NUNIA: 212
- NPC_EOMIE: 213
- NPC_BARD: 214
- NPC_ADRIAN: 215
- NPC_JOELIN: 216
- NPC_HETCHEL: 217
- NPC_MICHEL: 218
- NPC_KPG_MANAGER: 219
- NPC_SANDER: 220
- NPC_NICKOS: 221
- NPC_INYA: 222
- NPC_KARL: 223
- NPC_SILVIA: 224
- NPC_ANWAR: 225
- NPC_REBECCA: 226
- NPC_PAULINE: 227
+ NPC_EOMIE: 213
+ NPC_BARD: 214
+ NPC_ADRIAN: 215
+ NPC_JOELIN: 216
+ NPC_HETCHEL: 217
+ NPC_MICHEL: 218
+ NPC_KPG_MANAGER: 219
+ NPC_SANDER: 220
+ NPC_NICKOS: 221
+ NPC_INYA: 222
+ NPC_KARL: 223
+ NPC_SILVIA: 224
+ NPC_ANWAR: 225
+ NPC_REBECCA: 226
+ NPC_PAULINE: 227
NPC_JUKEBOX: 228
+ NPC_LA_MARINE: 229
+ NPC_TIKI: 230
NPC_CONFUSED_TREE: 400
NPC_ALIGE: 401
@@ -5038,14 +5040,15 @@ more than one separator can be used in a row (so 12_3___456 is illegal).
NPC_SEWER_GATE: 467
NPC_SEWER_WHEEL: 468
NPC_TREASURE: 469
- NPC_MORCANT: 470
+ NPC_MORCANT: 470
NPC_UKAR_FEMALE_BROTHERHOOD: 471
NPC_RAIJIN_MALE_BROTHERHOOD: 472
NPC_HUMAN_MALE_BROTHERHOOD: 473
- NPC_MAGE_RED: 474
- NPC_MAGE_BROWN: 475
- NPC_MAGE_BLUE: 476
- NPC_HAL: 477
+ NPC_MAGE_RED: 474
+ NPC_MAGE_BROWN: 475
+ NPC_MAGE_BLUE: 476
+ NPC_HAL: 477
+ NPC_SUMMONING_CIRC: 478
NPC_TEST1: 800
NPC_PLAYER: 801
@@ -5062,6 +5065,23 @@ 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+)
+ AVATAR_CARDA: 1000
+ AVATAR_CARD2: 1001
+ AVATAR_CARD3: 1002
+ AVATAR_CARD4: 1003
+ AVATAR_CARD5: 1004
+ AVATAR_CARD6: 1005
+ AVATAR_CARD7: 1006
+ AVATAR_CARD8: 1007
+ AVATAR_CARD9: 1008
+ AVATAR_CARD10: 1009
+ AVATAR_CARDJ: 1010
+ AVATAR_CARDQ: 1011
+ AVATAR_CARDK: 1012
+ AVATAR_CARD_JOKER: 1013
+ AVATAR_CARD_COVER: 1015
+
comment__: "special npcs"
NPC_EMPTY: -1
NPC_WARP: 45
@@ -5175,8 +5195,24 @@ more than one separator can be used in a row (so 12_3___456 is illegal).
LANG_DE: 3
MAX_LANG: 3
+ comment__: "Daily Constants"
+ DAILY_LOWLEVEL: 0
+ DAILY_IGNORED: 1
+ DAILY_NOPTS: 2
+ DAILY_NOITEMS: 3
+ DAILY_OK: 4
+
comment__: "Misc settings"
CHEST_WAITTIME: 900 // 15 minutes
+ ROSSY_INSTIME: 1200 // 20 minutes
+ VEGAN: 1
+ CARNIVOROUS: 2
+
+ comment__: "Merchant Requests"
+ MERCQ_LETTER: 1
+ MERCQ_GOODS: 2
+ MERCQ_SCOUT: 3
+ MERCQ_NONE: 99
comment__: "Magic constants"
CLASS_OTHER: 0
@@ -5187,5 +5223,27 @@ more than one separator can be used in a row (so 12_3___456 is illegal).
CLASS_WATER: 5
CLASS_HARMONY: 6
+ comment__: "Location Constants"
+ TP_NONE: 0
+ TP_ARTIS: 1
+ TP_TULIM: 2
+ TP_HURNS: 4
+ TP_CANDOR: 8
+ TP_ARGAES: 16
+
+ comment__: "Rossy Quest Constants"
+ ROSSY_PROLOGUE: 1
+ ROSSY_CAVE1: 2
+ ROSSY_CAVE2: 4
+ ROSSY_CAVE3: 8
+ ROSSY_CAVE4: 16
+ ROSSY_CAVE5: 32
+ ROSSY_CAVE6: 64
+ ROSSY_CAVE7: 128
+ ROSSY_CAVE8: 256
+ ROSSY_CAVE9: 512
+ ROSSY_READY: 1023
+ ROSSY_BOSSCAVE: 1024
+
@include "conf/import/constants.conf"
}
diff --git a/db/map_index.txt b/db/map_index.txt
index d3d4f255..7acdcebf 100644
--- a/db/map_index.txt
+++ b/db/map_index.txt
@@ -157,12 +157,17 @@
020-2-31 157
020-2-32 158
020-2-33 159
-020-2-4 160
-020-2-5 161
-020-2-6 162
-020-2-7 163
-020-2-8 164
-020-2-9 165
-sec_pri 166
-test 167
-testbg 168
+020-2-34 160
+020-2-4 161
+020-2-5 162
+020-2-6 163
+020-2-7 164
+020-2-8 165
+020-2-9 166
+botcheck 167
+fermi 168
+marine-2 169
+marine 170
+sec_pri 171
+test 172
+testbg 173
diff --git a/db/quest_db.conf b/db/quest_db.conf
index 794d6e80..88158915 100644
--- a/db/quest_db.conf
+++ b/db/quest_db.conf
@@ -199,6 +199,14 @@ quest_db: (
Id: 58
Name: "ArgaesQuest_Galimatia"
},
+{
+ Id: 59
+ Name: "HurnscaldQuests_Rossy"
+},
+{
+ Id: 60
+ Name: "HurnscaldQuests_BloodDonor"
+},
// Event and General Quests (100~149)
{
@@ -213,6 +221,48 @@ quest_db: (
Id: 102
Name: "Halloween_BarrelQuest"
},
+{
+ Id: 103
+ Name: "General_SmearedHands"
+},
+{
+ Id: 104
+ Name: "General_MerchantRequest"
+},
+
+// Tonori Quests (150~199)
+{
+ Id: 150
+ Name: "TonoriQuest_Kylian"
+},
+{
+ Id: 151
+ Name: "TonoriQuest_Anwar"
+},
+{
+ Id: 152
+ Name: "TonoriQuest_Imec"
+},
+{
+ Id: 153
+ Name: "TonoriQuest_Hetchel"
+},
+{
+ Id: 154
+ Name: "TonoriQuest_Inya"
+},
+{
+ Id: 155
+ Name: "TonoriQuest_Heathin"
+},
+{
+ Id: 156
+ Name: "TonoriQuest_Riskim"
+},
+{
+ Id: 157
+ Name: "TonoriQuest_Hocus"
+},
// Test Quests, Debug Quests, etc. (1000+)
{
diff --git a/db/re/item_db.conf b/db/re/item_db.conf
index 49a35b5c..b8ad71ab 100644
--- a/db/re/item_db.conf
+++ b/db/re/item_db.conf
@@ -2535,6 +2535,23 @@ item_db: (
Sell: 120
Weight: 110
},
+{
+ Id: 821
+ AegisName: "Suitcase"
+ Name: "Suitcase"
+ Type: "IT_ETC"
+ Buy: 900
+ Sell: 150
+ Weight: 8000
+ Trade: {
+ nodrop: true
+ notrade: true
+ noselltonpc: true
+ noauction: true
+ nomail: true
+ nogstorage: true
+ }
+},
// Necklaces
{
Id: 1000
diff --git a/maps/re/001-1.mcache b/maps/re/001-1.mcache
index 6ce64adc..6abbe6fe 100644
--- a/maps/re/001-1.mcache
+++ b/maps/re/001-1.mcache
Binary files differ
diff --git a/maps/re/008-1.mcache b/maps/re/008-1.mcache
index 38c10582..b04f087b 100644
--- a/maps/re/008-1.mcache
+++ b/maps/re/008-1.mcache
Binary files differ
diff --git a/maps/re/008-2-2.mcache b/maps/re/008-2-2.mcache
index 439b9b7c..cc1ae21d 100644
--- a/maps/re/008-2-2.mcache
+++ b/maps/re/008-2-2.mcache
Binary files differ
diff --git a/maps/re/009-1.mcache b/maps/re/009-1.mcache
index 0c26df8e..37f24b1f 100644
--- a/maps/re/009-1.mcache
+++ b/maps/re/009-1.mcache
Binary files differ
diff --git a/maps/re/009-2-0.mcache b/maps/re/009-2-0.mcache
index 800be227..f27b08c4 100644
--- a/maps/re/009-2-0.mcache
+++ b/maps/re/009-2-0.mcache
Binary files differ
diff --git a/maps/re/009-2-1.mcache b/maps/re/009-2-1.mcache
index aebc6f00..8f5a5130 100644
--- a/maps/re/009-2-1.mcache
+++ b/maps/re/009-2-1.mcache
Binary files differ
diff --git a/maps/re/009-2-2.mcache b/maps/re/009-2-2.mcache
index 8a7a7ad9..8c0352f0 100644
--- a/maps/re/009-2-2.mcache
+++ b/maps/re/009-2-2.mcache
Binary files differ
diff --git a/maps/re/009-2-3.mcache b/maps/re/009-2-3.mcache
index 57f9a137..fe995c6d 100644
--- a/maps/re/009-2-3.mcache
+++ b/maps/re/009-2-3.mcache
Binary files differ
diff --git a/maps/re/009-2-4.mcache b/maps/re/009-2-4.mcache
index 1823f15c..f8f1cfd7 100644
--- a/maps/re/009-2-4.mcache
+++ b/maps/re/009-2-4.mcache
Binary files differ
diff --git a/maps/re/009-2-5.mcache b/maps/re/009-2-5.mcache
index bfd93411..eb05548f 100644
--- a/maps/re/009-2-5.mcache
+++ b/maps/re/009-2-5.mcache
Binary files differ
diff --git a/maps/re/012-1.mcache b/maps/re/012-1.mcache
index 1fd1ac10..6f8e0e6d 100644
--- a/maps/re/012-1.mcache
+++ b/maps/re/012-1.mcache
Binary files differ
diff --git a/maps/re/020-1.mcache b/maps/re/020-1.mcache
index a8dcf0cd..20d49806 100644
--- a/maps/re/020-1.mcache
+++ b/maps/re/020-1.mcache
Binary files differ
diff --git a/maps/re/020-2-20.mcache b/maps/re/020-2-20.mcache
index 0ae011f7..b6b332ff 100644
--- a/maps/re/020-2-20.mcache
+++ b/maps/re/020-2-20.mcache
Binary files differ
diff --git a/maps/re/020-2-34.mcache b/maps/re/020-2-34.mcache
new file mode 100644
index 00000000..dcf17738
--- /dev/null
+++ b/maps/re/020-2-34.mcache
Binary files differ
diff --git a/maps/re/botcheck.mcache b/maps/re/botcheck.mcache
new file mode 100644
index 00000000..0c1cb2c8
--- /dev/null
+++ b/maps/re/botcheck.mcache
Binary files differ
diff --git a/maps/re/fermi.mcache b/maps/re/fermi.mcache
new file mode 100644
index 00000000..949c4a62
--- /dev/null
+++ b/maps/re/fermi.mcache
Binary files differ
diff --git a/maps/re/marine-2.mcache b/maps/re/marine-2.mcache
new file mode 100644
index 00000000..b93802e8
--- /dev/null
+++ b/maps/re/marine-2.mcache
Binary files differ
diff --git a/maps/re/marine.mcache b/maps/re/marine.mcache
new file mode 100644
index 00000000..9822d83c
--- /dev/null
+++ b/maps/re/marine.mcache
Binary files differ
diff --git a/npc/000-0-1/narrator.txt b/npc/000-0-1/narrator.txt
index a8486ab1..c681d75c 100644
--- a/npc/000-0-1/narrator.txt
+++ b/npc/000-0-1/narrator.txt
@@ -109,7 +109,7 @@ OnInit:
setq(General_Narrator, 2);
savepoint("008-1-1", 33, 63);
warp("SavePoint", 0, 0);
- dispbottom(l("After a tiring, yet fast, travel by Koga, you arrive at %s.", l("Woodlands")));
+ dispbottom(l("After a tiring, yet fast travel by ship, you arrive at %s.", l("Woodlands")));
close;
}
diff --git a/npc/000-2-1/chefgado.txt b/npc/000-2-1/chefgado.txt
index ca208dd8..75d4e434 100644
--- a/npc/000-2-1/chefgado.txt
+++ b/npc/000-2-1/chefgado.txt
@@ -33,6 +33,21 @@
if (.@r == 1) mesq l("Where is the damn salt?! Give me the salt, I know you have it!");
if (.@r == 2) mesq l("Are you going to stand here all day long? Do the dishes or go away.");
+ if (getq(General_SmearedHands) < 3) {
+ next;
+ select
+ l("I'll get moving, sorry!"),
+ //rif(.@r == 1 && countitem(Salt), l("Offer him the salt")),
+ l("Can you teach me cooking?");
+ mes "";
+ if (@menu == 2) {
+ mesn;
+ mesq l("NO! I am busy, can't you see?!");
+ next;
+ mesn;
+ mesq l("When we reach Artis, maybe, but not now!");
+ }
+ }
close;
L_QuestStart:
diff --git a/npc/001-1/_import.txt b/npc/001-1/_import.txt
index 14af4b49..18f8e363 100644
--- a/npc/001-1/_import.txt
+++ b/npc/001-1/_import.txt
@@ -23,6 +23,7 @@
"npc/001-1/lucas.txt",
"npc/001-1/manhole.txt",
"npc/001-1/mapflags.txt",
+"npc/001-1/marine.txt",
"npc/001-1/merlin.txt",
"npc/001-1/mouboo.txt",
"npc/001-1/nalkri.txt",
diff --git a/npc/001-1/doors.txt b/npc/001-1/doors.txt
index 7cf4e132..c4288328 100644
--- a/npc/001-1/doors.txt
+++ b/npc/001-1/doors.txt
@@ -10,7 +10,7 @@
OnTouch:
.@enora = getq(ArtisQuests_Enora);
- if (.@enora < 11)
+ if (.@enora < 4)
{
narrator S_LAST_NEXT,
l("The door to the legion building is temporarily closed.");
@@ -34,7 +34,7 @@ OnTouch:
.@enora = getq(ArtisQuests_Enora);
.@legion = getq(Artis_Legion_Progress);
.@brotherhood = getq(General_Brotherhood);
- if (.@enora < 11)
+ if (.@enora < 4)
{
setfakecells 57, 41, 1;
end;
@@ -46,7 +46,7 @@ OnTouch:
OnUnTouch:
.@enora = getq(ArtisQuests_Enora);
- if (.@enora < 11)
+ if (.@enora < 4)
{
end;
}
diff --git a/npc/001-1/enora.txt b/npc/001-1/enora.txt
index a57b5e78..73e81422 100644
--- a/npc/001-1/enora.txt
+++ b/npc/001-1/enora.txt
@@ -128,6 +128,8 @@
narrator S_LAST_NEXT,
l("You received @@ EXP and @@ E.", .@exp_reward, .@zeny_reward);
+ // This is silent (can be caught as a string variable)
+ faction_addrep("Legion", 10);
return;
}
diff --git a/npc/001-1/eugene.txt b/npc/001-1/eugene.txt
index 3efe4d7f..950da353 100644
--- a/npc/001-1/eugene.txt
+++ b/npc/001-1/eugene.txt
@@ -65,7 +65,7 @@ L_CheckItems:
l("Have a good time fishing!");
delitem .BaitID, .BaitCount;
- getitem FishingRod, 1;
+ getitembound FishingRod, 1, IBT_ACCOUNT;
getitem FishingGuideVolI, 1;
setq ArtisQuests_Fishman, 2;
close;
diff --git a/npc/001-1/koga.txt b/npc/001-1/koga.txt
index 57d0938d..045f9431 100644
--- a/npc/001-1/koga.txt
+++ b/npc/001-1/koga.txt
@@ -5,7 +5,7 @@
// The Koga in Artis, only accessable via Rowboat.
// THIS IS A PLACEHOLDER!
-001-1,225,59,0 script Koga#001-1 NPC_KOGA,{
+/*001-1,225,59,0 script Koga#001-1 NPC_LA_MARINE,{
.@q=getq(General_Narrator);
speech
l("Ah, whom did you bring here?"),
@@ -42,4 +42,5 @@ OnInit:
.distance = 6;
//.alwaysVisible = true;
end;
-}
+}*/
+
diff --git a/npc/001-1/marine.txt b/npc/001-1/marine.txt
new file mode 100644
index 00000000..b9cd93f9
--- /dev/null
+++ b/npc/001-1/marine.txt
@@ -0,0 +1,17 @@
+// Moubootaur Legends scripts.
+// Authors:
+// Jesusalva
+// Description:
+// This script controls access to Ships, fixing variables.
+
+// Use NPC_LA_MARINE if needed
+001-1,204,85,0 script Gema IV#A NPC_HIDDEN,0,0,{
+ end;
+
+OnTouch:
+ EnterTown("Artis");
+
+ warp "marine@"+LOCATION$, 42, 26;
+ closedialog;
+ close;
+}
diff --git a/npc/001-1/rowboat.txt b/npc/001-1/rowboat.txt
index a067b711..a3b50597 100644
--- a/npc/001-1/rowboat.txt
+++ b/npc/001-1/rowboat.txt
@@ -23,12 +23,17 @@
if (askyesno() == ASK_YES) {
if (getq(General_Brotherhood) >= 2)
{
- slide 227, 62;
+ //slide 227, 62;
//slide 204, 62;
+ PC_DEST$="Argaes";
+ @timer_navio_running = 1;
+ addtimer 210000, "#MarineShip::OnEvent"; // This route is 30s slower
+ warp "marine-2", 40, 32;
+ dispbottom l("You're smuggled aboard the Legion expedition. ACT NATURALLY!");
.caller=0;
.clocks=gettimetick(2);
movenpc("#Rowboat", 192, 25);
- setmount 1;
+ //setmount 1;
}
else
{
diff --git a/npc/001-2-19/lloyd.txt b/npc/001-2-19/lloyd.txt
index e183dd0e..692dd6a9 100644
--- a/npc/001-2-19/lloyd.txt
+++ b/npc/001-2-19/lloyd.txt
@@ -199,7 +199,7 @@
close;
break;
case 3:
- MerchantGuild_Bank;
+ MerchantGuild_Bank();
break;
case 4:
mes "";
@@ -208,12 +208,11 @@
case 5:
if (getq(ArtisQuests_Fexil) >= 1)
{
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("There are no tasks for you right now.");
+ MerchantGuild_Quests(.bankid);
continue;
}
- paper_to_deliver;
+ paper_to_deliver();
continue;
}
@@ -232,6 +231,11 @@ OnInit:
.quest_debug = ArtisQuests_Lloyd;
.bodytype = BODYTYPE_3;
.distance = 4;
+
+ // Bank configuration
+ array_push($@BANK_NAME$, .name$);
+ array_push($@BANK_TOWN$, "Artis");
+ .bankid = getarraysize($@BANK_NAME$)-1;
end;
}
diff --git a/npc/001-2-22/chefgado.txt b/npc/001-2-22/chefgado.txt
index 103b7835..86f30070 100644
--- a/npc/001-2-22/chefgado.txt
+++ b/npc/001-2-22/chefgado.txt
@@ -7,16 +7,107 @@
// La Johanne Chef.
001-2-22,27,28,0 script Chef Gado#Artis NPC_CHEF_GADO,{
+ function foodQuest;
.@r = rand(3);
if (.@r == 0) npctalk3 l("What are you doing in my kitchen?! Get out, it's not a place for kids!");
if (.@r == 1) npctalk3 l("Where is the damn salt?! Give me the salt, I know you have it!");
if (.@r == 2) npctalk3 l("Are you going to stand here all day long? Do the dishes or go away.");
+ if (getq(General_SmearedHands) < 3)
+ foodQuest();
close;
+function foodQuest {
+ .@q=getq(General_SmearedHands);
+ mesc l("%s seems busy as usual.", l("Chef Gado"));
+ select
+ l("I'll get moving, sorry!"),
+ //rif(.@r == 1 && countitem(Salt), l("Offer him the salt")),
+ l("Can you teach me cooking?");
+ mes "";
+ if (@menu == 1)
+ return;
+ // FOOD QUEST: BEGIN
+ .@ally=(getq(ShipQuests_ChefGado) == 4); // TRUE if you helped Gado
+ mesn;
+ mesq (.@ally ? l("I suppose I could. You helped me, after all.") : lg("Why should I help you, traitor?"));
+ next;
+ // Empty Bowl needed
+ if (!countitem(EmptyBowl)) {
+ mesn;
+ mesq l("Anyway: First, you'll need an %s. %s", getitemlink(EmptyBowl),
+ (.@ally ? l("Cannot get one here in Artis, though. Well, if you travel far enough...") : l("Stop wasting my time!")));
+ return;
+ }
+ // Recipe Book needed
+ if (!countitem(RecipeBook)) {
+ mesn;
+ mesq l("Anyway: First, you'll need a %s. You cannot cook without that. So go find one!", getitemlink(RecipeBook));
+ next;
+ mesn;
+ mesq l("These books are annoyingly expensive, but maybe you have luck elsewhere. I'm sure some housewife could give you one for helping her husband...");
+ next;
+ mesn;
+ mesq l("That's how I got mine, anyway.");
+ next;
+ mesn;
+ mesq l("Some nice lady called Ya... Micksha? No, it was not Yamicksha... For the life of me, I can't remember...");
+ // FIXME: I'm ignoring that unpractical plot in favor of clarity
+ return;
+ }
+
+ // Quest Loop
+ if (.@q == 0) {
+ mesn;
+ mesq l("You got a bowl, I see. You won't be finding another one, so be careful with that.");
+ next;
+ // Will only learn Sailor Stew Recipe if helped Gado instead Julia
+ if (.@ally) {
+ mesn;
+ mesq l("Now, watch and learn: The Sailor Stew Recipe!");
+ mesc l("Learned %s recipe!", getitemlink(SailorStew)), 2;
+ RECIPES[CraftSailorStew]=true;
+ next;
+ } else if (!RECIPES[CraftSailorStew]) {
+ // They requested for a neutral approach because Julia
+ mesn;
+ mesq l("I will teach you %s... But for you, it will be %s E.",
+ getitemlink(SailorStew), format_number(5000));
+ if (Zeny < 5000)
+ return;
+ next;
+ mesc l("Pay Chef Gado the gold?");
+ if (askyesno() == ASK_NO || Zeny < 5000)
+ return;
+ mesn;
+ mesq l("Now, watch and learn: The Sailor Stew Recipe!");
+ mesc l("Learned %s recipe!", getitemlink(SailorStew)), 2;
+ RECIPES[CraftSailorStew]=true;
+ Zeny-=5000;
+ next;
+ }
+ setq General_SmearedHands, 1;
+ .@q = 1;
+ mesn;
+ mesq l("Anyway, for the recipe, just add a few carps, carrots, manana, and roasted acorn in this order.");
+ next;
+ }
+ if (.@q == 1 || .@q == 2) {
+ mesn;
+ mesq l("Now, your next task is: I've heard rumors... About some delicious food, like %s...", getitemlink(any(BarbecuePlate, VeggiePlate)));
+ next;
+ mesn;
+ mesq l("They're related to Mouboos, but Artis cuisine is the worst. Go find the recipes!!");
+ next;
+ }
+ mesn;
+ mesq l("Get moving!");
+ return;
+}
+
OnInit:
.bodytype = BODYTYPE_3;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/001-2-32/serena.txt b/npc/001-2-32/serena.txt
index 1594f219..06b409ff 100644
--- a/npc/001-2-32/serena.txt
+++ b/npc/001-2-32/serena.txt
@@ -41,6 +41,13 @@ OnInit:
end;
}
+ // Enemies of the Legion of Aemil cannot train, obviously
+ if (faction_standing("LEGION", true) < 1) {
+ mesn;
+ mesq l("Sorry, but I can only train you if Lieutenant Lozerk authorizes.");
+ close;
+ }
+
// Otherwise, begin it
mesn;
mesq l("Are you ready for your training?");
diff --git a/npc/001-2-33/lozerk.txt b/npc/001-2-33/lozerk.txt
index 7ac6d4cb..5b8b00ed 100644
--- a/npc/001-2-33/lozerk.txt
+++ b/npc/001-2-33/lozerk.txt
@@ -139,6 +139,14 @@
speech S_LAST_NEXT,
l("Welcome to the Legion of Aemil's building in Artis!");
+ // You're an enemy of the Legion - No dialog for you
+ if (faction_standing("LEGION", true) < 1) {
+ mesn;
+ mesq l("Please don't loiter around unless you have business with the Legion.");
+ close;
+ }
+
+
do
{
.@legion_progress = getq(Artis_Legion_Progress);
diff --git a/npc/001-2-36/hector.txt b/npc/001-2-36/hector.txt
index 3b16ca10..b4f801be 100644
--- a/npc/001-2-36/hector.txt
+++ b/npc/001-2-36/hector.txt
@@ -342,8 +342,8 @@
}
}
- // only start if player talked with Lozerk
- if (getq(Artis_Legion_Progress) < 1 )
+ // only start if player talked with Lozerk and is not an enemy
+ if (getq(Artis_Legion_Progress) < 1 || faction_standing("LEGION", true) < 1)
{
speech(S_FIRST_BLANK_LINE | S_LAST_NEXT,
l("This is the training ground. And I ain't training nobody unless Lieutenant Lozerk tells me to!"),
diff --git a/npc/001-2-39/qanon.txt b/npc/001-2-39/qanon.txt
index 2a948afe..36cf47e5 100644
--- a/npc/001-2-39/qanon.txt
+++ b/npc/001-2-39/qanon.txt
@@ -2,6 +2,7 @@
// Authors:
// Alige
// Reid
+// Jesusalva
// Description:
// Artis's Legion of Aemil leader.
// Variables:
@@ -15,6 +16,7 @@
001-2-39,34,41,0 script Q'Anon NPC_Q_ANON,{
function legionState;
+ function legionState2;
function notaMember;
.@q=getq(Artis_Legion_Progress);
mesn;
@@ -31,6 +33,7 @@
// Main Menu
select
rif(.@q == 5, l("Lozerk told me to talk to you and join the legion.")),
+ rif(.@q == 6, l("Have I grown enough reputation to join?")),
l("Thanks, sir Q'Anon.");
mes "";
switch (@menu)
@@ -39,6 +42,9 @@
legionState();
break;
case 2:
+ legionState2();
+ break;
+ case 3:
mesn;
mesq lg("Make me proud, girl.", "Make me proud, boy.");
break;
@@ -90,6 +96,34 @@ function legionState {
return;
}
+function legionState2 {
+ if (faction_standing("LEGION", true) >= 1) {
+ mesn;
+ mesq l("Actually. I am thinking in sending you in a... special mission.");
+ next;
+ mesn;
+ mesq l("You probably noticed a frigate docked near La Johanne when you arrived?");
+ next;
+ mesn;
+ mesq l("We've found... the old continent, from where our race came from long ago.");
+ next;
+ mesn;
+ mesq l("It seems to have fallen in barbarian hands since the Fleet of Ancea, and that, is not something we can allow.");
+ next;
+ mesn;
+ mesc l("%s gives you a piece of paper, which you put on a different pocket.");
+ mesq lg("Go to the ship, show the captain this letter if asked. After reaching, look for Captain Hal. He'll give you further instructions.");
+ next;
+ mesn;
+ mesq lg("Make me proud, girl.", "Make me proud, boy.");
+ setq Artis_Legion_Progress, 7;
+ } else {
+ mesn;
+ mesq l("Hmm... No, not yet. Try helping other legion members around.");
+ }
+ return;
+}
+
OnInit:
.bodytype = BODYTYPE_3;
.distance = 3;
diff --git a/npc/001-2-41/edouard.txt b/npc/001-2-41/edouard.txt
index 2afac51f..abb764b7 100644
--- a/npc/001-2-41/edouard.txt
+++ b/npc/001-2-41/edouard.txt
@@ -86,24 +86,30 @@ OnInit:
}
001-2-41,30,29,0 script Edouard#001-2-41 NPC_EDOUARD,{
+ function tellStory;
+ //EdouardCheckChair();
+ if (!issit())
+ goto OnWrongPlace;
+ // Disregard if you're in the chair or not, for sake of gameplay
+ goto OnChair;
+
+function tellStory {
+ if (Edouard_StoryTold != 0)
+ {
+ mes "";
+ mesn;
+ }
+ speech S_LAST_NEXT | S_NO_NPC_NAME,
+ l("I am new in this town, just like you."),
+ l("I came here, looking for a better life."),
+ l("And so far, the Merchant Guild helped me find this appartment so I can't complain!"),
+ l("Anyway."),
+ l("I'm a barber, you see. I can change your hairstyle or hair color to your current taste.");
- function tellStory {
- if (Edouard_StoryTold != 0)
- {
- mes "";
- mesn;
- }
- speech S_LAST_NEXT | S_NO_NPC_NAME,
- l("I am new in this town, just like you."),
- l("I came here, looking for a better life."),
- l("And so far, the Merchant Guild helped me find this appartment so I can't complain!"),
- l("Anyway."),
- l("I'm a barber, you see. I can change your hairstyle or hair color to your current taste.");
-
- Edouard_StoryTold = 1;
+ Edouard_StoryTold = 1;
- return;
- }
+ return;
+}
OnWrongPlace:
npctalkonce("Sit on the chair, I will come in a second!");
diff --git a/npc/001-3-0/mundane.txt b/npc/001-3-0/mundane.txt
index 33b0ecfd..c52f4cf1 100644
--- a/npc/001-3-0/mundane.txt
+++ b/npc/001-3-0/mundane.txt
@@ -95,6 +95,8 @@
@MUNDANE_OLDX=.x;
@MUNDANE_OLDY=.y;
warp(.@MAP_NAME$, .x, .y);
+ // Move NPC as well
+ unitwarp(getnpcid(instance_npcname(.name$, @MUNDANE_INSTID)), .@MAP_NAME$, .x, .y);
setq ArtisQuests_MonaDad, 2;
addtimer(150, instance_npcname(.name$, @MUNDANE_INSTID)+"::OnMove");
diff --git a/npc/001-3-2/smuggler.txt b/npc/001-3-2/smuggler.txt
index fa96e842..377ce4d5 100644
--- a/npc/001-3-2/smuggler.txt
+++ b/npc/001-3-2/smuggler.txt
@@ -54,8 +54,15 @@ function smugglerBoarding {
setpcblock(PCBLOCK_MOVE, true);
npcwalkto(76, 85);
sleep2(1000);
- setmount 1;
- warp "001-1", 227, 62;
+ //setmount 1;
+ //warp "001-1", 227, 62;
+
+ PC_DEST$="Argaes";
+ @timer_navio_running = 1;
+ addtimer 210000, "#MarineShip::OnEvent"; // This route is 30s slower
+ warp "marine-2", 40, 32;
+ dispbottom l("You're smuggled aboard the Legion expedition. ACT NATURALLY!");
+
detachrid();
.dir = 2;
npcwalkto(71, 85);
diff --git a/npc/008-1-1/_import.txt b/npc/008-1-1/_import.txt
index c51a2b4e..46f9ce78 100644
--- a/npc/008-1-1/_import.txt
+++ b/npc/008-1-1/_import.txt
@@ -4,6 +4,8 @@
"npc/008-1-1/_warps.txt",
"npc/008-1-1/cutscene.txt",
"npc/008-1-1/galimatia.txt",
+"npc/008-1-1/hal.txt",
"npc/008-1-1/koga.txt",
"npc/008-1-1/morcant.txt",
"npc/008-1-1/sign.txt",
+"npc/008-1-1/soldiers.txt",
diff --git a/npc/008-1-1/_mobs.txt b/npc/008-1-1/_mobs.txt
index 3bd8151c..928a2c6d 100644
--- a/npc/008-1-1/_mobs.txt
+++ b/npc/008-1-1/_mobs.txt
@@ -8,7 +8,7 @@
008-1-1,131,45,0,0 monster Beehive 1056,1,30000,100000
008-1-1,156,51,10,4 monster Alizarin Plant 1037,3,1000,25000
008-1-1,167,61,2,2 monster Pink Flower 1034,1,100,10000
-008-1-1,153,176,9,7 monster Silkworm 1040,4,3000,6000
+008-1-1,154,176,9,7 monster Silkworm 1040,4,3000,6000
008-1-1,162,78,6,3 monster Gamboge Plant 1038,2,1000,10000
008-1-1,197,67,7,5 monster Cobalt Plant 1039,2,1000,30000
008-1-1,165,109,2,2 monster Pink Flower 1034,1,100,10000
@@ -26,7 +26,13 @@
008-1-1,137,86,11,16 monster Butterfly 1032,8,10000,10000
008-1-1,75,41,14,4 monster Silkworm 1040,3,9000,6000
008-1-1,122,75,8,4 monster Forest Maggot 1028,3,50000,2500
-008-1-1,96,45,1,0 monster Red Rose 1062,1,50000,10000
-008-1-1,97,47,2,0 monster Yellow Rose 1060,1,20000,5000
-008-1-1,99,45,0,0 monster Blue Rose 1061,1,100000,20000
-008-1-1,161,67,45,11 monster Moubi 1072,1,200000,1250000
+008-1-1,161,67,45,11 monster Mouboo 1023,3,20000,125000
+008-1-1,180,77,11,21 monster Log Head 1031,3,10000,15000
+008-1-1,149,77,99,15 monster Mana Bug 1035,11,10000,20000
+008-1-1,144,107,11,5 monster Bee 1029,3,5000,10000
+008-1-1,149,59,11,5 monster Bee 1029,3,5000,10000
+008-1-1,156,183,11,5 monster Bee 1029,3,5000,10000
+008-1-1,161,186,9,7 monster Bandit 1063,2,9000,18000
+008-1-1,157,172,5,15 monster Robin Bandit 1064,2,9000,18000
+008-1-1,156,177,10,15 monster Small Frog 1086,2,3000,30000
+008-1-1,169,74,30,23 monster Squirrel 1041,5,10000,30000
diff --git a/npc/008-1-1/_warps.txt b/npc/008-1-1/_warps.txt
index bd7867d4..cbf66f26 100644
--- a/npc/008-1-1/_warps.txt
+++ b/npc/008-1-1/_warps.txt
@@ -1,6 +1,5 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Map 008-1-1: Woodland warps
008-1-1,247,85,0 warp #008-1-1_247_85 0,1,008-1,21,85
-008-1-1,202,47,0 warp #008-1-1_202_47 0,0,008-3-0,129,112
008-1-1,51,57,0 warp #008-1-1_51_57 0,0,008-2-32,40,37
008-1-1,181,198,0 warp #008-1-1_181_198 1,0,009-1,180,32
diff --git a/npc/008-1-1/galimatia.txt b/npc/008-1-1/galimatia.txt
index 6197d3bf..29db843a 100644
--- a/npc/008-1-1/galimatia.txt
+++ b/npc/008-1-1/galimatia.txt
@@ -6,8 +6,6 @@
// Jesusalva
// Description:
// Galimatia the beekeeper.
-// THIS IS A PLACEHOLDER!
-
// KEEP item_db.conf updated as well
function script usePurificationPotion {
@@ -52,15 +50,7 @@ function script useFertilityPotion {
function QuestPart4;
function QuestPart5;
function QuestPart6;
-
- // TODO FIXME remove this once ready
- if (!debug) {
- speech
- l("Hello."),
- l("If only someone could help me to make my flowers bloom again."),
- l("I just dont know what to do. Perhaps all gets better when I stay here, whining and waiting. Please, leave me alone.");
- close;
- }
+ function galimatiaQuestDaily;
switch(getq(ArgaesQuest_Galimatia)) {
case 0: QuestPart0(); break;
@@ -70,6 +60,7 @@ function script useFertilityPotion {
case 4: QuestPart4(); break;
case 5: QuestPart5(); break;
case 6: QuestPart6(); break;
+ case 7: galimatiaQuestDaily(); break;
default:
mesq l("[Invalid quest status: %d, check script]", getq(ArgaesQuest_Galimatia));
}
@@ -149,7 +140,7 @@ function NPCcrafting {
getarg(4);
if (askyesno() == ASK_NO) {
mesq l("Come on, move!");
- close();
+ close;
} else {
switch(craftFromPlayer(getarg(0), getarg(1), getarg(2), getarg(3))) {
case 0:
@@ -159,7 +150,8 @@ function NPCcrafting {
case 1:
mesq getarg(6);
- printIngredients(.REQ0_INGREDIENTS, .REQ0_INGREDIENTS_AMOUNT);
+ // FIXME - Gather proper variables
+ printIngredients(getarg(0), getarg(1));
break;
case 2:
@@ -216,11 +208,14 @@ function QuestPart0 {
l("Hello."),
l("If only someone could help me to make my flowers bloom again."),
l("I just dont know what to do. Perhaps all gets better when I stay here, whining and waiting. Please, leave me alone.");
+ next;
select(
l("What about making some fertilizing-something?"),
l("I don't have time to spend on flowers.")
);
+ mes "";
+ mesn;
switch(@menu) {
case 1:
@@ -268,7 +263,7 @@ function QuestPart1 {
l("Why you don't have a %s with you? You need me to make another one?", getitemlink(.REQ0_OUTPUT));
if (askyesno() == ASK_NO) {
mesq l("Come on, stop wasting my time!");
- close();
+ close;
} else{
if (NPCcrafting(
.REQ0_INGREDIENTS, .REQ0_INGREDIENTS_AMOUNT,
@@ -294,6 +289,7 @@ If you weren't able to trash the potion, the land is now healed, but nothing gro
function QuestPart2 {
+ mesn;
mesq l("Fine. The land is healthy now but nothing will grow yet. This time I need you to get:");
printIngredients(.REQ1_INGREDIENTS, .REQ1_INGREDIENTS_AMOUNT);
mesq l("So making a %s will make things easier.", getitemlink(.REQ1_OUTPUT));
@@ -322,8 +318,9 @@ function QuestPart3 {
speech
l("Got drunk with the %s? You need me to make another one?", getitemlink(.REQ1_OUTPUT));
if (askyesno() == ASK_NO) {
+ mesn;
mesq l("Come on, stop wasting my time!");
- close();
+ close;
} else{
if (NPCcrafting(
.REQ1_INGREDIENTS, .REQ1_INGREDIENTS_AMOUNT,
@@ -350,13 +347,19 @@ NOTE: Flower seeds are dropped directly from Clover Patches, however grass seeds
*/
function QuestPart4 {
- speech
- l("Now I need %d %s.", .REQ2_INGREDIENTS_AMOUNT, getitemlink(.REQ2_INGREDIENTS));
- // We take player items without asking
+ speech
+ l("Thanks for the help earlier. The soil is now fertile thanks to your efforts."),
+ l("Do you know Blossom? She is the flower girl. Bees won't come without flowers."),
+ l("So, now I need %d %s.", .REQ2_INGREDIENTS_AMOUNT, getitemlink(.REQ2_INGREDIENTS));
+ next;
+ // We don't take player items without asking
+ mesc l("Deliver items to Blossom?");
+ if (askyesno() == ASK_NO) close;
if(checkForItems(.REQ2_INGREDIENTS, .REQ2_INGREDIENTS_AMOUNT)) {
- speech
- l("Nice, gimme that!");
advanceQuest();
+ speech
+ l("Nice, gimme that!"),
+ l("I'll go plant them. Now go, maybe I need your help again later.");
} else {
speech
l("Go get some!");
@@ -377,7 +380,8 @@ Galimatia gives the player their reward: Player must select a simple Magic Wand
function QuestPart5 {
speech
l("Nice job."),
- l("What do you want?"),
+ l("I've heard bees are scared of fire, you know."),
+ l("So, what do you want?"),
l("A %s or a %s?", getitemlink(.QUESTPRIZES[0]) , getitemlink(.QUESTPRIZES[1]));
select(
l("I want the %s!", getitemname(.QUESTPRIZES[0])),
@@ -401,13 +405,14 @@ This enables the player to receive a Rose Hat. Fighting the flowers that were ju
*/
function QuestPart6 {
+ mesn;
mesq l("Hello again! Do you want me to exchange %d %s and %d GP for a %s?",
.REQ3_INGREDIENTS_AMOUNT[0], getitemlink(.REQ3_INGREDIENTS[0]),
.REQ3_COST, getitemlink(.REQ3_OUTPUT)
);
if (askyesno() == ASK_NO) {
mesq l("As you wish.");
- close();
+ close;
} else {
if(Zeny>=.REQ3_COST) {
if(NPCcrafting(
@@ -417,7 +422,10 @@ function QuestPart6 {
l("Have fun!"),
l("Nope. I wont exchange for such less."),
l("I can't give you nothing if you don't leave some room for it!")
- )) Zeny-=(.REQ3_COST);
+ )) {
+ Zeny-=(.REQ3_COST);
+ advanceQuest();
+ }
} else {
mesq l("Ain't working for free, pal!");
}
@@ -426,6 +434,16 @@ function QuestPart6 {
return;
}
+/*
+Daily Part
+Allows players to sell Honey for Galimatia
+*/
+function galimatiaQuestDaily {
+ // DailyQuest(lvl, cost, count, item)
+ DailyQuest(10, 3, 1, Honey);
+ return;
+}
+
OnInit:
// NPC ITEM REQUESTS
setarray(.REQ0_INGREDIENTS , BottleOfWater , PinkPetal );
@@ -433,7 +451,6 @@ OnInit:
.REQ0_OUTPUT = PurificationPotion;
.REQ0_OUTPUT_AMOUNT = 1 ;
- // FIXME ingredients are wrong (because I'm tired of use /createitems everytime)
setarray(.REQ1_INGREDIENTS , BottleOfWater, MaggotSlime, MauveHerb);
setarray(.REQ1_INGREDIENTS_AMOUNT , 1 , 10 , 5);
.REQ1_OUTPUT = FertilityPotion;
@@ -442,7 +459,7 @@ OnInit:
setarray(.REQ2_INGREDIENTS , FlowerSeeds);
setarray(.REQ2_INGREDIENTS_AMOUNT , 5);
- setarray(.QUESTPRIZES , TrainingWand , RubberBat );
+ setarray(.QUESTPRIZES , TrainingWand , ManaTorch );
setarray(.QUESTPRIZES_AMOUNT , 1 , 1 );
setarray(.REQ3_INGREDIENTS , ABlueRose);
@@ -455,3 +472,43 @@ OnInit:
.distance = 4;
end;
}
+
+// ------------------------------------
+// Bees Hotspot
+008-1-1,93,46,0 script #GalimatiaInst NPC_HIDDEN,0,1,{
+ end;
+
+// Transport
+OnTouch:
+ if (getq(ArgaesQuest_Galimatia) >= 5) {
+ if (getmap() == "008-1-1")
+ warp "gali@matia", 94, 46;
+ else
+ warp "008-1-1", 92, 46;
+ }
+ end;
+
+// Populate
+OnInstanceInit:
+ areamonster("gali@matia", 95, 45, 97, 46, strmobinfo(1, RedRose), RedRose, 1, "#GalimatiaInst::OnRed");
+ areamonster("gali@matia", 95, 47, 99, 48, strmobinfo(1, YellowRose), YellowRose, 1, "#GalimatiaInst::OnYellow");
+ monster("gali@matia", 99, 45, strmobinfo(1, BlueRose), BlueRose, 1, "#GalimatiaInst::OnBlue");
+ end;
+
+// Respawn
+OnRed:
+ sleep(60000);
+ areamonster("gali@matia", 95, 45, 97, 46, strmobinfo(1, RedRose), RedRose, 1, "#GalimatiaInst::OnRed");
+ end;
+
+OnBlue:
+ sleep(120000);
+ monster("gali@matia", 99, 45, strmobinfo(1, BlueRose), BlueRose, 1, "#GalimatiaInst::OnBlue");
+ end;
+
+OnYellow:
+ sleep(25000);
+ areamonster("gali@matia", 95, 47, 99, 48, strmobinfo(1, YellowRose), YellowRose, 1, "#GalimatiaInst::OnYellow");
+ end;
+}
+
diff --git a/npc/008-1-1/hal.txt b/npc/008-1-1/hal.txt
index 40362b78..175fa8c1 100644
--- a/npc/008-1-1/hal.txt
+++ b/npc/008-1-1/hal.txt
@@ -14,7 +14,7 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-1-1/koga.txt b/npc/008-1-1/koga.txt
index 34bc75fc..404d1235 100644
--- a/npc/008-1-1/koga.txt
+++ b/npc/008-1-1/koga.txt
@@ -2,25 +2,23 @@
// Author:
// Micksha
// Description:
-// The Koga in Artis, only accessable via Rowboat.
+// The Koga in Argaes
// THIS IS A PLACEHOLDER!
-008-1-1,30,60,0 script Koga#008-1-1 NPC_KOGA,{
+008-1-1,27,60,0 script Gema IV#008-1-1 NPC_LA_MARINE,{
function kogaWrongMap;
if (getmap() != "008-1-1")
kogaWrongMap();
- speech
- l("So, finally, we are here."),
- l("Do you want to go back to Artis? You really should be afraid of the Legion there, now that you have been here in Woodland. They somehow smell the odor of the Brotherhood.");
+ mesc l("Returning to Artis is free, but coming back to Argaes after doing this may not be so.");
next;
mesc l("Return to Artis?");
if (askyesno() == ASK_YES)
{
closeclientdialog;
setmount 0;
- warp "001-1", 199, 91;
- dispbottom l("After a tiring, yet fast, travel by Koga, you arrive at @@.", l("Artis"));
+ EnterTown("Artis", true);
+ dispbottom l("The travel is a blur, you cannot remember much of it before reaching %s.", l("Artis"));
}
close;
@@ -31,6 +29,7 @@ function kogaWrongMap {
OnInit:
.bodytype = BODYTYPE_3;
- .distance = 4;
+ .distance = 7;
+ .alwaysVisible = true;
end;
}
diff --git a/npc/008-1-1/morcant.txt b/npc/008-1-1/morcant.txt
index 7735714d..166240e7 100644
--- a/npc/008-1-1/morcant.txt
+++ b/npc/008-1-1/morcant.txt
@@ -23,6 +23,14 @@
case 2:
mesn;
mesq l("Hohoho! That is a family's trade secret!");
+ if (!getq(General_SmearedHands)) {
+ next;
+ mesn;
+ mesq l("You don't even know how to cook. %s.. Ah, good old times.", any(
+ l("I've learned cooking with Yannika."),
+ l("I had tasty barbecue with Crane.")
+ ));
+ }
break;
case 3:
mesn;
diff --git a/npc/008-1-1/soldiers.txt b/npc/008-1-1/soldiers.txt
index 12674fc7..fef6951f 100644
--- a/npc/008-1-1/soldiers.txt
+++ b/npc/008-1-1/soldiers.txt
@@ -13,7 +13,7 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
@@ -25,6 +25,6 @@ OnInit:
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-1/_import.txt b/npc/008-1/_import.txt
index 812a33fa..381dec5a 100644
--- a/npc/008-1/_import.txt
+++ b/npc/008-1/_import.txt
@@ -7,14 +7,18 @@
"npc/008-1/banu.txt",
"npc/008-1/blossom.txt",
"npc/008-1/confused-tree.txt",
+"npc/008-1/crane.txt",
+"npc/008-1/doors.txt",
"npc/008-1/hinnak.txt",
"npc/008-1/jack.txt",
"npc/008-1/mapflags.txt",
+"npc/008-1/marine.txt",
"npc/008-1/mikhail.txt",
"npc/008-1/milly.txt",
"npc/008-1/old-man.txt",
"npc/008-1/old-woman.txt",
"npc/008-1/oscar.txt",
+"npc/008-1/rossy.txt",
"npc/008-1/sabine.txt",
"npc/008-1/shop.txt",
"npc/008-1/sign.txt",
diff --git a/npc/008-1/_mobs.txt b/npc/008-1/_mobs.txt
index 11f3e52a..4ca22849 100644
--- a/npc/008-1/_mobs.txt
+++ b/npc/008-1/_mobs.txt
@@ -52,7 +52,7 @@
008-1,235,118,9,9 monster Butterfly 1032,3,10000,10000
008-1,241,58,5,3 monster Butterfly 1032,3,10000,10000
008-1,292,165,5,3 monster Butterfly 1032,3,10000,10000
-008-1,203,142,5,3 monster Butterfly 1032,3,10000,10000
+008-1,207,139,5,3 monster Butterfly 1032,3,10000,10000
008-1,165,147,5,3 monster Butterfly 1032,3,10000,10000
008-1,181,213,14,10 monster Log Head 1031,2,5000,30000
008-1,244,160,31,11 monster Mana Bug 1035,7,10000,10000
@@ -92,7 +92,7 @@
008-1,146,183,36,25 monster Forest Maggot 1028,12,500,2500
008-1,77,96,7,5 monster Forest Maggot 1028,3,500,2500
008-1,185,187,21,11 monster Butterfly 1032,3,10000,10000
-008-1,272,67,30,35 monster Squirrel 1041,7,10000,30000
+008-1,267,68,30,35 monster Squirrel 1041,7,10000,30000
008-1,178,180,36,30 monster Squirrel 1041,12,10000,30000
008-1,161,34,6,7 monster Scorpion 1043,2,6000,12000
008-1,47,98,23,49 monster Butterfly 1032,5,10000,10000
@@ -103,5 +103,22 @@
008-1,111,68,8,3 monster Robin Bandit 1064,2,8000,12000
008-1,126,80,8,3 monster Bandit 1063,2,5500,8000
008-1,122,44,4,7 monster Robin Bandit 1064,1,3000,8000
-008-1,89,116,7,6 monster Moubi 1072,1,10000000,1000000
008-1,259,116,31,20 monster Maggot 1026,6,500,10000
+008-1,221,70,8,11 monster Small Frog 1086,3,3000,30000
+008-1,190,166,8,11 monster Small Frog 1086,2,3000,30000
+008-1,88,197,8,26 monster Small Frog 1086,4,3000,30000
+008-1,228,62,15,11 monster Big Frog 1087,1,6000,60000
+008-1,225,162,15,11 monster Big Frog 1087,1,6000,60000
+008-1,88,190,15,11 monster Big Frog 1087,1,6000,60000
+008-1,124,173,20,23 monster Mouboo 1023,5,30000,60000
+008-1,162,42,36,12 monster Butterfly 1032,3,10000,10000
+008-1,186,52,2,0 monster Mauve Plant 1036,1,1000,20000
+008-1,179,25,5,3 monster Pinkie 1030,2,3000,12000
+008-1,228,107,5,12 monster Brotherhood Fighter 1081,2,6000,18000
+008-1,249,143,18,3 monster Brotherhood Fighter 1081,2,12000,18000
+008-1,283,158,7,5 monster Forest Maggot 1028,3,500,2500
+008-1,66,191,17,27 monster Forest Maggot 1028,5,5000,25000
+008-1,55,204,17,8 monster Spider 1044,2,4000,8000
+008-1,73,54,17,12 monster Bluepar 1088,2,12000,36000
+008-1,33,33,11,12 monster Wolvern 1117,2,10000,10000
+008-1,82,162,38,14 monster Wolvern 1117,3,18000,60000
diff --git a/npc/008-1/auldsbel.txt b/npc/008-1/auldsbel.txt
index 7f0bc2b1..3d3ebbf5 100644
--- a/npc/008-1/auldsbel.txt
+++ b/npc/008-1/auldsbel.txt
@@ -1,11 +1,11 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
// Auldsbel the Magician.
// THIS IS A PLACEHOLDER!
-008-1,119,114,0 script Auldsbel#008-1 NPC_WIZARD,{
+008-1,119,114,0 script Auldsbel NPC_WIZARD,{
// Placeholder please remove
if (!MASTERBOOK_PAGES)
{
@@ -49,6 +49,6 @@
OnInit:
.bodytype = BODYTYPE_3;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-1/banu.txt b/npc/008-1/banu.txt
index 342475ea..183d33c3 100644
--- a/npc/008-1/banu.txt
+++ b/npc/008-1/banu.txt
@@ -1,11 +1,11 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
// Banu, the old lady.
// THIS IS A PLACEHOLDER!
-008-1,244,88,0 script Banu#008-1 NPC_OLD_LADY,{
+008-1,244,88,0 script Banu NPC_OLD_LADY,{
speech
l("Hello."),
l("You don't have a scythe, by chance? I am too old to mew this field all alone."),
@@ -16,6 +16,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-1/blossom.txt b/npc/008-1/blossom.txt
index 24db6821..8746752e 100644
--- a/npc/008-1/blossom.txt
+++ b/npc/008-1/blossom.txt
@@ -1,39 +1,78 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
// Blossom the flower-seller girl.
// THIS IS A PLACEHOLDER!
-008-1,198,138,0 script Blossom#008-1 NPC_BLOSSOM,{
+008-1,198,138,0 script Blossom NPC_BLOSSOM,{
speech
l("Hi, my name is Blossom."),
l("Strange, it seems I became younger lately."),
l("Are you in need of some flowers?");
- switch (select(l("I love flowers! What do you have for sale?"),
- l("Not now, thank you."),
- l("Dont you know something about fertility? I heard rumors.")))
+ do
{
- case 1:
- closeclientdialog;
- shop "#Invisible008-1";
- close;
- case 2:
- speech S_FIRST_BLANK_LINE,
- l("Oh, ok. Come back later if you need something.");
- close;
- case 3:
- speech S_FIRST_BLANK_LINE,
- l("I heard something too. A girl named Galimatia seems to need help. If only those lazy developers could tell her what she needs.");
- close;
- }
+ select
+ l("I love flowers! What do you have for sale?"),
+ l("Not now, thank you."),
+ l("Dont you know something about fertility? I heard rumors."),
+ l("Do you sell Flower Seeds?");
+ mes "";
+ switch (@menu)
+ {
+ case 1:
+ closeclientdialog;
+ shop "#Invisible008-1";
+ close;
+ case 2:
+ speech S_FIRST_BLANK_LINE,
+ l("Oh, ok. Come back later if you need something.");
+ close;
+ case 3:
+ /*
+ speech S_FIRST_BLANK_LINE,
+ l("I heard something too. A girl named Galimatia seems to need help. If only those lazy developers could tell her what she needs.");
+ */
+ mesn;
+ mesq l("I heard something too. A girl named Galimatia seems to need help.");
+ next;
+ mesn;
+ mesq l("But I believe Oscar gave her a fertility recipe...?");
+ next;
+ mesn;
+ mesq l("...Oops, I'm not supposed to say that. Oscar is... Well... Either a genius or a madman, I can't say.");
+ break;
+ case 4:
+ mesn;
+ mesq l("No I don't, but I can exchange them. 3 %s for a %s.", getitemlink(GrassSeeds), getitemlink(FlowerSeeds));
+ next;
+ /*
+ // TODO: Add Andra
+ mesn;
+ mesq l("If you need the opposite, look for Andra.");
+ */
+ if (countitem(GrassSeeds) < 3)
+ break;
+
+ mesc l("Trade with %s?", .name$);
+ if (askyesno() == ASK_YES) {
+ inventoryplace FlowerSeeds, 1;
+ delitem GrassSeeds, 3;
+ getitem FlowerSeeds, 1;
+ mesn;
+ mesq l("Thanks for the trade.");
+ next;
+ }
+ break;
+ }
+ } while (true);
close;
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-1/confused-tree.txt b/npc/008-1/confused-tree.txt
index 198aedd7..5ed54448 100644
--- a/npc/008-1/confused-tree.txt
+++ b/npc/008-1/confused-tree.txt
@@ -343,7 +343,7 @@
delayed_reply(sprintf("I haven't seen player `%s` today.", .@player$));
else
- delayed_reply(sprintf("Player `%s` was last seen %s.", .@player$, FuzzyTime(.@time)));
+ delayed_reply(sprintf("Player `%s` was last seen %s.", .@player$, FuzzyTime(.@time, 0, 99)));
end;
}
@@ -656,7 +656,7 @@
reply(relative_array_random(.bad$));
else if (.@m$ ~= "(?:^| )(?:how old are you|uptime)(?:$|[^a-z])")
- reply("%%B Server uptime: " + FuzzyTime(.uptime, 1) + ".");
+ reply("%%B Server uptime: " + FuzzyTime(.uptime, 1, 99) + ".");
else if (.@m$ ~= "(?:^| )how chatty are you(?:$|[^a-z])")
reply("%%B Answered " + .answered_times + " times, ignored " + .ignored_times + " times.");
diff --git a/npc/008-1/crane.txt b/npc/008-1/crane.txt
new file mode 100644
index 00000000..d8099536
--- /dev/null
+++ b/npc/008-1/crane.txt
@@ -0,0 +1,93 @@
+// TMW scripts.
+// Author:
+// Micksha
+// Description:
+// Crane is Snarfles' apprentice, who secretly eats mouboo steak and enjoys.
+
+008-1,97,113,0 script Crane NPC_SNARFLES,{
+ function foodQuest;
+
+ mesn;
+ mesq l("Heya. I am Crane, Snarfle's apprentice.");
+ if (getq(General_SmearedHands) <= 3 && getq2(General_SmearedHands) != 1)
+ foodQuest();
+ close;
+
+function foodQuest {
+ .@q=getq(General_SmearedHands);
+ next;
+ mesn;
+ mesq l("Don't tell him, but, I secretly love %s!", getitemlink(MoubooSteak));
+ switch (.@q) {
+ case 1:
+ next;
+ mesn strcharinfo(0);
+ select
+ l("Do you know a recipe for %s?", getitemname(BarbecuePlate)),
+ l("Okay, I won't.");
+ mes "";
+ if (@menu == 2)
+ break;
+ mesn;
+ mesq l("Ah sure, it is a simple recipe, I could even make one for you and give you the recipe, but...");
+ next;
+ mesn;
+ mesq l("I always get smeared hands eating it and cannot play cards anymore with Snarfles.");
+ next;
+ mesn;
+ mesq l("Well, if you find me a solution for that problem, I can give you the recipe. What do you say?");
+ next;
+ mesc l("WARNING: If you accept this quest, you'll be struck at the %s route!", b(l("Carnivour"))), 1;
+ mesc l("This will also make %s's Quest unavailable.", b("Snarfles")), 1;
+ mesc l("This decision cannot be changed later."), 1;
+ next;
+ mesc l("Accept this request?"), 1;
+ if (askyesno() == ASK_YES) {
+ setq General_SmearedHands, 2, CARNIVOROUS; // 2 = Carnivorous
+ mesn;
+ mesq l("Great! I'll be eager for your return!");
+ }
+ break;
+ case 2:
+ mesn;
+ mesq l("Have you found a solution for my smeared hands problem?");
+ next;
+ select
+ l("No, not yet.");
+ mes "";
+ mesn;
+ mesq l("I've heard they're related to the earl of sandwich, so maybe a sandwich maker could help... *sigh* I want to play cards...");
+ break;
+ case 3:
+ mesn strcharinfo(0);
+ select
+ l("Have you tried putting it in a bread already?"),
+ l("I'll keep looking for solutions for your problem.");
+ mes "";
+ if (@menu == 2)
+ return;
+ mesn;
+ mesq l("Actually... No. Have been too afraid of it tasting foul.");
+ next;
+ mesn strcharinfo(0);
+ mesq l("Really? Tiki, Candor's chef, liked it very much.");
+ next;
+ mesn;
+ mesq l("Wha - Really?! Tiki said it tasted good??! I'm saved! You're truly my savior!!");
+ next;
+ mesn;
+ mesq l("I'll put the %s recipe on your %s. Thanks, you saved my day!", getitemlink(BarbecuePlate), getitemlink(RecipeBook));
+ RECIPES[CraftBarbecuePlate]=true;
+ getitembound BarbecuePlate, 1, IBT_ACCOUNT;
+ setq1 General_SmearedHands, 4; // Finished
+ default:
+ return;
+ }
+ return;
+}
+
+OnInit:
+ .bodytype = BODYTYPE_3;
+ .distance = 4;
+ end;
+}
diff --git a/npc/008-1/doors.txt b/npc/008-1/doors.txt
new file mode 100644
index 00000000..7ad1d705
--- /dev/null
+++ b/npc/008-1/doors.txt
@@ -0,0 +1,43 @@
+// The Mana World scripts.
+// Author:
+// Jesusalva
+// Description:
+// Rossy Quest
+
+008-1,49,157,0 script #RossyCaveInit NPC_HIDDEN,0,0,{
+ end;
+
+OnTouch:
+ if (getq(HurnscaldQuests_Rossy) != 16)
+ {
+ // Normal warping
+ warp "008-3-0", 129, 112;
+ }
+ else
+ {
+ // HurnscaldQuests_Rossy
+ // (MAIN QUEST, CAVE CONTROL, INSTANCE CONTROL)
+ .@inst=getq3(HurnscaldQuests_Rossy);
+ .@mapn$="ross@"+getcharid(0);
+ // NOTE: .@inst >= 0 skipped now that inst=0 refers to La Marine
+ if (isinstance(.@inst) && instanceowner(.@inst) == getcharid(3))
+ {
+ // Renew instance for 15 minutes
+ //instance_set_timeout(900, 900, .@inst);
+ // FIXME: Clean unkilled monsters
+ } else {
+ .@inst = instance_create("ROSSY "+getcharid(0), getcharid(3), IOT_CHAR);
+ instance_attachmap("008-3-0", .@inst, false, .@mapn$);
+ // Instance lasts 20 minutes
+ instance_set_timeout(ROSSY_INSTIME, ROSSY_INSTIME, .@inst);
+ instance_init(.@inst);
+ setq3 HurnscaldQuests_Rossy, .@inst;
+ // Reset quest progress
+ setq2 HurnscaldQuests_Rossy, 0;
+ @rossylock=false;
+ }
+ // Warp to instanced map
+ warp .@mapn$, 129, 112;
+ }
+ end;
+}
diff --git a/npc/008-1/marine.txt b/npc/008-1/marine.txt
new file mode 100644
index 00000000..ca448a2e
--- /dev/null
+++ b/npc/008-1/marine.txt
@@ -0,0 +1,17 @@
+// Moubootaur Legends scripts.
+// Authors:
+// Jesusalva
+// Description:
+// This script controls access to Ships, fixing variables.
+
+// Use NPC_LA_MARINE if needed
+008-1,327,104,0 script La Marine#H NPC_HIDDEN,0,0,{
+ end;
+
+OnTouch:
+ EnterTown("Hurns");
+
+ warp "marine@"+LOCATION$, 42, 26;
+ closedialog;
+ close;
+}
diff --git a/npc/008-1/oscar.txt b/npc/008-1/oscar.txt
index 6668ea1e..d7c2f6d5 100644
--- a/npc/008-1/oscar.txt
+++ b/npc/008-1/oscar.txt
@@ -1,20 +1,20 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
// Oscar the farmer.
-// THIS IS A PLACEHOLDER!
+// THIS IS A PLACEHOLDER! Read Dimond Chef before editing.
-008-1,160,77,0 script Oscar#008-1 NPC_CAUL,{
+008-1,160,77,0 script Oscar NPC_CAUL,{
speech
l("Hi, my name is Oscar."),
l("I used to be a farmer, but my magic attempts were banned by the gouvernment."),
- lg("Now I remain poor and unemployed.");
+ l("Now I remain poor and unemployed.");
close;
OnInit:
.bodytype = BODYTYPE_3;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-1/rossy.txt b/npc/008-1/rossy.txt
new file mode 100644
index 00000000..8e63bd27
--- /dev/null
+++ b/npc/008-1/rossy.txt
@@ -0,0 +1,389 @@
+// The Mana World scripts.
+// Author:
+// Jesusalva
+// Description:
+// Daughter of Olana and sister of Juliet. PLACEHOLDER SPRITE
+
+008-1,62,220,0 script Rossy NPC_TANISHA,{
+ function rossyFirstmet;
+ function rossyBasket;
+ function rossyLetter;
+ function rossyPotionList;
+ function rossyPotionDone;
+ function rossyDeliverRoses;
+ function rossyDeliverTulip;
+ function rossyJulietIntro;
+ .@q=getq(HurnscaldQuests_Rossy);
+ mesn;
+ mesq l("Hello, wanderer.");
+ switch (.@q) {
+ case 1:
+ rossyFirstmet();
+ break;
+ case 3:
+ rossyBasket();
+ break;
+ case 6:
+ rossyLetter();
+ break;
+ case 7:
+ rossyPotionList();
+ break;
+ case 8:
+ mesn;
+ mesq l("What, you still have my potion with you??");
+ next;
+ mesn;
+ mesq l("Could you please deliver it to %s in the magic academy? He is the head of alchemy.", b("David"));
+ break;
+ case 9:
+ case 10:
+ rossyPotionDone();
+ break;
+ case 11:
+ rossyDeliverRoses();
+ break;
+ case 13:
+ rossyDeliverTulip();
+ break;
+ case 14:
+ mesn;
+ mesq l("Go and tell my mother that she is the nicest mother in the world.");
+ next;
+ select
+ l("Right on it."),
+ l("Did you find your sister? I am starting to get worried too.");
+ mes "";
+ if (@menu == 2) {
+ mesn;
+ if (BaseLevel < .minLevel_rescue)
+ mesq l("I think I have an idea where Juliet might be. Come back in a few levels, and I will tell you if she is ok.");
+ else
+ mesq l("I think I have an idea where she might be. Come back in a few minutes, I will tell you if she is ok.");
+ }
+ break;
+ case 15:
+ rossyJulietIntro();
+ break;
+ case 16:
+ mesn;
+ mesq l("Oh no! Juliet ... why would you go to that scary place? ... Please help her, %s!", strcharinfo(0));
+ mesc l("The cave is %s", b(l("Northwest of here.")));
+ break;
+ case 17:
+ mesn;
+ mesq l("Hey %s!", strcharinfo(0));
+ next;
+ mesn;
+ mesq l("Thanks for finding Juliet again. I'm so relieved!");
+ next;
+ mesn;
+ mesq l("...I still wonder what was that thing Juliet was running from... Hm? Nothing! Just thinking out loud.");
+ break;
+ // Default messages
+ case 12:
+ mesc l("Achooo!");
+ // FALLTHROUGH
+ default:
+ mesn;
+ mesq l("I'm being lazy right now, so please %s", any(
+ l("don't tell devs I'm slacking off again."),
+ l("tell my mother there is no reason to worry."),
+ l("don't worry with me.")
+ ));
+ }
+ close;
+
+function rossyFirstmet {
+ mesc l("A young girl looks at you in tears.");
+ next;
+ select
+ l("Hey there... Why are you crying? Are you hurt?"),
+ l("Sorry kid, I don't have time to play with children.");
+ mes "";
+ if (@menu == 2)
+ return;
+ mesn l("Young Girl");
+ mesq l("No. I'm crying because I lost all my fruits. My sister and I were collecting some near Dimond's Cove, but then I stumbled on a giant snail and it attacked us!");
+ next;
+ mesn l("Young Girl");
+ mesq l("But we were lucky, because the snail is really slow and we ran away from it. Juliet ran to the left and I ran to the right. The snail got pretty confused, because we are identical twins. The problem is that I dropped the basket full of fruits on the ground and that evil snail ate them all! And now I can't find Juliet to help me collect more fruits.");
+ next;
+ mesn strcharinfo(0);
+ select
+ l("Did you say \"Juliet\"? I talked to your mother Olana, She's very worried about you!");
+ mes "";
+ // You know she is Rossy, so mesn; won't need args anymore
+ mesn;
+ mesq l("Really? But she let us play in the woods. There's no reason to be worried – unless....");
+ next;
+ mesn;
+ mesc l("Rossy suddenly gets a strange look on her face, mumbling something about Juliet.");
+ mesq l("Could you do me a favor? Please, tell my mother that we're alright. There's ... well ... there's no reason to worry about us.");
+ next;
+ select
+ l("Very well, if you say so...."),
+ l("Sorry, but I really don't have time for this.");
+ mes "";
+ if (@menu == 2) {
+ mesn;
+ mesq lg("Then why bother? Weird person...");
+ return;
+ }
+ setq HurnscaldQuests_Rossy, 2;
+ mesn;
+ mesq l("Thank you very much!");
+ return;
+}
+
+function rossyBasket {
+ mesn;
+ mesq l("Hey, that is nice of you to come back. I was thinking about giving a basket full of %s to my mother, to make her happy, you know.", getitemlink(Blueberries));
+ next;
+ mesn;
+ mesq l("But I would need at least %d berries, and it would take ages to get so many by myself!", .blueberries_amount);
+ next;
+ select
+ l("That is no problem for me. Just wait and I will come back with the cherries."),
+ l("Ask Juliet, not me."),
+ rif(countitem(Blueberries), l("Hey, I have some in my backpack!")),
+ l("You should get them yourself.");
+ mes "";
+ if (@menu == 2) {
+ mesn;
+ mesq l("Juliet ran to the left, and I'm pretty sure she is doing the same.");
+ }
+ if (@menu != 3)
+ return;
+ if (countitem(Blueberries) < .blueberries_amount) {
+ mesn;
+ mesq l("You do, but that's not enough. I need %d %s.", .blueberries_amount, getitemlink(Blueberries));
+ }
+ delitem Blueberries, .blueberries_amount;
+ getexp 2000, 500;
+ setq HurnscaldQuests_Rossy, 4;
+ // FIXME: Perhaps give player a [Berries Bag] item? Hmm.
+ mesn;
+ mesq l("I can't believe it! You got all the berries needed! Lemme just wrap them and... done! Please give them to my mother. Tell her that it is a gift from me and Juliet, and that there's no reason to worry about us."); // Lemme = Let me
+ next;
+ mesn;
+ mesc l("%s mumbles to herself.", .name$);
+ mesq l("I hope...");
+ next;
+ mesn;
+ mesq l("Oh, and after you give the berries to my mother, please come back here. Err, if you have some free time, of course.");
+ return;
+}
+
+function rossyLetter {
+ mesn;
+ mesq l("I'm being lazy right now, so please %s", any(
+ l("don't tell devs I'm slacking off again."),
+ l("tell my mother there is no reason to worry."),
+ l("don't worry with me.")
+ ));
+ next;
+ select
+ l("Hocus sent a letter to you."),
+ l("Erm, okay.");
+ mes "";
+ if (@menu == 2)
+ return;
+ mesn;
+ mesq l("The Grandmaster? %%U Lemme read...");
+ next;
+ mesn;
+ mesc l("%s's face suddenly turns pale.", .name$);
+ mesq l("Oh no! I completely forgot. The exam! Dang, I knew I should not have picked Alchemy for study...");
+ next;
+ mesn;
+ mesc l("%s looks at you with beady eyes.", .name$);
+ mesq l("I haven't found Juliet yet, and I don't even have any of the ingredients required. Could you get them for me? Pretty please? %%J");
+ next;
+ select
+ l("Alright, tell me what I must get."),
+ l("Your cute face will not convince me - Your test, your responsibility.");
+ mes "";
+ if (@menu == 2) {
+ mesn;
+ mesq l("Yes, I know. I really should have started it earlier... But I can't look for Juliet AND get the ingredients at the same time. Some of them are only found in Tulimshar.");
+ next;
+ mesn;
+ mesq l("You don't even know how Juliet looks. Please come back if you reconsider. Please. Juliet could be being eaten by a creature, as we speak. %%i");
+ return;
+ }
+ setq HurnscaldQuests_Rossy, 7, 0;
+ mesn;
+ mesq l("Excellent! So, as for the materials I need to brew the potion...");
+ next;
+ rossyPotionList();
+ return;
+}
+
+function rossyPotionList {
+ .@t=getq2(HurnscaldQuests_Rossy);
+ // Potion submitted
+ if (.@t) {
+ // Finished!
+ if (.@t < gettimetick(2)) {
+ // Yay
+ mesn;
+ mesq l("I'm done! Thanks for the help. It is just the shade of blue I wanted.");
+ next;
+ mesn;
+ mesq l("Could you please deliver it to %s in the magic academy? He is the head of alchemy.", b("David"));
+ setq HurnscaldQuests_Rossy, 8, 0;
+ } else {
+ // Brewing
+ mesn;
+ mesq l("Please be patient... I'll be done in %s.", FuzzyTime(.@t));
+ }
+ return;
+ }
+
+ // Potion not yet finished
+ //mesf("- %d/%d %s", countitem(CactusDrink), 24, getitemlink(CactusDrink));
+ mesf("- %d/%d %s", countitem(MaggotSlime), 32, getitemlink(MaggotSlime));
+ mesf("- %d/%d %s", countitem(GambogeHerb), 50, getitemlink(GambogeHerb));
+ mesf("- %d/%d %s", countitem(AlizarinHerb), 43, getitemlink(AlizarinHerb));
+ mesf("- %d/%d %s", countitem(BugLeg), 30, getitemlink(BugLeg));
+ mesf("- %d/%d %s", countitem(Pearl), 1, getitemlink(Pearl));
+ next;
+ mesn;
+ mesq l("Do you have these materials with you?");
+ next;
+ select
+ l("Not yet."),
+ l("Yes, here they are!"),
+ l("No, but I'll be right back.");
+ mes "";
+ if (@menu != 2)
+ return;
+ if (countitem(MaggotSlime) < 32 ||
+ countitem(GambogeHerb) < 50 ||
+ countitem(AlizarinHerb) < 43 ||
+ countitem(BugLeg) < 30 ||
+ //countitem(CactusDrink) < 24 ||
+ countitem(Pearl) < 1) {
+ mesn;
+ mesq l("You would lie to a poor, small, frail girl like me? %%S");
+ next;
+ mesn;
+ mesq l("Don't you think that to be very coward on your part?");
+ return;
+ }
+ //delitem CactusDrink, 24;
+ delitem MaggotSlime, 32;
+ delitem GambogeHerb, 50;
+ delitem AlizarinHerb, 43;
+ delitem BugLeg, 30;
+ delitem Pearl, 1;
+ setq2 HurnscaldQuests_Rossy, gettimetick(2)+900;
+ mesn;
+ mesq l("Perfect! Please allow me some time to brew this potion. It should be ready in 15 minutes or so.");
+ return;
+}
+
+function rossyPotionDone {
+ mesn;
+ mesq l("So... How did it go?");
+ next;
+ select
+ l("David said it was \"okay-ish\"."),
+ l("David said he would grade it later, but you had nothing to worry about.");
+ mes "";
+ if (@menu == 1) {
+ mesn;
+ mesq l("That's a relief. Okay-ish is actually a pretty good grade in the Academy.");
+ next;
+ }
+ mesn;
+ mesq l("Could you please tell my mother about that? She is already worried with Juliet and me, no need to have her worried about the exam as well.");
+ compareandsetq HurnscaldQuests_Rossy, 9, 10;
+ return;
+}
+
+function rossyDeliverRoses {
+ if (countitem(ARedRose) < 15) {
+ mesn;
+ mesq l("Hello %s.", strcharinfo(0));
+ return;
+ }
+ select
+ l("Your mother was so happy that she asked me to bring you these flowers.");
+ mes "";
+ delitem ARedRose, 15;
+ setq HurnscaldQuests_Rossy, 12;
+ mesn;
+ mesq l("How nice!");
+ next;
+ mesn;
+ mesc l("Rossy takes the flowers from your hands and suddenly throws them on the ground. She begins sneezing.");
+ next;
+ select
+ l("I presume you don't like roses, right?"),
+ l("Are you feeling well?");
+ mes "";
+ mesn;
+ mesq l("I am allergic to roses; my mother should already know that!");
+ next;
+ mesn strcharinfo(0);
+ mesc l("Maybe we should talk to Olana about this.");
+ return;
+}
+
+function rossyDeliverTulip {
+ if (countitem(ARedTulip) < 15) {
+ mesc l("Achooo!");
+ mesn;
+ mesq l("I'm being lazy right now, so please %s", any(
+ l("don't tell devs I'm slacking off again."),
+ l("tell my mother there is no reason to worry."),
+ l("don't worry with me.")
+ ));
+ return;
+ }
+ select
+ l("Your mother is sorry about the roses. Here are some beautiful red tulips instead.");
+ mes "";
+ delitem ARedTulip, 15;
+ setq HurnscaldQuests_Rossy, 14;
+ getexp 2500, 250;
+ mesn;
+ mesq l("That's better! Go and tell my mother that she is the nicest mother in the world.");
+ next;
+ mesn;
+ mesq l("However... Now I should really find my sister. Come back later.");
+ return;
+}
+
+function rossyJulietIntro {
+ if (BaseLevel < .minLevel_rescue) {
+ mesn;
+ mesq l("I think I have an idea where Juliet might be. Come back in a few levels, and I will tell you if she is ok.");
+ return;
+ }
+ mesn;
+ mesq l("%s, you have to help me! I saw Juliet, but something was wrong!!", strcharinfo(0));
+ next;
+ select
+ l("Calm down and tell me what happened.");
+ mes "";
+ mesn;
+ mesq l("No time for that! She was running away from something and entered a cave not far from here. I heard her scream. Please, can you enter the cave and save her? I'm so scared!");
+ next;
+ mesc l("%s is too distressed to be of any help. It might be a better idea to go inside the cave and look for Juliet.", .name$);
+ mesc l("The cave is %s", b(l("Northwest of here.")));
+ setq HurnscaldQuests_Rossy, 16;
+ return;
+}
+
+OnInit:
+ .bodytype = BODYTYPE_3;
+ .distance = 4;
+
+ // Quest conf
+ .blueberries_amount=30;
+ .minLevel_rescue = 60;
+ end;
+}
diff --git a/npc/008-1/snarfles.txt b/npc/008-1/snarfles.txt
index d40bf309..6332b4c9 100644
--- a/npc/008-1/snarfles.txt
+++ b/npc/008-1/snarfles.txt
@@ -1,20 +1,98 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
// Snarfles the mouboo farmer.
// THIS IS A PLACEHOLDER!
-008-1,79,118,0 script Snarfles#008-1 NPC_SNARFLES,{
+008-1,79,118,0 script Snarfles NPC_SNARFLES,{
+ function foodQuest;
speech
l("My Mouboos, my beloved Mouboos!"),
l("Oh, hi, isn't it cool to live among all those Mouboos? I don't understand how some people can eat Mouboo steak."),
lg("Murderers!");
-
+ if (getq(General_SmearedHands) <= 3 && getq2(General_SmearedHands) != 2)
+ foodQuest();
close;
+function foodQuest {
+ .@q=getq(General_SmearedHands);
+ next;
+ mesn;
+ mesq l("Ah... I could use some Asparagus with Hollondaise now...");
+ switch (.@q) {
+ case 1:
+ next;
+ mesn strcharinfo(0);
+ select
+ l("\"Asparagus with Hollondaise\"? What's that?"),
+ menuaction(l("Leave"));
+ mes "";
+ if (@menu == 2)
+ break;
+ mesn;
+ mesq l("Some call it %s, but it is so tasty...", getitemlink(VeggiePlate));
+ next;
+ mesn;
+ mesq l("I could even make one for you and give the recipe, but...");
+ next;
+ mesn;
+ mesq l("I always get smeared hands eating it and cannot play cards anymore with Crane.");
+ next;
+ mesn;
+ mesq l("Well, if you find me a solution for that problem, I can give you the recipe. What do you say?");
+ next;
+ mesc l("WARNING: If you accept this quest, you'll be struck at the %s route!", b(l("Vegetarian"))), 1;
+ mesc l("This will also make %s's Quest unavailable.", b("Crane")), 1;
+ mesc l("This decision cannot be changed later."), 1;
+ next;
+ mesc l("Accept this request?"), 1;
+ if (askyesno() == ASK_YES) {
+ setq General_SmearedHands, 2, VEGAN; // 1 = Vegan
+ mesn;
+ mesq l("Great! I'll be eager for your return!");
+ }
+ break;
+ case 2:
+ mesn;
+ mesq l("Have you found a solution for my smeared hands problem?");
+ next;
+ select
+ l("No, not yet.");
+ mes "";
+ mesn;
+ mesq l("I've heard they're related to the earl of sandwich, so maybe a sandwich maker could help... *sigh* I want to play cards...");
+ break;
+ case 3:
+ mesn strcharinfo(0);
+ select
+ l("Have you tried putting it in a bread already?"),
+ l("I'll keep looking for solutions for your problem.");
+ mes "";
+ if (@menu == 2)
+ return;
+ mesn;
+ mesq l("Actually... No. Have been too afraid of it tasting foul.");
+ next;
+ mesn strcharinfo(0);
+ mesq l("Really? Tiki, Candor's chef, liked it very much.");
+ next;
+ mesn;
+ mesq l("Wha - Really?! Tiki said it tasted good??! I'm saved! You're truly my savior!!");
+ next;
+ mesn;
+ mesq l("I'll put the %s recipe on your %s. Thanks, you saved my day!", getitemlink(VeggiePlate), getitemlink(RecipeBook));
+ RECIPES[CraftVeggiePlate]=true;
+ getitembound VeggiePlate, 1, IBT_ACCOUNT;
+ setq1 General_SmearedHands, 4; // Finished
+ default:
+ return;
+ }
+ return;
+}
+
OnInit:
.bodytype = BODYTYPE_3;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-1/voltain.txt b/npc/008-1/voltain.txt
index d3aa9bc8..6ab22f1e 100644
--- a/npc/008-1/voltain.txt
+++ b/npc/008-1/voltain.txt
@@ -1,11 +1,11 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
// Voltain the dark druid.
// THIS IS A PLACEHOLDER!
-008-1,182,155,0 script Voltain#008-1 NPC_DARK_DRUID,{
+008-1,182,155,0 script Voltain NPC_DARK_DRUID,{
speech
l("Go away, I have to think about new evil doings."),
lg("GO AWAY, I SAID!");
@@ -14,6 +14,6 @@
OnInit:
.bodytype = BODYTYPE_3;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-2-0/celestia.txt b/npc/008-2-0/celestia.txt
index 4485ae73..9e39b7fc 100644
--- a/npc/008-2-0/celestia.txt
+++ b/npc/008-2-0/celestia.txt
@@ -1,4 +1,4 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
@@ -15,6 +15,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-2-1/richard.txt b/npc/008-2-1/richard.txt
index 8535abfa..acff286a 100644
--- a/npc/008-2-1/richard.txt
+++ b/npc/008-2-1/richard.txt
@@ -1,20 +1,63 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
// Richard the Hurns storage guy.
// THIS IS A PLACEHOLDER!
-008-2-1,26,35,0 script Richard#008-1 NPC_RICHARD_LEGACY,{
- speech
- l("Oh hey!"),
- l("I was supposed to act as storagekeeper, but I forgot my key.");
- lg("Come back later, perhaps I can find it.");
+008-2-1,26,35,0 script Richard NPC_RICHARD_LEGACY,{
+ // Storage/Banking function not unlocked in Artis
+ if (!getq(ArtisQuests_Lloyd)) {
+ speech
+ l("Oh hey!"),
+ l("I was supposed to act as storagekeeper, but I forgot my key."),
+ l("Come back later, perhaps I can find it.");
+ close;
+ }
+ mesn;
+ mesq l("Welcome to %s's Bank!", l($@BANK_TOWN$[.bankid]));
+ next;
+ do
+ {
+ select
+ l("I would like to store some items."),
+ l("I would like to perform money transactions."),
+ l("Is there any request for me?"),
+ menuaction(l("Quit"));
+
+ mes "";
+
+ switch (@menu) {
+ case 1:
+ mesn;
+ mesq l("Sure thing! I'll have your items transported here from Artis before you realize!");
+ next;
+ closeclientdialog();
+ openstorage();
+ close;
+ case 2:
+ MerchantGuild_Bank();
+ break;
+ case 3:
+ MerchantGuild_Quests(.bankid);
+ break;
+ default:
+ closeclientdialog;
+ goodbye;
+ close;
+ }
+
+ } while (true);
close;
OnInit:
.bodytype = BODYTYPE_3;
- .distance = 2;
+ .distance = 4;
+
+ // Bank configuration
+ array_push($@BANK_NAME$, .name$);
+ array_push($@BANK_TOWN$, "Hurnscald");
+ .bankid = getarraysize($@BANK_NAME$)-1;
end;
}
diff --git a/npc/008-2-1/selim.txt b/npc/008-2-1/selim.txt
index 457577ed..2bdea97d 100644
--- a/npc/008-2-1/selim.txt
+++ b/npc/008-2-1/selim.txt
@@ -1,19 +1,20 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
// Selim the Dyer.
// THIS IS A PLACEHOLDER!
-008-1,38,40,0 script Selim#008-1 NPC_GUMI_THE_DYER,{
+008-1,38,40,0 script Selim NPC_GUMI_THE_DYER,{
speech
l("Oh hey!"),
- lg("Good you are here, you could be handy for me right now.");
+ l("Good you are here, you could be handy for me right now."),
+ l("Or maybe later. Hmm, we'll see.");
close;
OnInit:
.bodytype = BODYTYPE_3;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-2-10/airlia.txt b/npc/008-2-10/airlia.txt
index fae76efb..437e624d 100644
--- a/npc/008-2-10/airlia.txt
+++ b/npc/008-2-10/airlia.txt
@@ -1,16 +1,18 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
// Airlia, the major's daughter.
// THIS IS A PLACEHOLDER!
-008-2-10,42,29,0 script Airlia#008-2-8 NPC_AIRLIA,{
+008-2-10,42,29,0 script Airlia NPC_AIRLIA,{
speech
l("Hello."),
l("Do you know where the graveyard is?"),
lg("No? Better that way. It's so dangerous there.");
+ if (getq(General_Brotherhood) < 2)
+ close;
next;
select
l("Okay, thanks."),
@@ -27,6 +29,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-2-12/nurse.txt b/npc/008-2-12/nurse.txt
index 7c708e66..753739d5 100644
--- a/npc/008-2-12/nurse.txt
+++ b/npc/008-2-12/nurse.txt
@@ -1,6 +1,7 @@
// Evol scripts.
// Author:
// gumi
+// The Moubootaur Legends Development Team
// Quest states:
// [1] 0 - cannot do the quest
// [1] 1 - can do the quest
@@ -26,16 +27,18 @@
// Hurnscald Nurse. Robberies in Hurnscald.
008-2-12,28,30,0 script Nurse NPC_NURSE_LEGACY,{
+ function bloodDonor;
+ .@q2=getq2(HurnscaldQuests_BloodDonor);
speech(4,
l("How can I help you?"));
- // TODO: check for AxeHat when we get it
// XXX: this npc used to teach the resist poison skill, do we still want that?
selectd(
l("Oooh, these wounds! They hurt so much!"),
l("I don't feel so well, I might be sick."),
+ rif(.@q2 < gettimetick(2), l("I would like to donate blood.")),
l("No, I'm fine."),
rif(getq(.quest_inspector) == 2, l("Have you seen anything out of the ordinary?")));
@@ -45,7 +48,7 @@
if (BaseLevel > .heal_max_level)
{
speech(
- l("I'm sorry but I'm here only to help young people."), // XXX: this sounds cruel towards elderly people
+ l("I'm sorry but I'm here only to help young adventurers and the town residents."),
l("Your level is already higher than %d.", .heal_max_level),
l("You can get some rest at the inn near here."));
close;
@@ -53,29 +56,110 @@
speech(4,
l("Here, let me heal you."));
+ // Jesusalva: I don't trust npcskill()
npcskill(AL_HEAL, .heal_skill_level, .heal_npc_stats, .heal_npc_level);
speech(
l("There you go, like new."));
- close;
+ break;
case 2:
speech(
l("Then you should better see the doctor."),
l("He is usually in his office on the 3rd floor."));
- close;
+ break;
case 3:
+ bloodDonor();
+ break;
+ case 4:
speech(
l("Then I would ask you to leave."),
l("There are people who really need our help."));
- close;
- case 4:
+ break;
+ case 5:
speech(
l("I'm too busy here to observe the town."));
- close;
+ break;
}
+ close;
+function bloodDonor {
+ .@q2=getq2(HurnscaldQuests_BloodDonor);
+ .@q3=getq3(HurnscaldQuests_BloodDonor);
+ // Cheating??!
+ if (.@q2 > gettimetick(2))
+ kick(getcharid(3));
+ // Anyway, ML code comes here, adapted for TMW
+ mesc l("Donating blood will BLOCK YOUR MOVEMENT for three minutes.");
+ mesc l("Do not disconnect while waiting. You need 100% HP to donate.");
+ next;
+ // Always show Info if it is your first time donating blood
+ @menu = 1;
+ if (.@q3) {
+ select
+ l("Info"),
+ rif(readparam(Hp) == readparam(MaxHp), l("Yes, please use my blood to save lifes.")),
+ l("I changed my mind");
+ mes "";
+ }
+ if (@menu == 3)
+ return;
+ if (@menu == 1) {
+ mesn;
+ mesq l("Donating blood is a noble act, which allows to save lifes.");
+ next;
+ mesn;
+ mesq l("When people loses too much blood, they die, unless we can lend them somebody's else blood.");
+ next;
+ mesn;
+ mesq l("Not everyone can be a blood donor. For example, you must be healthy.");
+ mesq l("You can find more info about this on these links:");
+ mes "";
+ mes "[@@https://www.blood.co.uk/|https://www.blood.co.uk/@@]";
+ mes "[@@https://www.nhsbt.nhs.uk/what-we-do/blood-services/blood-donation/|https://www.nhsbt.nhs.uk/what-we-do/blood-services/blood-donation/@@]";
+ mes l("France: [@@https://dondesang.efs.sante.fr/|https://dondesang.efs.sante.fr/@@]");
+ mes l("Brazil: [@@http://www.prosangue.sp.gov.br/home/Default.html|http://www.prosangue.sp.gov.br/home/Default.html@@]");
+ if (readparam(Hp) < readparam(MaxHp))
+ return;
+ next;
+ mesc l("Donate blood?", 1);
+ if (askyesno() == ASK_NO)
+ return;
+ }
+ // Donate blood
+ mesn;
+ mesq l("This will take only a short while.");
+ next;
+ setq1 HurnscaldQuests_BloodDonor, 2;
+ percentheal -90, 0;
+ addtimer(180000, "Nurse::OnDonationComplete");
+ warp "008-2-14", 31, 27;
+ setpcblock(PCBLOCK_ATTACK|PCBLOCK_SKILL|PCBLOCK_USEITEM|PCBLOCK_MOVE, true);
+ dispbottom l("Any movement/skill/item will be without effect until time is up.");
+ closedialog;
+ return;
+}
+
+OnDonationComplete:
+ if (checkpcblock() & PCBLOCK_ATTACK)
+ setpcblock(PCBLOCK_ATTACK|PCBLOCK_SKILL|PCBLOCK_USEITEM|PCBLOCK_MOVE, false);
+ warp "008-2-12", 30, 30;
+ percentheal 100, 0;
+ // Experience gain is based on HP
+ getexp readparam(Hp)*2, readparam(Hp)/100;
+ .@q3=getq3(HurnscaldQuests_BloodDonor)+1;
+ // Cooldown: 60*60*24*30: 30 days
+ setq HurnscaldQuests_BloodDonor, 1, gettimetick(2)+(2592000), .@q3;
+ if (BaseLevel >= 30)
+ getitem Bread, 1;
+ if (BaseLevel >= 50)
+ getitem ChocolateBar, 1;
+ if (BaseLevel >= 70)
+ getitem BottleOfWater, 1;
+ mesn;
+ mesq l("Thanks for donating blood. You can donate again in 30 days.");
+ mesq l("You should eat and drink water after donating blood. Thanks for saving lifes!");
+ close;
- end;
OnInit:
.heal_max_level = 20; // she will only heal low level players
@@ -88,14 +172,5 @@ OnInit:
.quest_debug = .quest_inspector;
.bodytype = BODYTYPE_2;
.distance = 3;
-
-////////// UNFINISHED //////////
-////////////////////////////////
-// REMOVE THIS CODE WHEN THIS //
-// NPC IS NO LONGER A WIP //////
-////////////////////////////////
-if (!debug) disablenpc(.name$);
-///////// UNFINISHED ///////////
-
end;
}
diff --git a/npc/008-2-13/lena.txt b/npc/008-2-13/lena.txt
index 759cc64a..74f47724 100644
--- a/npc/008-2-13/lena.txt
+++ b/npc/008-2-13/lena.txt
@@ -1,11 +1,11 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
// Lena the Bowwoman.
// THIS IS A PLACEHOLDER!
-008-2-13,27,27,0 script Lena#008-2-13 NPC_LENA,{
+008-2-13,27,27,0 script Lena NPC_LENA,{
speech
l("Hey."),
l("Did you hear about the Bandit's attacks? They must have a hideout somewhere outside Hurnscald."),
@@ -15,6 +15,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-2-14/doctor.txt b/npc/008-2-14/doctor.txt
index c8609330..0dd6caea 100644
--- a/npc/008-2-14/doctor.txt
+++ b/npc/008-2-14/doctor.txt
@@ -1,6 +1,7 @@
// Evol scripts.
// Author:
// gumi
+// The Mana World Project
// Quest states:
// [1] 0 - cannot do the quest
// [1] 1 - can do the quest
@@ -26,13 +27,17 @@
// The crazy Hurnscald Doctor.
008-2-14,27,27,0 script Doctor NPC_DOCTOR_LEGACY,{
+ function doctorAxeHat;
+ function doctorEyePatch;
+
+ if (getequipid(EQI_HEAD_TOP) == AxeHat)
+ doctorAxeHat();
+ if (getequipid(EQI_ACC_R) == Eyepatch)
+ doctorEyePatch();
speech(4,
l("Hello, can I help you?"));
- // TODO: check for AxeHat when we get it
- // TODO: check for EyePatch when we get it
-
selectd(
l("I think I am sick!"),
l("No, I feel fine."),
@@ -58,23 +63,53 @@
l("No, I haven't seen anything."));
close;
}
+ end;
+function doctorAxeHat {
+ mesn;
+ mesq l("Oh my, what happened to you?");
+ next;
+ mesn;
+ mesq l("Wait. Thats just a fake. Shame on you!");
+ next;
+ mesn;
+ mesq l("Anyway...");
+ next;
+ return;
+}
+
+function doctorEyePatch {
+ mesn;
+ mesq l("Would you like a glass eye to replace that eye patch you have? We just got a whole load of them in today. I'll even let you keep the patch as a souvenir.");
+ next;
+ select
+ l("No, thank you."),
+ l("Yes, please.");
+ mes "";
+ if (@menu == 1) {
+ mesn;
+ mesq l("If you change your mind, just say the word. Anyway...");
+ next;
+ return;
+ }
+ mesn;
+ mesq l("Now, where did I put that box of eyes...");
+ next;
+ mesn;
+ mesc l("He goes off to look for them and comes back empty handed.");
+ mesq l("I can't seem to find where I put that box. You should come back later, I may have found them by then.");
+ next;
+ mesn;
+ mesq l("Anyway...");
+ next;
+ return;
+}
- end;
OnInit:
.quest_inspector = HurnscaldQuests_Inspector;
.quest_debug = .quest_inspector;
.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-16/yannika.txt b/npc/008-2-16/yannika.txt
index d22ef124..ecf9551a 100644
--- a/npc/008-2-16/yannika.txt
+++ b/npc/008-2-16/yannika.txt
@@ -1,4 +1,4 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Jesusalva
@@ -15,7 +15,59 @@
// It is an array with Craft Constants.
008-2-16,28,29,0 script Yannika NPC_YANNIKA,{
+ function yannika_intro;
+ function yannika_knives;
+ function yannika_recipe;
+ function sudo_make_sandwich;
+ function teach_cooking;
+ // If player haven't finished Hinnak quest yet, Yannika says so
+ .@q=getq(HurnscaldQuests_Hinnak);
+ if (.@q < 3)
+ {
+ speech
+ lg(l("Hello madam."), l("Hi Sir.")),
+ l("Isn't my husband Hinnak so hardworking?"),
+ lg("Come back later.");
+ close;
+ }
+
+ // Player completed Hinnak quest, we can continue in making Sandwiches
+ switch (getq(.quest))
+ {
+ case 0:
+ yannika_intro();
+ break;
+ case 1:
+ yannika_knives();
+ break;
+ default:
+ speech
+ lg(l("Hello madam."), l("Hi Sir.")),
+ l("Thanks for helping my husband Hinnak."),
+ l("He likes to eat sandwiches. A good thing they are so easy to make!");
+
+ select
+ l("Easy to make? Could you make one for me?"),
+ l("Easy to make? Could you teach me how to make them?"),
+ l("Good to know, thanks.");
+ mes "";
+
+ if (@menu == 1)
+ sudo_make_sandwich();
+ else if (@menu == 2)
+ teach_cooking();
+
+ next;
+ break;
+ }
+ closeclientdialog;
+ goodbye;
+ close;
+
+
+
+ ////////////////////////////////////////////////////
// Quest state 0
function yannika_intro
{
@@ -58,7 +110,7 @@
// delitem halts the script if it cannot delete all items.
inventoryplace RecipeBook, 1;
delitem Knife, 2;
- getitem RecipeBook, 1;
+ getitembound RecipeBook, 1, IBT_ACCOUNT;
setq .quest, 2;
speech
@@ -73,27 +125,36 @@
}
// Learn a new Sandwich Recipe
- // yannika_recipe ( Craft ID, Ammo 1, Item 1, Ammo 2, Item 2, Sandwich ID )
+ // yannika_recipe ( Craft ID, Sandwich ID, Ammo 1, Item 1, Ammo 2, Item 2, Ammo 3, Item 3, {alt1, alt2} )
function yannika_recipe
{
.@craft=getarg(0);
- .@ammo1=getarg(1);
- .@item1=getarg(2);
- .@ammo2=getarg(3);
- .@item2=getarg(4);
- .@sanid=getarg(5);
- speech
- l("I do know a recipe with this!"),
- l("You'll need to bring me @@ @@ and @@ @@ for the recipe.", .@ammo1, getitemlink(.@item1), .@ammo2, getitemlink(.@item2));
+ .@sanid=getarg(1);
+ .@ammo1=getarg(2);
+ .@item1=getarg(3);
+ .@ammo2=getarg(4);
+ .@item2=getarg(5);
+ .@ammo3=getarg(6);
+ .@item3=getarg(7);
+ .@alt1=getarg(8);
+ .@alt2=getarg(9);
+ mesn;
+ mes l("For this recipe, you'll need to bring me:");
+ mesf("%d/%d %s", countitem(.@item1), .@ammo1, getitemlink(.@item1));
+ mesf("%d/%d %s", countitem(.@item2), .@ammo2, getitemlink(.@item2));
+ mesf("%d/%d %s", countitem(.@item3), .@ammo3, getitemlink(.@item3));
+ mesf("%s or %s", getitemlink(.@alt1), getitemlink(.@alt2));
select
- l("Yes, in fact, you can take them now."),
+ rif(countitem(.@alt1), l("(%s) Yes, in fact, you can take them now.", getitemname(.@alt1))),
+ rif(countitem(.@alt2), l("(%s) Yes, in fact, you can take them now.", getitemname(.@alt2))),
l("Maybe later.");
- if (@menu == 1)
+ if (@menu < 3)
{
if (countitem(.@item1) < .@ammo1 ||
- countitem(.@item2) < .@ammo2)
+ countitem(.@item2) < .@ammo2 ||
+ countitem(.@item3) < .@ammo3)
{
speech
l("You don't have everything I have asked for.");
@@ -101,12 +162,24 @@
}
delitem .@item1, .@ammo1;
delitem .@item2, .@ammo2;
+ delitem .@item3, .@ammo3;
+ if (@menu == 1)
+ delitem .@alt1, 1;
+ if (@menu == 2)
+ delitem .@alt2, 1;
+
+ // Learn recipe
RECIPES[.@craft]=true;
- speech
- l("This is how you do it! HAAH!");
+ mesn;
+ mesq l("Look and learn.");
+ next;
+ mesn;
+ mesq l("This is how you do it! HAAH!");
next;
mesc l("You learned how to cook @@.", getitemlink(.@sanid));
next;
+ mesn;
+ mesq l("Please come back later and I may have something else to show you.");
}
return;
}
@@ -186,125 +259,209 @@
close;
}
- speech
- l("Well, of course, I can show you how to cook sandwiches. But you'll need to bring ingredients for practice."),
- l("Why don't you show me a main ingredient, and I'll tell you what can be done?");
-
- do
- {
- mes "##B" + l("Drag and drop an item from your inventory.") + "##b";
- .@id = requestitem();
-
- // If ID is invalid
- if (.@id < 1) {
- speech
- l("Out of creativity already? Don't worry, I don't judge! Hehe.");
- close;
+ // First part: Carp Sandwich
+ if (!RECIPES[CraftCarpSandwich]) {
+ mesn;
+ mesq l("Well, of course, I can show you how to cook sandwiches. But you'll need to bring ingredients for practice.");
+ next;
+ mesn;
+ mesq l("Should we start with something simple? Hmmm... Do you have a %s? It is hard to find one around these parts, but you don't seem to be from here.", getitemlink(FishingRod));
+ next;
+ // pre-req
+ if (!countitem(FishingRod)) {
+ mesn;
+ mesq l("Please try getting one. You'll need some carps for the recipe I'm going to teach you.");
+ if (countitem(CommonCarp) || countitem(GrassCarp))
+ mesq l("Cooking begins with collecting your own ingredients. That is what makes it so tasty. So, bring me a fishing rod!");
+ return;
}
- // If you are cheating ManaPlus interface
- if (countitem(.@id) < 1) {
- mesc l("You do not have the item!");
- close;
+ // warn about main req
+ if (!countitem(CommonCarp) && !countitem(GrassCarp)) {
+ mesn;
+ mesq l("Ah, good, you've brought one!");
+ next;
+ mesn;
+ mesq l("Now you'll need to fish a carp. It can be a %s or a single %s, for the sandwhich.", getitemlink(CommonCarp), getitemlink(GrassCarp));
+ next;
}
+ mesn;
+ mesq l("I'll also be needing the usual sandwich stuff: Bread, Lettuce and Cheese.");
+ next;
+ yannika_recipe(CraftCarpSandwich, CarpSandwich, 1, Bread, 3, LettuceLeaf, 2, Cheese, CommonCarp, GrassCarp);
+ return;
+ }
- // Now we will switch your result and check recipe on the meanwhile
- switch (.@id)
- {
- case CommonCarp:
- case GrassCarp:
- if (RECIPES[CraftCarpSandwich])
- {
- speech
- lg("Haha, silly you! You already know the recipe! Read the @@ if you forgot!", getitemlink(RecipeBook));
- }
- else
- {
- yannika_recipe(CraftCarpSandwich, 2, GrassCarp, 10, CommonCarp, CarpSandwich);
- }
- break;
-
- case Manana:
- if (RECIPES[CraftMananaSandwich])
- {
- speech
- lg("Haha, silly you! You already know the recipe! Read the @@ if you forgot!", getitemlink(RecipeBook));
- }
- else
- {
- yannika_recipe(CraftMananaSandwich, 3, Carrot, 30, Manana, MananaSandwich);
- }
- break;
+ // Main quest (TODO)
+ .@q=getq(.quest);
+ .@q2=getq2(.quest);
+ .@s=getq(General_SmearedHands);
- case PiouLegs:
- if (RECIPES[CraftPioulegSandwich])
- {
- speech
- lg("Haha, silly you! You already know the recipe! Read the @@ if you forgot!", getitemlink(RecipeBook));
- }
- else
- {
- yannika_recipe(CraftPioulegSandwich, 10, Croconut, 20, PiouLegs, PioulegSandwich);
- }
- break;
-
- default:
- speech
- l("Sorry, I don't know any recipe with this."),
- l("Maybe you have more luck with something else?");
- next;
- break;
- }
- } while (true);
-
- return;
- }
+ // Snarfles/Crane dependency
+ if (!.@s) {
+ mesn;
+ mesq l("No, not at the moment.");
+ next;
+ return;
+ }
- // If player haven't finished Hinnak quest yet, Yannika says so
- .@q=getq(HurnscaldQuests_Hinnak);
- if (.@q < 3)
- {
- speech
- lg(l("Hello madam."), l("Hi Sir.")),
- l("Isn't my husband Hinnak so hardworking?"),
- lg("Come back later.");
- close;
- }
+ // Backup SmearedHands to cooking for ease of access
+ setq2 General_Cooking, getq2(General_SmearedHands);
- // Player completed Hinnak quest, we can continue in making Sandwiches
- switch (getq(.quest))
- {
- case 0:
- yannika_intro();
+ // Switch General_Cooking quest
+ switch (.@q) {
+ case 2:
+ setq1 General_Cooking, 3;
+ // FALLTHROUGH
+ case 3:
+ case 4:
+ case 5:
+ case 9:
+ case 10:
+ case 12:
+ case 13:
+ case 14:
+ case 17:
+ mesn;
+ mesq l("Could you do a favor for me, first?");
+ next;
+ mesn;
+ mesq l("Could you bring a couple fresh fish to %s? Carps should do.", b(l("the Chef in Dimond's Cove")));
+ next;
+ mesn;
+ mesq l("He promised to make me some %s if I could provide him the fish.", getitemlink(SeafoodPlate));
+ next;
+ mesn;
+ mesq l("Sandwiches are handy, but they won't beat a full meal, which we hadn't in a while.");
+ next;
+ mesn;
+ mesq l("I'll be waiting your return!");
+ next;
break;
- case 1:
- yannika_knives();
+ case 6:
+ select
+ l("What did you want, again?"),
+ l("I need some %s.", getitemname(.@q2 == VEGAN ? MananaSandwich : PioulegSandwich));
+ mes "";
+ if (@menu == 1) {
+ mesn;
+ mesq l("A %s pretty please.", getitemlink(SeafoodPlate));
+ break;
+ }
+ mesn;
+ mesq l("Ehh, I usually only make %s... You know cooking is not just throwing ingredients and vói-la, right?", getitemlink(CarpSandwich));
+ next;
+ mesn;
+ mesq l("But actually... Perhaps the chef in Candor?");
+ next;
+ mesn;
+ mesq l("I forgot their name, but they are not very normal. Err.");
+ next;
+ mesn;
+ mesq l("You probably can find them by the shorelines.");
+ setq1 General_Cooking, 7;
break;
- case 2:
- speech
- lg(l("Hello madam."), l("Hi Sir.")),
- l("Thanks for helping my husband Hinnak."),
- l("He likes to eat sandwiches. A good thing they are so easy to make!");
-
- select
- l("Easy to make? Could you make one for me?"),
- l("Easy to make? Could you teach me how to make them?"),
- l("Good to know, thanks.");
-
- if (@menu == 1)
- sudo_make_sandwich();
- else if (@menu == 2)
- teach_cooking();
+ case 7:
+ mesn;
+ mesq l("Candor's Chef is not very normal, so be careful when asking him about the sandwiches you want to make.");
+ break;
+ case 8:
+ mesn;
+ mesq l("How things went with Candor's Chef?");
+ next;
+ select
+ l("Great!"),
+ l("Not so great!");
+ mes "";
+ if (@menu == 1) {
+ mesn;
+ mesq l("That's good to hear!");
+ } else {
+ mesn;
+ mesq l("Oh no... Did he asked you to help you with something crazy? I feared he would do that...");
+ next;
+ mesn;
+ mesq l("But that's how I learned the carp sandwich recipe, you know?");
+ next;
+ mesn;
+ mesq l("Was trying to eat fried carp, but it always smeared my hands. Never thought he would come up with a sandwich recipe when I gave him that!");
+ next;
+ mesn;
+ mesq l("But he is still crazy, in my opinion...");
+ }
+ break;
+ case 11:
+ select
+ l("What did you want, again?"),
+ l("Do you know where Tulimshar bakery is?");
+ mes "";
+ if (@menu == 1) {
+ mesn;
+ mesq l("A %s pretty please.", getitemlink(SeafoodPlate));
+ break;
+ }
+ mesn;
+ mesq l("What, don't tell me you never have been at Tulimshar! Nearly everyone of your age already has been there at least once.");
+ next;
+ mesn;
+ mesq l("Tulimshar used to have a great Inn, but after the war, their business started to decline.");
+ next;
+ mesn;
+ mesq l("However, they had a bakery which has since flourished!");
+ next;
+ mesn;
+ mesq l("So if you fail finding the bakery, look for the Inn - it is on the same building.");
+ break;
+ case 15:
+ case 16:
+ select
+ l("What did you want, again?"),
+ l("Where can I find salad?");
+ mes "";
+ if (@menu == 1) {
+ mesn;
+ mesq l("A %s pretty please.", getitemlink(SeafoodPlate));
+ break;
+ }
+ mesn;
+ mesq l("This is a strange question. But I might be able to answer.");
+ next;
+ mesn;
+ mesq l("Hubby exports a lot of crops to Tulimshar. The purchaser is the Magic Academy of Tulimshar.");
+ next;
+ mesn;
+ mesq l("I'm not sure if this is of any help to you, though? I forgot who is the responsible for the Academy, so good luck!");
+ break;
+ case 18:
+ mesn;
+ mesq l("So? Did you got me a %s? I'm hungry...", getitemlink(SeafoodPlate));
+ next;
+ if (countitem(SeafoodPlate) < 1)
+ break;
+ if (askyesno() == ASK_NO)
+ break;
+ delitem SeafoodPlate, 1;
+ getitem EmptyPlate, 1;
+ getexp 10000, 1000;
+ setq1 General_Cooking, 19;
+ mesn;
+ mesq l("Ah - Many thanks. Here, I'll return you a plate.");
+ next;
+ mesc l("Food Questline Complete!");
+ mesc l("Stay tuned for more updates!");
+ mes "";
+ mesc l("- The Mana World Development Team");
+ break;
+ default:
+ mesn;
+ mesq l("No, not at the moment.");
+ }
- next;
- break;
+ return;
}
- closeclientdialog;
- goodbye;
- close;
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
.quest=General_Cooking;
end;
diff --git a/npc/008-2-17/angus.txt b/npc/008-2-17/angus.txt
index 0be2570c..48fe7c9c 100644
--- a/npc/008-2-17/angus.txt
+++ b/npc/008-2-17/angus.txt
@@ -1,11 +1,11 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
// Angus the Smith.
// THIS IS A PLACEHOLDER!
-008-2-17,34,47,0 script Angus#008-2-17 NPC_ANGUS_THE_SMITH,{
+008-2-17,34,47,0 script Angus NPC_ANGUS_THE_SMITH,{
speech
l("Hello."),
l("Do you need your pickaxe or your shovel fixed? Then I am your man."),
@@ -15,6 +15,6 @@
OnInit:
.bodytype = BODYTYPE_3;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-2-17/caul.txt b/npc/008-2-17/caul.txt
index 41ba53fa..c3202f11 100644
--- a/npc/008-2-17/caul.txt
+++ b/npc/008-2-17/caul.txt
@@ -1,11 +1,11 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
// Caul the Alchemist.
// THIS IS A PLACEHOLDER!
-008-2-17,40,33,0 script Caul#008-2-17 NPC_CAUL,{
+008-2-17,40,33,0 script Caul NPC_CAUL,{
speech
l("Hi there."),
l("Don't you like the smoke, when there is a nice fire beneath a cauldron?"),
@@ -15,6 +15,6 @@
OnInit:
.bodytype = BODYTYPE_3;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-2-19/books.txt b/npc/008-2-19/books.txt
index 81cd4b98..2c6a2112 100644
--- a/npc/008-2-19/books.txt
+++ b/npc/008-2-19/books.txt
@@ -53,7 +53,7 @@ OnInit:
// REMOVE THIS CODE WHEN THIS //
// NPC IS NO LONGER A WIP //////
////////////////////////////////
-if (!debug) disablenpc(.name$);
+//if (!debug) disablenpc(.name$);
///////// UNFINISHED ///////////
end;
diff --git a/npc/008-2-2/kfahr.txt b/npc/008-2-2/kfahr.txt
index feb6f1e2..8788620a 100644
--- a/npc/008-2-2/kfahr.txt
+++ b/npc/008-2-2/kfahr.txt
@@ -779,6 +779,6 @@ OnInit:
.STINGER_QUEST_XP = 80000;
.bodytype = BODYTYPE_3;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-2-2/melania.txt b/npc/008-2-2/melania.txt
index 4d5470a9..0fc490df 100644
--- a/npc/008-2-2/melania.txt
+++ b/npc/008-2-2/melania.txt
@@ -102,7 +102,7 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
.inn=RUSTYPICK_INN;
end;
}
diff --git a/npc/008-2-20/valia.txt b/npc/008-2-20/valia.txt
index 0090be12..ce6c6f5d 100644
--- a/npc/008-2-20/valia.txt
+++ b/npc/008-2-20/valia.txt
@@ -1,4 +1,4 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
@@ -9,12 +9,12 @@
speech
l("Hi!"),
lg("You may remember me, I am Valia.");
- l("Better stay away from my basement, you may end up like the poor guys down there.");
+ l("Better stay away from my basement, you may end up like the poor guy down there.");
close;
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-2-24/_import.txt b/npc/008-2-24/_import.txt
index 63cfe25c..808bd398 100644
--- a/npc/008-2-24/_import.txt
+++ b/npc/008-2-24/_import.txt
@@ -1,4 +1,5 @@
// Map 008-2-24: Dimond's Cove Ground Floor
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-2-24/_warps.txt",
+"npc/008-2-24/chef.txt",
"npc/008-2-24/troupe-leader.txt",
diff --git a/npc/008-2-24/chef.txt b/npc/008-2-24/chef.txt
new file mode 100644
index 00000000..37a36d60
--- /dev/null
+++ b/npc/008-2-24/chef.txt
@@ -0,0 +1,270 @@
+// The Mana World scripts.
+// Author:
+// Jesusalva
+// Description:
+// The nameless chef of Dimond's Cove, lover of pickled beets.
+
+008-2-24,30,25,0 script Chef#Dimond NPC_CHEF_LEGACY,{
+ function deliverFish;
+ function useYourHead;
+ function reminderReid;
+ function recipeBad;
+ function reminderBakery;
+ function heyDiabetes;
+ function reminderSalad;
+ function deliverSalad;
+ mesn;
+ mesq l("I'm too busy right now to talk.");
+ // TODO: Kadiya Quest
+ // TODO: Pickled Beets Quest
+ // (Probably can be mashed together in deliverFish?)
+ switch (getq(General_Cooking)) {
+ case 3:
+ deliverFish();
+ break;
+ case 4:
+ useYourHead();
+ break;
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ reminderReid();
+ break;
+ case 10:
+ recipeBad();
+ break;
+ case 11:
+ case 12:
+ case 13:
+ reminderBakery();
+ break;
+ case 14:
+ heyDiabetes();
+ break;
+ case 15:
+ case 16:
+ reminderSalad();
+ break;
+ case 17:
+ deliverSalad();
+ break;
+ }
+ close;
+
+function deliverFish {
+ next;
+ mesn;
+ mesq l("If you have any business with me, get it over already.");
+ mes "";
+ mes "##B" + l("Drag and drop an item from your inventory.") + "##b";
+
+ .@id = requestitem();
+
+ // If ID is invalid
+ if (.@id < 1)
+ return;
+
+ // If there's not enough items, it is bound, it cannot be traded/dropped/sold, etc.
+ if (countitem(.@id) < 2 || checkbound(.@id)) {
+ mesc l("You need at least two units of this item for the Chef.");
+ close;
+ }
+
+ // Now now now, what have you given to the Chef...?
+ switch (.@id) {
+ case CommonCarp:
+ case GrassCarp:
+ case Codfish:
+ case Tuna:
+ case Trout:
+ case Salmon:
+ mesn;
+ mesq l("...I hate you.");
+ break;
+ // Other Quests
+ //case OrangeCupcake:
+ //case ChocolateCake:
+ // Fun items and Easter Eggs
+ //case PickledBeets:
+ case Beer:
+ mesn;
+ mesq l("Wha - I am not a drunkard, and anyone who says that is lying!");
+ break;
+ case EasterBasket:
+ mesn;
+ mesq l("Easter event is over, no pickled beets for you!");
+ break;
+ // Default
+ default:
+ mesn;
+ mesq l("What do you expect me to do with this? GO AWAY!");
+ return;
+ }
+ delitem .@id, 2;
+ getexp 1000, 0;
+ setq1 General_Cooking, 4;
+ next;
+ mesn;
+ mesq l("I'm tired of cooking fish all the time. I used to bake Orange Cupcakes and pickled beets!");
+ next;
+ mesn;
+ mesq l("But since that damned Oscar stopped supplying me fruits, I'm trapped in fish-cooking.");
+ useYourHead();
+ return;
+}
+
+function useYourHead {
+ next;
+ mesn;
+ mesq l("I'm too busy to cook the %s but I won't teach you the recipe. I still need to make a living after all.", getitemlink(SeafoodPlate));
+ next;
+ select
+ l("There is no solution for your dilemma."),
+ l("Maybe if you had a recipe which doesn't needs fruits?"),
+ l("Maybe if I convinced Oscar to supply you fruits again?");
+ mes "";
+ if (@menu == 1) {
+ return;
+ } else if (@menu == 2) {
+ mesn;
+ mesq l("Hmpf! It would need to be worth of Dimond's name! I won't accept a lame %s.", getitemlink(SailorStew));
+ setq1 General_Cooking, 5;
+ reminderReid();
+ } else {
+ mesn;
+ mesq l("Hah! In case you didn't noticed, Oscar is a mage. A rather good one.");
+ next;
+ mesn;
+ mesq l("He, however, used magic to improve his crops, and the Brotherhood got wind of that. Some stuff about \"transgenic\" or whatever.");
+ next;
+ mesn;
+ mesq l("I mean, this is a magical world, isn't it?! That makes no sense. He probably angered some corrupt officer or whatever.");
+ next;
+ mesn;
+ mesq l("Maybe you can help him get back his job and stuff, I think the whole town would thank you for that. But I need some more immediate solution, not empty idealist promises.");
+ // TODO: Finish this path so players doesn't have to learn Squirrel Stew
+ }
+ return;
+}
+
+function reminderReid {
+ next;
+ mesn;
+ mesq l("You know what, I've heard the chef from Reid's Inn used to be a great chef when they were alive.");
+ next;
+ mesn;
+ mesq l("Maybe they know some great recipe from the parallel dimensions which doesn't need fruits.");
+ next;
+ mesn;
+ mesq l("Learn and share that with me, and only then, I'll teach you the %s recipe for Yannika.", getitemlink(SeafoodPlate));
+ return;
+}
+
+/* TODO: “The Cook starts too cook the recipe from Reid's Inn the player gave him but the squirrel he uses is still alive and bites him. He does not want to cook anymore wildlife. Fish stinks, Squirrels bite etc. ... and he does not give away his fish recipe.” */
+function recipeBad {
+ .@recipe=(getq2(General_Cooking) == CARNIVOROUS ? MoubooStew : SquirrelStew);
+ mesn;
+ mesq l("You know what, I've heard the chef from Reid's Inn used to be a great chef when they were alive.");
+ next;
+ mesn;
+ mesq l("Maybe they know some great recipe from the parallel dimensions which doesn't need fruits.");
+ next;
+ mesn;
+ mesq l("Learn and share that with me, and only then, I'll teach you the %s recipe for Yannika.", getitemlink(SeafoodPlate));
+ next;
+ select
+ l("He teached me the %s recipe.", getitemname(.@recipe)),
+ l("Alright, I'll be right back.");
+ mes "";
+ if (@menu == 2)
+ return;
+ mesn;
+ mesq l("%s? What is even a %s? Are you trying to poison my customers?!", getitemlink(.@recipe), getitemlink(.@recipe));
+ next;
+ mesn;
+ mesq l("Bah! I should have known better. Of course you would only find weird people in Golbenez's fantasy inn.");
+ next;
+ mesn;
+ mesc l("%s sighs.", .name$);
+ mesq l("You know what? Maybe I should make some dessert instead. It is perfect, who doesn't likes desserts, anyway?");
+ // Well, Ms. Dimond in Moubootaur Legends, who got overweight maybe...?
+ next;
+ mesn;
+ mesq l("Tulimshar has a great bakery - learn their secrets and share with me something sweet and nice. Go already!");
+ setq1 General_Cooking, 11;
+ return;
+}
+
+function reminderBakery {
+ next;
+ mesn;
+ mesc l("%s sighs.", .name$);
+ mesq l("You know what? Maybe I should make some dessert instead. It is perfect, who doesn't likes desserts, anyway?");
+ next;
+ mesn;
+ mesq l("Tulimshar has a great bakery - learn their secrets and share with me something sweet and nice. Go already!");
+ return;
+}
+
+function heyDiabetes {
+ mesn;
+ mesq l("%s, where have you been?! I looked for you everywhere in Hurnscald and couldn't find you!", strcharinfo(0));
+ next;
+ mesn;
+ mesq l("I remembered I have diabetes, so I wouldn't be able to taste the food! So sweets might be a bad idea!");
+ next;
+ mesn;
+ mesq l("Also, the doctor told Dimond to lose weight, so salads might be a better choice.");
+ next;
+ select
+ l("WHAT?! I even got a Donut recipe!!"),
+ l("Okay... Where can I find salad recipe?"),
+ l("Can't you do it yourself?!");
+ mes "";
+ if (@menu == 3) {
+ mesn;
+ mesq l("Sure I could, but who wants the %s recipe is you, not me. So get to work!", getitemlink(SeafoodPlate));
+ next;
+ }
+ mesn;
+ mesq l("Well, you can bake sweets for yourself, they don't require a Plate anyway. As for salad...");
+ next;
+ mesn;
+ mesq l("I honestly don't know. I mean, we usually export healthy food to Tulimshar; People here aren't so healthy in general.");
+ next;
+ mesn;
+ mesq l("Not sure who in Tulimshar would have money to import that much lettuce and such, but good luck figuring it out!");
+ setq1 General_Cooking, 15;
+ return;
+}
+
+function reminderSalad {
+ mesn;
+ mesq l("Not sure who in Tulimshar would have money to import that much lettuce and such, but good luck figuring it out!");
+ next;
+ mesn;
+ mesq l("Bring me Salad, the healthiest of all foods!");
+ return;
+}
+
+function deliverSalad {
+ mesn;
+ mesq l("What is that...? Salad! You did it!! Give me the recipe!");
+ next;
+ mesn strcharinfo(0);
+ mesc l("You give the recipe to the Chef.");
+ next;
+ mesn;
+ mesq l("Here, I'll now teach you the %s recipe. Don't share it with anyone, and good luck cooking one for Yannika! Yoo-hoo!", getitemlink(SeafoodPlate));
+ RECIPES[CraftSeafoodPlate]=true;
+ setq1 General_Cooking, 18;
+ return;
+}
+
+OnInit:
+ .bodytype = BODYTYPE_2;
+ .distance = 4;
+ end;
+}
diff --git a/npc/008-2-4/olana.txt b/npc/008-2-4/olana.txt
index 02cdf4f9..c8eceed7 100644
--- a/npc/008-2-4/olana.txt
+++ b/npc/008-2-4/olana.txt
@@ -1,21 +1,320 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
+// Jesusalva
+// Alastrim
+// Ali-g
+// Dark Mage
// Description:
-// Olana, the old woman who is looking for her daughter Rossy.
-// THIS IS A PLACEHOLDER!
+// Olana, the old woman who is looking for her daughter Rossy and Juliet.
+// HurnscaldQuests_Rossy
+// 0 - Quest Not Assigned
+// 1 - Asked to look for Rossy
-008-2-4,30,28,0 script Olana#008-2-4 NPC_OLANA,{
- speech
- l("Oh, a traveller. Welcome."),
- l("Did you see my daughter Rossy, by chance?"),
+
+008-2-4,30,28,0 script Olana NPC_OLANA,{
+ function olanaIntro;
+ function olanaIntroDone;
+ function olanaRossyLie;
+ function olanaDeliverBerries;
+ function olanaGetLetter;
+ function olanaRossyGoodGirl;
+ function olanaRossyBadMom;
+ function olanaRossyHappy;
+ .@q=getq(HurnscaldQuests_Rossy);
+ if (BaseLevel < .minLevel)
+ .@q = -1; // Hard Reset
+ mesn;
+ mesq l("Oh, a traveler. Welcome.");
+ next;
+ switch (.@q) {
+ case 0:
+ olanaIntro();
+ break;
+ case 1:
+ olanaIntroDone();
+ break;
+ case 2:
+ olanaRossyLie();
+ break;
+ case 3:
+ mesc l("%s smiles at you, but she still seems preoccupied.", .name$);
+ next;
+ mesc l("Rossy was collecting fruits, right? Maybe she has some idea on how to cheer her mother up?");
+ break;
+ case 4:
+ olanaDeliverBerries();
+ break;
+ case 5:
+ olanaGetLetter();
+ break;
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ mesn;
+ mesq l("Please bring Hocus' letter to my daughter as fast as you can.");
+ break;
+ case 10:
+ olanaRossyGoodGirl();
+ break;
+ case 11:
+ mesn;
+ mesc l("%s says absently-minded, while staring at a portrait of her daughters, Rossy and Juliet:");
+ mesq l("Could you do me a favor? Could you bring her %d %s? I am sure she will love them!", 15, getitemlink(ARedRose));
+ break;
+ case 12:
+ olanaRossyBadMom();
+ break;
+ case 13:
+ mesn;
+ mesq l("Please, tell Rossy I am really sorry and buy her Red Tulips instead, the same amount - %d, her age.", 15);
+ break;
+ case 14:
+ olanaRossyHappy();
+ break;
+ case 15:
+ case 16:
+ mesn;
+ mesq l("Where is Juliet? I want to know where she is! Please find her, %s!", strcharinfo(0));
+ break;
+ case 17:
+ mesn;
+ mesq l("Juliet got home sound and safe thanks to you, %s. I'll be eternally grateful.", strcharinfo(0));
+ next;
+ mesn;
+ mesq l("Rossy and Juliet are out there, playing again. Please, feel free to play with them or to come here for a cup of water.");
+ break;
+ default:
+ speech
+ l("Did you see my daughters Rossy and Juliet, by chance?"),
l("She wasn't at home for two days now. I worry about her!"),
lg("If you see her, please tell her to come home.");
-
+ }
close;
+function olanaIntro {
+ mesn;
+ mesq l("This is a private room from the Rusty Pick. You see, my father owns this inn.");
+ next;
+ mesn;
+ mesq l("I moved to Tulimshar so my daughters – Rossy and Juliet – could learn magic, but we come back to Hurnscald on occasion.");
+ next;
+ mesn;
+ mesc l("Olana suddenly looks very pale and starts to shiver.");
+ mesq l("Which reminds me - I let my two lovely girls play in the woods nearby but they haven't come back yet!");
+ next;
+ mesn;
+ mesq l("These forests are not safe; I am afraid they might have wandered in the swamps by accident.");
+ next;
+ mesn;
+ mesq l("Could you pretty please see if they're fine? I can book you this inn for a night after that.");
+ next;
+ if (askyesno() == ASK_NO) {
+ mesn;
+ mesq l("Well, you *do* look weak, I guess I would get worried if you went after them and ended up lost and on the swamps.");
+ next;
+ mesn;
+ mesq l("But if you change your mind, please, call me again.");
+ return;
+ }
+ mesn;
+ mesq l("Excellent! I am counting on you!");
+ setq HurnscaldQuests_Rossy, 1;
+ return;
+}
+
+function olanaIntroDone {
+ mesn;
+ mesq l("My daughters – Rossy and Juliet – went to play in the woods but haven't come back yet.");
+ next;
+ mesn;
+ mesq l("Could you pretty please see if they're fine? I can book you this inn for a night after that.");
+ return;
+}
+
+function olanaRossyLie {
+ mesn;
+ mesq l("Have you found my daughters yet? %%i");
+ next;
+ select
+ l("No, sorry, I'll keep looking."),
+ l("I saw Rossy, she is fine."),
+ l("Yes, a snail attacked them.");
+ mes "";
+ if (@menu == 1) {
+ mesn;
+ mesq l("Please do, I'm worried about them....");
+ return;
+ }
+ if (@menu == 3) {
+ mesn;
+ mesq l("Oh noes!!!!");
+ next;
+ mesc l("%s faints.", .name$);
+ mesc l("Maybe we could have told her that in a better way.");
+ return;
+ }
+ mesn;
+ mesq l("Oh you did? That's good. I'm relieved. But what about Juliet?");
+ next;
+ select
+ l("I haven't found Juliet yet, sorry."),
+ l("Well, Rossy told both of them were fine...");
+ mes "";
+ mesn;
+ mesq l("Ok. They must be playing hide and seek. Thanks again... I can't express how grateful I am.");
+ next;
+ setq HurnscaldQuests_Rossy, 3;
+ mesn;
+ mesq l("I'll now book you a room on the Inn.");
+ select
+ l("Thanks."),
+ lg("Actually, please don't. I do this out of the goodness of my heart.");
+ mes "";
+ // Do not register the inn
+ if (@menu == 2) {
+ mesn;
+ mesq l("Oh... Okay, then!");
+ return;
+ }
+ // Register the inn
+ INN_REGISTER = RUSTYPICK_INN;
+ PC_IS_DEAD = false;
+ savepoint "008-2-4", 26, 27;
+ return;
+}
+
+function olanaDeliverBerries {
+ mesn;
+ mesq l("Hello there.");
+ next;
+ select
+ l("Erm, hi."),
+ l("Hi, Rossy asked me to give you this. She says it is a gift from both her and Juliet.");
+ mes "";
+ if (@menu == 1)
+ 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;
+ setq HurnscaldQuests_Rossy, 5;
+ next;
+ mesn;
+ mesq lg("Could you do me a small favor, though? I know I barely know you, and you must be very busy, but...");
+ next;
+ olanaGetLetter();
+ return;
+}
+
+function olanaGetLetter {
+ mesn;
+ mesq l("Would you mind giving this letter to my little Rossy? You see, Rossy and Juliet are enrolled at Tulimshar Magic School...");
+ next;
+ mesn;
+ mesq l("Rossy is doing alchemy, and I received a letter signed by Hocus, the Grandmaster. She did not submit her exam before we travelled, and now she is running out of time...");
+ next;
+ mesn;
+ mesq l("Pretty please?");
+ next;
+ if (askyesno() == ASK_NO)
+ return;
+ mesn;
+ mesq l("Thank you again. Please, bring it to her as fast as you can.");
+ setq HurnscaldQuests_Rossy, 6;
+ return;
+}
+
+function olanaRossyGoodGirl {
+ mesn strcharinfo(0);
+ select
+ l("Rossy passed her exam.");
+ mes "";
+ mesn;
+ mesq l("That's a relief to hear! I'm so proud of her.");
+ next;
+ mesn;
+ mesq l("Could you do me a favor? Could you bring her %d %s? I am sure she will love them!", 15, getitemlink(ARedRose));
+ next;
+ select
+ l("Okay, I'll get the roses and give them to her."),
+ l("What? No way!");
+ mes "";
+ if (@menu == 2)
+ return;
+ mesn;
+ mesq l("I know this won't be enough, but here is %d E to help you.", 50);
+ next;
+ mesn;
+ mesq l("After you get them, please deliver them to my brilliant daughter, Rossy.");
+ Zeny+=50;
+ setq HurnscaldQuests_Rossy, 11;
+ return;
+}
+
+function olanaRossyBadMom {
+ mesn;
+ mesq l("Did she like my present?");
+ next;
+ select
+ l("Sure she did..."),
+ l("Well, you should have known that your daughter is allergic to roses.");
+ mes "";
+ if (@menu == 1) {
+ mesn;
+ mes "%%H";
+ return;
+ }
+ mesn;
+ mesq l("Oh, how stupid I am! Here, take some of my money and buy Red Tulips instead, the same amount. Keep the flowers.");
+ next;
+ mesn;
+ mesq l("Please, tell Rossy I am really sorry. My mind was on Juliet when I asked you to bring the red roses — they are her favorite.");
+ next;
+ mesn strcharinfo(0);
+ select
+ l("I will give her the tulips when I see her.");
+ mes "";
+ mesn;
+ mesq l("Thank you. And don't forget to tell her that I'm really sorry.");
+ Zeny+=450;
+ setq HurnscaldQuests_Rossy, 13;
+ return;
+}
+
+function olanaRossyHappy {
+ mesn;
+ mesq l("So?");
+ next;
+ select
+ l("Rossy was happy with your gift, and asked me to say you are the nicest mother in the world.");
+ mes "";
+ mesn;
+ mesq l("I'm so glad to hear that! But, have you seen Juliet too, by any chance?");
+ next;
+ select
+ l("Erm, no, sorry."),
+ l("I'm sure she is fine.");
+ mes "";
+ mesn;
+ mesq l("For some reason, I can't get off my mind she is in danger... Motherly instincts.");
+ next;
+ mesn;
+ mesq l("For now, I should reward you for all your effort thus far.");
+ .@item=any(Diamond, Ruby, Emerald, Sapphire, Topaz, Amethyst);
+ inventoryplace .@item, 1;
+ setq HurnscaldQuests_Rossy, 15;
+ getitem .@item, 1;
+ next;
+ mesn;
+ mesq l("But please, could you look for Juliet as well? I'm starting to get deeply worried, here.");
+ return;
+}
+
OnInit:
.bodytype = BODYTYPE_3;
- .distance = 2;
+ .distance = 4;
+ .minLevel = 40;
end;
}
diff --git a/npc/008-2-6/donald.txt b/npc/008-2-6/donald.txt
index c536e1ba..abc68632 100644
--- a/npc/008-2-6/donald.txt
+++ b/npc/008-2-6/donald.txt
@@ -1,4 +1,4 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
@@ -15,6 +15,6 @@
OnInit:
.bodytype = BODYTYPE_3;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-2-7/shop.txt b/npc/008-2-7/shop.txt
index 22a175bb..d565205f 100644
--- a/npc/008-2-7/shop.txt
+++ b/npc/008-2-7/shop.txt
@@ -20,7 +20,7 @@ OnInit:
sellitem IronPotion, -1, 3;
.bodytype = BODYTYPE_1;
- .distance = 2;
+ .distance = 4;
end;
OnClock0000:
diff --git a/npc/008-2-7/simon.txt b/npc/008-2-7/simon.txt
index b5ef32ed..2bce2c8e 100644
--- a/npc/008-2-7/simon.txt
+++ b/npc/008-2-7/simon.txt
@@ -1,4 +1,4 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
@@ -34,6 +34,6 @@
OnInit:
.bodytype = BODYTYPE_3;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-2-7/wyara.txt b/npc/008-2-7/wyara.txt
index de667ac4..5a05a008 100644
--- a/npc/008-2-7/wyara.txt
+++ b/npc/008-2-7/wyara.txt
@@ -6,7 +6,7 @@
// 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#008-2-7 NPC_DARK_DRUID,{
+008-2-7,27,28,0 script Wyara NPC_DARK_DRUID,{
function confirmStatusReset;
function doStatusReset;
speech
@@ -78,6 +78,6 @@ function doStatusReset {
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/008-3-0/_import.txt b/npc/008-3-0/_import.txt
index 11ecbf2d..4ff9254d 100644
--- a/npc/008-3-0/_import.txt
+++ b/npc/008-3-0/_import.txt
@@ -2,3 +2,5 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-3-0/_mobs.txt",
"npc/008-3-0/_warps.txt",
+"npc/008-3-0/clauquer.txt",
+"npc/008-3-0/juliet.txt",
diff --git a/npc/008-3-0/_warps.txt b/npc/008-3-0/_warps.txt
index 7426d274..74a3623b 100644
--- a/npc/008-3-0/_warps.txt
+++ b/npc/008-3-0/_warps.txt
@@ -1,3 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Map 008-3-0: Rossy Cave warps
-008-3-0,130,113,0 warp #008-3-0_130_113 1,0,008-1-1,202,48
+008-3-0,130,113,0 warp #008-3-0_130_113 1,0,008-1,49,158
diff --git a/npc/008-3-0/clauquer.txt b/npc/008-3-0/clauquer.txt
new file mode 100644
index 00000000..45d217fc
--- /dev/null
+++ b/npc/008-3-0/clauquer.txt
@@ -0,0 +1,139 @@
+// The Mana World scripts.
+// Author:
+// Jesusalva
+// Description:
+// Shaddy man
+
+008-3-0,129,94,0 script Clauquer NPC_CAUL,{
+ function clauquerPrologue;
+
+ // HurnscaldQuests_Rossy
+ // (MAIN QUEST, CAVE CONTROL, INSTANCE CONTROL)
+ .@q=getq(HurnscaldQuests_Rossy);
+ .@q2=getq2(HurnscaldQuests_Rossy);
+ .@inst=getq3(HurnscaldQuests_Rossy);
+
+ // Instance zero is reserved for La Marine
+ if (instance_id() <= 0 || .@q != 16) {
+ mesn;
+ mesq l("Huh? Why are you here? Get out.");
+ close;
+ }
+ mesn;
+ mesq l("Hello stranger, are you lost?");
+ if (.@q < 16)
+ close;
+ if (!.@q2) {
+ clauquerPrologue();
+ close;
+ }
+ next;
+ .@caves=bitmask_count(.@q2)-1;
+ mesn;
+ if (.@q2 > ROSSY_BOSSCAVE || .@q > 16)
+ .@msg$=l("Good job rescuing the little girl!");
+ else if (.@q2 == ROSSY_READY)
+ .@msg$=l("I am amazed... You eliminated all the 9 energy sources. Now is the difficult part. To save the girl, you need to eliminate the last and most powerful barrier. Good Luck!");
+ else if (.@q2 <= ROSSY_PROLOGUE)
+ .@msg$=l("Well... You didn't eliminate any of the barriers, so that means there are still 9 caves and the tenth one, the strongest...");
+ else
+ .@msg$=l("You are doing good... If I am right, you already eliminated %d of the 9 energy sources of the barrier that protects the cave in which the girl is being kept captive.", .@caves);
+
+ mesq .@msg$;
+ if (.@q == 16 && .@caves < ROSSY_BOSSCAVE) {
+ next;
+ select
+ l("Thanks."),
+ l("But please, I really need your help!");
+ mes "";
+ if (@menu == 2) {
+ mesn;
+ mesq l("Well, I already told you what I knew, but repeating never hurts, I guess. So, to nullify the barrier.");
+ next;
+ clauquerPrologue();
+ }
+ }
+ close;
+
+function clauquerPrologue {
+ // HurnscaldQuests_Rossy
+ // (MAIN QUEST, CAVE CONTROL, INSTANCE CONTROL)
+ .@q=getq(HurnscaldQuests_Rossy);
+ .@q2=getq2(HurnscaldQuests_Rossy);
+ .@inst=getq3(HurnscaldQuests_Rossy);
+
+ // Prologue
+ if (!(.@q2 & ROSSY_PROLOGUE)) {
+ next;
+ mesn;
+ mesq l("Don't answer— I know you are looking for someone... A little girl, is that right?");
+ next;
+ select
+ l("I must admit you're right, but how come you..."),
+ l("I'm not lost and I don't need help, bye.");
+ mes "";
+ if (@menu == 2)
+ return;
+ mesn;
+ mesq l("How do I know you're looking for her? Well, because I am a very good observer. I know you were helping her family. Besides, I saw the little girl. I also heard her. She screamed, and probably still screams like hell. Moreover, I don't think you would enter these caves just for fun!");
+ next;
+ select l("Of course not.");
+ mes "";
+ mesn;
+ mesq l("I can see that you really want to save the little girl. She is trapped in a place inside one of these caves, protected by a magic barrier created by a fey spirit. To save her, you have to annulate the energy sources of this barrier. They are located in 10 different spots, each one in a different cave.");
+ next;
+ select l("But how can I annulate this barrier?");
+ mes "";
+ }
+ // Common
+ mesn;
+ mesq l("It is simple, you just have to place a %s on the exact center of the energy source. Once you do this, its entire power will transmute into some terrible earth monsters. If you defeat them, this source of energy will be close to nothing and the barrier will be weaker.", getitemlink(PileOfAsh));
+ next;
+ mesn;
+ mesq l("If my observations are correct, the girl is trapped in a cave protected by a barrier fed by 9 different power sources. And inside this cave there is another barrier, fed by a single, but very strong, power source. The girl is inside that cave, protected by that strong barrier.");
+ next;
+ mesn;
+ mesq l("Be prepared before you enter one of these caves, because once you put the root in the power source, you won't be able to get out. Also, remember that you can't stay in these caves for a long time, because of the foul air.");
+ mesc l("If you take more than %d minutes between a boss fight and other, you'll faint and the quest will reset!!", 20), 1;
+ next;
+ // Prologue (FIXME)
+ if (!(.@q2 & ROSSY_PROLOGUE)) {
+ mesn;
+ mesq l("Now I should tell you more about how that little girl got into that cave and warn you about what you are going to face there...");
+ next;
+ select l("Please go on.");
+ mes "";
+ mesn;
+ mesq l("I advise you to be mentally prepared for this rescue operation. You'll be fighting a selection of monsters in these caves with mixed elements.");
+ next;
+ mesn;
+ mesq l("Also, the old tales of Hurnscald say that a Golem inhabits these caves and smashes anyone who enters here ill prepared; but it can be tamed and made into subservience by a sacrifice. And I saw the girl heading to said room...");
+ next;
+ mesn;
+ mesq l("However, hope is not yet lost. If you were to, say, defeat the Golem before it is fully awakened, the girl would be saved... Time, however, is not on your favor and is of essence. And I am no fighter, so I cannot help you.");
+ next;
+ }
+ mesn;
+ mesq l("Oh, and if you really plan to rescue the girl, I advise you to use potions for every single battle. I'm thinking of Concentration and Iron Potions. You might want to take some food with you too. I would personally take some water, I'm always thirsty. Don't be afraid to bring too much with you, these battles take time to end.");
+ next;
+ mesn;
+ mesq l("I think you're now ready to explore these caves and fight. Good luck rescuing the girl!");
+
+ // Renew the timer the first time you see the prologue
+ if (!.@q2) {
+ instance_set_timeout(ROSSY_INSTIME, ROSSY_INSTIME, .@inst);
+ addtimer2(300000, "#RossyQuest::OnTick1");
+ deltimer("#RossyQuest::OnTick2");
+ deltimer("#RossyQuest::OnTick3");
+ deltimer("#RossyQuest::OnTick4");
+ deltimer("#RossyQuest::OnTick5");
+ }
+ setq2 HurnscaldQuests_Rossy, .@q2 | ROSSY_PROLOGUE;
+ return;
+}
+
+OnInit:
+ .bodytype = BODYTYPE_3;
+ .distance = 4;
+ end;
+}
diff --git a/npc/008-3-0/juliet.txt b/npc/008-3-0/juliet.txt
new file mode 100644
index 00000000..c4f15fc0
--- /dev/null
+++ b/npc/008-3-0/juliet.txt
@@ -0,0 +1,654 @@
+// The Mana World scripts.
+// Author:
+// Jesusalva
+// Description:
+// Core for rescuing Juliet.
+// Named as "Juliet" so `pluma npc/*/juliet.txt` resolves to something tangible.
+008-3-0 mapflag nosave 008-1-1,49,158
+
+008-3-0,92,89,0 script Summoning Altar#Rossy NPC_NO_SPRITE,{
+ .@q2=getq2(HurnscaldQuests_Rossy);
+ // Not ready
+ if (.@q2 < ROSSY_READY) {
+ mesn;
+ mesq l("Better not touch this.");
+ close;
+ }
+ // Complete
+ if (.@q2 & ROSSY_BOSSCAVE) {
+ dispbottom l("You find someone hiding behind the altar.");
+ enablenpc instance_npcname("Juliet");
+ disablenpc instance_npcname("Summoning Altar#Rossy");
+ end;
+ }
+ // Battle
+ mesc l("This is the boss room! Be prepared for the worst!!"), 1;
+ callfunc("RossyCave", ROSSY_BOSSCAVE);
+ close;
+
+OnInit:
+ .bodytype = BODYTYPE_3;
+ .distance = 4;
+ end;
+
+// Time to configure the map
+OnInstanceInit:
+ .@m$=instance_mapname("008-3-0");
+ // Rebuild spawns
+ // WARNING: Originals were generated automatically!
+ // print('\tareamonster(.@m$, %d, %d, %d, %d, strmobinfo(1, %s), %s, %d);' % (obj.x, obj.y, obj.x+obj.w, obj.y+obj.h, obj.name.replace(' ', ''), obj.name.replace(' ', ''), obj.max_beings))
+ areamonster(.@m$, 30, 113, 37, 127, strmobinfo(1, CaveMaggot), CaveMaggot, 5);
+ areamonster(.@m$, 102, 116, 116, 124, strmobinfo(1, CaveMaggot), CaveMaggot, 5);
+ areamonster(.@m$, 79, 144, 89, 150, strmobinfo(1, CaveMaggot), CaveMaggot, 7);
+ areamonster(.@m$, 158, 87, 168, 99, strmobinfo(1, CaveMaggot), CaveMaggot, 7);
+ areamonster(.@m$, 34, 28, 37, 32, strmobinfo(1, PoisonSkull), PoisonSkull, 1);
+ areamonster(.@m$, 160, 124, 165, 127, strmobinfo(1, Ratto), Ratto, 4);
+ areamonster(.@m$, 155, 163, 156, 170, strmobinfo(1, Ratto), Ratto, 4);
+ areamonster(.@m$, 128, 146, 133, 149, strmobinfo(1, Ratto), Ratto, 4);
+ areamonster(.@m$, 120, 61, 125, 64, strmobinfo(1, Ratto), Ratto, 4);
+ areamonster(.@m$, 138, 64, 148, 71, strmobinfo(1, Crafty), Crafty, 10);
+ areamonster(.@m$, 129, 102, 140, 108, strmobinfo(1, Crafty), Crafty, 6);
+ areamonster(.@m$, 67, 114, 77, 116, strmobinfo(1, Spider), Spider, 3);
+ areamonster(.@m$, 109, 145, 113, 155, strmobinfo(1, Spider), Spider, 5);
+ areamonster(.@m$, 68, 84, 71, 91, strmobinfo(1, Spider), Spider, 4);
+ areamonster(.@m$, 80, 169, 80, 169, strmobinfo(1, DiamondVein), DiamondVein, 1);
+ areamonster(.@m$, 118, 96, 118, 96, strmobinfo(1, GemVeinbloc), GemVeinbloc, 1);
+ areamonster(.@m$, 131, 93, 131, 93, strmobinfo(1, CoalVeinbloc), CoalVeinbloc, 1);
+ areamonster(.@m$, 119, 101, 119, 101, strmobinfo(1, GoldVeinbloc), GoldVeinbloc, 1);
+ areamonster(.@m$, 113, 60, 136, 68, strmobinfo(1, CaveMaggot), CaveMaggot, 7);
+ areamonster(.@m$, 199, 68, 207, 77, strmobinfo(1, Crafty), Crafty, 5);
+ areamonster(.@m$, 160, 47, 177, 52, strmobinfo(1, Crafty), Crafty, 5);
+ areamonster(.@m$, 119, 200, 139, 204, strmobinfo(1, Spider), Spider, 5);
+ areamonster(.@m$, 34, 193, 45, 202, strmobinfo(1, Spider), Spider, 5);
+ areamonster(.@m$, 26, 115, 31, 132, strmobinfo(1, Spider), Spider, 5);
+ areamonster(.@m$, 82, 60, 103, 67, strmobinfo(1, CaveMaggot), CaveMaggot, 5);
+ areamonster(.@m$, 38, 193, 54, 197, strmobinfo(1, CaveMaggot), CaveMaggot, 5);
+ areamonster(.@m$, 114, 199, 126, 202, strmobinfo(1, Ratto), Ratto, 4);
+ areamonster(.@m$, 106, 30, 116, 37, strmobinfo(1, Crafty), Crafty, 5);
+ areamonster(.@m$, 78, 128, 89, 149, strmobinfo(1, Ratto), Ratto, 4);
+ areamonster(.@m$, 117, 141, 152, 152, strmobinfo(1, Crafty), Crafty, 10);
+ areamonster(.@m$, 117, 101, 135, 112, strmobinfo(1, Ratto), Ratto, 7);
+ areamonster(.@m$, 130, 88, 130, 88, strmobinfo(1, RubyVein), RubyVein, 1);
+ areamonster(.@m$, 122, 94, 122, 94, strmobinfo(1, RubyVein), RubyVein, 1);
+ areamonster(.@m$, 31, 181, 31, 181, strmobinfo(1, SapphireVein), SapphireVein, 1);
+ areamonster(.@m$, 31, 198, 31, 198, strmobinfo(1, SapphireVein), SapphireVein, 1);
+ areamonster(.@m$, 135, 127, 135, 127, strmobinfo(1, TopazVein), TopazVein, 1);
+ areamonster(.@m$, 120, 125, 120, 125, strmobinfo(1, TopazVein), TopazVein, 1);
+ areamonster(.@m$, 31, 112, 31, 112, strmobinfo(1, AmethystVein), AmethystVein, 1);
+ areamonster(.@m$, 24, 123, 24, 123, strmobinfo(1, AmethystVein), AmethystVein, 1);
+ areamonster(.@m$, 193, 123, 193, 123, strmobinfo(1, EmeraldVein), EmeraldVein, 1);
+ areamonster(.@m$, 204, 116, 204, 116, strmobinfo(1, EmeraldVein), EmeraldVein, 1);
+ areamonster(.@m$, 89, 168, 89, 168, strmobinfo(1, DiamondVein), DiamondVein, 1);
+ areamonster(.@m$, 132, 192, 132, 192, strmobinfo(1, SapphireVein), SapphireVein, 1);
+ areamonster(.@m$, 39, 174, 39, 174, strmobinfo(1, AmethystVein), AmethystVein, 1);
+ areamonster(.@m$, 44, 174, 44, 174, strmobinfo(1, TopazVein), TopazVein, 1);
+ areamonster(.@m$, 118, 196, 118, 196, strmobinfo(1, EmeraldVein), EmeraldVein, 1);
+ areamonster(.@m$, 65, 105, 65, 105, strmobinfo(1, DiamondVein), DiamondVein, 1);
+ areamonster(.@m$, 143, 139, 143, 139, strmobinfo(1, GemVeinbloc), GemVeinbloc, 1);
+ areamonster(.@m$, 156, 121, 156, 121, strmobinfo(1, GemVeinbloc), GemVeinbloc, 1);
+ areamonster(.@m$, 155, 166, 155, 166, strmobinfo(1, GemVeinbloc), GemVeinbloc, 1);
+ areamonster(.@m$, 125, 162, 125, 162, strmobinfo(1, GemVeinbloc), GemVeinbloc, 1);
+ areamonster(.@m$, 107, 141, 107, 141, strmobinfo(1, GemVeinbloc), GemVeinbloc, 1);
+ areamonster(.@m$, 77, 148, 77, 148, strmobinfo(1, GemVeinbloc), GemVeinbloc, 1);
+ areamonster(.@m$, 62, 119, 62, 119, strmobinfo(1, GemVeinbloc), GemVeinbloc, 1);
+ areamonster(.@m$, 162, 95, 162, 95, strmobinfo(1, CoalVeinbloc), CoalVeinbloc, 1);
+ areamonster(.@m$, 157, 66, 157, 66, strmobinfo(1, CoalVeinbloc), CoalVeinbloc, 1);
+ areamonster(.@m$, 112, 60, 112, 60, strmobinfo(1, CoalVeinbloc), CoalVeinbloc, 1);
+ areamonster(.@m$, 66, 54, 66, 54, strmobinfo(1, CoalVeinbloc), CoalVeinbloc, 1);
+ areamonster(.@m$, 63, 91, 63, 91, strmobinfo(1, GoldVeinbloc), GoldVeinbloc, 1);
+ areamonster(.@m$, 76, 127, 76, 127, strmobinfo(1, GoldVeinbloc), GoldVeinbloc, 1);
+ areamonster(.@m$, 111, 148, 111, 148, strmobinfo(1, GoldVeinbloc), GoldVeinbloc, 1);
+ /*
+ areamonster(.@m$, 101, 27, 104, 31, strmobinfo(1, PoisonSkull), PoisonSkull, 1);
+ areamonster(.@m$, 165, 28, 168, 32, strmobinfo(1, PoisonSkull), PoisonSkull, 1);
+ areamonster(.@m$, 199, 67, 202, 71, strmobinfo(1, PoisonSkull), PoisonSkull, 1);
+ areamonster(.@m$, 199, 109, 202, 113, strmobinfo(1, PoisonSkull), PoisonSkull, 1);
+ areamonster(.@m$, 197, 194, 200, 198, strmobinfo(1, PoisonSkull), PoisonSkull, 1);
+ areamonster(.@m$, 133, 199, 136, 203, strmobinfo(1, PoisonSkull), PoisonSkull, 1);
+ areamonster(.@m$, 34, 194, 37, 198, strmobinfo(1, PoisonSkull), PoisonSkull, 1);
+ areamonster(.@m$, 26, 111, 29, 115, strmobinfo(1, PoisonSkull), PoisonSkull, 1);
+ */
+ areamonster(.@m$, 88, 48, 88, 48, strmobinfo(1, CoalVein), CoalVein, 1);
+ areamonster(.@m$, 100, 49, 100, 49, strmobinfo(1, CoalVein), CoalVein, 1);
+ areamonster(.@m$, 130, 44, 130, 44, strmobinfo(1, CoalVein), CoalVein, 1);
+ areamonster(.@m$, 67, 47, 67, 47, strmobinfo(1, CoalVein), CoalVein, 1);
+ areamonster(.@m$, 124, 94, 124, 94, strmobinfo(1, CoalVein), CoalVein, 1);
+ areamonster(.@m$, 158, 60, 158, 60, strmobinfo(1, CoalVein), CoalVein, 1);
+ areamonster(.@m$, 56, 53, 56, 53, strmobinfo(1, IronVein), IronVein, 1);
+ areamonster(.@m$, 55, 98, 55, 98, strmobinfo(1, IronVein), IronVein, 1);
+ areamonster(.@m$, 62, 103, 62, 103, strmobinfo(1, IronVein), IronVein, 1);
+ areamonster(.@m$, 69, 125, 69, 125, strmobinfo(1, IronVein), IronVein, 1);
+ areamonster(.@m$, 62, 153, 62, 153, strmobinfo(1, IronVein), IronVein, 1);
+ areamonster(.@m$, 96, 145, 96, 145, strmobinfo(1, IronVein), IronVein, 1);
+
+ // Yay yay yay
+ end;
+}
+
+/////////////////////////////////////////////////////////
+// Main script controller for Rossy Quest
+- script #RossyQuest NPC_HIDDEN,{
+ end;
+
+OnStage2:
+ if (!playerattached()) end; // ERROR
+ if (!@rossylock) end; // Invalid
+ if (mobcount(getmap(), "#RossyQuest::OnStage2")) end; // Still working
+ .@q2=getq2(HurnscaldQuests_Rossy);
+ setq2 HurnscaldQuests_Rossy, .@q2 | ROSSY_CAVE1;
+ goto OnBeat;
+
+OnStage4:
+ if (!playerattached()) end; // ERROR
+ if (!@rossylock) end; // Invalid
+ if (mobcount(getmap(), "#RossyQuest::OnStage4")) end; // Still working
+ .@q2=getq2(HurnscaldQuests_Rossy);
+ setq2 HurnscaldQuests_Rossy, .@q2 | ROSSY_CAVE2;
+ goto OnBeat;
+
+OnStage8:
+ if (!playerattached()) end; // ERROR
+ if (!@rossylock) end; // Invalid
+ if (mobcount(getmap(), "#RossyQuest::OnStage8")) end; // Still working
+ .@q2=getq2(HurnscaldQuests_Rossy);
+ setq2 HurnscaldQuests_Rossy, .@q2 | ROSSY_CAVE3;
+ goto OnBeat;
+
+OnStage16:
+ if (!playerattached()) end; // ERROR
+ if (!@rossylock) end; // Invalid
+ if (mobcount(getmap(), "#RossyQuest::OnStage16")) end; // Still working
+ .@q2=getq2(HurnscaldQuests_Rossy);
+ setq2 HurnscaldQuests_Rossy, .@q2 | ROSSY_CAVE4;
+ goto OnBeat;
+
+OnStage32:
+ if (!playerattached()) end; // ERROR
+ if (!@rossylock) end; // Invalid
+ if (mobcount(getmap(), "#RossyQuest::OnStage32")) end; // Still working
+ .@q2=getq2(HurnscaldQuests_Rossy);
+ setq2 HurnscaldQuests_Rossy, .@q2 | ROSSY_CAVE5;
+ goto OnBeat;
+
+OnStage64:
+ if (!playerattached()) end; // ERROR
+ if (!@rossylock) end; // Invalid
+ if (mobcount(getmap(), "#RossyQuest::OnStage64")) end; // Still working
+ .@q2=getq2(HurnscaldQuests_Rossy);
+ setq2 HurnscaldQuests_Rossy, .@q2 | ROSSY_CAVE6;
+ goto OnBeat;
+
+OnStage128:
+ if (!playerattached()) end; // ERROR
+ if (!@rossylock) end; // Invalid
+ if (mobcount(getmap(), "#RossyQuest::OnStage128")) end; // Still working
+ .@q2=getq2(HurnscaldQuests_Rossy);
+ setq2 HurnscaldQuests_Rossy, .@q2 | ROSSY_CAVE7;
+ goto OnBeat;
+
+OnStage256:
+ if (!playerattached()) end; // ERROR
+ if (!@rossylock) end; // Invalid
+ if (mobcount(getmap(), "#RossyQuest::OnStage256")) end; // Still working
+ .@q2=getq2(HurnscaldQuests_Rossy);
+ setq2 HurnscaldQuests_Rossy, .@q2 | ROSSY_CAVE8;
+ goto OnBeat;
+
+OnStage512:
+ if (!playerattached()) end; // ERROR
+ if (!@rossylock) end; // Invalid
+ if (mobcount(getmap(), "#RossyQuest::OnStage512")) end; // Still working
+ .@q2=getq2(HurnscaldQuests_Rossy);
+ setq2 HurnscaldQuests_Rossy, .@q2 | ROSSY_CAVE9;
+ goto OnBeat;
+
+OnStage1024:
+ if (!playerattached()) end; // ERROR
+ if (!@rossylock) end; // Invalid
+ if (mobcount(getmap(), "#RossyQuest::OnStage1024")) end; // Still working
+ .@q2=getq2(HurnscaldQuests_Rossy);
+ setq2 HurnscaldQuests_Rossy, .@q2 | ROSSY_BOSSCAVE;
+ goto OnBeat;
+
+OnBeat:
+ @rossylock = false;
+ dispbottom l("*** Cave Cleared ***");
+ delcells "Rossy"+getcharid(0)+"Wall";
+ .@inst = getq3(HurnscaldQuests_Rossy);
+ instance_set_timeout(ROSSY_INSTIME, ROSSY_INSTIME, .@inst);
+ if (.@q2 < ROSSY_BOSSCAVE)
+ addtimer2(300000, "#RossyQuest::OnTick1");
+ else
+ deltimer("#RossyQuest::OnTick1");
+ deltimer("#RossyQuest::OnTick2");
+ deltimer("#RossyQuest::OnTick3");
+ deltimer("#RossyQuest::OnTick4");
+ deltimer("#RossyQuest::OnTick5");
+ end;
+
+/* ****************************************** */
+OnTick1:
+ dispbottom l("Time remaining: %d minutes", 15);
+ addtimer2(300000, "#RossyQuest::OnTick2");
+ end;
+
+OnTick2:
+ dispbottom l("Time remaining: %d minutes", 10);
+ addtimer2(300000, "#RossyQuest::OnTick3");
+ end;
+
+OnTick3:
+ dispbottom l("Time remaining: %d minutes", 5);
+ addtimer2(240000, "#RossyQuest::OnTick4");
+ end;
+
+OnTick4:
+ dispbottom l("Time remaining: 1 minute");
+ addtimer2(45000, "#RossyQuest::OnTick5");
+ end;
+
+OnTick5:
+ dispbottom l("Time remaining: %d seconds!", 15);
+ end;
+
+}
+
+/////////////////////////////////////////////////////////
+// RossyCave(Cave ID)
+function script RossyCave {
+ // Fight ongoing - cannot trigger
+ if (@rossylock)
+ return false;
+
+ // Check quest consistency
+ // HurnscaldQuests_Rossy
+ // (MAIN QUEST, CAVE CONTROL, INSTANCE CONTROL)
+ .@q=getq(HurnscaldQuests_Rossy);
+ .@q2=getq2(HurnscaldQuests_Rossy);
+ .@inst=getq3(HurnscaldQuests_Rossy);
+
+ if (instance_id() != .@inst)
+ return false;
+ if (.@q != 16)
+ return false;
+ if (!.@q2) {
+ dispbottom l("This looks DANGEROUS! Maybe someone around here can tell me what I'm supposed to do.");
+ return false;
+ }
+ if (.@q2 & .caveid)
+ return false;
+
+ // ---------------
+ // Main node setup
+ .@c=getarg(0);
+ .@m$=getmap();
+ .@n$="#RossyQuest::OnStage"+.@c;
+
+ // Obtain and Write Configuration
+ switch (.@c) {
+ case ROSSY_CAVE1:
+ .@boss=PoisonSkull;
+ .@mobc=rand2(3,5);
+ .@x1=85;.@y1=21;.@x2=108;.@y2=39;
+ .@x3=109;.@y3=33; .@x4=109; .@y4=36;
+ break;
+ case ROSSY_CAVE2:
+ .@boss=Troll;
+ .@mobc=rand2(3,5);
+ .@x1=191;.@y1=103;.@x2=205;.@y2=122;
+ .@x3=201;.@y3=123; .@x4=201; .@y4=123;
+ break;
+ case ROSSY_CAVE3:
+ .@boss=FireWisp;
+ .@mobc=rand2(2,4);
+ .@x1=26;.@y1=23;.@x2=43;.@y2=36;
+ .@x3=38;.@y3=37; .@x4=38; .@y4=37;
+ break;
+ case ROSSY_CAVE4:
+ .@boss=WaterWisp;
+ .@mobc=rand2(6,12);
+ .@x1=180;.@y1=176;.@x2=206;.@y2=207;
+ .@x3=179;.@y3=200; .@x4=179; .@y4=200;
+ break;
+ case ROSSY_CAVE5:
+ .@boss=Serqet;
+ .@mobc=rand2(6,8);
+ .@x1=98;.@y1=188;.@x2=141;.@y2=207;
+ .@x3=97;.@y3=190; .@x4=97; .@y4=197;
+ break;
+ case ROSSY_CAVE6:
+ .@boss=SnakeGhost;
+ .@mobc=rand2(5,7);
+ .@x1=19;.@y1=98;.@x2=36;.@y2=136;
+ .@x3=37;.@y3=125; .@x4=37; .@y4=125;
+ break;
+ case ROSSY_CAVE7:
+ .@boss=ScorpionGhost;
+ .@mobc=rand2(5,7);
+ .@x1=22;.@y1=181;.@x2=50;.@y2=205;
+ .@x3=51;.@y3=192; .@x4=51; .@y4=197;
+ break;
+ case ROSSY_CAVE8:
+ .@boss=JackO;
+ .@mobc=rand2(3,5);
+ .@x1=158;.@y1=20;.@x2=176;.@y2=35;
+ .@x3=175;.@y3=36; .@x4=177; .@y4=36;
+ break;
+ case ROSSY_CAVE9:
+ .@boss=GreenSlimeProgenitor;
+ .@mobc=rand2(5,7);
+ .@x1=187;.@y1=58;.@x2=208;.@y2=85;
+ .@x3=186;.@y3=82; .@x4=186; .@y4=85;
+ break;
+ case ROSSY_BOSSCAVE:
+ .@boss=Golem;
+ .@mobc=rand2(3,5);
+ .@x1=84;.@y1=85;.@x2=101;.@y2=101;
+ .@x3=92;.@y3=102; .@x4=93; .@y4=102;
+ break;
+ default:
+ consolemes(CONSOLEMES_ERROR, "INVALID ROSSY CAVE ID - "+.@c+" - SCRIPT ABORTED");
+ return false;
+ }
+
+ // This is cast from a dialog so prompt comes before any advanced calculation
+ mesc l("Drop a %s here to summon monsters.", getitemlink(PileOfAsh));
+ if (.@c == ROSSY_BOSSCAVE)
+ mesc l("This is the master's room seal, be careful!"), 1;
+ else
+ mesc l("Weaken all nine seals to be able to undo the final one.");
+ select
+ rif(countitem(PileOfAsh), l("Place pile of ashes")),
+ l("Run away in fear");
+ mes "";
+ closeclientdialog;
+ if (@menu == 2)
+ return false;
+
+ // Delete the item and lock for the quest
+ delitem PileOfAsh, 1;
+ @rossylock = true;
+
+ // Spawn underlings
+ for (.@i=0; .@i < .@mobc; .@i++) {
+ // FIXME: Penguin? Mister Prickel? Ice Goblin? Wolvern?
+ // I think all those four could be removed.
+ .@mobId=any(Bandit, RobinBandit, Skeleton, MisterPrickel, ManaGhost, Penguin, CraftyGhost, Zombie, Wolvern, SpiderGhost, IceGoblin); // Mobs lv 26~47
+ .@mob=areamonster(.@m$, .@x1, .@y1, .@x2, .@y2, strmobinfo(1, .@mobId), .@mobId, 1, .@n$);
+ // Make it aggresive
+ .@bmod=getunitdata(.@mob, UDT_MODE);
+ setunitdata(.@mob, UDT_MODE, .@bmod|4); // 4 = MD_AGGRESSIVE
+ }
+
+ // Spawn boss
+ .@mob=areamonster(.@m$, .@x1, .@y1, .@x2, .@y2, strmobinfo(1, .@boss), .@boss, 1, .@n$);
+
+ // Obain boss basic status...
+ .@bhp= getunitdata(.@mob, UDT_MAXHP);
+ .@bat1=getunitdata(.@mob, UDT_ATKMIN);
+ .@bat2=getunitdata(.@mob, UDT_ATKMAX);
+ .@bhit=getunitdata(.@mob, UDT_HIT);
+ .@bmod=getunitdata(.@mob, UDT_MODE);
+ .@bmod=.@bmod|4; // 4 = MD_AGGRESSIVE
+
+ // ...And Tweak Battle Status
+ setunitdata(.@mob, UDT_MAXHP, .@bhp*15/10);
+ setunitdata(.@mob, UDT_HP, .@bhp*15/10);
+ setunitdata(.@mob, UDT_ATKMIN, .@bat1*7/10);
+ setunitdata(.@mob, UDT_ATKMAX, .@bat2*7/10);
+ setunitdata(.@mob, UDT_HIT, .@bhit*2);
+ setunitdata(.@mob, UDT_MODE, .@bmod|32); // 32 = MD_BOSS
+
+ // Build the wall so you cannot leave :>
+ setcells getmap(), .@x3, .@y3, .@x4, .@y4, 3, "Rossy"+getcharid(0)+"Wall";
+ return true;
+}
+
+///////////////////////////////////////////////
+// Reset quest when you die
+function script RossyDeath {
+ if (getq(HurnscaldQuests_Rossy) != 16)
+ return;
+ if (@rossylock)
+ delcells("Rossy"+getcharid(0)+"Wall");
+ @rossylock=false;
+ setq2 HurnscaldQuests_Rossy, 0;
+ deltimer("#RossyQuest::OnTick1");
+ deltimer("#RossyQuest::OnTick2");
+ deltimer("#RossyQuest::OnTick3");
+ deltimer("#RossyQuest::OnTick4");
+ deltimer("#RossyQuest::OnTick5");
+ return;
+}
+
+// May reset quest when you logout
+function script RossyLogout {
+ if (getq(HurnscaldQuests_Rossy) != 16)
+ return;
+ if (@rossylock) {
+ delcells("Rossy"+getcharid(0)+"Wall");
+ @rossylock=false;
+ setq2 HurnscaldQuests_Rossy, 0;
+ }
+ // FIXME: Set timers again when you login back? =/
+ return;
+}
+
+/////////////////////////////////////////////////////////
+// Position the triggers
+
+// Begin Cave Code
+008-3-0,98,27,0 script #RossyCave01 NPC_SUMMONING_CIRC,{
+ if (RossyCave(.caveid))
+ disablenpc instance_npcname(.name$);
+ close;
+
+OnInit:
+ disablenpc "#RossyCave01";
+OnInstanceInit:
+ .distance=1;
+ .caveid=ROSSY_CAVE1;
+ end;
+}
+
+// Begin Cave Code
+008-3-0,199,109,0 script #RossyCave02 NPC_SUMMONING_CIRC,{
+ if (RossyCave(.caveid))
+ disablenpc instance_npcname(.name$);
+ close;
+
+OnInit:
+ disablenpc "#RossyCave02";
+OnInstanceInit:
+ .distance=1;
+ .caveid=ROSSY_CAVE2;
+ end;
+}
+
+// Begin Cave Code
+008-3-0,35,26,0 script #RossyCave03 NPC_SUMMONING_CIRC,{
+ if (RossyCave(.caveid))
+ disablenpc instance_npcname(.name$);
+ close;
+
+OnInit:
+ disablenpc "#RossyCave03";
+OnInstanceInit:
+ .distance=1;
+ .caveid=ROSSY_CAVE3;
+ end;
+}
+
+// Begin Cave Code
+008-3-0,198,193,0 script #RossyCave04 NPC_SUMMONING_CIRC,{
+ if (RossyCave(.caveid))
+ disablenpc instance_npcname(.name$);
+ close;
+
+OnInit:
+ disablenpc "#RossyCave04";
+OnInstanceInit:
+ .distance=1;
+ .caveid=ROSSY_CAVE4;
+ end;
+}
+
+// Begin Cave Code
+008-3-0,133,200,0 script #RossyCave05 NPC_SUMMONING_CIRC,{
+ if (RossyCave(.caveid))
+ disablenpc instance_npcname(.name$);
+ close;
+
+OnInit:
+ disablenpc "#RossyCave05";
+OnInstanceInit:
+ .distance=1;
+ .caveid=ROSSY_CAVE5;
+ end;
+}
+
+// Begin Cave Code
+008-3-0,27,104,0 script #RossyCave06 NPC_SUMMONING_CIRC,{
+ if (RossyCave(.caveid))
+ disablenpc instance_npcname(.name$);
+ close;
+
+OnInit:
+ disablenpc "#RossyCave06";
+OnInstanceInit:
+ .distance=1;
+ .caveid=ROSSY_CAVE6;
+ end;
+}
+
+// Begin Cave Code
+008-3-0,31,192,0 script #RossyCave07 NPC_SUMMONING_CIRC,{
+ if (RossyCave(.caveid))
+ disablenpc instance_npcname(.name$);
+ close;
+
+OnInit:
+ disablenpc "#RossyCave07";
+OnInstanceInit:
+ .distance=1;
+ .caveid=ROSSY_CAVE7;
+ end;
+}
+
+// Begin Cave Code
+008-3-0,165,26,0 script #RossyCave08 NPC_SUMMONING_CIRC,{
+ if (RossyCave(.caveid))
+ disablenpc instance_npcname(.name$);
+ close;
+
+OnInit:
+ disablenpc "#RossyCave08";
+OnInstanceInit:
+ .distance=1;
+ .caveid=ROSSY_CAVE8;
+ end;
+}
+
+// Begin Cave Code
+008-3-0,201,69,0 script #RossyCave09 NPC_SUMMONING_CIRC,{
+ if (RossyCave(.caveid))
+ disablenpc instance_npcname(.name$);
+ close;
+
+OnInit:
+ disablenpc "#RossyCave09";
+OnInstanceInit:
+ .distance=1;
+ .caveid=ROSSY_CAVE9;
+ end;
+}
+
+// --------------------------------------------------------------------
+008-3-0,92,90,0 script Juliet NPC_TANISHA,{
+ // Check quest consistency
+ // HurnscaldQuests_Rossy
+ // (MAIN QUEST, CAVE CONTROL, INSTANCE CONTROL)
+ .@q=getq(HurnscaldQuests_Rossy);
+ .@q2=getq2(HurnscaldQuests_Rossy);
+ .@inst=getq3(HurnscaldQuests_Rossy);
+
+ if (instance_id() != .@inst)
+ end;
+ if (!.@q2)
+ end;
+
+ // A bug!
+ if (.@q != 16) {
+ disablenpc instance_npcname("Juliet", .@inst);
+ end;
+ }
+
+ // Another bug!!
+ if (!(.@q2 & ROSSY_BOSSCAVE)) {
+ disablenpc instance_npcname("Juliet", .@inst);
+ end;
+ }
+
+ // Prepare rewards
+ .@rune=any(RunestoneUruz, RunestoneRaido, RunestoneThurisaz, RunestoneKaunaz, RunestoneDagaz, RunestonePeorth);
+ .@gems=any(CrudeDiamond, CrudeRuby, CrudeEmerald, CrudeSapphire, CrudeTopaz, CrudeAmethyst);
+ inventoryplace .@rune, 1, .@gems, 1;
+
+ // Run epilogue
+ mesn;
+ mesq l("I heard some battle noises a few minutes ago. Are you here to save me?");
+ next;
+ select
+ l("Of course I'm here to save you, Rossy sent me here!");
+ mes "";
+ mesn;
+ mesc l("Juliet starts scavenging the fallen Golem.");
+ mesq l("Mommy teached me about precious gemstones. This Golem has quite a few of them.");
+ next;
+ mesn;
+ mesq lg("Here you go, miss!", "Here you go, mister!");
+ getitem .@rune, 1;
+ getitem .@gems, 1;
+ getexp 100000, 10000;
+ setq HurnscaldQuests_Rossy, 17, 0, .@inst;
+ next;
+ mesn;
+ mesq l("Thanks for helping me... I'll be on my way now.");
+ next;
+ select
+ l("Go safely!"),
+ l("Do you need an escort?"),
+ l("What was following you, anyway?");
+ mes "";
+ if (@menu == 2) {
+ mesn;
+ mesq l("I'll be fine, but thanks for the concern.");
+ } else if (@menu == 3) {
+ // This opens path for additional questline
+ mesn;
+ mesq l("Actually... I don't remember. I'm not sure why.");
+ next;
+ mesn;
+ mesq l("But it was big and scary! I haven't seen it since I entered this cave, though...");
+ next;
+ mesn;
+ mesq lg("It probably went away after seeing your bravure, tee-hee!");
+ next;
+ mesn;
+ mesq l("I must go now. I've already spent too much time here already.");
+ }
+ disablenpc instance_npcname("Juliet", .@inst);
+ close;
+
+OnInit:
+ disablenpc "Juliet";
+ .distance=4;
+ end;
+
+OnInstanceInit:
+ disablenpc instance_npcname("Juliet");
+ .distance=4;
+ end;
+}
+
+
diff --git a/npc/008-3-5/nunia.txt b/npc/008-3-5/nunia.txt
index 4a6c0eb9..e58df875 100644
--- a/npc/008-3-5/nunia.txt
+++ b/npc/008-3-5/nunia.txt
@@ -77,6 +77,6 @@ function nuniaBegin {
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/009-1/_mobs.txt b/npc/009-1/_mobs.txt
index 141279c2..278be1b7 100644
--- a/npc/009-1/_mobs.txt
+++ b/npc/009-1/_mobs.txt
@@ -8,7 +8,7 @@
009-1,168,95,14,9 monster Bandit 1063,2,9000,18000
009-1,115,150,45,26 monster Thief Slime 1105,5,11500,45000
009-1,185,179,45,20 monster Blub 1008,4,60000,120000
-009-1,127,144,77,47 monster Green Slime 1024,10,10000,30000
+009-1,128,144,77,47 monster Green Slime 1024,10,10000,30000
009-1,63,175,30,15 monster Little Green Slime 1025,5,10000,30000
009-1,84,111,30,15 monster Little Green Slime 1025,5,10000,50000
009-1,228,139,13,12 monster Mana Ghost 1101,2,10000,30000
@@ -16,4 +16,18 @@
009-1,69,185,31,9 monster Skeleton 1084,4,6000,24000
009-1,142,159,84,20 monster Swampling 1109,10,30000,60000
009-1,162,99,17,15 monster Robin Bandit 1064,2,9000,18000
-009-1,189,50,38,13 monster Spiky Mushroom 1049,4,3000,12000
+009-1,184,48,38,13 monster Spiky Mushroom 1049,4,3000,12000
+009-1,103,86,31,27 monster Big Frog 1087,3,6000,60000
+009-1,85,118,49,43 monster Small Frog 1086,8,3000,30000
+009-1,152,165,44,40 monster Big Frog 1087,5,6000,75000
+009-1,188,188,49,18 monster Small Frog 1086,7,3000,30000
+009-1,228,65,16,8 monster Spider 1044,2,4000,8000
+009-1,209,58,16,28 monster Grass Snake 1042,4,3000,12000
+009-1,232,79,3,12 monster Wicked Mushroom 1050,3,6000,12000
+009-1,124,64,3,12 monster Wicked Mushroom 1050,7,3000,12000
+009-1,214,173,13,12 monster Zombie 1118,1,48000,120000
+009-1,37,181,13,12 monster Water Wisp 1116,3,10000,60000
+009-1,66,182,13,12 monster Fire Wisp 1115,1,10000,60000
+009-1,131,193,13,12 monster Green Slime Progenitor 1097,1,48000,120000
+009-1,149,174,84,19 monster Mud Slime 1096,4,30000,60000
+009-1,61,109,16,32 monster Serqet 1119,2,12000,60000
diff --git a/npc/009-2-3/_import.txt b/npc/009-2-3/_import.txt
index ec13efe3..7e647857 100644
--- a/npc/009-2-3/_import.txt
+++ b/npc/009-2-3/_import.txt
@@ -1,3 +1,4 @@
// 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/chef.txt",
diff --git a/npc/009-2-3/chef.txt b/npc/009-2-3/chef.txt
new file mode 100644
index 00000000..51e0a5eb
--- /dev/null
+++ b/npc/009-2-3/chef.txt
@@ -0,0 +1,92 @@
+// The Mana World scripts.
+// Author:
+// Jesusalva
+// Description:
+// The nameless chef of Reid's Inn
+
+009-2-3,27,41,0 script Chef#Reid NPC_CHEF_LEGACY,{
+ function cookingIntro;
+ function cookingDeal;
+ .@q=getq(General_Cooking);
+ mesn;
+ mesq l("You're in the way. Get moving!");
+ // TODO: Shop option
+ if (.@q == 5)
+ cookingIntro();
+ if (.@q == 9)
+ cookingDeal();
+ close;
+
+function cookingIntro {
+ .@q2=getq2(General_Cooking);
+ next;
+ select
+ l("Okay, okay..."),
+ l("I've heard you were a great chef and wanted to learn a recipe.");
+ mes "";
+ if (@menu == 1)
+ return;
+ mesn;
+ mesq l("Do I look like charity to you? I'm undead, you know?");
+ next;
+ mesn;
+ mesq l("Actually, the food quality here is horrible. I'm glad I'm undead or I would not eat here.");
+ next;
+ mesn;
+ mesq l("It is all \"fancy\" stuff, I don't even know if that could be of any nourishment for the living, and tastes like rotten. Well, figures. Undead town.");
+ next;
+ mesn;
+ mesq l("What about the following deal: You bring me some tasty food, and I give you some tasty recipe from before I became undead?");
+ next;
+ select
+ l("Deal"),
+ l("No Deal");
+ mes "";
+ if (@menu == 2) {
+ mesn;
+ mesq l("Smart choice, still-living person.");
+ return;
+ }
+ setq1 General_Cooking, 6;
+ mesn;
+ mesq l("Hah, you'll regret it. Bring me %d %s, before Golbenez finds out about our silly agreement.", .amount, getitemlink(.@q2 == VEGAN ? MananaSandwich : PioulegSandwich));
+ return;
+}
+
+function cookingDeal {
+ .@q2=getq2(General_Cooking);
+ .@item=(.@q2 == VEGAN ? MananaSandwich : PioulegSandwich);
+ .@recp=(.@q2 == CARNIVOROUS ? CraftMoubooStew : CraftSquirrelStew);
+ .@reit=(.@q2 == CARNIVOROUS ? MoubooStew : SquirrelStew);
+ next;
+ select
+ l("Okay, okay..."),
+ l("I wanted to give you the %d sandwiches you asked.", .amount);
+ mes "";
+ if (countitem(.@item) < .amount) {
+ mesn;
+ mesq l("Wha- Do you think I'm stupid?");
+ next;
+ mesn;
+ mesq l("You better get out of here, before I turn you into stew!");
+ return;
+ }
+ delitem .@item, .amount;
+ setq1 General_Cooking, 10;
+ RECIPES[.@recp]=true;
+ mesn;
+ mesq l("Eh, not bad. So, here is the %s recipe, from when I was living. It was a blast.", getitemlink(.@reit));
+ next;
+ mesn;
+ mesq l("Now begone and stop disrupting my work!");
+ return;
+}
+
+OnInit:
+ .bodytype = BODYTYPE_2;
+ .distance = 4;
+ .amount = 10;
+ end;
+
+}
+
diff --git a/npc/009-2-7/_import.txt b/npc/009-2-7/_import.txt
index 2dc0427e..745de620 100644
--- a/npc/009-2-7/_import.txt
+++ b/npc/009-2-7/_import.txt
@@ -1,3 +1,4 @@
// 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",
diff --git a/npc/009-2-7/jpmorbid.txt b/npc/009-2-7/jpmorbid.txt
new file mode 100644
index 00000000..9c8cf768
--- /dev/null
+++ b/npc/009-2-7/jpmorbid.txt
@@ -0,0 +1,63 @@
+// The Mana World scripts.
+// Author:
+// 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,{
+ // Storage/Banking function not unlocked in Artis
+ if (!getq(ArtisQuests_Lloyd)) {
+ speech
+ l("Oh hey!"),
+ l("I was supposed to act as storagekeeper, but I forgot my key."),
+ l("Come back later, perhaps I can find it.");
+ close;
+ }
+ mesn;
+ mesq l("Welcome to %s's Bank!", l($@BANK_TOWN$[.bankid]));
+ next;
+
+ do
+ {
+ select
+ l("I would like to store some items."),
+ l("I would like to perform money transactions."),
+ l("Is there any request for me?"),
+ menuaction(l("Quit"));
+
+ mes "";
+
+ switch (@menu) {
+ case 1:
+ mesn;
+ mesq l("Sure thing! I'll have your items transported here from Artis before you realize!");
+ next;
+ closeclientdialog();
+ openstorage();
+ close;
+ case 2:
+ MerchantGuild_Bank();
+ break;
+ case 3:
+ MerchantGuild_Quests(.bankid);
+ break;
+ default:
+ closeclientdialog;
+ goodbye;
+ close;
+ }
+
+ } while (true);
+ close;
+
+OnInit:
+ .bodytype = BODYTYPE_3;
+ .distance = 4;
+
+ // Bank configuration
+ array_push($@BANK_NAME$, .name$);
+ array_push($@BANK_TOWN$, "Asphodel Moors");
+ .bankid = getarraysize($@BANK_NAME$)-1;
+ end;
+}
diff --git a/npc/012-1/_import.txt b/npc/012-1/_import.txt
index 363a65e9..d12bbabf 100644
--- a/npc/012-1/_import.txt
+++ b/npc/012-1/_import.txt
@@ -10,6 +10,8 @@
"npc/012-1/ishi.txt",
"npc/012-1/kaan.txt",
"npc/012-1/liana.txt",
+"npc/012-1/marine.txt",
"npc/012-1/prawors.txt",
+"npc/012-1/tiki.txt",
"npc/012-1/vincent.txt",
"npc/012-1/zegas.txt",
diff --git a/npc/012-1/_mobs.txt b/npc/012-1/_mobs.txt
index d00ebaaa..ce3a3234 100644
--- a/npc/012-1/_mobs.txt
+++ b/npc/012-1/_mobs.txt
@@ -6,3 +6,7 @@
012-1,57,57,20,14 monster Grass Snake 1042,5,3000,12000
012-1,106,42,16,7 monster Scorpion 1043,4,15000,50000
012-1,115,123,14,7 monster Scorpion 1043,4,15000,40000
+012-1,91,81,10,15 monster Small Frog 1086,4,3000,30000
+012-1,86,86,7,11 monster Big Frog 1087,2,6000,75000
+012-1,103,55,14,13 monster Spiky Mushroom 1049,2,3000,6000
+012-1,43,51,3,4 monster Wicked Mushroom 1050,1,6000,12000
diff --git a/npc/012-1/marine.txt b/npc/012-1/marine.txt
new file mode 100644
index 00000000..db261fd0
--- /dev/null
+++ b/npc/012-1/marine.txt
@@ -0,0 +1,17 @@
+// Moubootaur Legends scripts.
+// Authors:
+// Jesusalva
+// Description:
+// This script controls access to Ships, fixing variables.
+
+// Use NPC_LA_MARINE if needed
+012-1,64,133,0 script La Marine#C NPC_HIDDEN,0,0,{
+ end;
+
+OnTouch:
+ EnterTown("Candor");
+
+ warp "marine@"+LOCATION$, 42, 26;
+ closedialog;
+ close;
+}
diff --git a/npc/012-1/prawors.txt b/npc/012-1/prawors.txt
index 4682c6a6..785ff66f 100644
--- a/npc/012-1/prawors.txt
+++ b/npc/012-1/prawors.txt
@@ -8,7 +8,7 @@
012-1,53,122,0 script Prawors NPC_PRAWORS,{
speech
l("Arrhoy!"),
- l("Micksha still haven't added a ship here, so you're stranded here FOREVER!"),
+ l("Saluc Golden Beard, the greediest of all ship captains, charges money for trips. so if you don't have money to pay him, you're stranded here FOREVER!"),
l("I hope you enjoy this town! Meanwhile, I wonder where I put my %s...", getitemlink(TreasureMap));
close;
diff --git a/npc/012-1/tiki.txt b/npc/012-1/tiki.txt
new file mode 100644
index 00000000..d50c27c8
--- /dev/null
+++ b/npc/012-1/tiki.txt
@@ -0,0 +1,151 @@
+// The Mana World scripts.
+// Author:
+// Jesusalva
+// Description:
+// Tiki is the sandwich maker of Candor
+
+012-1,116,118,0 script Tiki NPC_TIKI,{
+ function tikiSubmit;
+ function tikiMenu;
+ function tikiShop;
+ mesn;
+ mesq l("Hey there, shady fella. Whaddaya want in Candor shores?");
+ next;
+ if (getq(General_Cooking) == 7)
+ tikiMenu();
+ if (getq(General_Cooking) == 8)
+ tikiSubmit();
+ tikiShop();
+ end;
+
+function tikiShop {
+ closeclientdialog;
+ shop .name$;
+ return;
+}
+
+function tikiMenu {
+ .@q2=getq2(General_Cooking);
+ select
+ l("Just wanted to purchase ingredients for cooking."),
+ l("Actually, I would like to learn some recipes."),
+ l("Actually I'm lost. Sorry.");
+ mes "";
+ // Explode script as requested
+ if (@menu == 3)
+ close;
+ // Return so shop can take over
+ if (@menu == 1)
+ return;
+ // @menu == 2, "I would like to learn some recipes"
+ mesn strcharinfo(0);
+ mesc l("You quickly explain the situation and request the %s sandwich.", getitemlink(.@q2 == VEGAN ? MananaSandwich : PioulegSandwich));
+ next;
+ mesn;
+ mesq l("Ahh, I see! Very shady indeed, almost as shady as you are!");
+ next;
+ mesn;
+ mesq l("I would like to help, but I can't. I'm busy, you see! Candor's Sandwich Making Contest is coming up, and I never lost a single instance of it!");
+ next;
+ select
+ l("Ah, too bad, I'll ask Yannika for more ideas, bye."),
+ l("How come you never lost before?"),
+ l("Perhaps I can help?");
+ mes "";
+ if (@menu == 1)
+ close;
+ if (@menu == 2) {
+ mesn;
+ mesq l("Because I'm so great! I am so good, that the other challengers doesn't even show up in fear of losing to me!");
+ next;
+ mesn;
+ mesq l("Anyway, perhaps you could help me, and I'll help you in exchange. Whaddaya think?");
+ next;
+ }
+ mesn;
+ mesq l("It is really easy - I need an idea. Bring me something NEW, revolutionary, to make a sandwich out of it. And I'll teach you the recipe!");
+ next;
+ setq1 General_Cooking, 8;
+ return;
+}
+
+function tikiSubmit {
+ mesc "[" + .name$ + "]";
+ mesc l("\"Bring me something NEW, revolutionary, to make a sandwich out of it.\"");
+ mes "##B" + l("Drag and drop an item from your inventory.") + "##b";
+
+ .@id = requestitem();
+
+ // If ID is invalid
+ if (.@id < 1)
+ close;
+
+ // If there's not enough items, it is bound, it cannot be traded/dropped/sold, etc.
+ // TODO: Prevent plates/bowls from being destroyed this way!!
+ if (countitem(.@id) < 1 || checkbound(.@id) || getiteminfo(.@id, ITEMINFO_TYPE) != IT_HEALING) {
+ mesc l("This item cannot be given.");
+ close;
+ }
+
+ mesc l("Are you sure you want to give %s to %s? Item will be lost!",
+ getitemlink(.@id), .name$), 1;
+ if (askyesno() == ASK_NO)
+ close;
+
+ mesn;
+ mesq l("%s puts %s on between two bread slices and try it.", .name$, getitemname(.@id));
+ next;
+ delitem .@id, 1;
+ if (.@id != MoubooSteak) {
+ mesn;
+ mesc l("%s starts shouting insults at you!", .name$);
+ next;
+ mesn;
+ mesq l("This is the worst. sandwich. ever! How do you dare to give me such thing?!");
+ next;
+ mesn;
+ mesq l("Go get me something else, go do it NOW!!");
+ mesc l("...Maybe if he put the cheese and lettuce as you usually do, it would have tasted great... *sigh*");
+ close;
+ }
+ setq1 General_Cooking, 9;
+ setq1 General_SmearedHands, 3;
+ RECIPES[(.@q2 == VEGAN ? CraftMananaSandwich : CraftPioulegSandwich)]=true;
+ mesn;
+ mesq l("Uh - Oh. This is... Actually good!");
+ next;
+ mesn;
+ mesq l("I'm sure I'll win this year's contest as well! Hah, just wait and see!");
+ next;
+ mesn;
+ mesq l("What? Still want that shady recipe? Meh, just cut a bread, throw in three lettuce leaves, two cheese, and put the special ingredient - A %s!", getitemname(.@q2 == VEGAN ? Manana : PiouLegs));
+ next;
+ mesq l("And vói-la, you have your sandwich done. Now go, I have a contest to win! Hahaha!");
+ close;
+}
+
+OnInit:
+ .bodytype = BODYTYPE_2;
+ .distance = 4;
+ tradertype(NST_MARKET);
+
+ sellitem Bread, -1, 35;
+ sellitem PiouLegs, -1, 25;
+ sellitem Manana, -1, 20;
+ sellitem Cheese, -1, 12;
+ sellitem LettuceLeaf, -1, 10;
+ sellitem CommonCarp, -1, 8;
+ sellitem GrassCarp, -1, 7;
+ end;
+
+OnClock0001:
+ restoreshopitem Bread, 35;
+ restoreshopitem PiouLegs, 25;
+ restoreshopitem Manana, 20;
+ restoreshopitem Cheese, 12;
+ restoreshopitem LettuceLeaf, 10;
+ restoreshopitem CommonCarp, 8;
+ restoreshopitem GrassCarp, 7;
+ end;
+}
+
diff --git a/npc/012-2-3/cynric.txt b/npc/012-2-3/cynric.txt
index 3ca1bf33..960a96fb 100644
--- a/npc/012-2-3/cynric.txt
+++ b/npc/012-2-3/cynric.txt
@@ -7,7 +7,7 @@
012-2-3,27,28,0 script Cynric NPC_CYNRIC,{
mesn;
- mesq l("Welcome to Candor's Bank!");
+ mesq l("Welcome to %s's Bank!", l($@BANK_TOWN$[.bankid]));
next;
do
@@ -15,6 +15,7 @@
select
l("I would like to store some items."),
l("I would like to perform money transactions."),
+ l("Is there any request for me?"),
menuaction(l("Quit"));
mes "";
@@ -30,6 +31,9 @@
case 2:
MerchantGuild_Bank();
break;
+ case 3:
+ MerchantGuild_Quests(.bankid);
+ break;
default:
closeclientdialog;
goodbye;
@@ -42,5 +46,10 @@
OnInit:
.bodytype = BODYTYPE_3;
.distance = 4;
+
+ // Bank configuration
+ array_push($@BANK_NAME$, .name$);
+ array_push($@BANK_TOWN$, "Candor");
+ .bankid = getarraysize($@BANK_NAME$)-1;
end;
}
diff --git a/npc/020-1/_import.txt b/npc/020-1/_import.txt
index 9af8d519..58eebf87 100644
--- a/npc/020-1/_import.txt
+++ b/npc/020-1/_import.txt
@@ -2,3 +2,34 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/020-1/_mobs.txt",
"npc/020-1/_warps.txt",
+"npc/020-1/adrian.txt",
+"npc/020-1/aisha.txt",
+"npc/020-1/anwar.txt",
+"npc/020-1/bodyguard.txt",
+"npc/020-1/budifis.txt",
+"npc/020-1/cyndala.txt",
+"npc/020-1/ekinu.txt",
+"npc/020-1/eomie.txt",
+"npc/020-1/froma.txt",
+"npc/020-1/harper.txt",
+"npc/020-1/hocus.txt",
+"npc/020-1/inar.txt",
+"npc/020-1/itka.txt",
+"npc/020-1/joelin.txt",
+"npc/020-1/jossy.txt",
+"npc/020-1/mahoud.txt",
+"npc/020-1/malivox.txt",
+"npc/020-1/marikel.txt",
+"npc/020-1/marine.txt",
+"npc/020-1/martha.txt",
+"npc/020-1/neko.txt",
+"npc/020-1/nickos.txt",
+"npc/020-1/noke.txt",
+"npc/020-1/odonell.txt",
+"npc/020-1/philip.txt",
+"npc/020-1/popaul.txt",
+"npc/020-1/pusco.txt",
+"npc/020-1/ryan.txt",
+"npc/020-1/sander.txt",
+"npc/020-1/tindris.txt",
+"npc/020-1/vaspina.txt",
diff --git a/npc/020-1/_mobs.txt b/npc/020-1/_mobs.txt
index e9ad346a..23449fcd 100644
--- a/npc/020-1/_mobs.txt
+++ b/npc/020-1/_mobs.txt
@@ -55,3 +55,10 @@
020-1,66,64,0,0 monster Crocotree 1010,1,420000,240000
020-1,291,254,0,0 monster Crocotree 1010,1,420000,240000
020-1,285,246,0,0 monster Crocotree 1010,1,420000,240000
+020-1,116,251,23,3 monster Mister Prickel 1085,1,100000,200000
+020-1,64,88,6,6 monster Mister Prickel 1085,1,100000,200000
+020-1,268,249,9,3 monster Mister Prickel 1085,1,100000,200000
+020-1,70,132,13,12 monster Fire Wisp 1115,3,10000,60000
+020-1,70,86,12,10 monster Water Wisp 1116,1,10000,60000
+020-1,244,236,47,21 monster Serqet 1119,2,12000,60000
+020-1,228,222,50,19 monster Fire Goblin 1080,5,8000,50000
diff --git a/npc/020-1/adrian.txt b/npc/020-1/adrian.txt
index 9f59202e..ca4b1a3f 100644
--- a/npc/020-1/adrian.txt
+++ b/npc/020-1/adrian.txt
@@ -1,20 +1,43 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
+// Jesusalva
// Description:
// Adrian, a Sailor near the Legion's Docks.
// THIS IS A PLACEHOLDER!
020-1,272,138,0 script Adrian NPC_ADRIAN,{
+ .@q=getq(TonoriQuest_Kylian);
+
speech
l("Hi there."),
- l("Looks like someone ran out of ideas for placeholder NPCs."),
- l("So if you want, you can go to bed again."),
- l("Whatever.");
+ l("I was just having a nap, now the port authority summons me to stand here! I hate this job."),
+ l("Are you here to pick up luggage? I'd like to go get a beer, but I have to wait here until all the luggage is picked up.");
+ if (.@q != 1)
+ close;
+ select
+ l("I've came to fetch Kylian's luggage."),
+ l("Leave");
+ mes "";
+ if (@menu == 2)
+ close;
+ mesn;
+ mesc l("%s examines the ticket.", .name$);
+ mesq l("...");
+ next;
+ mesn;
+ mesq l("Mr. Kylian you say? Of course he would send someone to pick up his luggage. Figures.");
+ next;
+ inventoryplace Suitcase, 1;
+ 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;
+ getitembound Suitcase, 1, IBT_CHARACTER;
close;
OnInit:
- .bodytype = BODYTYPE_2;
- .distance = 2;
+ .bodytype = BODYTYPE_1;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/aisha.txt b/npc/020-1/aisha.txt
index 808808ee..5c276f9c 100644
--- a/npc/020-1/aisha.txt
+++ b/npc/020-1/aisha.txt
@@ -14,6 +14,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/anwar.txt b/npc/020-1/anwar.txt
index bab82b8f..63355ab6 100644
--- a/npc/020-1/anwar.txt
+++ b/npc/020-1/anwar.txt
@@ -15,6 +15,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/bodyguard.txt b/npc/020-1/bodyguard.txt
index f9879df2..4b60c5b6 100644
--- a/npc/020-1/bodyguard.txt
+++ b/npc/020-1/bodyguard.txt
@@ -3,17 +3,52 @@
// Micksha
// Description:
// Bodyguard protecting Micksha's chilling place in oasis.
-// THIS IS A PLACEHOLDER!
020-1,292,245,0 script Bodyguard NPC_RAIJIN_FEMALE_LEGION_ARTIS,{
speech
l("Hey, you!"),
l("Do not dare sitting on this bench. This is Micksha's place to relax. You better are gone when he arrives."),
l("He has to listen to much drama, so he wants to rest here, alone, in silence. Got it?");
+ next;
+ select
+ l("Got it."),
+ l("And what if I sit?"),
+ l("Who's Micksha?"),
+ l("What's the story of this place, anyway?");
+ mes "";
+ mesn;
+ switch (@menu) {
+ case 2:
+ mesq l("Well, if he sees you, a giant foot will descend from the heavens upon you... Or so I've heard.");
+ next;
+ mesn;
+ mesc l("*shivers*");
+ mesq l("I would be afraid if I were you!");
+ next;
+ mesn;
+ break;
+ case 3:
+ mesq l("A popular designer and inventor. A lot of buildings follow their architectonic drawings.");
+ next;
+ mesn;
+ mesq l("You would be amazed at how much engineers and politicians oppose to his architecture, though!");
+ next;
+ mesn;
+ break;
+ case 4:
+ mesq l("Once upon a long time, a local nobleman crushed a gold ingot in this lake. Instead of dust, it became water and then, this pond came to be.");
+ next;
+ mesn;
+ mesq l("It is only a myth, don't expect it to make a lot of sense.");
+ next;
+ mesn;
+ break;
+ }
+ mesq l("Now, get moving.");
close;
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/budifis.txt b/npc/020-1/budifis.txt
index f8637303..b67a42fd 100644
--- a/npc/020-1/budifis.txt
+++ b/npc/020-1/budifis.txt
@@ -14,7 +14,7 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/cyndala.txt b/npc/020-1/cyndala.txt
index ff87825d..b5d9d7e9 100644
--- a/npc/020-1/cyndala.txt
+++ b/npc/020-1/cyndala.txt
@@ -8,13 +8,13 @@
020-1,285,156,0 script Cyndala NPC_INYA,{
speech
l("Hi there."),
- l("Looks like someone ran out of ideas for placeholder NPCs."),
- l("So if you want, you can bring Heathin a hammer."),
+ l("There used to be more pirates around here, but, you know."),
+ l("People are going mad rewriting history and I'm clueless."),
l("Whatever.");
close;
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/ekinu.txt b/npc/020-1/ekinu.txt
index d692e55e..1f8987c7 100644
--- a/npc/020-1/ekinu.txt
+++ b/npc/020-1/ekinu.txt
@@ -14,6 +14,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/eomie.txt b/npc/020-1/eomie.txt
index 2873cd80..c96389ca 100644
--- a/npc/020-1/eomie.txt
+++ b/npc/020-1/eomie.txt
@@ -14,7 +14,7 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/froma.txt b/npc/020-1/froma.txt
index fe6f1ef7..f3aba5e4 100644
--- a/npc/020-1/froma.txt
+++ b/npc/020-1/froma.txt
@@ -7,14 +7,14 @@
020-1,291,123,0 script Froma NPC_DEMON_MALE_LEGION_ARTIS,{
speech
- l("Hi there."),
- l("Looks like someone ran out of ideas for placeholder NPCs."),
+ l("Fromage!"),
+ l("It is the only word in french I know. We are very classy."),
l("So if you want, you can hunt something, or cook something, or craft somethig."),
l("Whatever.");
close;
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/harper.txt b/npc/020-1/harper.txt
index 79ef2850..11749dfd 100644
--- a/npc/020-1/harper.txt
+++ b/npc/020-1/harper.txt
@@ -14,6 +14,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/hocus.txt b/npc/020-1/hocus.txt
index cd44b265..aee036e5 100644
--- a/npc/020-1/hocus.txt
+++ b/npc/020-1/hocus.txt
@@ -2,7 +2,8 @@
// Author:
// Micksha
// Description:
-// Hocus, the Nature Mage. More interested in food than in nature magic, sometimes.
+// Hocus, the Nature Mage and Academy Grandmaster. More interested in food than in nature magic, sometimes.
+// "Hocus: the mages here? They just think they work for me, they never understod that i am just one of them.. no idea why they follow me"
// THIS IS A PLACEHOLDER!
020-1,73,91,0 script Hocus NPC_MAGE_BROWN,{
@@ -10,11 +11,65 @@
l("Hi!"),
l("You should eat more salad. I see in your face that your nutrition is not good."),
l("Can you bug Jesusalva? I really would like to teach you something.");
+ if (getq(HurnscaldQuests_Rossy) == 8) {
+ next;
+ mesn;
+ mesq l("I see you are helping the little girl, Rossy I believe? Her profesor, Mr. David, is on the west wing of the magic academy building.");
+ }
+ next;
+ 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.")),
+ l("Thanks for your wise words.");
+ mes "";
+ switch (@menu) {
+ /* Food Questline */
+ case 1:
+ mesn;
+ mesq l("Here. But you probably won't be coming here to eat all the time, so I will teach you a salad recipe.");
+ next;
+ select
+ l("Do you need some monster killed?"),
+ l("Do you need some sort of item?"),
+ l("Do you need money?");
+ mes "";
+ mesn;
+ mesq l("Hm, not really...");
+ next;
+ mesn strcharinfo(0);
+ // FIXME: Carrot Cake? Really??
+ mesq l("I'll bring you 6 %s, 6 %s, and a %s just wait here. I'll also clean up all monsters on the proximity and pay you 1000 E. Wait for my return, Grandmaster!", getitemlink(RoastedAcorn), getitemlink(Carrot), getitemlink(CarrotCake));
+ setq1 General_Cooking, 16;
+ break;
+ case 2:
+ if (countitem(RoastedAcorn) < 6 ||
+ countitem(Carrot) < 6 ||
+ countitem(CarrotCake) < 1 ||
+ Zeny < 1000) {
+ mesn strcharinfo(0);
+ mesc l("I promised to bring him 6 %s, 6 %s, and a %s. I also promised clean up all monsters on the proximity and pay him 1000 E. I'll make the Grandmaster proud!", getitemlink(RoastedAcorn), getitemlink(Carrot), getitemlink(CarrotCake));
+ close;
+ }
+ mesn;
+ mesq lg("Child, I do not need your money nor items. I told you I would teach you the recipe. It is free.");
+ next;
+ mesn;
+ mesq l("I am already happy enough that you want to improve your own eating habits. You don't need to give me anything.");
+ next;
+ mesn;
+ mesq l("Besides, helping each other, even without a compensation is a good thing and accepting help is nothing to be ashamed of. Here. Go in peace, child.");
+ // FIXME: Probably wrong recipe
+ RECIPES[CraftBlueberryCake]=true;
+ RECIPES[CraftCarrotCake]=true;
+ getitem BlueberryCake, 1;
+ setq1 General_Cooking, 17;
+ break;
+ }
close;
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/inar.txt b/npc/020-1/inar.txt
index b9a52fb3..0d705f46 100644
--- a/npc/020-1/inar.txt
+++ b/npc/020-1/inar.txt
@@ -15,6 +15,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/itka.txt b/npc/020-1/itka.txt
index 6cb6f5ea..679c1792 100644
--- a/npc/020-1/itka.txt
+++ b/npc/020-1/itka.txt
@@ -14,6 +14,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/joelin.txt b/npc/020-1/joelin.txt
index 21fd788f..ee34800b 100644
--- a/npc/020-1/joelin.txt
+++ b/npc/020-1/joelin.txt
@@ -14,6 +14,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/jossy.txt b/npc/020-1/jossy.txt
index 1fc8422a..de14c876 100644
--- a/npc/020-1/jossy.txt
+++ b/npc/020-1/jossy.txt
@@ -8,12 +8,13 @@
020-1,180,87,0 script Jossy NPC_HUMAN_MALE_BROTHERHOOD,{
speech
l("Hi!"),
- l("I do't want to talk to you."),
+ l("I don't want to talk to you."),
l("Here, talk to my hand.");
+ heal -100, 0;
close;
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/mahoud.txt b/npc/020-1/mahoud.txt
index 2f9170fa..d8d63cc2 100644
--- a/npc/020-1/mahoud.txt
+++ b/npc/020-1/mahoud.txt
@@ -14,6 +14,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/malivox.txt b/npc/020-1/malivox.txt
index a8f9acca..9f2b7787 100644
--- a/npc/020-1/malivox.txt
+++ b/npc/020-1/malivox.txt
@@ -15,6 +15,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/marikel.txt b/npc/020-1/marikel.txt
index fa5895ee..d9492077 100644
--- a/npc/020-1/marikel.txt
+++ b/npc/020-1/marikel.txt
@@ -14,6 +14,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/marine.txt b/npc/020-1/marine.txt
new file mode 100644
index 00000000..65a08adc
--- /dev/null
+++ b/npc/020-1/marine.txt
@@ -0,0 +1,17 @@
+// Moubootaur Legends scripts.
+// Authors:
+// Jesusalva
+// Description:
+// This script controls access to Ships, fixing variables.
+
+// Use NPC_LA_MARINE if needed
+020-1,210,143,0 script La Marine#T NPC_HIDDEN,0,0,{
+ end;
+
+OnTouch:
+ EnterTown("Tulim");
+
+ warp "marine@"+LOCATION$, 42, 26;
+ closedialog;
+ close;
+}
diff --git a/npc/020-1/martha.txt b/npc/020-1/martha.txt
index 961404e7..9b22e80e 100644
--- a/npc/020-1/martha.txt
+++ b/npc/020-1/martha.txt
@@ -14,6 +14,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/neko.txt b/npc/020-1/neko.txt
index bdae8288..5e572b70 100644
--- a/npc/020-1/neko.txt
+++ b/npc/020-1/neko.txt
@@ -8,13 +8,13 @@
020-1,278,99,0 script Neko NPC_DESERT_HAT_MAN,{
speech
l("Hi there."),
- l("Looks like someone ran out of ideas for placeholder NPCs."),
- l("So if you want, you can hunt something, or cook something, or craft somethig."),
- l("Whatever.");
+ l("I am out of stock, unfortunately."),
+ l("What do you mean to look at my wares?!"),
+ l("My collection of random stuff is not for sale! Go away!");
close;
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/nickos.txt b/npc/020-1/nickos.txt
index 97d56aa9..892842bd 100644
--- a/npc/020-1/nickos.txt
+++ b/npc/020-1/nickos.txt
@@ -14,6 +14,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/noke.txt b/npc/020-1/noke.txt
index c8b244e3..561cbb74 100644
--- a/npc/020-1/noke.txt
+++ b/npc/020-1/noke.txt
@@ -8,13 +8,13 @@
020-1,171,80,0 script Noke NPC_DESERT_HAT_MAN,{
speech
l("Hi there."),
- l("Looks like someone ran out of ideas for placeholder NPCs."),
- l("So if you want, you can hunt something, or cook something, or craft somethig."),
+ l("Everyone wants a slice of Tulimshar."),
+ l("So it is hard to know my role on this world."),
l("Whatever.");
close;
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/odonell.txt b/npc/020-1/odonell.txt
index 4509287d..cb582c90 100644
--- a/npc/020-1/odonell.txt
+++ b/npc/020-1/odonell.txt
@@ -14,6 +14,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/philip.txt b/npc/020-1/philip.txt
index 91c046bc..b73b9685 100644
--- a/npc/020-1/philip.txt
+++ b/npc/020-1/philip.txt
@@ -8,13 +8,12 @@
020-1,285,123,0 script Philip NPC_UKAR_MALE_LEGION_ARTIS,{
speech
l("Hi there."),
- l("Looks like someone ran out of ideas for placeholder NPCs."),
- l("So if you want, you can hunt something, or cook something, or craft somethig."),
+ l("I am just a random soldier, so stop bothering me."),
l("Whatever.");
close;
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/popaul.txt b/npc/020-1/popaul.txt
index 4ac979d6..b6e553f0 100644
--- a/npc/020-1/popaul.txt
+++ b/npc/020-1/popaul.txt
@@ -8,13 +8,13 @@
020-1,278,108,0 script Popaul NPC_HUMAN_MALE_LEGION_ARTIS,{
speech
l("Hi there."),
- l("Looks like someone ran out of ideas for placeholder NPCs."),
- l("So if you want, you can hunt something, or cook something, or craft somethig."),
- l("Whatever.");
+ l("I am so lazy today. I wish work hours end soon."),
+ l("Then I'll have a drink with my friends at the inn."),
+ l("Won't be able to walk properly afterwards, but whatever, I get experience either way!");
close;
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/pusco.txt b/npc/020-1/pusco.txt
index 282362c3..5a5b4767 100644
--- a/npc/020-1/pusco.txt
+++ b/npc/020-1/pusco.txt
@@ -14,7 +14,7 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/ryan.txt b/npc/020-1/ryan.txt
index 0de695c9..9aaae54e 100644
--- a/npc/020-1/ryan.txt
+++ b/npc/020-1/ryan.txt
@@ -14,6 +14,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/sander.txt b/npc/020-1/sander.txt
index fe2124a0..f5a05e73 100644
--- a/npc/020-1/sander.txt
+++ b/npc/020-1/sander.txt
@@ -8,12 +8,12 @@
020-1,200,203,0 script Sander NPC_SANDER,{
speech
l("Hi there."),
- l("I will send you to the mines! Later, when we have mines, that is."),
+ l("I will send you to the mines! Later, when we have clearance for the mines, that is."),
l("Tell Micksha to get up his ass for mapping desert caves, maybe this will speed it up.");
close;
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/tindris.txt b/npc/020-1/tindris.txt
index 45087ced..60a3a36a 100644
--- a/npc/020-1/tindris.txt
+++ b/npc/020-1/tindris.txt
@@ -14,7 +14,7 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
@@ -27,6 +27,6 @@ OnInit:
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-1/vaspina.txt b/npc/020-1/vaspina.txt
index 0b46be13..46fa1316 100644
--- a/npc/020-1/vaspina.txt
+++ b/npc/020-1/vaspina.txt
@@ -14,7 +14,7 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-2-0/_import.txt b/npc/020-2-0/_import.txt
index 38f92c4e..368dffce 100644
--- a/npc/020-2-0/_import.txt
+++ b/npc/020-2-0/_import.txt
@@ -2,3 +2,4 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/020-2-0/_mobs.txt",
"npc/020-2-0/_warps.txt",
+"npc/020-2-0/kaizer.txt",
diff --git a/npc/020-2-0/kaizer.txt b/npc/020-2-0/kaizer.txt
index 3815b19d..b9d53543 100644
--- a/npc/020-2-0/kaizer.txt
+++ b/npc/020-2-0/kaizer.txt
@@ -14,6 +14,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-2-10/_import.txt b/npc/020-2-10/_import.txt
index a2d0c1cd..0f59e421 100644
--- a/npc/020-2-10/_import.txt
+++ b/npc/020-2-10/_import.txt
@@ -1,3 +1,4 @@
// Map 020-2-10: Tailor
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/020-2-10/_warps.txt",
+"npc/020-2-10/hetchel.txt",
diff --git a/npc/020-2-10/hetchel.txt b/npc/020-2-10/hetchel.txt
index 9af9d2b1..5114124e 100644
--- a/npc/020-2-10/hetchel.txt
+++ b/npc/020-2-10/hetchel.txt
@@ -7,14 +7,14 @@
020-2-10,45,27,0 script Hetchel NPC_HETCHEL,{
speech
- l("Hi there."),
- l("Looks like someone ran out of ideas for placeholder NPCs."),
- l("So if you want, you can bring Heathin a hammer."),
- l("Whatever.");
+ 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.");
close;
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-2-18/_import.txt b/npc/020-2-18/_import.txt
index 7c171074..1898daec 100644
--- a/npc/020-2-18/_import.txt
+++ b/npc/020-2-18/_import.txt
@@ -1,3 +1,4 @@
// Map 020-2-18: Market Administration
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/020-2-18/_warps.txt",
+"npc/020-2-18/inya.txt",
diff --git a/npc/020-2-18/inya.txt b/npc/020-2-18/inya.txt
index b33f1f6c..aec5ee0a 100644
--- a/npc/020-2-18/inya.txt
+++ b/npc/020-2-18/inya.txt
@@ -15,6 +15,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-2-20/_import.txt b/npc/020-2-20/_import.txt
index fd72cbf9..8bc63945 100644
--- a/npc/020-2-20/_import.txt
+++ b/npc/020-2-20/_import.txt
@@ -1,3 +1,5 @@
// Map 020-2-20: Tulimshar Inn
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/020-2-20/_warps.txt",
+"npc/020-2-20/drabur.txt",
+"npc/020-2-20/riskim.txt",
diff --git a/npc/020-2-20/_warps.txt b/npc/020-2-20/_warps.txt
index 772fc3c3..3508873e 100644
--- a/npc/020-2-20/_warps.txt
+++ b/npc/020-2-20/_warps.txt
@@ -3,3 +3,4 @@
020-2-20,49,38,0 warp #020-2-20_49_38 0,0,020-1,202,169
020-2-20,35,38,0 warp #020-2-20_35_38 0,0,020-1,194,169
020-2-20,33,22,0 warp #020-2-20_33_22 0,0,020-2-24,32,24
+020-2-20,37,21,0 warp #020-2-20_37_21 0,0,020-2-34,37,41
diff --git a/npc/020-2-20/drabur.txt b/npc/020-2-20/drabur.txt
index 59749ce3..8be16d8d 100644
--- a/npc/020-2-20/drabur.txt
+++ b/npc/020-2-20/drabur.txt
@@ -1,18 +1,55 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
// Drabur, the baker's salesman.
// THIS IS A PLACEHOLDER!
-020-2-20,49,30,0 script Drabur NPC_GENERAL_STORE,{
- speech
+020-2-20,47,30,0 script Drabur NPC_GENERAL_STORE,{
+ mesn;
+ mesq l("Please don't interrupt my work, I am busy.");
+ next;
+ select
l("Hi there."),
+ l("Do you sell anything here?"),
+ l("Could I lodge here?"),
l("Goodbye.");
+ mes "";
+ switch (@menu) {
+ case 1:
+ mesn;
+ mesq l("...");
+ break;
+ case 2:
+ mesn;
+ mesq l("Sure - take a look.");
+ next;
+ closeclientdialog;
+ shop .name$;
+ break;
+ case 3:
+ mesn;
+ mesq l("Sorry, we've booked our only room to a foreigner called Kylian.");
+ next;
+ mesn;
+ mesq l("And we got rid of the extra beds as no one was using them, so we are full at the moment. Come again later.");
+ break;
+ }
close;
OnInit:
- .bodytype = BODYTYPE_2;
- .distance = 2;
+ .bodytype = BODYTYPE_1;
+ .distance = 4;
+ tradertype(NST_MARKET);
+
+ sellitem BlueberryCake, -1, 1+rand2(10);
+ sellitem CarrotCake, -1, 1+rand2(10);
+ sellitem Donut, -1, 1+rand2(10);
+ end;
+
+OnClock0002:
+ restoreshopitem BlueberryCake, rand2(11);
+ restoreshopitem CarrotCake, rand2(11);
+ restoreshopitem Donut, rand2(11);
end;
}
diff --git a/npc/020-2-20/riskim.txt b/npc/020-2-20/riskim.txt
index 9267305f..4478a3d8 100644
--- a/npc/020-2-20/riskim.txt
+++ b/npc/020-2-20/riskim.txt
@@ -1,4 +1,4 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
// Description:
@@ -6,15 +6,148 @@
// THIS IS A PLACEHOLDER!
020-2-20,49,30,0 script Riskim NPC_CHEF_LEGACY,{
+ function foodQuestline;
+ .@q=getq(General_Cooking);
speech
l("Hi there."),
l("Need a Donut?"),
l("Well, tell me the recipe and I will bake for you whatever you need, for a small fee."),
- l("But: No recipe, no deserts.");
+ l("But: No recipe, no desserts.");
+ if (.@q > 10)
+ foodQuestline;
close;
+function foodQuestline {
+ .@q=getq(General_Cooking);
+ .@q2=getq2(General_Cooking);
+ mes "";
+ select
+ rif(.@q == 11, l("Aww, but I was hoping to learn a recipe!")),
+ rif(.@q >= 14, l("I needed Acorn Flour.")),
+ rif(.@q >= 14, l("Do you need acorn flour yourself?")),
+ rif(.@q >= 14, l("I want to cook!")),
+ l("=(");
+ mes "";
+ switch (@menu) {
+ case 1:
+ mesn;
+ mesq l("What? Get out of here you noob. The recipes are the pride of this inn-bakery and I'm not going to give them away just because you asked.");
+ next;
+ mesn;
+ mesq l("Besides, I already have an apprentice - He should be cleaning the basement at this moment, including.");
+ next;
+ mesn;
+ mesq l("Get out of my face and don't say that again.");
+ setq1 General_Cooking, 12;
+ break;
+ case 2:
+ mesn;
+ mesq l("Only the best %s can make fine recipes.", getitemlink(AcornFlour));
+ next;
+ mesn;
+ mesq l("I'm willing to make you one flour for each %d %s you bring me. Three for you, and two as commission.", 5, getitemlink(Acorn));
+ next;
+ mesn;
+ mesq l("So, how many do you want?");
+ menuint
+ rif(countitem(Acorn) >= 5, l("I want %d", 1)), 1,
+ rif(countitem(Acorn) >= 25, l("I want %d", 5)), 5,
+ rif(countitem(Acorn) >= 50, l("I want %d", 10)), 10,
+ rif(countitem(Acorn) >= 125, l("I want %d", 25)), 25,
+ rif(countitem(Acorn) >= 250, l("I want %d", 50)), 50,
+ rif(countitem(Acorn) >= 500, l("I want %d", 100)), 100,
+ rif(countitem(Acorn) >= 5, l("As many as you can.")), countitem(Acorn)/5,
+ l("Ehrm, none, thanks."), 0;
+ mes "";
+ if (!@menuret)
+ break;
+ inventoryplace AcornFlour, @menuret;
+ delitem Acorn, @menuret*5;
+ getitem AcornFlour, @menuret;
+ mesn;
+ mesq l("Here you go. A pleasure doing business with you.");
+ break;
+ case 3:
+ // DailyQuest(lvl, cost, count, item)
+ DailyQuest(20, 3, 1, AcornFlour);
+ break;
+ case 4:
+ mesn;
+ mesq l("My charge is %d E per batch.", .price);
+ if (Zeny < .price)
+ break;
+ next;
+ do
+ {
+ mes "##B" + l("Drag and drop the items from your inventory in the frames.") + "##b";
+
+ // Crafting skin with 4 columns
+ setskin "craft4";
+ .@var$ = requestcraft(4); // Limit: 4 items
+ .@craft = initcraft(.@var$);
+ .@entry = findcraftentry(.@craft, CRAFT_COOKING);
+ setskin "";
+
+ // Does the recipe exist and is a sandwich?
+ if (.@entry < 0)
+ {
+ narrator
+ l("You don't know how any recipe with that."),
+ l("Do you want to try again?");
+ if (askyesno() == ASK_YES)
+ .@tryAgain=true;
+ else
+ .@tryAgain=false;
+ }
+ else
+ {
+ // Did player cheat? If not, proceed with the craft
+ if (!validatecraft(.@craft))
+ {
+ narrator
+ l("Where are the ingredients?");
+ .@tryAgain=true;
+ }
+ else
+ {
+ // Even if the recipe is right, if you don't have it on your
+ // recipe book, it should be deemed invalid.
+ if (RECIPES[.@entry])
+ {
+ usecraft .@craft;
+ narrator
+ l("Done!"),
+ l("Do you want to try again?");
+ }
+ else
+ {
+ narrator
+ l("You don't know how any recipe with that."),
+ l("Do you want to try again?");
+ }
+
+ if (askyesno() == ASK_YES)
+ .@tryAgain=true;
+ else
+ .@tryAgain=false;
+ }
+ }
+
+ // Clear unused variables and clear the screen.
+ deletecraft .@craft;
+ Zeny-=.price;
+ if (Zeny < .price)
+ .@tryAgain = false;
+ clear;
+ } while (.@tryAgain);
+ break;
+ }
+ return;
+}
+
OnInit:
- .bodytype = BODYTYPE_2;
- .distance = 2;
+ .bodytype = BODYTYPE_1;
+ .distance = 4;
+ .price = 120;
end;
}
diff --git a/npc/020-2-24/_import.txt b/npc/020-2-24/_import.txt
index 267cff9a..b4fa1e73 100644
--- a/npc/020-2-24/_import.txt
+++ b/npc/020-2-24/_import.txt
@@ -1,3 +1,4 @@
// Map 020-2-24: Tulimshar Inn First Floor
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/020-2-24/_warps.txt",
+"npc/020-2-24/kylian.txt",
diff --git a/npc/020-2-24/kylian.txt b/npc/020-2-24/kylian.txt
new file mode 100644
index 00000000..446f17bb
--- /dev/null
+++ b/npc/020-2-24/kylian.txt
@@ -0,0 +1,63 @@
+// The Mana World scripts.
+// Author:
+// Jesusalva
+// Description:
+// Rich merchant
+
+020-2-24,35,24,0 script Kylian NPC_KPG_MANAGER,{
+ function kylianLuggage;
+ .@q=getq(TonoriQuest_Kylian);
+ switch (.@q) {
+ case 0:
+ kylianLuggage();
+ break;
+ case 1:
+ mesn;
+ mesq l("Please show Adrian the luggage ticket I gave you.");
+ 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.");
+ break;
+ }
+ close;
+
+function kylianLuggage {
+ // Insert lore babbling here
+ mesn;
+ mesq l("Ah! Are you the room service? I have some requests.");
+ next;
+ select
+ l("Sure... What can I do for you?"),
+ l("No, I'm not!");
+ mes "";
+ if (@menu == 2) {
+ mesn;
+ mesq l("Too bad. Would you be interested in earning some quick money with some errands regardless?");
+ next;
+ select
+ l("I'm a great adventurer! I don't do petty errands."),
+ l("No. I'm busy."),
+ l("Well... OK.");
+ mes "";
+ if (@menu != 3)
+ return;
+ }
+ 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;
+ next;
+ mesn;
+ mesq l("I'll be waiting your return.");
+ return;
+}
+
+OnInit:
+ .bodytype = BODYTYPE_3;
+ .distance = 4;
+ end;
+}
diff --git a/npc/020-2-26/_import.txt b/npc/020-2-26/_import.txt
index 7fc3a49c..bf3dda11 100644
--- a/npc/020-2-26/_import.txt
+++ b/npc/020-2-26/_import.txt
@@ -1,3 +1,4 @@
// Map 020-2-26: Magic Academy Ground Floor
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/020-2-26/_warps.txt",
+"npc/020-2-26/receptionist.txt",
diff --git a/npc/020-2-26/receptionist.txt b/npc/020-2-26/receptionist.txt
index fb7a316e..4e2c3963 100644
--- a/npc/020-2-26/receptionist.txt
+++ b/npc/020-2-26/receptionist.txt
@@ -10,11 +10,12 @@
l("Hi!"),
l("This is the magic academy. If all those mages were not so absentminded, they could make some furniture."),
l("But oh well, people have different priorities it seems. Ask Micksha.");
+ // if (something) ask about enrolling - Hocus Quest
close;
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-2-28/_import.txt b/npc/020-2-28/_import.txt
index fc26fb22..cbdcd407 100644
--- a/npc/020-2-28/_import.txt
+++ b/npc/020-2-28/_import.txt
@@ -1,3 +1,4 @@
// Map 020-2-28: Magic Acedemy Central, Second Floor
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/020-2-28/_warps.txt",
+"npc/020-2-28/pauline.txt",
diff --git a/npc/020-2-28/pauline.txt b/npc/020-2-28/pauline.txt
index 4e3de4df..720ab465 100644
--- a/npc/020-2-28/pauline.txt
+++ b/npc/020-2-28/pauline.txt
@@ -10,11 +10,30 @@
l("Hi!"),
l("Should I tell you the secret of a good fight?"),
l("CONFRONT AND DESTROY!! (Don't tell your parents I said that.");
+ select
+ l("You're weird, I have to go sorry."),
+ l("I can't do that, I keep getting killed.");
+ mes "";
+ if (@menu == 1)
+ close;
+ mesn;
+ mesq l("Oh no! Well, I never said to confront alone. Did you try going with friends?");
+ next;
+ if (askyesno() == ASK_NO) {
+ mesn;
+ mesq l("Then you should do that. It is always more fun with friends.");
+ close;
+ }
+ mesn;
+ mesq l("Ah... Then maybe you should summon a monster to your aid, or hire a mercenary.");
+ next;
+ mesn;
+ mesq l("Hold tight. Hire a mercenary? That was not in the script. Please call Jesusalva ASAP.");
close;
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-2-3/_import.txt b/npc/020-2-3/_import.txt
index 5f9ad85f..12378155 100644
--- a/npc/020-2-3/_import.txt
+++ b/npc/020-2-3/_import.txt
@@ -1,3 +1,4 @@
// Map 020-2-3: Brotherhood Inn
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/020-2-3/_warps.txt",
+"npc/020-2-3/inac.txt",
diff --git a/npc/020-2-3/inac.txt b/npc/020-2-3/inac.txt
index 289cbbd1..57650aa7 100644
--- a/npc/020-2-3/inac.txt
+++ b/npc/020-2-3/inac.txt
@@ -14,6 +14,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-2-30/_import.txt b/npc/020-2-30/_import.txt
index 5647fac2..97b89ffd 100644
--- a/npc/020-2-30/_import.txt
+++ b/npc/020-2-30/_import.txt
@@ -1,3 +1,4 @@
// Map 020-2-30: Magic Acedemy West, First Floor
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/020-2-30/_warps.txt",
+"npc/020-2-30/david.txt",
diff --git a/npc/020-2-30/david.txt b/npc/020-2-30/david.txt
new file mode 100644
index 00000000..3329485a
--- /dev/null
+++ b/npc/020-2-30/david.txt
@@ -0,0 +1,43 @@
+// The Mana World scripts.
+// Author:
+// Jesusalva
+// Description:
+// David is the head of Alchemy class in the Magic Academy
+
+020-2-30,36,24,0 script David NPC_MAGE_BLUE,{
+ function rossyPotion;
+ mesn;
+ mesq l("Hello there. I am David, head of alchemy in the magic academy.");
+ next;
+ mesn;
+ mesq l("If you are not a student, please leave the premises at once.");
+ if (getq(HurnscaldQuests_Rossy) == 8)
+ rossyPotion();
+ close;
+
+function rossyPotion {
+ next;
+ select
+ l("Alright, I'll be going."),
+ l("Actually, Rossy told me to deliver a potion to you.");
+ mes "";
+ if (@menu == 1)
+ return;
+ mesn;
+ mesq l("Ah, just in time. I asked Hocus' to send a letter; the deadline was coming up soon.");
+ next;
+ mesn;
+ mesq l("It seems okay-ish, I guess? Okay-ish is enough. Anyway, I'll analyze it and grade fairly. You can tell her that.");
+ next;
+ mesn;
+ mesq l("And unless you are a student, I'll have to ask you to leave the premises.");
+ setq HurnscaldQuests_Rossy, 9;
+ return;
+}
+
+OnInit:
+ .bodytype = BODYTYPE_2;
+ .distance = 4;
+ end;
+}
+
diff --git a/npc/020-2-34/_import.txt b/npc/020-2-34/_import.txt
new file mode 100644
index 00000000..2a823164
--- /dev/null
+++ b/npc/020-2-34/_import.txt
@@ -0,0 +1,5 @@
+// Map 020-2-34: Tulimshar Casino
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/020-2-34/_warps.txt",
+"npc/020-2-34/casino.txt",
+"npc/020-2-34/donutello.txt",
diff --git a/npc/020-2-34/_warps.txt b/npc/020-2-34/_warps.txt
new file mode 100644
index 00000000..2a4a162e
--- /dev/null
+++ b/npc/020-2-34/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 020-2-34: Tulimshar Casino warps
+020-2-34,37,40,0 warp #020-2-34_37_40 0,0,020-2-20,37,22
diff --git a/npc/020-2-34/casino.txt b/npc/020-2-34/casino.txt
new file mode 100644
index 00000000..63a17c9f
--- /dev/null
+++ b/npc/020-2-34/casino.txt
@@ -0,0 +1,8 @@
+// Tulimshar Inn Casino
+// Author:
+// Jesusalva
+
+020-2-34,33,22,0 duplicate(Slot Machine) Slot Machine#T1 NPC_HASAN
+
+020-2-34,45,22,0 duplicate(High Lower) Gambler#T1 NPC_HUMAN_MALE_BROTHERHOOD
+
diff --git a/npc/020-2-34/donutello.txt b/npc/020-2-34/donutello.txt
new file mode 100644
index 00000000..c14420e6
--- /dev/null
+++ b/npc/020-2-34/donutello.txt
@@ -0,0 +1,167 @@
+// The Mana World scripts.
+// Author:
+// Jesusalva
+// Description:
+// Donutello is the Donut Apprentice
+
+020-2-34,33,48,0 script Donutello NPC_CHEF_LEGACY,{
+ function foodQuestline;
+
+ // Instance behavior
+ if (instance_id() > 0) {
+ npctalk3 l("Time remaining: %s" , FuzzyTime(@tinner));
+ end;
+ }
+
+ mesn;
+ mesq l("Why are you here? Only staff and VIP are supposed to go down here.");
+
+ .@q=getq(General_Cooking);
+ if (.@q > 11)
+ foodQuestline();
+
+ close;
+
+function foodQuestline {
+ .@q=getq(General_Cooking);
+ .@q2=getq2(General_Cooking);
+ mes "";
+ select
+ rif(.@q == 12, l("Can you teach me how to cook sweets?")),
+ rif(.@q == 13, l("Rattos killed. So, my recipe...")),
+ l("What is the area, anyway?"),
+ l("Erm, wrong door, sorry.");
+ mes "";
+ switch (@menu) {
+ case 1:
+ mesn;
+ mesq l("What? But the recipes are the pride of Tulimshar Inn, and-- Oohhhh.... Maybe...");
+ next;
+ mesn;
+ mesq l("Hey, I can teach the %s recipe. However...", getitemlink(Donut));
+ next;
+ select
+ l("Oh no - I'm not your personal delivery guy! Bye bye!"),
+ l("Here we go again...");
+ mes "";
+ if (@menu == 1)
+ break;
+ mesn;
+ mesq l("I am scared of the rattos! And Riskim says that we cannot have rattos here, so he also wants me to kill them!! %%i");
+ next;
+ mesn strcharinfo(0);
+ select
+ l("Sounds cliché, but okay, I'll help."),
+ l("They're just rattos?");
+ mes "";
+ mesn;
+ mesq l("Oh, but they aren't only fast - they're more vicious than common rattos, from all the sugar they eat. And if you take too long killing them, Riskim will hear and - things will turn out badly!");
+ next;
+ mesc l("Accept quest?"), 1;
+ mesc l("Time limit: %s", l("2 minutes"));
+ .@mapn$="Tinn@"+getcharid(0);
+ if (askyesno() == ASK_NO)
+ break;
+
+ if (instanceowner(@tinnst) != getcharid(3)) {
+ @tinnst = instance_create("T.INN "+getcharid(0), getcharid(3), IOT_CHAR);
+ instance_attachmap("020-2-34", @tinnst, false, .@mapn$);
+ instance_set_timeout(120, 120, @tinnst);
+ instance_init(@tinnst);
+ } else {
+ instance_set_timeout(120, 120, @tinnst);
+ }
+ @tinner = gettimetick(2) + 120;
+ killmonsterall(.@mapn$);
+ for (.@i = 0; .@i < 4; .@i++) {
+ .@mob=areamonster(.@mapn$, 32, 50, 52, 57, strmobinfo(1, Ratto), Ratto, 1, "Donutello::OnRattoKill");
+ // Make them vicious
+ .@bhp= getunitdata(.@mob, UDT_MAXHP);
+ .@bat1=getunitdata(.@mob, UDT_ATKMIN);
+ .@bat2=getunitdata(.@mob, UDT_ATKMAX);
+ .@bhit=getunitdata(.@mob, UDT_HIT);
+ setunitdata(.@mob, UDT_MAXHP, .@bhp*22/10);
+ setunitdata(.@mob, UDT_HP, .@bhp*22/10);
+ setunitdata(.@mob, UDT_ATKMIN, .@bat1*27/10);
+ setunitdata(.@mob, UDT_ATKMAX, .@bat2*27/10);
+ setunitdata(.@mob, UDT_HIT, .@bhit*20);
+ }
+ warp .@mapn$, 37, 50;
+ dispbottom l("Time remaining: %s", FuzzyTime(@tinner));
+ closeclientdialog;
+ close;
+ break;
+ case 2:
+ mesn;
+ mesq l("Phew, thanks %s. These rattos were going to be the ruin of me!", strcharinfo(0));
+ next;
+ mesn;
+ mesq l("However, you must bring me %d %s, %d %s and %d %s. Because the ingredients are you!",
+ 6, getitemlink(AcornFlour),
+ 2, getitemlink(MoubooMilk),
+ 2, getitemlink(ChocolateBar));
+ next;
+ mesn;
+ mesq l("Erm, Acorn Flour is made of mashed up acorns. %d Acorns make one flour. So, I'll accept the acorns instead of the flour as you helped me a lot.", 3);
+ next;
+ mesc l("Deliver the ingredients?"), 1;
+ mesf("- %d %s", 18, getitemlink(Acorn));
+ mesf("- %d %s", 2, getitemlink(MoubooMilk));
+ mesf("- %d %s", 2, getitemlink(ChocolateBar));
+ mes "";
+ if (askyesno() == ASK_NO)
+ break;
+ if (countitem(ChocolateBar) < 2 ||
+ countitem(MoubooMilk) < 2 ||
+ countitem(Acorn) < 18)
+ break;
+ inventoryplace Donut, 1;
+ delitem Acorn, 18;
+ delitem MoubooMilk, 2;
+ delitem ChocolateBar, 2;
+ setq1 General_Cooking, 14;
+ RECIPES[CraftDonut]=true;
+ getitem Donut, 1;
+ mesn;
+ mesq l("Great, thanks! If you need more flour you can ask Riskim. He also buys flour for a good price.");
+ next;
+ mesn;
+ mesq l("First divide the ingredients on two halves. Take the first half, mix them, bring the oven, and blablablablah....");
+ next;
+ mesn;
+ mesq l("And after a while, you have %s! I made two with the ingredients you gave me, one for you and one for me. This is my thankyou for helping me out on the storeroom. Enjoy!", getitemlink(Donut));
+ break;
+ case 3:
+ mesn;
+ mesq l("Up there is the Casino. Erm, it is totally legal, I swear.");
+ next;
+ mesn;
+ mesq l("Here is the storeroom, and... Hey! I don't need to answer you questions!!");
+ break;
+ }
+ return;
+
+OnRattoKill:
+ if (!playerattached()) end;
+ // FIXME - Make sure this is an instanced map
+ //if (instance_id() < 1) end;
+
+ if (mobcount(getmap(), "Donutello::OnRattoKill") <= 0) {
+ dispbottom l("I'm done with this.");
+ getmapxy(.@m$, .@x, .@y, 0);
+ setq1 General_Cooking, 13;
+ sleep2(1000); // Give you some time to loot
+ warp "020-2-34", .@x, .@y;
+ sleep2(500); // Give M+ some time to re-render everything
+ npctalk3 l("Thanks %s... I feel much safer now!", strcharinfo(0));
+ } else {
+ dispbottom l("Rattos remaining: %d", mobcount(getmap(), "Donutello::OnRattoKill"));
+ }
+ end;
+}
+
+OnInit:
+ .bodytype = BODYTYPE_1;
+ .distance = 4;
+ end;
+}
diff --git a/npc/020-2-5/_import.txt b/npc/020-2-5/_import.txt
index f7be2ce9..e7e9087c 100644
--- a/npc/020-2-5/_import.txt
+++ b/npc/020-2-5/_import.txt
@@ -1,3 +1,5 @@
// Map 020-2-5: Legion Castle
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/020-2-5/_warps.txt",
+"npc/020-2-5/dausen.txt",
+"npc/020-2-5/filipa.txt",
diff --git a/npc/020-2-5/dausen.txt b/npc/020-2-5/dausen.txt
index f8b77df1..157c689e 100644
--- a/npc/020-2-5/dausen.txt
+++ b/npc/020-2-5/dausen.txt
@@ -7,14 +7,14 @@
020-2-5,40,23,0 script Dausen NPC_HUMAN_MALE_CHIEF_ARTIS_LEGION,{
speech
- l("Hi there."),
- l("Looks like someone ran out of ideas for placeholder NPCs."),
- l("So if you want, you can hunt something, or cook something, or craft somethig."),
- l("Whatever.");
+ l("Hi there. I am lieutenant Dausen."),
+ l("Red Sands desert is dangerous at the moment, so we sealed it off."),
+ l("The mines are also on the risk of collapsing, so the workers had to be evacuated as well."),
+ l("I fear for the future of this town...");
close;
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-2-5/filipa.txt b/npc/020-2-5/filipa.txt
index 74beb94e..1390df19 100644
--- a/npc/020-2-5/filipa.txt
+++ b/npc/020-2-5/filipa.txt
@@ -8,13 +8,13 @@
020-2-5,47,28,0 script Filipa NPC_RAIJIN_FEMALE_LEGION_ARTIS,{
speech
l("Hi there."),
- l("Looks like someone ran out of ideas for placeholder NPCs."),
- l("So if you want, you can hunt something, or cook something, or craft somethig."),
- l("Whatever.");
+ l("This is no place for you, get moving!"),
+ l("If you want, you can hunt something, or cook something, or craft something."),
+ l("Whatever, just get out of here already!");
close;
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-2-7/_import.txt b/npc/020-2-7/_import.txt
index 855eef7d..b4179bc5 100644
--- a/npc/020-2-7/_import.txt
+++ b/npc/020-2-7/_import.txt
@@ -1,3 +1,4 @@
// Map 020-2-7: Legion Guardhouse
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/020-2-7/_warps.txt",
+"npc/020-2-7/manoli.txt",
diff --git a/npc/020-2-7/manoli.txt b/npc/020-2-7/manoli.txt
index 258810cd..2f1b7b63 100644
--- a/npc/020-2-7/manoli.txt
+++ b/npc/020-2-7/manoli.txt
@@ -15,6 +15,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/020-2-9/_import.txt b/npc/020-2-9/_import.txt
index 25967b52..d8d9c07d 100644
--- a/npc/020-2-9/_import.txt
+++ b/npc/020-2-9/_import.txt
@@ -1,3 +1,6 @@
// 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",
diff --git a/npc/020-2-9/hydusun.txt b/npc/020-2-9/hydusun.txt
new file mode 100644
index 00000000..b80c1e78
--- /dev/null
+++ b/npc/020-2-9/hydusun.txt
@@ -0,0 +1,63 @@
+// The Mana World scripts.
+// Author:
+// Jesusalva
+// Description:
+// Hydusun the Tulimshar storage guy.
+// THIS IS A PLACEHOLDER!
+
+020-2-9,35,25,0 script Hydusun NPC_RICHARD_LEGACY,{
+ // Storage/Banking function not unlocked in Artis
+ if (!getq(ArtisQuests_Lloyd)) {
+ speech
+ l("Oh hey!"),
+ l("I was supposed to act as storagekeeper, but I forgot my key."),
+ l("Come back later, perhaps I can find it.");
+ close;
+ }
+ mesn;
+ mesq l("Welcome to %s's Bank!", l($@BANK_TOWN$[.bankid]));
+ next;
+
+ do
+ {
+ select
+ l("I would like to store some items."),
+ l("I would like to perform money transactions."),
+ l("Is there any request for me?"),
+ menuaction(l("Quit"));
+
+ mes "";
+
+ switch (@menu) {
+ case 1:
+ mesn;
+ mesq l("Sure thing! I'll have your items transported here from Artis before you realize!");
+ next;
+ closeclientdialog();
+ openstorage();
+ close;
+ case 2:
+ MerchantGuild_Bank();
+ break;
+ case 3:
+ MerchantGuild_Quests(.bankid);
+ break;
+ default:
+ closeclientdialog;
+ goodbye;
+ close;
+ }
+
+ } while (true);
+ close;
+
+OnInit:
+ .bodytype = BODYTYPE_3;
+ .distance = 4;
+
+ // Bank configuration
+ array_push($@BANK_NAME$, .name$);
+ array_push($@BANK_TOWN$, "Tulimshar");
+ .bankid = getarraysize($@BANK_NAME$)-1;
+ end;
+}
diff --git a/npc/020-2-9/jhedia.txt b/npc/020-2-9/jhedia.txt
index 4da687e6..3f24d448 100644
--- a/npc/020-2-9/jhedia.txt
+++ b/npc/020-2-9/jhedia.txt
@@ -15,6 +15,6 @@
OnInit:
.bodytype = BODYTYPE_2;
- .distance = 2;
+ .distance = 4;
end;
}
diff --git a/npc/_anchors.txt b/npc/_anchors.txt
index 454a9eab..a1421cdb 100644
--- a/npc/_anchors.txt
+++ b/npc/_anchors.txt
@@ -8,6 +8,7 @@ OnInit:
htput(.ht, "^ART", "001-1 89 86");
htput(.ht, "^ASPH|MOOR", "009-1 53 171");
htput(.ht, "^BLACK|SMITH", "001-2-27 35 32");
+ htput(.ht, "^BOT|CHECK", "botcheck 30 30");
htput(.ht, "^CAMP|FIRE", "008-1 55 46");
htput(.ht, "^CANDOR", "012-1 49 114");
htput(.ht, "^CHAP", "009-1 212 151");
@@ -15,6 +16,7 @@ OnInit:
htput(.ht, "^DIMOND|COVE", "008-1 106 222");
htput(.ht, "^DRA|ISLAND", "000-1 62 111");
htput(.ht, "^FARM|MOUB", "008-1 71 129");
+ htput(.ht, "^FERMI|VOTE", "fermi 29 20");
htput(.ht, "^FIRST|^DECK1?$", "000-2-0 23 28");
htput(.ht, "^GARDEN", "020-1 76 99");
htput(.ht, "^HARB|^MASTER", "001-2-16 28 32");
@@ -38,7 +40,7 @@ OnInit:
htput(.ht, "^NOBLE5$", "001-2-15 34 38");
htput(.ht, "^OASIS", "020-1 287 246");
htput(.ht, "^RED|PLUSH|^INN", "001-2-28 30 35");
- htput(.ht, "^ROSSY", "008-3-0 130 108");
+ htput(.ht, "^ROSSY", "008-1 49 158");
htput(.ht, "^SECOND|^DECK2$", "000-2-1 67 32");
htput(.ht, "^SHIP2$", "001-2-21 23 28");
htput(.ht, "^START2$", "000-0-0 26 28");
diff --git a/npc/_import.txt b/npc/_import.txt
index ed967629..65890740 100644
--- a/npc/_import.txt
+++ b/npc/_import.txt
@@ -159,12 +159,17 @@
@include "npc/020-2-31/_import.txt"
@include "npc/020-2-32/_import.txt"
@include "npc/020-2-33/_import.txt"
+@include "npc/020-2-34/_import.txt"
@include "npc/020-2-4/_import.txt"
@include "npc/020-2-5/_import.txt"
@include "npc/020-2-6/_import.txt"
@include "npc/020-2-7/_import.txt"
@include "npc/020-2-8/_import.txt"
@include "npc/020-2-9/_import.txt"
+@include "npc/botcheck/_import.txt"
+@include "npc/fermi/_import.txt"
+@include "npc/marine-2/_import.txt"
+@include "npc/marine/_import.txt"
@include "npc/sec_pri/_import.txt"
@include "npc/test/_import.txt"
@include "npc/testbg/_import.txt"
diff --git a/npc/botcheck/_import.txt b/npc/botcheck/_import.txt
new file mode 100644
index 00000000..5f53d234
--- /dev/null
+++ b/npc/botcheck/_import.txt
@@ -0,0 +1,2 @@
+// Map botcheck: Botcheck Area
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
diff --git a/npc/commands/debug-quest.txt b/npc/commands/debug-quest.txt
index 8ec18fae..40a6a8b6 100644
--- a/npc/commands/debug-quest.txt
+++ b/npc/commands/debug-quest.txt
@@ -109,7 +109,8 @@ function script GlobalQuestDebug {
l("Forest bow"), HurnscaldQuests_ForestBow,
l("Wooden shield"), HurnscaldQuests_WoodenShield,
"Kfahr",HurnscaldQuests_Kfahr,
- "Galimatia",ArgaesQuest_Galimatia;
+ "Galimatia",ArgaesQuest_Galimatia,
+ "Rossy",HurnscaldQuests_Rossy;
switch (@menuret)
{
@@ -185,6 +186,31 @@ OnCall:
closeclientdialog;
end;
+OnSetq:
+ if (.@atcmd_numparameters < 2) {
+ dispbottom "setq called with invalid arguments (min. 2)";
+ dispbottom "GM Command syntax: @setq <quest_id> <val1> <val2> <val3>";
+ end;
+ }
+ .@q=atoi(.@atcmd_parameters$[0]);
+ switch (.@atcmd_numparameters) {
+ case 4:
+ setq3 .@q, atoi(.@atcmd_parameters$[3]);
+ case 3:
+ setq2 .@q, atoi(.@atcmd_parameters$[2]);
+ case 2:
+ setq1 .@q, atoi(.@atcmd_parameters$[1]);
+ dispbottom l("Quest %s modified by GM", getquestlink(.@q));
+ specialeffect 54, SELF, playerattached();
+ break;
+ default:
+ dispbottom "setq called with invalid arguments (max. 4)";
+ dispbottom "GM Command syntax: @setq <quest_id> <val1> <val2> <val3>";
+ break;
+ }
+ end;
+
OnInit:
bindatcmd "qdebug", "@qdebug::OnCall", 0, 99, 0;
+ bindatcmd "setq", "@qdebug::OnSetq", 99, 99, 1;
}
diff --git a/npc/commands/scheduled-broadcasts.txt b/npc/commands/scheduled-broadcasts.txt
index 720651b3..8699c581 100644
--- a/npc/commands/scheduled-broadcasts.txt
+++ b/npc/commands/scheduled-broadcasts.txt
@@ -147,7 +147,7 @@ function script StoneBoard {
{
.@next = max(1, ((3600000 * ($@SCHED_Opt[1] - $@SCHED_Opt[4])) - getnpctimer(0, "@sched")));
mes l("Interval: every @@ hour(s)", $@SCHED_Opt[1]);
- mes l("Next broadcast: @@", FuzzyTime(time_from_ms(.@next)));
+ mes l("Next broadcast: @@", FuzzyTime(time_from_ms(.@next), 0, 99));
}
else
{
diff --git a/npc/config/location.txt b/npc/config/location.txt
new file mode 100644
index 00000000..a094075f
--- /dev/null
+++ b/npc/config/location.txt
@@ -0,0 +1,83 @@
+// Moubootaur Legends Script
+// Author: Jesusalva
+// Location Config
+
+- script loc_config 32767,{
+ end;
+
+OnInit:
+ // TODO: Migglemire, Westport... As this is only used for ship right now, meh
+ setarray $@LOCMASTER_TP, TP_ARTIS, TP_TULIM, TP_HURNS, TP_CANDOR, TP_ARGAES;
+ setarray $@LOCMASTER_LOC$, "Artis", "Tulim" , "Hurns" , "Candor" , "Argaes" ;
+ setarray $@LOCMASTER_MAP$, "001-1", "020-1" , "008-1" , "012-1" , "008-1-1";
+ setarray $@LOCMASTER_X, 203, 209, 326, 63, 33;
+ setarray $@LOCMASTER_Y, 85, 143, 104, 133, 63;
+ end;
+
+OnInterIfInit:
+ // Create ship instances
+ /* La Marine's Ship */
+ // Tulim Instance
+ .TULIM_INSTID = instance_create("marine@TulimInst", 0, IOT_NONE);
+ instance_attachmap("marine", .TULIM_INSTID, 0, "marine@Tulim");
+ instance_set_timeout(0, 0, .TULIM_INSTID);
+ instance_init(.TULIM_INSTID);
+
+ // Hurns Instance
+ .HURNS_INSTID = instance_create("marine@HurnsInst", 0, IOT_NONE);
+ instance_attachmap("marine", .HURNS_INSTID, 0, "marine@Hurns");
+ instance_set_timeout(0, 0, .HURNS_INSTID);
+ instance_init(.HURNS_INSTID);
+
+ // Candor Instance
+ .CANDOR_INSTID = instance_create("marine@CandorInst", 0, IOT_NONE);
+ instance_attachmap("marine", .CANDOR_INSTID, 0, "marine@Candor");
+ instance_set_timeout(0, 0, .CANDOR_INSTID);
+ instance_init(.CANDOR_INSTID);
+
+ // Artis Instance (Frigate Gema IV)
+ .ARTIS_INSTID = instance_create("marine@ArtisInst", 0, IOT_NONE);
+ instance_attachmap("marine", .ARTIS_INSTID, 0, "marine@Artis");
+ instance_set_timeout(0, 0, .ARTIS_INSTID);
+ instance_init(.ARTIS_INSTID);
+
+ /* Other instances */
+ .GALI_INSTID = instance_create("008-1-1@galimatia", 0, IOT_NONE);
+ instance_attachmap("008-1-1", .GALI_INSTID, 0, "gali@matia");
+ instance_set_timeout(0, 0, .GALI_INSTID);
+ instance_init(.GALI_INSTID);
+ end;
+}
+
+// Warps you to last visited town
+function script ReturnLastTown {
+ PC_DEST$ = "";
+ @timer_navio_running = 0;
+ .@i=array_find($@LOCMASTER_LOC$, LOCATION$);
+ warp $@LOCMASTER_MAP$[.@i], $@LOCMASTER_X[.@i], $@LOCMASTER_Y[.@i];
+ return;
+}
+
+// Upon entering a town, save it to LOCATION$
+// EnterTown( LocName{, warp=False} )
+function script EnterTown {
+ // Fill variable
+ .@v$=getarg(0);
+
+ // Validade variable
+ if (array_find($@LOCMASTER_LOC$, .@v$) < 0) {
+ consolemes(CONSOLEMES_ERROR, "Invalid location passed to EnterTown: "+.@v$);
+ if (getarg(1, false))
+ ReturnLastTown();
+ return;
+ }
+
+ // Save location
+ LOCATION$=.@v$;
+
+ // If "warp" is true
+ if (getarg(1, false))
+ ReturnLastTown();
+ return;
+}
+
diff --git a/npc/fermi/_import.txt b/npc/fermi/_import.txt
new file mode 100644
index 00000000..9c2eafa4
--- /dev/null
+++ b/npc/fermi/_import.txt
@@ -0,0 +1,3 @@
+// Map fermi: Three Fermi Land
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/fermi/_warps.txt",
diff --git a/npc/fermi/_warps.txt b/npc/fermi/_warps.txt
new file mode 100644
index 00000000..9da4df68
--- /dev/null
+++ b/npc/fermi/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map fermi: Three Fermi Land warps
+fermi,29,19,0 warp #fermi_29_19 0,0,marine,43,27
diff --git a/npc/functions/bank.txt b/npc/functions/bank.txt
index 5b281379..2af9136e 100644
--- a/npc/functions/bank.txt
+++ b/npc/functions/bank.txt
@@ -2,6 +2,7 @@
// Authors:
// gumi
// Reid
+// Jesusalva
function script MerchantGuild_Bank {
do
@@ -132,3 +133,165 @@ function script MerchantGuild_Bank {
}
} while (true);
}
+
+// MerchantGuild_Quests(.bankid)
+function script MerchantGuild_Quests {
+ mes "";
+ // Quest Type, Quest Data, Quest Timer
+ .@q=getq(General_MerchantRequest);
+ .@q2=getq2(General_MerchantRequest);
+ .@q3=getq3(General_MerchantRequest);
+ .@id=getarg(0);
+
+ // Cooldown
+ if (.@q3 > gettimetick(2)) {
+ mesn $@BANK_NAME$[.@id];
+ mesq l("There are no tasks for you right now.");
+ mesc l("Please come back later, in %s.", FuzzyTime(.@q3));
+ next;
+ return;
+ }
+
+ // TODO: Submit/Abort current request
+ switch (.@q) {
+ case MERCQ_LETTER:
+ if (.@id == .@q2) {
+ mesn $@BANK_NAME$[.@id];
+ mesq l("Thanks for the letter! Your efforts are greatly appreciated.");
+ Zeny+=rand2(100, 500);
+ getexp rand2(1000, 5000), rand2(150, 300);
+ setq General_MerchantRequest, MERCQ_NONE, 0, gettimetick(2)+1800;
+ return;
+ }
+ else
+ {
+ mesn $@BANK_NAME$[.@id];
+ mesq l("Current task: Deliver a letter to %s", $@BANK_TOWN$[.@q2]);
+ next;
+ select
+ l("Continue"),
+ l("Abort") + " ["+l("Change task")+"]";
+ mes "";
+ if (@menu == 1)
+ return;
+ setq General_MerchantRequest, MERCQ_NONE, 0, gettimetick(2);
+ }
+ break;
+ /* ***************************************** */
+ case MERCQ_GOODS:
+ .@cont=ASK_NO;
+ if (countitem(.@q2)) {
+ mesc l("Deliver %s?", getitemlink(.@q2));
+ .@cont=askyesno();
+ }
+ if (.@cont == ASK_YES) {
+ mesn $@BANK_NAME$[.@id];
+ mesq l("Thanks for the %s! Your efforts are greatly appreciated.", getitemlink(.@q2));
+ delitem .@q2, 1;
+ Zeny+=rand2(500, 2500);
+ getexp rand2(5000, 15000), rand2(250, 400);
+ setq General_MerchantRequest, MERCQ_NONE, 0, gettimetick(2)+7200;
+ return;
+ }
+ else
+ {
+ mesn $@BANK_NAME$[.@id];
+ mesq l("Current task: Purchase a(n) %s", getitemlink(.@q2));
+ next;
+ select
+ l("Continue"),
+ l("Abort") + " ["+l("Change task")+"]";
+ mes "";
+ if (@menu == 1)
+ return;
+ setq General_MerchantRequest, MERCQ_NONE, 0, gettimetick(2);
+ }
+ break;
+ /* ***************************************** */
+ case MERCQ_SCOUT:
+ if (.@id == .@q2) {
+ mesn $@BANK_NAME$[.@id];
+ mesq l("Thanks for scorting our caravan! Your efforts are greatly appreciated.");
+ Zeny+=rand2(2500, 5000);
+ getexp rand2(21000, 35000), rand2(500, 800);
+ setq General_MerchantRequest, MERCQ_NONE, 0, gettimetick(2)+43200;
+ return;
+ }
+ else
+ {
+ mesn $@BANK_NAME$[.@id];
+ mesq l("Current task: Scout guild member to %s", $@BANK_TOWN$[.@q2]);
+ next;
+ select
+ l("Continue"),
+ l("Abort");
+ mes "";
+ if (@menu == 1)
+ return;
+ setq General_MerchantRequest, MERCQ_NONE, 0, gettimetick(2);
+ }
+ break;
+ }
+
+ do
+ {
+ mesc l("The %s Merchant Guild has a few requests for you:", $@BANK_TOWN$[.@id]);
+ .@town = .@id;
+ while (.@town == .@id) {
+ .@town=rand2(getarraysize($@BANK_TOWN$));
+ }
+ select
+ l("How does this works?"),
+ rif(.@town != .@id, l("★ Deliver a letter")),
+ l("★★ Purchase goods"),
+ //rif(.@town != .@id, l("★★★ Scout a caravan")),
+ l("Sorry, I won't accept any.");
+ mes "";
+ switch (@menu) {
+ case 1:
+ mesc l("The Merchant Guild spawns multiple continents, and we can offer you a few tasks for them. Be careful as you might not be able to finish them and you'll have to abort!");
+ mesc l("The more stars, the harder it is.");
+ next;
+ mesc l("After completing a request, there'll be a cooldown, proportional to the difficulty.");
+ mesc l("You can only have one Merchant Guild request active at same time.");
+ next;
+ break;
+ // Deliver a letter
+ case 2:
+ mesc l("We need you to deliver this important letter to %s! Avoid the roads and bandits!", $@BANK_NAME$[.@town]);
+ next;
+ mesc l("Accept request?");
+ if (askyesno() == ASK_YES) {
+ mesc l("I'm counting on you!");
+ setq General_MerchantRequest, MERCQ_LETTER, .@town, gettimetick(2);
+ return;
+ }
+ break;
+ // Purchase goods
+ case 3:
+ .@item=any(ElixirOfLife,
+ CarpSandwich, PioulegSandwich, MananaSandwich,
+ MaggotSlimePotion, BlueberryCake, CarrotCake, Donut,
+ DeathPotion, TreasureMap, IronIngot, SilverIngot, GoldIngot,
+ Diamond, Ruby, Emerald, Sapphire, Topaz, Amethyst,
+ CrudeDiamond, CrudeRuby, CrudeEmerald,
+ CrudeSapphire, CrudeTopaz, CrudeAmethyst,
+ RunestoneUruz, RunestoneRaido, RunestoneThurisaz,
+ RunestoneKaunaz, RunestoneDagaz, RunestonePeorth);
+ // TODO: equips, as crafting/tailoring is added
+ mesc l("The merchant guild needs %s! Purchase it and deliver at the nearest merchant guild member!", getitemlink(.@item));
+ next;
+ mesc l("Accept request?");
+ if (askyesno() == ASK_YES) {
+ mesc l("I'm counting on you!");
+ setq General_MerchantRequest, MERCQ_GOODS, .@item, gettimetick(2);
+ return;
+ }
+ break;
+ default:
+ return;
+ }
+ } while (true);
+ return;
+}
+
diff --git a/npc/functions/barber.txt b/npc/functions/barber.txt
index e9477387..3d2e3014 100644
--- a/npc/functions/barber.txt
+++ b/npc/functions/barber.txt
@@ -159,6 +159,7 @@ function script BarberChangeRace {
}
// Change race and we're done
- Class = @menuret;
+ //Class = @menuret;
+ jobchange(@menuret); // STUPID idea, but imposed by Hercules
return;
}
diff --git a/npc/functions/bitwise.txt b/npc/functions/bitwise.txt
index 8cb6a426..a2e57587 100644
--- a/npc/functions/bitwise.txt
+++ b/npc/functions/bitwise.txt
@@ -44,3 +44,23 @@ function script bitwise_set {
return set(getarg(0), (getarg(0) & ~(getarg(1))) | (getarg(3, 0) << getarg(2, 0)));
}
+
+
+// bitmask_count(<int>)
+// returns the number of bits set in <int> (up to 4096?)
+function script bitmask_count {
+ .@n = getarg(0); // Number evaluated
+ .@p=0; // Bits set/unset
+ .@s=0; // Stack and Check
+ .@m=0; // Memory
+
+ // Loop only as needed
+ while (.@s < .@n) {
+ .@s=2**.@m;
+ if (.@n & .@s)
+ .@p++;
+ .@m++;
+ }
+ return .@p;
+}
+
diff --git a/npc/functions/casino.txt b/npc/functions/casino.txt
new file mode 100644
index 00000000..87b71a4d
--- /dev/null
+++ b/npc/functions/casino.txt
@@ -0,0 +1,254 @@
+// TMW2 Scripts
+// Author:
+// Jesusalva
+// Description:
+// Slot Machines, Blackjack, other crap for npc duplication
+// Contents:
+// "Slot Machine"
+// "High Lower"
+
+// SLOT MACHINE - You'll get PRIZE if you roll a 777!
+// PRIZE must be numeric INT, AegisName won't get parsed.
+// Slot Machine#map_prize
+// Slot Machine#map
+// Slot Machine#_prize
+- script Slot Machine NPC_HIDDEN,{
+ function symbol {
+ switch (getarg(0)) {
+ case 1:
+ mesn "%%A";
+ break;
+ case 2:
+ mesn "%%B";
+ break;
+ case 3:
+ mesn "%%C";
+ break;
+ case 4:
+ mesn "%%D";
+ break;
+ case 5:
+ mesn "%%E";
+ break;
+ case 6:
+ mesn "%%F";
+ break;
+ case 7:
+ mesn "7";
+ break;
+ default:
+ mesn "%%@";
+ break;
+ }
+ }
+
+L_Menu:
+ mesn;
+ mesc l("Spin three symbols, and jackpot great rewards!");
+ mesc l("Just one coin for spin.");
+ next;
+ menu
+ rif(countitem(.coinid) >= 1, l("Spin!")), L_Spin,
+ l("Prizes"), L_Info,
+ l("Leave"), -;
+ close;
+
+L_Info:
+ mes "";
+ mesc l("Prizes:");
+ mes l("##9 777: @@.", getitemlink(.itemid));
+ mesc l("Three equal: @@.", "18 casino coins");
+ mesc l("Two equal: 1 casino coin.");
+ next;
+ goto L_Menu;
+
+
+L_Spin:
+ mesc l("Spinning...");
+ next;
+ delitem .coinid, 1;
+ .@a=rand2(1,7);
+ .@b=rand2(1,7);
+ .@c=rand2(1,7);
+ symbol(.@a);
+ symbol(.@b);
+ symbol(.@c);
+ next;
+ mesn;
+ if (.@a == .@b && .@a == .@c && .@a == 7) {
+ getitem .itemid, 1;
+ mesc l("Jackpot! You got a(n) %s!", getitemlink(.itemid)), 3;
+ } else if (.@a == .@b && .@a == .@c) {
+ getitem .coinid, 18;
+ mesc l("Congrats! A pity it was not 777..."), 3;
+ } else if (.@a == .@b || .@a == .@c || .@b == .@c) {
+ getitem .coinid, 1;
+ mesc l("Lucky! You got the coin back!"), 3;
+ } else {
+ mesc l("It wasn't this time..."), 3;
+ }
+ next;
+ goto L_Menu;
+
+OnInit:
+ // "Next-Generation" parsing system
+ // To replace default item, name NPC like this:
+ // Slot Machine#_1212
+ // Where "1212" is the item ID
+ .@n$=strnpcinfo(0, "_0");
+ explode(.@ni$, .@n$, "_");
+ if (getarraysize(.@n$) > 0)
+ .itemid=atoi(.@ni$[1]);
+ else
+ .itemid=0;
+
+ // If item ID was not provided
+ if (.itemid < 1) {
+ //.itemid=Monocle;
+ .itemid=BrownBowlerHat;
+ }
+
+ // Coin ID
+ //.coinid=CasinoCoins;
+ .coinid=CoinBag;
+
+ .sex = G_OTHER;
+ .distance = 4;
+ end;
+}
+
+
+// HIGH LOWER - Guess if the next card will be HIGHER or LOWER!
+// (No arguments)
+- script High Lower NPC_HIDDEN,{
+ function cardname {
+ switch (getarg(0)) {
+ case 0:
+ return "A"; break;
+ case 10:
+ return "J"; break;
+ case 11:
+ return "Q"; break;
+ case 12:
+ return "K"; break;
+ case 13:
+ return l("Joker"); break;
+ default:
+ return getarg(0)+1;
+ }
+ }
+
+ goto L_Menu;
+
+L_Menu:
+ showavatar;
+ mesn;
+ mesc l("Hey, I am flopped. Do you want to gamble?");
+ mesc l("You need a %s. I'll flip one card, and you'll need to decide if next draw will be HIGHER or LOWER.", getitemlink(.coinid));
+ mesc l("If a tie happens, I'll give your coin back.");
+ next;
+ menu
+ rif(countitem(.coinid) >= 1, l("Let's play!")), L_Spin,
+ l("Information"), L_Info,
+ l("Leave"), L_Quit;
+
+L_Info:
+ mes "";
+ mesc l("Rules:");
+ mesc l("A card will be flipped, you'll need to decide if next flip will be HIGHER or LOWER.");
+ mesc l("Cards are ranked on this priority: A - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - J - Q - K - Joker");
+ next;
+ mesc l("Prizes:");
+ mesc l("If you're right, you'll get at least %d GP!", .minprize);
+ mesc l("If a tie happens, you'll get your coin back.");
+ mesc l("If you're wrong, your winning streak is reset.");
+ mesc l("Winning Streak is also reset on logout or when you leave the room.");
+ next;
+ mesc l("Winning Strike Prizes:");
+ mesc l("Every seven successive right guesses, you'll get a %s!", getitemlink(Acorn)); // 7.14%
+ //mesc l("Every fifteen successive right guesses, you'll get a %s!", getitemlink(SilverGift)); // 3.33%
+ //mesc l("Every fifty successive right guesses, you'll get a %s!", getitemlink(GoldenGift)); // 1.00%
+ //mesc l("Every 101 successive right guesses, you'll get a %s!", getitemlink(PrismGift)); // 0.50%
+ next;
+ goto L_Menu;
+
+
+L_Spin:
+ showavatar AVATAR_CARD_COVER;
+ mesc l("I'll draw a card now!");
+ next;
+ delitem .coinid, 1;
+ // First card will never be an edge card (Ace or Joker), so you can ALWAYS guess wrong.
+ .@card1=rand2(1, 12);
+ showavatar 1000+.@card1;
+ mesn;
+ mesc l("It's a @@!", cardname(.@card1));
+ mesc l("Will next draw be HIGHER or LOWER?!");
+ next;
+ mesc l("Cards are ranked on this priority: A - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - J - Q - K - Joker");
+ select
+ l("HIGHER!"),
+ l("LOWER!");
+ mes "";
+
+ // Flip Flop!
+ .@card2=rand2(0, 13);
+ showavatar 1000+.@card2;
+ mesn;
+ mesc l("It's a @@!", cardname(.@card2));
+
+ if (.@card1 == .@card2) {
+ mesc l("It's a tie!");
+ getitem .coinid, 1;
+ .@bypass=1;
+ } else if (.@card2 < .@card1 && @menu == 2) {
+ mesc l("It's lower! That's right!");
+ Zeny=Zeny+.minprize;
+ @gambler_winstreak+=1;
+ } else if (.@card2 > .@card1 && @menu == 1) {
+ mesc l("It's higher! That's right!");
+ Zeny=Zeny+.minprize;
+ @gambler_winstreak+=1;
+ } else {
+ mesc l("You were wrong!");
+ @gambler_winstreak=0;
+ }
+
+ // Winning Streak
+ if (!.@bypass && @gambler_winstreak) {
+ if (@gambler_winstreak % 7 == 0)
+ getitem Acorn, 1;
+ /*
+ if (@gambler_winstreak % 15 == 0)
+ getitem SilverGift, 1;
+ if (@gambler_winstreak % 50 == 0)
+ getitem GoldenGift, 1;
+ if (@gambler_winstreak % 101 == 0)
+ getitem PrismGift, 1;
+ */
+ mesc l("Your current win streak is @@!", @gambler_winstreak);
+ Zeny+=min(((@gambler_winstreak-1)*.gpbonus), .minprize); // Never 2x
+ } else {
+ .@bypass=0;
+ }
+ next;
+ goto L_Menu;
+
+L_Quit:
+ close;
+
+OnInit:
+ // Gambling configuration
+ .minprize=180;
+ .gpbonus=10;
+
+ // Coin ID
+ //.coinid=CasinoCoins;
+ .coinid=CoinBag;
+
+ .sex = G_OTHER;
+ .distance = 4;
+ end;
+
+}
+
diff --git a/npc/functions/daily.txt b/npc/functions/daily.txt
new file mode 100644
index 00000000..6de9ef27
--- /dev/null
+++ b/npc/functions/daily.txt
@@ -0,0 +1,154 @@
+// The Mana World scripts.
+// Author:
+// TMW Team
+// Jesusalva
+// Description:
+// Daily Quest framework
+// Variables returned:
+// .@dq_return - Code of what happend
+// DAILY_LOWLEVEL = Low level
+// DAILY_IGNORED = Ignored NPC
+// DAILY_NOPTS = Not enough points
+// DAILY_NOITEMS = Not enough items
+// DAILY_OK = Success
+
+// Variables to set:
+// .@dq_level - Minimal level needed to use the quest
+// .@dq_cost - The number of points this quest uses
+// .@dq_count - The number of given item needed
+// .@dq_name - Item Aegis
+// .@dq_money - The money reward for doing the quest
+// .@dq_exp - Experince gained by doing the quest
+
+// Optional:
+// .@dq_handle_return - When set to anything other then 0 the function will not print exiting text
+
+// Variables used inside:
+// DailyQuestPoints - The number of points the player currently has
+// DailyQuestTime - Time since DailyQuestPoints was lasted renewed
+// DailyQuestBonus - Additional points added in addition to player BaseLevel
+
+// (DailyQuestBonus makes a good reward from non-daily quests)
+
+function script DailyQuestPointsFunc {
+ .@dq_earliest = gettimetick(2) - 86400;
+ if (DailyQuestTime < .@dq_earliest)
+ DailyQuestTime = .@dq_earliest;
+
+ // how many whole daily quest points the player has earned
+ // we increment DailyQuestTime by the number of seconds in that many increments
+ .@dq_increments = (gettimetick(2) - DailyQuestTime)*BaseLevel / 86400;
+ DailyQuestTime = DailyQuestTime + .@dq_increments*86400/BaseLevel;
+
+ // player can't regenerate any quest points, but might have a bonus
+ if (DailyQuestPoints < BaseLevel) {
+ // normal recharging case - increment, but don't let it recharge more than a day's worth
+ DailyQuestPoints = DailyQuestPoints + .@dq_increments;
+ if (DailyQuestPoints > BaseLevel)
+ DailyQuestPoints = BaseLevel;
+ }
+
+ // fallthrough to bonus, which *is* allowed to push DailyQuestPoints above BaseLevel
+ DailyQuestPoints = DailyQuestPoints + DailyQuestBonus;
+ DailyQuestBonus = 0;
+ return;
+
+}
+
+// DailyQuest(lvl, cost, count, item, {exp, money})
+function script DailyQuest {
+ // Sanitize
+ DailyQuestPointsFunc();
+
+ // Load variables
+ .@dq_level=getarg(0);
+ .@dq_cost=getarg(1);
+ .@dq_count=getarg(2);
+ .@dq_name=getarg(3);
+ // Money defaults to 200% sell value, experience to 300% sell value
+ .@dq_exp=getarg(4, getiteminfo(.@dq_name, ITEMINFO_SELLPRICE)*.@dq_count*3);
+ .@dq_money=getarg(5, getiteminfo(.@dq_name, ITEMINFO_SELLPRICE)*.@dq_count*2);
+
+ // Insufficient level
+ if (BaseLevel < .@dq_level) {
+ mesq l("Hey, you should go kill some things to get stronger first.");
+ return DAILY_LOWLEVEL;
+ }
+
+ // Insufficient points
+ if (DailyQuestPoints < .@dq_cost) {
+ mesq l("You look exhausted, maybe you should rest a bit.");
+ return DAILY_NOPTS;
+ }
+
+ mesq l("If you bring me %d %s, I will give you a reward.", .@dq_count, getitemlink(.@dq_name));
+ select
+ l("I have what you want."),
+ l("Take all you need."),
+ l("Ok, I'll get to work."),
+ l("Nah, I'm not going to help you.");
+ mes "";
+
+ if (@menu >= 3)
+ return DAILY_IGNORED;
+
+ if (countitem(.@dq_name) < .@dq_count) {
+ mesq l("I said %d %s; you should learn to count.", .@dq_count, getitemlink(.@dq_name));
+ return DAILY_NOITEMS;
+ }
+
+ // Default multiplier
+ .@multiplier = 1;
+
+ if (@menu == 1) {
+ delitem .@dq_name, .@dq_count;
+
+ Zeny = Zeny + .@dq_money;
+ getexp .@dq_exp, 0;
+
+ DailyQuestPoints = DailyQuestPoints - .@dq_cost;
+
+ }
+ else
+ {
+
+ .@item_multiple = (countitem(.@dq_name) / .@dq_count);
+ .@dp_multiple = (DailyQuestPoints / .@dq_cost);
+
+ if (.@dp_multiple > .@item_multiple)
+ .@multiplier = .@item_multiple;
+ if (.@item_multiple >= .@dp_multiple)
+ .@multiplier = .@dp_multiple;
+
+ DailyQuestPoints = DailyQuestPoints - (.@dq_cost * .@multiplier);
+
+ delitem .@dq_name, (.@dq_count * .@multiplier);
+
+ Zeny = Zeny + (.@dq_money * .@multiplier);
+ getexp (.@dq_exp * .@multiplier), 0;
+
+ if (.@dq_handle_return)
+ goto L_Exit_Good;
+ }
+
+ mesq l("Thank you!");
+
+ if (DailyQuestPoints < .@dq_cost)
+ mesq l("You look exhausted, maybe you should rest a bit.");
+ else if (DailyQuestPoints > BaseLevel)
+ mesq l("Woah, you're bursting with power.");
+ else if (DailyQuestPoints > (BaseLevel*9)/10)
+ mesq l("You're in a very good shape.");
+ else if (DailyQuestPoints > (BaseLevel*7)/10)
+ mesq l("You don't seem very exhausted by my tasks.");
+ else if (DailyQuestPoints > (BaseLevel*5)/10)
+ mesq l("Aren't you getting weary yet?");
+ else
+ mesq l("You look a little tired.");
+
+ mes "";
+ mesc l("+%d money", (.@dq_money * .@multiplier));
+ mesc l("+%d experience points", (.@dq_exp * .@multiplier));
+ return DAILY_OK;
+}
+
diff --git a/npc/functions/faction.txt b/npc/functions/faction.txt
index 19450df9..497c469a 100644
--- a/npc/functions/faction.txt
+++ b/npc/functions/faction.txt
@@ -18,11 +18,11 @@
// legionrank() / brotherrank() / thiefrank() / magerank()
function script legionrank {
switch (LEGION_RANK) {
- case 5: return l("Constable");
- case 4: return l("Tengu");
- case 3: return l("Terranite");
- case 2: return l("Fluffy");
- case 1: return l("Maggot");
+ case 5: return l("Admiral");
+ case 4: return l("Constable");
+ case 3: return l("Lieutenant");
+ case 2: return l("Sergeant");
+ case 1: return l("Private");
case 0: return l("Citizen");
default: return l("Error");
}
diff --git a/npc/functions/global_event_handler.txt b/npc/functions/global_event_handler.txt
index 08bbc7ab..3f10ae73 100644
--- a/npc/functions/global_event_handler.txt
+++ b/npc/functions/global_event_handler.txt
@@ -25,6 +25,7 @@ OnPCLoginEvent:
callfunc("FixBankVault");
callfunc("GrantSuperSkill");
callfunc("AFKLogin");
+ callfunc("TravelFix");
end;
OnPCLogoutEvent:
@@ -32,6 +33,7 @@ OnPCLogoutEvent:
callfunc("MundaneLogout");
callfunc("fishing_cleanup", @fishing_spot$);
callfunc("ATLFightEnd");
+ callfunc("RossyLogout");
// Variable cleanup
@fishing_spot$ = "";
@@ -41,6 +43,7 @@ OnPCDieEvent:
callfunc("ForcedUnmount");
callfunc("MundaneDeath");
callfunc("ATLFightEnd");
+ callfunc("RossyDeath");
end;
OnPCBaseLvUpEvent:
diff --git a/npc/functions/main.txt b/npc/functions/main.txt
index eef24ed4..3be6b6fb 100644
--- a/npc/functions/main.txt
+++ b/npc/functions/main.txt
@@ -202,8 +202,10 @@ function script npcdebug {
}
function script askyesno {
- return select(menuaction(l("Yes")),
+ .@sel = select(menuaction(l("Yes")),
menuaction(l("No")));
+ mes "";
+ return .@sel;
}
// Argument:
diff --git a/npc/functions/quest-debug/055-General_Cooking.txt b/npc/functions/quest-debug/055-General_Cooking.txt
index 76e23b17..ec725364 100644
--- a/npc/functions/quest-debug/055-General_Cooking.txt
+++ b/npc/functions/quest-debug/055-General_Cooking.txt
@@ -10,37 +10,78 @@ function script QuestDebug55 {
mes "General_Cooking";
mes "---";
mes l("Quest state: @@", getq(General_Cooking));
+ mes l("Route choosen: %s", (getq2(General_Cooking) == VEGAN ? l("Vegan") : l("Carnivorous")));
mes l("Known Recipes: @@", array_entries(RECIPES));
next;
- select
- l("Return"),
- l("Reset Quest"),
- l("Complete Quest"),
- l("Get a Recipe Book"),
- l("Learn all recipes"),
- l("Reset all recipes");
+ menuint
+ l("Return"), -1,
+ l("Reset Quest"), 0,
+ "[2] Completed Yannika's Quest", 2,
+ "[3] Accepted Yannika's Request for Seafood Plate", 3,
+ "[4] Delivered fish to Dimond's Inn", 4,
+ "[5] Accepted task to talk to Reid's Inn", 5,
+ "[6] Got request for Piou/Manana Sandwhich", 6,
+ "[7] Got sent to Candor Inn", 7,
+ "[8] Tiki asked for new idea", 8,
+ "[9] Tiki approved new idea", 9,
+ "[10] Reid's Chef gave you epic recipe", 10,
+ "[11] Sent to tulimshar bakery", 11,
+ "[12] Sent to bakery apprentice", 12,
+ "[13] Killed all rattos", 13,
+ "[14] Learned Donut recipe", 14,
+ "[15] Sent to search for Salad", 15,
+ "[16] Offered to bring stuff to Hocus", 16,
+ "[17] Received Hocus' Salad", 17,
+ "[18] Salad Delivered", 18,
+ "[19] Quest Completed", 19,
+ l("Get a Recipe Book"), -2,
+ l("Learn all recipes"), -3,
+ l("Reset all recipes"), -4;
- switch (@menu)
+ switch (@menuret)
{
- case 2:
- setq General_Cooking, 0;
+ case -1:
break;
- case 3:
- setq General_Cooking, 2;
- break;
- case 4:
+ case -2:
getitem RecipeBook, 1;
break;
- case 5:
+ case -3:
RECIPES[CraftCarpSandwich]=true;
RECIPES[CraftMananaSandwich]=true;
RECIPES[CraftPioulegSandwich]=true;
+
+ RECIPES[CraftSailorStew]=true;
+ RECIPES[CraftSquirrelStew]=true;
+ RECIPES[CraftMoubooStew]=true;
+
+ RECIPES[CraftSeafoodPlate]=true;
+ RECIPES[CraftBarbecuePlate]=true;
+ RECIPES[CraftVeggiePlate]=true;
+
+ RECIPES[CraftDonut]=true;
+ RECIPES[CraftBlueberryCake]=true;
+ RECIPES[CraftCarrotCake]=true;
break;
- case 6:
+ case -4:
RECIPES[CraftCarpSandwich]=false;
RECIPES[CraftMananaSandwich]=false;
RECIPES[CraftPioulegSandwich]=false;
+
+ RECIPES[CraftSailorStew]=false;
+ RECIPES[CraftSquirrelStew]=false;
+ RECIPES[CraftMoubooStew]=false;
+
+ RECIPES[CraftSeafoodPlate]=false;
+ RECIPES[CraftBarbecuePlate]=false;
+ RECIPES[CraftVeggiePlate]=false;
+
+ RECIPES[CraftDonut]=false;
+ RECIPES[CraftBlueberryCake]=false;
+ RECIPES[CraftCarrotCake]=false;
+ break;
+ default:
+ setq1 General_Cooking, @menuret;
break;
}
diff --git a/npc/functions/quest-debug/059-HurnscaldQuests_Rossy.txt b/npc/functions/quest-debug/059-HurnscaldQuests_Rossy.txt
new file mode 100644
index 00000000..85c2006b
--- /dev/null
+++ b/npc/functions/quest-debug/059-HurnscaldQuests_Rossy.txt
@@ -0,0 +1,43 @@
+// Rossy quest debug
+// Authors:
+// jesusalva
+
+function script QuestDebug59 {
+ do
+ {
+ clear;
+ setnpcdialogtitle l("Quest debug");
+ mes "HurnscaldQuests_Rossy";
+ mes "---";
+ mes l("Quest state: @@", getq(HurnscaldQuests_Rossy));
+ if (getq(HurnscaldQuests_Rossy) == 16)
+ mes l("Clauquer's Cave Mask: %d", getq2(HurnscaldQuests_Rossy));
+ next;
+
+ GenericQuestDebug HurnscaldQuests_Rossy,
+ l("Does not have the quest"), 0,
+ l("Requested to find Rossy"), 1,
+ l("Found Rossy"), 2,
+ l("Informed Olana about Rossy"), 3,
+ l("Requested to deliver the berries"), 4,
+ l("Berries delivered"), 5,
+ l("Requested to tell Rossy about exam"), 6,
+ l("Accepted to help Rossy"), 7,
+ l("Requested to deliver potion to David"), 8,
+ l("Delivered potion to David"), 9,
+ l("Inform Olana about success"), 10,
+ l("Bring roses to Rossy"), 11,
+ l("Talk to Olana about allergy"), 12,
+ l("Bring tulips to Rossy"), 13,
+ l("Say Olana is a good mother"), 14,
+ l("Get status on Juliet with Rossy"), 15,
+ l("Dispatched to Clauquer Cave"), 16,
+ l("Juliet has been rescued"), 17;
+
+ if (@menuret < 0)
+ {
+ return;
+ }
+
+ } while (1);
+}
diff --git a/npc/functions/scoreboards.txt b/npc/functions/scoreboards.txt
index d3ceb9a7..616ea54a 100644
--- a/npc/functions/scoreboards.txt
+++ b/npc/functions/scoreboards.txt
@@ -101,6 +101,28 @@ function script HallOfAcorns {
return;
}
+function script HallOfLethality {
+ mes "";
+ mes l("##BHall Of Lethality: TOP15##b");
+ mesc l("Special monsters are not counted.");
+ mesf("1. %s (%d)", $@hol_name$[0], $@hol_value[0]);
+ mesf("2. %s (%d)", $@hol_name$[1], $@hol_value[1]);
+ mesf("3. %s (%d)", $@hol_name$[2], $@hol_value[2]);
+ mesf("4. %s (%d)", $@hol_name$[3], $@hol_value[3]);
+ mesf("5. %s (%d)", $@hol_name$[4], $@hol_value[4]);
+ mesf("6. %s (%d)", $@hol_name$[5], $@hol_value[5]);
+ mesf("7. %s (%d)", $@hol_name$[6], $@hol_value[6]);
+ mesf("8. %s (%d)", $@hol_name$[7], $@hol_value[7]);
+ mesf("9. %s (%d)", $@hol_name$[8], $@hol_value[8]);
+ mesf("10. %s (%d)", $@hol_name$[9], $@hol_value[9]);
+ mesf("11. %s (%d)", $@hol_name$[10], $@hol_value[10]);
+ mesf("12. %s (%d)", $@hol_name$[11], $@hol_value[11]);
+ mesf("13. %s (%d)", $@hol_name$[12], $@hol_value[12]);
+ mesf("14. %s (%d)", $@hol_name$[13], $@hol_value[13]);
+ mesf("15. %s (%d)", $@hol_name$[14], $@hol_value[14]);
+ return;
+}
+
function script HallOfATL {
mes "";
mes l("##BHall Of Artis Legion Training Arena: TOP10##b");
@@ -194,6 +216,7 @@ OnInit:
.@nb = query_sql("SELECT c.name, i.amount FROM `storage` AS i, `char` AS c WHERE i.nameid="+Acorn+" AND i.account_id=c.account_id ORDER BY i.amount DESC LIMIT 15", $@hoa_name$, $@hoa_value);
.@nb = query_sql("SELECT c.name, i.value FROM `char_reg_num_db` AS i, `char` AS c WHERE i.key='ATLRANK' AND i.char_id=c.char_id ORDER BY i.value DESC LIMIT 10", $@atl_name$, $@atl_value);
.@nb = query_sql("SELECT c.name, i.value FROM `char_reg_num_db` AS i, `char` AS c WHERE i.key='AFKING' AND i.char_id=c.char_id ORDER BY i.value DESC LIMIT 10", $@afk_name$, $@afk_value);
+ .@nb = query_sql("SELECT c.name, i.value FROM `char_reg_num_db` AS i, `char` AS c WHERE i.key='MONSTERS_KILLED' AND i.char_id=c.char_id ORDER BY i.value DESC LIMIT 15", $@hol_name$, $@hol_value);
consolemes(CONSOLEMES_DEBUG, "Scoreboards reloaded");
if (!$@SCOREBOARD_BIND) {
bindatcmd "scoreboard", "@scoreboard::OnCall", 0, 100, 0;
@@ -214,6 +237,7 @@ OnCall:
l("Hall Of Base Level"),
l("Hall Of Job Level"),
l("Hall Of Guilds"),
+ l("Hall Of Lethality"),
l("Hall Of Acorns"),
l("Hall Of Artis Legion Training Arena"),
l("Hall Of AFK King"),
@@ -238,18 +262,22 @@ OnCall:
next;
break;
case 5:
- HallOfAcorns();
+ HallOfLethality();
next;
break;
case 6:
- HallOfATL();
+ HallOfAcorns();
next;
break;
case 7:
- HallOfAFK();
+ HallOfATL();
next;
break;
case 8:
+ HallOfAFK();
+ next;
+ break;
+ case 9:
HallOfGame();
next;
break;
diff --git a/npc/functions/time.txt b/npc/functions/time.txt
index 30ab9f46..8376d6a0 100644
--- a/npc/functions/time.txt
+++ b/npc/functions/time.txt
@@ -29,16 +29,16 @@ function script time_from_days {
//
// <options> is bitmasked:
// 1 do not show "ago" when in past
-// 2 do not show "in" when in the future
+// 2 do not show "in" when in the future (default)
// 4 show "from now" instead of "in" when in the future
//
// <precision> is the number of units to show,
-// by default uses max precision
+// do not exceed 99 (default is 2)
function script FuzzyTime {
.@future = getarg(0, now());
- .@options = getarg(1, 0);
- .@precision = getarg(2, 99);
+ .@options = getarg(1, 2);
+ .@precision = getarg(2, 2);
.@diff = (.@future - now());
// check if in the past, or in the future
diff --git a/npc/items/shovel.txt b/npc/items/shovel.txt
index 13aba25d..27c9352c 100644
--- a/npc/items/shovel.txt
+++ b/npc/items/shovel.txt
@@ -291,6 +291,8 @@ function script shovel_getcity {
function script shovel_randomtreasure {
.@id=any(TreasureKey,CoinBag,CoinBag,CoinBag,Coal,
Diamond,Ruby,Emerald,Sapphire,Topaz,Amethyst,
+ CrudeDiamond,CrudeRuby,CrudeEmerald,
+ CrudeSapphire,CrudeTopaz,CrudeAmethyst,
MaggotSlimePotion, LargeMana, LargeHealing);
delitem TreasureMap, 1;
.@amount=any(1,1,2);
diff --git a/npc/marine-2/_import.txt b/npc/marine-2/_import.txt
new file mode 100644
index 00000000..006ce407
--- /dev/null
+++ b/npc/marine-2/_import.txt
@@ -0,0 +1,4 @@
+// Map marine-2: Ocean
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/marine-2/_mobs.txt",
+"npc/marine-2/main.txt",
diff --git a/npc/marine-2/_mobs.txt b/npc/marine-2/_mobs.txt
new file mode 100644
index 00000000..a41d1a2c
--- /dev/null
+++ b/npc/marine-2/_mobs.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map marine-2: Ocean mobs
+marine-2,32,32,9,3 monster Croc 1006,2,13000,12000
+marine-2,31,33,9,3 monster Tipiou 1016,1,14000,14000
diff --git a/npc/marine-2/main.txt b/npc/marine-2/main.txt
new file mode 100644
index 00000000..9ab0dfc0
--- /dev/null
+++ b/npc/marine-2/main.txt
@@ -0,0 +1,60 @@
+// Moubootaur Legends script
+// Originals from TMW-BR
+// Imported by Jesusalva
+
+marine-2,0,0,0 script #MarineShip NPC_HIDDEN,{
+ end;
+
+OnEvent:
+ // Handle travel
+ if (@timer_navio_running == 0) end;
+ if (PC_DEST$ == "Tulim") goto L_Tulim;
+ else if (PC_DEST$ == "Hurns") goto L_Hurns;
+ else if (PC_DEST$ == "Candor") goto L_Candor;
+ else if (PC_DEST$ == "Artis") goto L_Artis;
+ else if (PC_DEST$ == "Argaes") goto L_Argaes;
+ else goto L_Error;
+ end;
+
+L_Tulim:
+ EnterTown("Tulim", true);
+ dispbottom l("%s disembarks at Tulimshar.", strcharinfo(0));
+ end;
+
+L_Hurns:
+ EnterTown("Hurns", true);
+ dispbottom l("%s disembarks at Hurnscald.", strcharinfo(0));
+ end;
+
+L_Candor:
+ EnterTown("Candor", true);
+ dispbottom l("%s disembarks at Candor.", strcharinfo(0));
+ end;
+
+L_Artis:
+ EnterTown("Artis", true);
+ dispbottom l("%s disembarks at Artis.", strcharinfo(0));
+ end;
+
+L_Argaes:
+ if (getq(General_Narrator) == 1) {
+ warp "000-0-1", 26, 28;
+ } else {
+ EnterTown("Argaes", true);
+ dispbottom l("%s disembarks at Argaes.", strcharinfo(0));
+ }
+ end;
+
+L_Error:
+ consolemes(CONSOLEMES_ERROR, "PLAYER INVALID PC_DEST ON #MarineShip: " + PC_DEST$);
+ ReturnLastTown();
+ dispbottom l("An error on your travel happened. Please report.");
+ end;
+}
+
+function script TravelFix {
+ if (getmap() == "marine-2")
+ ReturnLastTown();
+ return;
+}
+
diff --git a/npc/marine/_import.txt b/npc/marine/_import.txt
new file mode 100644
index 00000000..6ab1ff31
--- /dev/null
+++ b/npc/marine/_import.txt
@@ -0,0 +1,4 @@
+// Map marine: La Marine
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/marine/_mobs.txt",
+"npc/marine/saluc.txt",
diff --git a/npc/marine/_mobs.txt b/npc/marine/_mobs.txt
new file mode 100644
index 00000000..57623607
--- /dev/null
+++ b/npc/marine/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map marine: La Marine mobs
+marine,31,26,9,4 monster Piou 1002,2,30000,20000
diff --git a/npc/marine/saluc.txt b/npc/marine/saluc.txt
new file mode 100644
index 00000000..56bc493f
--- /dev/null
+++ b/npc/marine/saluc.txt
@@ -0,0 +1,138 @@
+// The Mana World scripts.
+// Author:
+// Jesusalva
+// Description:
+// Saluc Golden Beard, one of the greediest ship captains in Argaes.
+// THIS IS A PLACEHOLDER!
+
+// If you logout on instance, ensure TravelFix() can fix your position
+marine mapflag nosave marine-2,40,32
+
+// Ship captain
+marine,25,24,0 script Saluc Golden Beard NPC_HAL,{
+ function confirmTravel;
+ function artisTravel;
+ if (.artis)
+ artisTravel();
+ mesn;
+ mesq l("Hello, adventurer! I am Saluc the Golden Beard!");
+ next;
+ mesn;
+ mesq l("No, I'm not a scammer! You'll get a ship travel with me, I just... charge a bit more for profit.");
+ next;
+ mesn;
+ mesq l("So, to where you want to go?");
+ mesc l("You are currently at %s.", LOCATION$);
+ menuint
+ rif(LOCATION$ != "Tulim", l("To Tulimshar")), TP_TULIM,
+ rif(LOCATION$ != "Hurns", l("To Hurnscald")), TP_HURNS,
+ rif(LOCATION$ != "Candor", l("To Candor")), TP_CANDOR,
+ l("No, I'll save my money."), TP_NONE;
+ mes "";
+ if (@menuret == TP_NONE)
+ close;
+ mesn;
+ mesq l("Excellent! Hehehe... That'll be %d E!", .price);
+ if (.artis)
+ mesc l("This travel option is NOT advised for new players."), 1;
+ if (Zeny < .price)
+ close;
+ next;
+ mesc l("Travel?");
+ if (askyesno() == ASK_NO || Zeny < .price)
+ close;
+
+ mesn;
+ mesq l("Hehehe... All aboard!");
+ next;
+ confirmTravel(.price);
+ close;
+
+/* Special Artis dialog */
+function artisTravel {
+ mesn;
+ mesq l("Hello, adventurer! I am William D. and I am the captain of this frigate!");
+ next;
+ mesn;
+ mesq l("Gema IV is a good trading ship, but the Legion has requisitioned it...");
+ next;
+ .@price=.price;
+ // NOT a typo; You can self-smuggle yourself w/o the commendation leter.
+ // ...For now.
+ if (getq(Artis_Legion_Progress) >= 6) {
+ mesn;
+ mesq l("Did Q'Anon sent you? Are you enrolled in the Argaes expedition? We're leaving soon so hurry up!");
+ .@price=0;
+ } else {
+ mesn;
+ mesq l("I'm providing transport to the Argaes expedition.");
+ mesc l("William looks around to make sure no one else is listening and continues.");
+ next;
+ mesn;
+ mesq l("Heh, are you curious with the new world? I can make room for an extra \"Crew\" member, if ya catch my drift...");
+ mesc l("NEW PLAYERS: This route is for veterans only."), 1;
+ }
+ next;
+ mesn;
+ mesq l("So, will you board?");
+ next;
+ menuint
+ l("To Argaes!"), TP_ARGAES,
+ l("No, I'll save my money."), TP_NONE;
+ mes "";
+ if (@menuret == TP_NONE)
+ close;
+ if (Zeny < .@price)
+ close;
+ next;
+ mesc l("Travel?");
+ if (.@price)
+ mesc l("This option is not advised."), 1;
+ if (askyesno() == ASK_NO || Zeny < .@price)
+ close;
+
+ mesn;
+ mesq l("Hehehe... All aboard!");
+ next;
+ confirmTravel(.@price);
+ close;
+ return;
+}
+
+/* Warp players to their travel */
+function confirmTravel {
+ closeclientdialog;
+
+ Zeny-=getarg(0);
+ .@i=array_find($@LOCMASTER_TP, @menuret);
+ PC_DEST$=$@LOCMASTER_LOC$[.@i];
+ @timer_navio_running = 1;
+ addtimer (.artis ? 140000 : 50000), "#MarineShip::OnEvent"; // One minute
+ warp "marine-2", 40, 32;
+ return;
+}
+
+OnInit:
+ .bodytype = BODYTYPE_2;
+ .distance = 4;
+ .price = 100; // Current a constant, but maybe... In future...
+ .artis = false;
+ end;
+
+OnInstanceInit:
+ // Smart Replacement for Artis' version
+ if (instance_mapname("marine") == "marine@Arti") {
+ setnpcdisplay(instance_npcname(.name$), "William D.");
+ .price = 10000;
+ .artis = true;
+ }
+ end;
+}
+
+// Exit door
+marine,42,25,0 script Exit#Marine NPC_HIDDEN,0,0,{
+OnTouch:
+ ReturnLastTown();
+ end;
+}
+
diff --git a/npc/scripts.conf b/npc/scripts.conf
index 6f275056..8976c457 100644
--- a/npc/scripts.conf
+++ b/npc/scripts.conf
@@ -66,6 +66,8 @@
"npc/functions/crafting.txt",
"npc/functions/referral.txt",
"npc/functions/music.txt",
+"npc/functions/casino.txt",
+"npc/functions/daily.txt",
// quest debug
"npc/functions/quest-debug/functions.txt",
@@ -119,6 +121,7 @@
"npc/functions/quest-debug/056-General_Brotherhood.txt",
"npc/functions/quest-debug/057-HurnscaldQuests_Kfahr.txt",
"npc/functions/quest-debug/058-ArgaesQuest_Galimatia.txt",
+"npc/functions/quest-debug/059-HurnscaldQuests_Rossy.txt",
// Event and General Quests
"npc/functions/quest-debug/100-General_Narrator.txt",
@@ -158,6 +161,7 @@
// config script
"npc/config/hairstyle_config.txt",
+"npc/config/location.txt",
"npc/config/magic.txt",
// placeholder scripts