summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--world/map/data/001-2.wlkbin17224 -> 17224 bytes
-rw-r--r--world/map/data/080-1.wlkbin0 -> 40004 bytes
-rw-r--r--world/map/data/080-3.wlkbin0 -> 40004 bytes
-rw-r--r--world/map/data/081-1.wlkbin0 -> 16254 bytes
-rw-r--r--world/map/data/081-2.wlkbin0 -> 57924 bytes
-rw-r--r--world/map/data/081-3.wlkbin0 -> 6304 bytes
-rw-r--r--world/map/data/082-2.wlkbin0 -> 5504 bytes
-rw-r--r--world/map/data/082-3.wlkbin0 -> 40004 bytes
-rw-r--r--world/map/data/fermi.wlkbin0 -> 3604 bytes
-rw-r--r--world/map/data/guild.wlkbin0 -> 5629 bytes
-rw-r--r--world/map/data/prison.wlkbin0 -> 4804 bytes
-rw-r--r--world/map/data/resnametable.txt10
-rw-r--r--world/map/db/item_db.conf28
-rw-r--r--world/map/db/item_db_chest.txt6
-rw-r--r--world/map/db/item_db_foot.txt2
-rw-r--r--world/map/db/item_db_head.txt2
-rw-r--r--world/map/db/item_db_offhand.txt2
-rw-r--r--world/map/db/item_db_use.txt4
-rw-r--r--world/map/db/mob_db.conf25
-rw-r--r--world/map/db/mob_db_over_100.txt2
-rw-r--r--world/map/db/mob_db_over_150.txt10
-rw-r--r--world/map/npc/001-1/_warps.txt1
-rw-r--r--world/map/npc/001-2/_warps.txt2
-rw-r--r--world/map/npc/080-1/_import.txt6
-rw-r--r--world/map/npc/080-1/_mobs.txt3
-rw-r--r--world/map/npc/080-1/_nodes.txt4
-rw-r--r--world/map/npc/080-1/_warps.txt3
-rw-r--r--world/map/npc/080-3/_import.txt6
-rw-r--r--world/map/npc/080-3/_mobs.txt3
-rw-r--r--world/map/npc/080-3/_nodes.txt4
-rw-r--r--world/map/npc/080-3/_warps.txt4
-rw-r--r--world/map/npc/081-1/_import.txt6
-rw-r--r--world/map/npc/081-1/_mobs.txt3
-rw-r--r--world/map/npc/081-1/_nodes.txt4
-rw-r--r--world/map/npc/081-1/_warps.txt6
-rw-r--r--world/map/npc/081-2/_import.txt6
-rw-r--r--world/map/npc/081-2/_mobs.txt3
-rw-r--r--world/map/npc/081-2/_nodes.txt4
-rw-r--r--world/map/npc/081-2/_warps.txt5
-rw-r--r--world/map/npc/081-3/_import.txt6
-rw-r--r--world/map/npc/081-3/_mobs.txt3
-rw-r--r--world/map/npc/081-3/_nodes.txt4
-rw-r--r--world/map/npc/081-3/_warps.txt5
-rw-r--r--world/map/npc/082-2/_import.txt6
-rw-r--r--world/map/npc/082-2/_mobs.txt3
-rw-r--r--world/map/npc/082-2/_nodes.txt4
-rw-r--r--world/map/npc/082-2/_warps.txt9
-rw-r--r--world/map/npc/082-3/_import.txt6
-rw-r--r--world/map/npc/082-3/_mobs.txt3
-rw-r--r--world/map/npc/082-3/_nodes.txt4
-rw-r--r--world/map/npc/082-3/_warps.txt4
-rw-r--r--world/map/npc/_import.txt10
-rw-r--r--world/map/npc/fermi/_import.txt6
-rw-r--r--world/map/npc/fermi/_mobs.txt3
-rw-r--r--world/map/npc/fermi/_nodes.txt4
-rw-r--r--world/map/npc/fermi/_warps.txt5
-rw-r--r--world/map/npc/functions/treasure_hunt.txt469
-rw-r--r--world/map/npc/guild/_import.txt6
-rw-r--r--world/map/npc/guild/_mobs.txt3
-rw-r--r--world/map/npc/guild/_nodes.txt4
-rw-r--r--world/map/npc/guild/_warps.txt3
-rw-r--r--world/map/npc/items/maps.txt3
-rw-r--r--world/map/npc/items/shovel.txt4
-rw-r--r--world/map/npc/prison/_import.txt6
-rw-r--r--world/map/npc/prison/_mobs.txt3
-rw-r--r--world/map/npc/prison/_nodes.txt4
-rw-r--r--world/map/npc/prison/_warps.txt4
-rw-r--r--world/map/npc/scripts.conf1
68 files changed, 717 insertions, 42 deletions
diff --git a/world/map/data/001-2.wlk b/world/map/data/001-2.wlk
index 1db402b4..23af0d76 100644
--- a/world/map/data/001-2.wlk
+++ b/world/map/data/001-2.wlk
Binary files differ
diff --git a/world/map/data/080-1.wlk b/world/map/data/080-1.wlk
new file mode 100644
index 00000000..3a1f02c9
--- /dev/null
+++ b/world/map/data/080-1.wlk
Binary files differ
diff --git a/world/map/data/080-3.wlk b/world/map/data/080-3.wlk
new file mode 100644
index 00000000..102bdbee
--- /dev/null
+++ b/world/map/data/080-3.wlk
Binary files differ
diff --git a/world/map/data/081-1.wlk b/world/map/data/081-1.wlk
new file mode 100644
index 00000000..774f115d
--- /dev/null
+++ b/world/map/data/081-1.wlk
Binary files differ
diff --git a/world/map/data/081-2.wlk b/world/map/data/081-2.wlk
new file mode 100644
index 00000000..c5d6b7ee
--- /dev/null
+++ b/world/map/data/081-2.wlk
Binary files differ
diff --git a/world/map/data/081-3.wlk b/world/map/data/081-3.wlk
new file mode 100644
index 00000000..44510db5
--- /dev/null
+++ b/world/map/data/081-3.wlk
Binary files differ
diff --git a/world/map/data/082-2.wlk b/world/map/data/082-2.wlk
new file mode 100644
index 00000000..f8a1c319
--- /dev/null
+++ b/world/map/data/082-2.wlk
Binary files differ
diff --git a/world/map/data/082-3.wlk b/world/map/data/082-3.wlk
new file mode 100644
index 00000000..3726f7ef
--- /dev/null
+++ b/world/map/data/082-3.wlk
Binary files differ
diff --git a/world/map/data/fermi.wlk b/world/map/data/fermi.wlk
new file mode 100644
index 00000000..5e55dabd
--- /dev/null
+++ b/world/map/data/fermi.wlk
Binary files differ
diff --git a/world/map/data/guild.wlk b/world/map/data/guild.wlk
new file mode 100644
index 00000000..bd11ef86
--- /dev/null
+++ b/world/map/data/guild.wlk
Binary files differ
diff --git a/world/map/data/prison.wlk b/world/map/data/prison.wlk
new file mode 100644
index 00000000..249adb7e
--- /dev/null
+++ b/world/map/data/prison.wlk
Binary files differ
diff --git a/world/map/data/resnametable.txt b/world/map/data/resnametable.txt
index cfebd318..39e74814 100644
--- a/world/map/data/resnametable.txt
+++ b/world/map/data/resnametable.txt
@@ -120,6 +120,13 @@
069-2#069-2.wlk#
070-1#070-1.wlk#
070-3#070-3.wlk#
+080-1#080-1.wlk#
+080-3#080-3.wlk#
+081-1#081-1.wlk#
+081-2#081-2.wlk#
+081-3#081-3.wlk#
+082-2#082-2.wlk#
+082-3#082-3.wlk#
099-1#099-1.wlk#
099-2#099-2.wlk#
099-3#099-3.wlk#
@@ -129,3 +136,6 @@
099-7#099-7.wlk#
099-8#099-8.wlk#
botcheck#botcheck.wlk#
+fermi#fermi.wlk#
+guild#guild.wlk#
+prison#prison.wlk#
diff --git a/world/map/db/item_db.conf b/world/map/db/item_db.conf
index eb0325dd..153dd543 100644
--- a/world/map/db/item_db.conf
+++ b/world/map/db/item_db.conf
@@ -2012,8 +2012,8 @@ item_db: (
AegisName: "WarlordBoots"
Name: "WarlordBoots"
Type: "IT_ARMOR"
- Buy: 19000
- Sell: 2000
+ Buy: 141500
+ Sell: 70750
Weight: 550
Matk: -22
Def: 5
@@ -6066,8 +6066,8 @@ item_db: (
AegisName: "ChainmailShirt"
Name: "ChainmailShirt"
Type: "IT_ARMOR"
- Buy: 15000
- Sell: 1500
+ Buy: 83750
+ Sell: 41875
Weight: 800
Matk: -120
Def: 20
@@ -6084,8 +6084,8 @@ item_db: (
AegisName: "LightPlatemail"
Name: "LightPlatemail"
Type: "IT_ARMOR"
- Buy: 50000
- Sell: 2500
+ Buy: 192500
+ Sell: 96250
Weight: 1200
Matk: -150
Def: 25
@@ -6217,8 +6217,8 @@ item_db: (
AegisName: "WarlordPlate"
Name: "WarlordPlate"
Type: "IT_ARMOR"
- Buy: 100000
- Sell: 3000
+ Buy: 351250
+ Sell: 175625
Weight: 2600
Matk: -170
Def: 27
@@ -10947,8 +10947,8 @@ item_db: (
AegisName: "WarlordHelmet"
Name: "WarlordHelmet"
Type: "IT_ARMOR"
- Buy: 30000
- Sell: 3000
+ Buy: 85750
+ Sell: 42875
Weight: 900
Matk: -36
Def: 18
@@ -17101,7 +17101,7 @@ item_db: (
KeepAfterUse: true
Trade: {
notrade: true
- nodrop: true
+ nodrop: false
nocart: true
nomail: true
noauction: true
@@ -17132,7 +17132,7 @@ item_db: (
KeepAfterUse: true
Trade: {
notrade: true
- nodrop: true
+ nodrop: false
nocart: true
nomail: true
noauction: true
@@ -18460,8 +18460,8 @@ item_db: (
AegisName: "SteelShield"
Name: "SteelShield"
Type: "IT_ARMOR"
- Buy: 40000
- Sell: 3000
+ Buy: 100000
+ Sell: 50000
Weight: 2500
Matk: -200
Def: 20
diff --git a/world/map/db/item_db_chest.txt b/world/map/db/item_db_chest.txt
index 25c91cdb..dac8b7a0 100644
--- a/world/map/db/item_db_chest.txt
+++ b/world/map/db/item_db_chest.txt
@@ -6,15 +6,15 @@
546, DesertShirt, 5, 2000, 1000, 140, 0, 6, 0, -18, 0, 2, 512, 0, 0, 0, 0, {}, {}
564, Turtleneck, 5, 2000, 1000, 130, 0, 6, 0, -18, 0, 2, 512, 0, 0, 0, 0, {}, {}
624, VNeckSweater, 5, 6000, 3000, 135, 0, 8, 0, -24, 0, 2, 512, 0, 0, 0, 0, {}, {}
-625, ChainmailShirt, 5, 15000, 1500, 800, 0, 20, 0, -120, 0, 2, 512, 0, 0, 0, 0, {}, {}
-626, LightPlatemail, 5, 50000, 2500, 1200, 0, 25, 0, -150, 0, 2, 512, 0, 0, 0, 0, {}, {}
+625, ChainmailShirt, 5, 83750, 41875, 800, 0, 20, 0, -120, 0, 2, 512, 0, 0, 0, 0, {}, {}
+626, LightPlatemail, 5, 192500, 96250, 1200, 0, 25, 0, -150, 0, 2, 512, 0, 0, 0, 0, {}, {}
645, GoldenPlatemail, 5, 350000, 3000, 4500, 0, 25, 0, -100, 0, 2, 512, 0, 0, 0, 0, {}, {bonus bCriticalDef, 5;}
649, WhiteEvokersRobeBlue, 5, 8000, 4000, 50, 0, 5, 0, 20, 0, 2, 512, 0, 0, 0, 0, {}, {bonus bAgi, 1; bonus bCriticalDef, 10;}
650, BlackEvokersRobeBlue, 5, 8000, 4000, 50, 0, 5, 0, 20, 0, 2, 512, 0, 0, 0, 0, {}, {bonus bAgi, 1; bonus bCriticalDef, 10;}
651, WhiteWizardRobe, 5, 8000, 4000, 50, 0, 5, 0, 20, 0, 2, 512, 0, 0, 0, 0, {}, {}
652, BlackWizardRobe, 5, 8000, 4000, 50, 0, 5, 0, 20, 0, 2, 512, 0, 0, 0, 0, {}, {}
653, ApprenticeRobe, 5, 8000, 4000, 50, 0, 5, 0, 20, 0, 2, 512, 0, 0, 0, 0, {}, {bonus bAgi, 1; bonus bCriticalDef, 10;}
-658, WarlordPlate, 5, 100000, 3000, 2600, 0, 27, 0, -170, 0, 2, 512, 0, 0, 0, 0, {}, {}
+658, WarlordPlate, 5, 351250, 175625, 2600, 0, 27, 0, -170, 0, 2, 512, 0, 0, 0, 0, {}, {}
659, GoldenWarlordPlate, 5, 500000, 4000, 7600, 0, 27, 0, -110, 0, 2, 512, 0, 0, 0, 0, {}, {bonus bCriticalDef, 10;}
688, TankTop, 5, 800, 400, 10, 0, 2, 0, -4, 0, 2, 512, 0, 0, 0, 0, {}, {}
689, ShortTankTop, 5, 600, 300, 8, 0, 2, 0, -4, 0, 2, 512, 0, 0, 0, 0, {}, {}
diff --git a/world/map/db/item_db_foot.txt b/world/map/db/item_db_foot.txt
index 10f1d07c..c5754fbf 100644
--- a/world/map/db/item_db_foot.txt
+++ b/world/map/db/item_db_foot.txt
@@ -8,7 +8,7 @@
735, CottonBoots, 5, 2000, 500, 10, 0, 1, 0, 1, 0, 2, 64, 0, 0, 0, 0, {}, {}
757, AssassinBoots, 5, 7000, 2000, 10, 0, 3, 0, -3, 0, 2, 64, 0, 0, 0, 0, {}, {callfunc "BrawlingItem"; bonus bAgi, 4;}
792, BromenalBoots, 5, 8000, 500, 250, 0, 4, 0, -14, 0, 2, 64, 0, 0, 0, 0, {}, {}
-876, WarlordBoots, 5, 19000, 2000, 550, 0, 5, 0, -22, 0, 2, 64, 0, 0, 0, 0, {}, {}
+876, WarlordBoots, 5, 141500, 70750, 550, 0, 5, 0, -22, 0, 2, 64, 0, 0, 0, 0, {}, {}
1188, RedStockings, 5, 7000, 2000, 10, 0, 1, 0, 2, 0, 2, 64, 0, 0, 0, 0, {}, {}
2150, RedCottonBoots, 5, 2000, 500, 10, 0, 1, 0, 1, 0, 2, 64, 0, 0, 0, 0, {}, {}
2151, GreenCottonBoots, 5, 2000, 500, 10, 0, 1, 0, 1, 0, 2, 64, 0, 0, 0, 0, {}, {}
diff --git a/world/map/db/item_db_head.txt b/world/map/db/item_db_head.txt
index 374909c9..5d2470bb 100644
--- a/world/map/db/item_db_head.txt
+++ b/world/map/db/item_db_head.txt
@@ -23,7 +23,7 @@
633, ChristmasElfHat, 5, 3000, 1500, 30, 0, 13, 0, 2, 0, 2, 256, 0, 0, 0, 0, {}, {}
634, FaceMask, 5, 2500, 1250, 50, 0, 10, 0, 0, 0, 2, 256, 0, 0, 0, 0, {}, {}
//ID, Name, Type, Price, Sell, Weight, ATK, DEF, Range, Mbonus, Slot, Gender, Loc, wLV, eLV, View, Mode, {UseScript}, {EquipScript}
-636, WarlordHelmet, 5, 30000, 3000, 900, 0, 18, 0, -36, 0, 2, 256, 0, 0, 0, 0, {}, {}
+636, WarlordHelmet, 5, 85750, 42875, 900, 0, 18, 0, -36, 0, 2, 256, 0, 0, 0, 0, {}, {}
637, KnightsHelmet, 5, 20000, 2000, 600, 0, 15, 0, -30, 0, 2, 256, 0, 0, 0, 0, {}, {}
638, InfantryHelmet, 5, 15000, 1500, 400, 0, 15, 0, -30, 0, 2, 256, 0, 0, 0, 0, {}, {}
639, CrusadeHelmet, 5, 25000, 2500, 1300, 0, 18, 0, -36, 0, 2, 256, 0, 0, 0, 0, {}, {}
diff --git a/world/map/db/item_db_offhand.txt b/world/map/db/item_db_offhand.txt
index 52e500df..9bf9996b 100644
--- a/world/map/db/item_db_offhand.txt
+++ b/world/map/db/item_db_offhand.txt
@@ -3,7 +3,7 @@
//Edit item_db.conf instead!
//ID, Name, Type, Price, Sell, Weight, ATK, DEF, Range, Mbonus, Slot, Gender, Loc, wLV, eLV, View, Mode, {UseScript}, {EquipScript}
585, ScarabArmlet, 5, 8000, 4000, 200, 0, 0, 0, 5, 0, 2, 32, 0, 1, 0, 0, {}, {bonus bInt, 1;}
-601, SteelShield, 5, 40000, 3000, 2500, 0, 20, 0, -200, 0, 2, 32, 0, 0, 0, 0, {}, {}
+601, SteelShield, 5, 100000, 50000, 2500, 0, 20, 0, -200, 0, 2, 32, 0, 0, 0, 0, {}, {}
602, WoodenShield, 5, 10000, 2000, 1500, 0, 14, 0, -70, 0, 2, 32, 0, 0, 0, 0, {}, {}
603, LeatherShield, 5, 2000, 1000, 1300, 0, 7, 0, -35, 0, 2, 32, 0, 0, 0, 0, {}, {}
//797, BromenalShield, 5, 40000, 3000, 2000, 0, 18, 0, -160, 0, 2, 32, 0, 0, 0, 0, {}, {}
diff --git a/world/map/db/item_db_use.txt b/world/map/db/item_db_use.txt
index 5bb8137c..020bc80b 100644
--- a/world/map/db/item_db_use.txt
+++ b/world/map/db/item_db_use.txt
@@ -150,5 +150,5 @@
5382, AnchorStone, 0, 90000, 45000, 40, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 23, {set @StoneName$, "AnchorStone"; callfunc "useAnchorStone";}, {}
//ID, Name, Type, Price, Sell, Weight, ATK, DEF, Range, Mbonus, Slot, Gender, Loc, wLV, eLV, View, Mode, {UseScript}, {EquipScript}
5383, AnchoredAnchorStone, 0, 0, 0, 40, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 31, {set @StoneName$, "AnchoredAnchorStone"; callfunc "useAnchorStone";}, {}
-5405, LegendaryShovel, 0, 0, 0, 210, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 23, {set @ShovelName$, "LegendaryShovel"; callfunc "useShovel";}, {}
-5406, LegendaryTreasureMap, 0, 0, 0, 14, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 23, {set @MapName$, "LegendaryTreasureMap"; callfunc "readMap";}, {}
+5405, LegendaryShovel, 0, 0, 0, 210, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 22, {set @ShovelName$, "LegendaryShovel"; callfunc "useShovel";}, {}
+5406, LegendaryTreasureMap, 0, 0, 0, 14, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 22, {set @MapName$, "LegendaryTreasureMap"; callfunc "readMap";}, {}
diff --git a/world/map/db/mob_db.conf b/world/map/db/mob_db.conf
index 21a59413..c97b044f 100644
--- a/world/map/db/mob_db.conf
+++ b/world/map/db/mob_db.conf
@@ -2541,6 +2541,7 @@ mob_db: (
GambogeScroll: 10
MauveScroll: 10
JoyplimScroll: 10
+ PointyWitchHat: 1
}
},
{
@@ -3447,6 +3448,7 @@ mob_db: (
GambogeScroll: 10
MauveScroll: 10
JoyplimScroll: 10
+ PointyWitchHat: 1
}
},
{
@@ -3664,6 +3666,9 @@ mob_db: (
AttackDelay: 672
AttackMotion: 672
DamageMotion: 50
+ Drops: {
+ PointyWitchHat: 1
+ }
},
{
Id: 1143
@@ -3928,13 +3933,8 @@ mob_db: (
MutationCount: 1
MutationStrength: 10
Drops: {
- TreasureKey: 800
- UndeadEar: 150
- UndeadEye: 150
- RottenRags: 70
- Soul: 50
BlackRose: 30
- MagicRing: 4
+ MagicRing: 2
BlinkingHocus: 1
}
},
@@ -3981,13 +3981,11 @@ mob_db: (
MutationCount: 1
MutationStrength: 10
Drops: {
- TreasureKey: 800
- UndeadEar: 90
- UndeadEye: 80
- RottenRags: 70
- Soul: 50
+ Arrow: 5000
+ IronArrow: 5000
+ SilverArrow: 50
BlackRose: 30
- EnchantersAmulet: 2
+ EnchantersAmulet: 1
}
},
{
@@ -4559,6 +4557,9 @@ mob_db: (
AttackDelay: 672
AttackMotion: 672
DamageMotion: 50
+ Drops: {
+ PointyWitchHat: 1
+ }
},
{
Id: 1004
diff --git a/world/map/db/mob_db_over_100.txt b/world/map/db/mob_db_over_100.txt
index 443361a6..25e90507 100644
--- a/world/map/db/mob_db_over_100.txt
+++ b/world/map/db/mob_db_over_100.txt
@@ -20,7 +20,7 @@
1072, Yeti, Yeti, 100, 8500, 0, 9040, 726, 2, 100, 400, 60, 15, 0, 60, 5, 45, 15, 60, 32, 9, 10, 1, 0, 31, 135, 220, 1200, 672, 900, 4023, 700, 4024, 300, 4025, 400, 4027, 142, 4021, 800, 4022, 700, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 30
1075, Stalker, Stalker, 120, 20000, 0, 15628, 4000, 2, 220, 500, 23, 30, 0, 35, 15, 3, 50, 50, 50, 2, 10, 1, 1, 17, 175, 340, 1800, 672, 950, 775, 75, 775, 115, 776, 135, 631, 40, 778, 500, 1198, 500, 5116, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 20
1096, SoulSnake, SoulSnake, 115, 850, 0, 325, 56, 1, 75, 90, 4, 6, 0, 20, 11, 10, 10, 35, 10, 9, 10, 1, 0, 10, 137, 900, 1300, 672, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 30
-1102, Luvia, Luvia, 127, 48044, 60, 315973, 12172, 5, 339, 364, 50, 92, 0, 1, 29, 55, 255, 255, 255, 31, 10, 1, 1, 37, 181, 220, 1200, 672, 50, 5141, 10, 5142, 10, 5143, 10, 5144, 10, 5145, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+1102, Luvia, Luvia, 127, 48044, 60, 315973, 12172, 5, 339, 364, 50, 92, 0, 1, 29, 55, 255, 255, 255, 31, 10, 1, 1, 37, 181, 220, 1200, 672, 50, 5141, 10, 5142, 10, 5143, 10, 5144, 10, 5145, 10, 5200, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1106, WickedMushroom, WickedMushroom, 110, 550, 0, 220, 30, 1, 70, 80, 4, 4, 0, 16, 12, 10, 10, 35, 10, 9, 10, 1, 3, 12, 133, 800, 1800, 672, 480, 613, 600, 4007, 50, 567, 100, 566, 1000, 5334, 30, 5360, 100, 5145, 40, 5397, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 60
//ID, Name, Jname, LV, HP, SP, EXP, JEXP, Range1, ATK1, ATK2, DEF, MDEF, CRITDEF,STR, AGI, VIT, INT, DEX, LUK, Range2, Range3, Scale, Race, Element,Mode, Speed, Adelay, Amotion,Dmotion,Drop0id,Drop0%, Drop1id,Drop1%, Drop2id,Drop2%, Drop3id,Drop3%, Drop4id,Drop4%, Drop5id,Drop5%, Drop6id,Drop6%, Drop7id,Drop7%, Drop8id,Drop8%, Drop9id,Drop9%, Item1, Item2, MEXP, ExpPer, MVP1id, MVP1per,MVP2id, MVP2per,MVP3id, MVP3per,mutationcount,mutationstrength
1114, Nutcracker, Nutcracker, 110, 6000, 0, 4226, 769, 1, 81, 281, 20, 37, 0, 40, 20, 10, 5, 60, 40, 9, 10, 1, 1, 17, 133, 400, 872, 672, 900, 569, 1000, 660, 750, 539, 750, 503, 250, 640, 200, 4004, 200, 4001, 600, 1190, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 30
diff --git a/world/map/db/mob_db_over_150.txt b/world/map/db/mob_db_over_150.txt
index 00c50972..4021a887 100644
--- a/world/map/db/mob_db_over_150.txt
+++ b/world/map/db/mob_db_over_150.txt
@@ -11,22 +11,22 @@
1121, Grenadier, Grenadier, 170, 6000, 0, 4332, 999, 6, 100, 200, 8, 50, 0, 12, 10, 50, 60, 90, 70, 9, 10, 1, 0, 10, 143, 500, 2000, 672, 480, 539, 1000, 657, 1000, 701, 500, 704, 250, 700, 250, 617, 100, 765, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 40
1122, DreadPirateMarley, DreadPirateMarley, 180, 10000, 0, 17612, 20000, 6, 175, 250, 38, 32, 0, 10, 20, 40, 20, 90, 80, 9, 10, 1, 0, 10, 175, 400, 700, 672, 480, 539, 1000, 657, 1000, 701, 500, 704, 250, 700, 250, 621, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1134, SUSAN, SUSAN, 255, 696969, 0, 69000, 1400, 1, 0, 0, 69, 69, 0, 69, 69, 69, 69, 69, 69, 9, 10, 1, 1, 17, 161, 1500, 1872, 672, 480, 838, 6000, 839, 6000, 840, 6000, 1229, 200, 1230, 500, 1231, 500, 1232, 500, 1281, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 30
-1137, Tormenta, Tormenta, 200, 18000, 60, 500000, 5000, 5, 360, 374, 48, 70, 0, 1, 32, 60, 255, 255, 255, 31, 10, 1, 1, 37, 181, 210, 1200, 672, 50, 5141, 10, 5142, 10, 5143, 10, 5144, 10, 5145, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+1137, Tormenta, Tormenta, 200, 18000, 60, 500000, 5000, 5, 360, 374, 48, 70, 0, 1, 32, 60, 255, 255, 255, 31, 10, 1, 1, 37, 181, 210, 1200, 672, 50, 5141, 10, 5142, 10, 5143, 10, 5144, 10, 5145, 10, 5200, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1138, ManaGuard, ManaGuard, 180, 20000, 280, 27000, 5000, 2, 280, 324, 22, 67, 0, 31, 22, 90, 127, 255, 95, 31, 10, 1, 1, 37, 181, 210, 1200, 672, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1139, Virus, Virus, 170, 5000, 0, 5254, 721, 6, 45, 75, 37, 12, 0, 30, 30, 20, 20, 25, 60, 9, 10, 1, 3, 12, 143, 600, 1872, 672, 480, 787, 500, 743, 1100, 5236, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1140, Tengu, Tengu, 180, 24000, 280, 45000, 5000, 2, 180, 224, 67, 9, 0, 31, 22, 90, 97, 255, 95, 31, 10, 1, 1, 37, 181, 310, 1200, 672, 50, 825, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1141, Sasquatch, Sasquatch, 180, 24000, 280, 45000, 5000, 2, 420, 444, 12, 27, 0, 31, 22, 90, 97, 255, 95, 31, 10, 1, 1, 37, 181, 310, 1200, 672, 50, 825, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-1142, Kage, Kage, 200, 29999, 280, 999999, 99999, 9, 90, 124, 74, 100, 0, 199, 2, 199, 197, 255, 175, 31, 10, 1, 1, 37, 181, 210, 672, 672, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+1142, Kage, Kage, 200, 29999, 280, 999999, 99999, 9, 90, 124, 74, 100, 0, 199, 2, 199, 197, 255, 175, 31, 10, 1, 1, 37, 181, 210, 672, 672, 50, 5200, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1143, ManaSlayer, ManaSlayer, 180, 24000, 280, 42000, 5000, 2, 260, 274, 22, 67, 0, 31, 22, 90, 127, 255, 95, 31, 10, 1, 1, 37, 181, 210, 1200, 672, 50, 825, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1144, Dragon, Dragon, 250, 29999, 280, 1, 1, 3, 60, 90, 67, 67, 0, 199, 2, 199, 197, 255, 95, 31, 10, 1, 1, 37, 181, 210, 1200, 672, 50, 759, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1145, KageGolem, KageGolem, 180, 29999, 280, 150000, 15000, 6, 140, 174, 72, 55, 0, 31, 22, 90, 127, 255, 125, 31, 10, 1, 1, 37, 181, 410, 1000, 672, 50, 5251, 10000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1146, Flashmob, Flashmob, 181, 27000, 280, 72000, 5000, 3, 40, 60, 57, 57, 0, 31, 22, 90, 127, 255, 95, 31, 10, 1, 1, 37, 181, 160, 600, 672, 50, 825, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1147, Koyntety, Koyntety, 181, 27000, 280, 72000, 5000, 4, 220, 240, 52, 52, 0, 31, 22, 90, 127, 255, 105, 31, 10, 1, 1, 37, 181, 240, 1400, 672, 50, 825, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
//ID, Name, Jname, LV, HP, SP, EXP, JEXP, Range1, ATK1, ATK2, DEF, MDEF, CRITDEF,STR, AGI, VIT, INT, DEX, LUK, Range2, Range3, Scale, Race, Element,Mode, Speed, Adelay, Amotion,Dmotion,Drop0id,Drop0%, Drop1id,Drop1%, Drop2id,Drop2%, Drop3id,Drop3%, Drop4id,Drop4%, Drop5id,Drop5%, Drop6id,Drop6%, Drop7id,Drop7%, Drop8id,Drop8%, Drop9id,Drop9%, Item1, Item2, MEXP, ExpPer, MVP1id, MVP1per,MVP2id, MVP2per,MVP3id, MVP3per,mutationcount,mutationstrength
-1148, DoomGolem, DoomGolem, 180, 22000, 280, 65000, 2000, 3, 160, 180, 60, 30, 0, 31, 22, 90, 127, 255, 105, 31, 10, 1, 1, 37, 181, 320, 1000, 672, 50, 537, 800, 779, 150, 780, 150, 777, 70, 1198, 50, 666, 30, 5253, 4, 5258, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10
-1149, Enchanter, Enchanter, 181, 19000, 280, 55000, 2000, 8, 140, 180, 30, 60, 0, 31, 22, 90, 127, 255, 105, 31, 10, 1, 1, 37, 181, 240, 800, 672, 50, 537, 800, 779, 90, 780, 80, 777, 70, 1198, 50, 666, 30, 1227, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10
+1148, DoomGolem, DoomGolem, 180, 22000, 280, 65000, 2000, 3, 160, 180, 60, 30, 0, 31, 22, 90, 127, 255, 105, 31, 10, 1, 1, 37, 181, 320, 1000, 672, 50, 666, 30, 5253, 2, 5258, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10
+1149, Enchanter, Enchanter, 181, 19000, 280, 55000, 2000, 8, 140, 180, 30, 60, 0, 31, 22, 90, 127, 255, 105, 31, 10, 1, 1, 37, 181, 240, 800, 672, 50, 1199, 5000, 529, 5000, 5290, 50, 666, 30, 1227, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10
1150, ManaTyrant, ManaTyrant, 180, 24000, 280, 27000, 5000, 2, 300, 325, 42, 67, 0, 31, 22, 90, 127, 255, 95, 31, 10, 1, 1, 37, 181, 180, 1050, 672, 50, 759, 1, 5237, 20, 1253, 5, 720, 100, 825, 500, 868, 20, 1172, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-1161, Xakelbael, Xakelbael, 200, 29999, 280, 999999, 99999, 9, 90, 124, 74, 100, 0, 199, 2, 199, 197, 255, 175, 31, 10, 1, 1, 37, 181, 210, 672, 672, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+1161, Xakelbael, Xakelbael, 200, 29999, 280, 999999, 99999, 9, 90, 124, 74, 100, 0, 199, 2, 199, 197, 255, 175, 31, 10, 1, 1, 37, 181, 210, 672, 672, 50, 5200, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1170, CrystalGolem, CrystalGolem, 180, 25000, 280, 68000, 2200, 3, 170, 190, 75, 40, 0, 35, 26, 99, 127, 255, 105, 31, 30, 1, 0, 46, 169, 320, 1000, 672, 50, 5384, 400, 5384, 200, 5384, 100, 4002, 50, 4003, 50, 4004, 50, 4005, 50, 4006, 50, 4007, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1171, BlackCrystalGolem, BlackCrystalGolem, 180, 25000, 280, 68000, 2200, 3, 170, 190, 75, 40, 0, 35, 26, 99, 127, 255, 105, 31, 30, 1, 0, 46, 169, 320, 1000, 672, 50, 5385, 400, 5385, 200, 5385, 100, 4002, 50, 4003, 50, 4004, 50, 4005, 50, 4006, 50, 4007, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1183, MobMoubootaur, MobMoubootaur, 220, 99999, 9999, 999999, 99999, 1, 400, 500, 99, 99, 0, 99, 60, 99, 30, 255, 255, 18, 18, 1, 6, 47, 165, 240, 872, 272, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
diff --git a/world/map/npc/001-1/_warps.txt b/world/map/npc/001-1/_warps.txt
index 2b3f2dfd..8c648d70 100644
--- a/world/map/npc/001-1/_warps.txt
+++ b/world/map/npc/001-1/_warps.txt
@@ -7,6 +7,7 @@
001-1,52,71|warp|-1,-1,001-2,28,27
001-1,49,71|warp|-1,-1,001-2,25,27
001-1,114,99|warp|-1,-1,001-2,25,64
+001-1,114,82|warp|-1,-1,001-2,57,52
001-1,27,32|warp|-1,-1,001-2,28,101
001-1,37,32|warp|-1,-1,001-2,71,101
001-1,55,34|warp|0,-1,001-2,104,101
diff --git a/world/map/npc/001-2/_warps.txt b/world/map/npc/001-2/_warps.txt
index 07ebce6d..9eef0564 100644
--- a/world/map/npc/001-2/_warps.txt
+++ b/world/map/npc/001-2/_warps.txt
@@ -16,3 +16,5 @@
001-2,57,90|warp|-1,-1,001-2,35,94
001-2,36,95|warp|-1,0,001-2,58,90
001-2,65,26|warp|-1,-1,001-1,59,99
+001-2,60,50|warp|-1,-1,prison,46,23
+001-2,57,53|warp|-1,-1,001-1,114,83
diff --git a/world/map/npc/080-1/_import.txt b/world/map/npc/080-1/_import.txt
new file mode 100644
index 00000000..cafaba0c
--- /dev/null
+++ b/world/map/npc/080-1/_import.txt
@@ -0,0 +1,6 @@
+// Map 080-1: Mysterious Glade
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+map: 080-1
+npc: npc/080-1/_mobs.txt
+npc: npc/080-1/_nodes.txt
+npc: npc/080-1/_warps.txt
diff --git a/world/map/npc/080-1/_mobs.txt b/world/map/npc/080-1/_mobs.txt
new file mode 100644
index 00000000..6fc52fa7
--- /dev/null
+++ b/world/map/npc/080-1/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Mysterious Glade mobs
+
diff --git a/world/map/npc/080-1/_nodes.txt b/world/map/npc/080-1/_nodes.txt
new file mode 100644
index 00000000..449b6975
--- /dev/null
+++ b/world/map/npc/080-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Mysterious Glade nodes
+
+// (no nodes)
diff --git a/world/map/npc/080-1/_warps.txt b/world/map/npc/080-1/_warps.txt
new file mode 100644
index 00000000..97de0f6f
--- /dev/null
+++ b/world/map/npc/080-1/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Mysterious Glade warps
+
diff --git a/world/map/npc/080-3/_import.txt b/world/map/npc/080-3/_import.txt
new file mode 100644
index 00000000..593a5e46
--- /dev/null
+++ b/world/map/npc/080-3/_import.txt
@@ -0,0 +1,6 @@
+// Map 080-3: Forgotten Glade
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+map: 080-3
+npc: npc/080-3/_mobs.txt
+npc: npc/080-3/_nodes.txt
+npc: npc/080-3/_warps.txt
diff --git a/world/map/npc/080-3/_mobs.txt b/world/map/npc/080-3/_mobs.txt
new file mode 100644
index 00000000..5fce2024
--- /dev/null
+++ b/world/map/npc/080-3/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Forgotten Glade mobs
+
diff --git a/world/map/npc/080-3/_nodes.txt b/world/map/npc/080-3/_nodes.txt
new file mode 100644
index 00000000..c809d136
--- /dev/null
+++ b/world/map/npc/080-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Forgotten Glade nodes
+
+// (no nodes)
diff --git a/world/map/npc/080-3/_warps.txt b/world/map/npc/080-3/_warps.txt
new file mode 100644
index 00000000..e6ecce07
--- /dev/null
+++ b/world/map/npc/080-3/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Forgotten Glade warps
+
+080-3,84,155|warp|0,-1,081-3,44,23
diff --git a/world/map/npc/081-1/_import.txt b/world/map/npc/081-1/_import.txt
new file mode 100644
index 00000000..f35b3648
--- /dev/null
+++ b/world/map/npc/081-1/_import.txt
@@ -0,0 +1,6 @@
+// Map 081-1: Aethyr
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+map: 081-1
+npc: npc/081-1/_mobs.txt
+npc: npc/081-1/_nodes.txt
+npc: npc/081-1/_warps.txt
diff --git a/world/map/npc/081-1/_mobs.txt b/world/map/npc/081-1/_mobs.txt
new file mode 100644
index 00000000..27f6cc97
--- /dev/null
+++ b/world/map/npc/081-1/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Aethyr mobs
+
diff --git a/world/map/npc/081-1/_nodes.txt b/world/map/npc/081-1/_nodes.txt
new file mode 100644
index 00000000..4eb18abe
--- /dev/null
+++ b/world/map/npc/081-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Aethyr nodes
+
+// (no nodes)
diff --git a/world/map/npc/081-1/_warps.txt b/world/map/npc/081-1/_warps.txt
new file mode 100644
index 00000000..e56660cc
--- /dev/null
+++ b/world/map/npc/081-1/_warps.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Aethyr warps
+
+081-1,68,30|warp|-1,-1,081-2,90,298
+081-1,58,104|warp|-1,-1,020-1,84,75
+081-1,44,89|warp|-1,-1,082-2,88,25
diff --git a/world/map/npc/081-2/_import.txt b/world/map/npc/081-2/_import.txt
new file mode 100644
index 00000000..60017ade
--- /dev/null
+++ b/world/map/npc/081-2/_import.txt
@@ -0,0 +1,6 @@
+// Map 081-2: Northern Lights
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+map: 081-2
+npc: npc/081-2/_mobs.txt
+npc: npc/081-2/_nodes.txt
+npc: npc/081-2/_warps.txt
diff --git a/world/map/npc/081-2/_mobs.txt b/world/map/npc/081-2/_mobs.txt
new file mode 100644
index 00000000..fa19192a
--- /dev/null
+++ b/world/map/npc/081-2/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Northern Lights mobs
+
diff --git a/world/map/npc/081-2/_nodes.txt b/world/map/npc/081-2/_nodes.txt
new file mode 100644
index 00000000..b4162204
--- /dev/null
+++ b/world/map/npc/081-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Northern Lights nodes
+
+// (no nodes)
diff --git a/world/map/npc/081-2/_warps.txt b/world/map/npc/081-2/_warps.txt
new file mode 100644
index 00000000..0f47357f
--- /dev/null
+++ b/world/map/npc/081-2/_warps.txt
@@ -0,0 +1,5 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Northern Lights warps
+
+081-2,90,20|warp|-1,-1,081-3,44,50
+081-2,90,299|warp|-1,-1,081-1,68,31
diff --git a/world/map/npc/081-3/_import.txt b/world/map/npc/081-3/_import.txt
new file mode 100644
index 00000000..237a93c5
--- /dev/null
+++ b/world/map/npc/081-3/_import.txt
@@ -0,0 +1,6 @@
+// Map 081-3: Existential Frontier
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+map: 081-3
+npc: npc/081-3/_mobs.txt
+npc: npc/081-3/_nodes.txt
+npc: npc/081-3/_warps.txt
diff --git a/world/map/npc/081-3/_mobs.txt b/world/map/npc/081-3/_mobs.txt
new file mode 100644
index 00000000..6493e765
--- /dev/null
+++ b/world/map/npc/081-3/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Existential Frontier mobs
+
diff --git a/world/map/npc/081-3/_nodes.txt b/world/map/npc/081-3/_nodes.txt
new file mode 100644
index 00000000..5ca051db
--- /dev/null
+++ b/world/map/npc/081-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Existential Frontier nodes
+
+// (no nodes)
diff --git a/world/map/npc/081-3/_warps.txt b/world/map/npc/081-3/_warps.txt
new file mode 100644
index 00000000..fcca59a7
--- /dev/null
+++ b/world/map/npc/081-3/_warps.txt
@@ -0,0 +1,5 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Existential Frontier warps
+
+081-3,44,22|warp|-1,-1,080-3,84,154
+081-3,44,51|warp|-1,-1,081-2,90,21
diff --git a/world/map/npc/082-2/_import.txt b/world/map/npc/082-2/_import.txt
new file mode 100644
index 00000000..5d5646d1
--- /dev/null
+++ b/world/map/npc/082-2/_import.txt
@@ -0,0 +1,6 @@
+// Map 082-2: Porthos - Frontier
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+map: 082-2
+npc: npc/082-2/_mobs.txt
+npc: npc/082-2/_nodes.txt
+npc: npc/082-2/_warps.txt
diff --git a/world/map/npc/082-2/_mobs.txt b/world/map/npc/082-2/_mobs.txt
new file mode 100644
index 00000000..689ad2b7
--- /dev/null
+++ b/world/map/npc/082-2/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Porthos - Frontier mobs
+
diff --git a/world/map/npc/082-2/_nodes.txt b/world/map/npc/082-2/_nodes.txt
new file mode 100644
index 00000000..9b2e0796
--- /dev/null
+++ b/world/map/npc/082-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Porthos - Frontier nodes
+
+// (no nodes)
diff --git a/world/map/npc/082-2/_warps.txt b/world/map/npc/082-2/_warps.txt
new file mode 100644
index 00000000..249afc27
--- /dev/null
+++ b/world/map/npc/082-2/_warps.txt
@@ -0,0 +1,9 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Porthos - Frontier warps
+
+082-2,81,13|warp|-1,-1,000-1,22,22
+082-2,44,13|warp|-1,-1,000-1,22,22
+082-2,55,33|warp|-1,-1,000-1,22,22
+082-2,57,12|warp|-1,-1,000-1,22,22
+082-2,28,16|warp|-1,-1,082-3,111,35
+082-2,88,26|warp|-1,-1,081-1,44,90
diff --git a/world/map/npc/082-3/_import.txt b/world/map/npc/082-3/_import.txt
new file mode 100644
index 00000000..6f883e7e
--- /dev/null
+++ b/world/map/npc/082-3/_import.txt
@@ -0,0 +1,6 @@
+// Map 082-3: Aether Caves
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+map: 082-3
+npc: npc/082-3/_mobs.txt
+npc: npc/082-3/_nodes.txt
+npc: npc/082-3/_warps.txt
diff --git a/world/map/npc/082-3/_mobs.txt b/world/map/npc/082-3/_mobs.txt
new file mode 100644
index 00000000..9d8f3638
--- /dev/null
+++ b/world/map/npc/082-3/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Aether Caves mobs
+
diff --git a/world/map/npc/082-3/_nodes.txt b/world/map/npc/082-3/_nodes.txt
new file mode 100644
index 00000000..1de2e9c5
--- /dev/null
+++ b/world/map/npc/082-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Aether Caves nodes
+
+// (no nodes)
diff --git a/world/map/npc/082-3/_warps.txt b/world/map/npc/082-3/_warps.txt
new file mode 100644
index 00000000..8bfc67ad
--- /dev/null
+++ b/world/map/npc/082-3/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Aether Caves warps
+
+082-3,111,34|warp|-1,-1,082-2,28,17
diff --git a/world/map/npc/_import.txt b/world/map/npc/_import.txt
index 2e832cdb..835d6613 100644
--- a/world/map/npc/_import.txt
+++ b/world/map/npc/_import.txt
@@ -122,6 +122,13 @@ import: npc/058-2/_import.txt
import: npc/069-2/_import.txt
import: npc/070-1/_import.txt
import: npc/070-3/_import.txt
+import: npc/080-1/_import.txt
+import: npc/080-3/_import.txt
+import: npc/081-1/_import.txt
+import: npc/081-2/_import.txt
+import: npc/081-3/_import.txt
+import: npc/082-2/_import.txt
+import: npc/082-3/_import.txt
import: npc/099-1/_import.txt
import: npc/099-2/_import.txt
import: npc/099-3/_import.txt
@@ -131,3 +138,6 @@ import: npc/099-6/_import.txt
import: npc/099-7/_import.txt
import: npc/099-8/_import.txt
import: npc/botcheck/_import.txt
+import: npc/fermi/_import.txt
+import: npc/guild/_import.txt
+import: npc/prison/_import.txt
diff --git a/world/map/npc/fermi/_import.txt b/world/map/npc/fermi/_import.txt
new file mode 100644
index 00000000..3860cda1
--- /dev/null
+++ b/world/map/npc/fermi/_import.txt
@@ -0,0 +1,6 @@
+// Map fermi: Three Fermi Land
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+map: fermi
+npc: npc/fermi/_mobs.txt
+npc: npc/fermi/_nodes.txt
+npc: npc/fermi/_warps.txt
diff --git a/world/map/npc/fermi/_mobs.txt b/world/map/npc/fermi/_mobs.txt
new file mode 100644
index 00000000..d49b9534
--- /dev/null
+++ b/world/map/npc/fermi/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Three Fermi Land mobs
+
diff --git a/world/map/npc/fermi/_nodes.txt b/world/map/npc/fermi/_nodes.txt
new file mode 100644
index 00000000..2f3e21fc
--- /dev/null
+++ b/world/map/npc/fermi/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Three Fermi Land nodes
+
+// (no nodes)
diff --git a/world/map/npc/fermi/_warps.txt b/world/map/npc/fermi/_warps.txt
new file mode 100644
index 00000000..a8a14cb8
--- /dev/null
+++ b/world/map/npc/fermi/_warps.txt
@@ -0,0 +1,5 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Three Fermi Land warps
+
+fermi,29,19|warp|-1,-1,017-9,32,31
+fermi,21,19|warp|-1,-1,009-1,42,44
diff --git a/world/map/npc/functions/treasure_hunt.txt b/world/map/npc/functions/treasure_hunt.txt
new file mode 100644
index 00000000..0e97adce
--- /dev/null
+++ b/world/map/npc/functions/treasure_hunt.txt
@@ -0,0 +1,469 @@
+// Pirate Treasures Hunt quest (c) 2025 Hello=)
+
+// This NPC handles treasure placement
+-|script|TreasureHunt|32767
+{
+ end;
+
+OnTreasurePlace:
+ if (GM < 60) end;
+ gmlog strcharinfo(0) + " shuffled treasure placement";
+ wgm strcharinfo(0) + " shuffled treasure placement";
+ set $TREASURE_X, 0; // To force reinit
+ void call("treasure_place");
+ end;
+
+OnInit:
+ registercmd "@treasure_place", "TreasureHunt::OnTreasurePlace";
+ void call("treasure_place");
+ end;
+}
+
+// Applies defaults to global vars if unconfigured
+function|script|treasure_place
+{
+ if ($TREASURE_MAP$ == "") || !($TREASURE_X) || !($TREASURE_Y) // Not looks configured?
+ goto L_Setup;
+ return;
+
+L_Setup:
+ // Apply defaults
+ set $TREASURE_REWARD, Eyepatch; // main reward
+ set $TREASURE_BOOTY, 200; // max amount of booty (worst case anti-milking cap)
+ set $TREASURE_DIFFICULTY, 100; // common rounds difficulty
+ set $TREASURE_DIFFICULTY2, 100; // extra rounds difficulty (if player found treasure)
+ set $TREASURE_MAP$, "003-4"; // Map to use. Ships are hardwired so far, beware.
+ set $TREASURE_X1, 97; // Rectangle
+ set $TREASURE_X2, 104;
+ set $TREASURE_Y1, 61;
+ set $TREASURE_Y2, 100;
+ // $TREASURE_DEBUG // Debug mode, a lot of battle flow/trace spam.
+ // $TREASURE_TURBO // Play battle real fast. You'll need @hide and GM Hat to survive.
+ goto L_TryPlacement;
+
+L_TryPlacement:
+ // Try placement
+ set $TREASURE_X, rand($TREASURE_X1, $TREASURE_X2); // Choose exact spot
+ set $TREASURE_Y, rand($TREASURE_Y1, $TREASURE_Y2);
+ if (iscollision($TREASURE_MAP$, $TREASURE_X, $TREASURE_Y))
+ goto L_TryPlacement; // do not place trasure on collisions
+ debugmes "treasure_place: treasure placed and configured";
+ return;
+}
+
+// Handler to be invoked from item usage attempt of shovels.
+// This function supposed to be called with player RID attached (its item use by player)
+// Input: Arg0: shovel name from item use handler function.
+// Return: 1 = item use handled (swallowed) by quest, 0 = not handled.
+function|script|treasure_try_shovel
+{
+ set .@shovel$, getarg(0, "");
+ set .@handled, 0;
+ if ($TREASURE_DEBUG) debugmes "treasure_try_shovel, shovel=" + .@shovel$;
+ if (.@shovel$ == "LegendaryShovel") set .@handled, 1; // TH handles everything about Legendary Shovel
+ if (!(.@handled) && (getmap() == $TREASURE_MAP$)) // Hint player they need different shovel on treasure map
+ message strcharinfo(0), "There're rocks in these sands. You'll need different shovel here...";
+ if ($TREASURE_DEBUG) debugmes "treasure_try_shovel, .@handled=" + .@handled;
+ if (.@handled) addtimer 0, "TreasureDig::OnDig", BL_ID; // Request NPC to do its thing just like #treasuredig.
+ return .@handled;
+}
+
+// Handler to be invoked from item usage attempt of maps.
+// This function supposed to be called with player RID attached (its item use by player)
+// Input: Arg0: map name from item use handler function.
+// Return: 1 = item use handled (swallowed) by quest, 0 = not handled.
+function|script|treasure_try_map
+{
+ set .@mapname$, getarg(0, "");
+ if ($TREASURE_DEBUG) debugmes "treasure_try_map, map=" + .@mapname$;
+ set .@handled, 0;
+ if (.@mapname$ == "LegendaryTreasureMap") set .@handled, 1; // TH handles everything about Legendary Treasure Map
+ if ($TREASURE_DEBUG) debugmes "treasure_try_map, .@handled=" + .@handled;
+ if ((getmap() != $TREASURE_MAP$) && (.@handled))
+ message strcharinfo(0), "Treasure Map : This place doesn't looks like one on map.";
+ if ((getmap() == $TREASURE_MAP$) && (.@handled) &&
+ !(isin($TREASURE_MAP$, $TREASURE_X1, $TREASURE_Y1, $TREASURE_X2, $TREASURE_Y2)))
+ message strcharinfo(0), "Treasure Map : This place looks right! Yet [X] mark isn't where you stand.";
+ if ((getmap() == $TREASURE_MAP$) && (.@handled) &&
+ (isin($TREASURE_MAP$, $TREASURE_X1, $TREASURE_Y1, $TREASURE_X2, $TREASURE_Y2)))
+ message strcharinfo(0), "Treasure Map : Aha! Right spot! Unfortunately X mark is big and crude. Promising area is " +
+ "(" + $TREASURE_X1 +"," + $TREASURE_Y1 + ")<->(" + $TREASURE_X2 + "," + $TREASURE_Y2 + ")";
+ return .@handled;
+}
+
+// This NPC handles traeasure dig.
+-|script|TreasureDig|32767
+{
+ end;
+
+OnDig:
+ if ($TREASURE_DISABLE) message strcharinfo(0), "Tough luck, seems there's no booty at this time!";
+ if ($TREASURE_DISABLE) end;
+ set @treasureMobs,
+ mobcount($TREASURE_MAP$, "TreasureDigAux::OnMobKill") +
+ mobcount($TREASURE_MAP$, "TreasureDigAux::OnPirateKill");
+ if ($TREASURE_DEBUG) debugmes "OnDig: mob count = " + @treasureMobs;
+ if (@treasureMobs > 300) message strcharinfo(0), "Its too crowded here to dig! Perhaps kill some mob first?";
+ if (@treasureMobs > 300) end; // Do not let users spam server by mobs indefinitely
+ set .@puppet$, "#"+strnpcinfo(0)+"#"+BL_ID;
+ set .@puppet, puppet(getmap(), POS_X, POS_Y, .@puppet$, 127);
+ if (.@puppet < 1) end; // It also denies player launching N instances at once.
+ // Set up instance of treasure hunt attempt
+ set .digger, BL_ID, .@puppet;
+ set .diggernm$, strcharinfo(0), .@puppet;
+ set .delay, 1000, .@puppet; // Initial round delay
+ set .tiles, TILES_WALKED, .@puppet;
+ if ($TREASURE_DEBUG) debugmes "OnDig: starting";
+ npctalk .@puppet$, "Digging : " + strcharinfo(0) + " starts digging in hope to find something..";
+ if ($TREASURE_MAP$ == getmap())
+ addnpctimer 4000, .@puppet$+"::OnDiggingRound"; // Start digging rounds.
+ else
+ addnpctimer 12000, .@puppet$+"::OnDiggingRound"; // Start digging rounds - fake - slow 'em a bit.
+ addnpctimer 700000, .@puppet$+"::OnDestroy"; // Failsafe quest shutdown on timeout
+ end;
+
+OnDiggingRound:
+ set .dig_round, .dig_round + 1;
+ if ($TREASURE_DEBUG) debugmes "OnDiggingRound: my name=" + strnpcinfo(0) + " digger=" + .digger;
+ if ($TREASURE_DEBUG) debugmes "OnDiggingRound: PLAYER: POSX=" + get(POS_X, .digger) + " POSY=" + get(POS_Y, .digger) + " MAP=" + getmap(.digger) + " TILES=" + get(TILES_WALKED, .digger);
+ if ($TREASURE_DEBUG) debugmes "OnDiggingRound: NPC: POSX=" + getnpcx() + " POSY=" + getnpcy() + " MAP=" + strnpcinfo(3) + " TILES=" + .tiles;
+ if (!(isloggedin(.digger))) set .failed, 2; // Treasure digger disappeared?
+ if (get(Hp, .digger) < 1) set .failed, 3; // Digger digger died?
+ if ((getmap(.digger) != strnpcinfo(3)) || // Digger left map?
+ (get(POS_X, .digger) != getnpcx()) ||
+ (get(POS_Y, .digger) != getnpcy()) ||
+ (get(TILES_WALKED, .digger) != .tiles))
+ set .failed, 4; // Has digger moved?
+ if ($TREASURE_MAP$ != strnpcinfo(3)) set .failed, 9; // Trying to dig on wrong map? Side effects avoidance.
+ if ($TREASURE_DEBUG) debugmes "OnDiggingRound: failed1=" + .failed;
+ if (.failed) goto L_DiggFail;
+ // Basic checks ok -> next round starts
+ misceffect FX_CHANNELLING_RAISE_RED, strcharinfo(0, .digger);
+ set .failed, call("treasure_dig_round", .dig_round); // core function of digging
+ if ($TREASURE_DEBUG) debugmes "OnDiggingRound: failed2=" + .failed;
+ if !($TREASURE_TURBO) set .delay, .delay + 1000; // Turbo == "skip AI moves" for test/debug: FAST battle, @hide+gm map to observe
+ if ((.failed == 9) && call("treasure_is_here") && ($TREASURE_REWARD != 0))
+ goto L_DiggFound; // MaxRound && Found treasure?! Its WIN, not .fail :)
+ if ((.failed == 9) && call("treasure_is_here") && ($TREASURE_REWARD == 0))
+ set .failed, 10; // Found it - but someone got there first? How unfortunate.
+ if (.failed) goto L_DiggFail; // catches e.g. (running to max round && no treasure)
+ else addnpctimer .delay, strnpcinfo(0)+"::OnDiggingRound";
+ end;
+
+// Invoked when digging failed for any reason, by both OnDiggingRound and OnBootyRound.
+L_DiggFail:
+ if ($TREASURE_DEBUG) debugmes "TreasureDig: digging done, .failed=" + .failed;
+ if (.failed == 2) npctalk strnpcinfo(0), "Digging : ##3##BDigger " + .diggernm$ + " disappeared... strange...";
+ elif (.failed == 3) npctalk strnpcinfo(0), "Digging : ##3##BDigger " + .diggernm$ + " haven't made it, digging site collapsed";
+ elif (.failed == 4) npctalk strnpcinfo(0), "Digging : ##3##BDigger " + .diggernm$ + " has lost focus and digging site collapsed";
+ elif (.failed == 9) npctalk strnpcinfo(0), "Digging : ##3##BDoh! Seems there's no treasure on this spot!";
+ elif (.failed == 10) npctalk strnpcinfo(0), "Digging : ##3##BDoh! Someone already digged treasure out!";
+ else /*error, etc*/ npctalk strnpcinfo(0), "Digging : ##3##BDigger " + .diggernm$ + " something went wrong, digging site collapsed";
+ destroy;
+
+L_DiggFound:
+ if !($TREASURE_TURBO) set .delay, 16000; // Configure booty rounds
+ else set .delay, 3000;
+ set .failed, 0;
+ set .round, 1;
+ monster $TREASURE_MAP$, 94, 74, "Pirates!", MontBlanc, 1, "TreasureDigAux::OnPirateKill"; // FIXME hardwired thing
+ monster $TREASURE_MAP$, 95, 66, "Pirates!", MontBlanc, 1, "TreasureDigAux::OnPirateKill";
+ monster $TREASURE_MAP$, 97, 91, "Pirates!", MontBlanc, 1, "TreasureDigAux::OnPirateKill";
+ mapannounce strnpcinfo(3), "Emo : WHAT DO WE HAVE HERE?! Contenders for OUR booty?! Pirates! Kill them all! YARRR!!", 0;
+ addnpctimer .delay, strnpcinfo(0)+"::OnBootyRound"; // Hand over -> OnBootyRound but do not destroy puppet.
+ end;
+
+// Invoked when digger survived initial digging && found treasure. Called when OnDiggRound rounds end.
+OnBootyRound:
+ if ($TREASURE_DEBUG) debugmes "OnBootyRound ->";
+ if (!(isloggedin(.digger))) set .failed, 2; // Treasure digger disappeared?
+ if (get(Hp, .digger) < 1) set .failed, 3; // Digger digger died?
+ if ((getmap(.digger) != strnpcinfo(3)) || // Digger left map?
+ (get(POS_X, .digger) != getnpcx()) ||
+ (get(POS_Y, .digger) != getnpcy()) ||
+ (get(TILES_WALKED, .digger) != .tiles))
+ set .failed, 4; // Has digger moved?
+ if (.failed) goto L_DiggFail; // Reuse digg failure handling above.
+ if (.round > 8) goto L_Finalize;
+ npctalk strnpcinfo(0), "Digging : ##3##B [TREASURE] [" + .round + "] "+ .diggernm$ + " found treasure, keep digger alive to collect collateral!";
+ if ($TREASURE_BOOTY > 0)
+ addtimer 0, "TreasureDigAux::OnCollateral10", .digger; // Collateral for supporters
+ set $TREASURE_BOOTY, $TREASURE_BOOTY - 10; // anti-milking cap, total ~20 rounds with booty top (configurable)
+ set .@round_power, call("treasure_estimate_team"); // get team level
+ if ($TREASURE_DEBUG) debugmes "treasure_dig_round: round power B0=" + .@round_power;
+ set .@round_power, (.@round_power * $TREASURE_DIFFICULTY2) / 170 + (.round / 7) + rand(3); // Adjust & randomize
+ if ($TREASURE_DEBUG) debugmes "treasure_dig_round: round power B1=" + .@round_power;
+ if (.round == 1) set .@mob, Emo; // Guy who yelled
+ else set .@mob, Ratto; // His ship ratto, also treasure contender
+ void call("spawn_in_radius", strnpcinfo(3), getnpcx(), getnpcy(), 2, .@mob, 1, "TreasureDigAux::OnPirateKill");
+ void call("spawn_in_radius", strnpcinfo(3), getnpcx(), getnpcy(), 4, Swashbuckler, .@round_power, "TreasureDigAux::OnPirateKill");
+ void call("spawn_in_radius", strnpcinfo(3), getnpcx(), getnpcy(), 4, Grenadier, .@round_power, "TreasureDigAux::OnPirateKill");
+ void call("spawn_in_radius", strnpcinfo(3), getnpcx(), getnpcy(), 4, Thug, .@round_power, "TreasureDigAux::OnPirateKill");
+ void call("spawn_in_radius", strnpcinfo(3), getnpcx(), getnpcy(), 4, Ratto, 5, "TreasureDigAux::OnPirateKill");
+ set .round, .round + 1;
+ addnpctimer .delay, strnpcinfo(0)+"::OnBootyRound"; // Hand over -> OnBootyRound but do not destroy puppet.
+ end;
+
+L_Finalize:
+ addtimer 0, "TreasureDigAux::OnMainBooty", .digger; // Hand over to final reward handler.
+ mapannounce strnpcinfo(3), "Treasure : Digger " + .diggernm$ + " found treasure!", 0;
+ npctalk strnpcinfo(0), "Digging : ##3##B [TREASURE] Victory! Treasure hunter " + .diggernm$ + " got booty!";
+ destroy;
+
+OnDestroy:
+ debugmes "TreasureDig: GLOBAL TIME OUT, this shouldn't happen"; // Failsafe logic
+ npctalk strnpcinfo(0), "Digging : ##3##BSomething went wrong, your digging site has collapsed";
+ destroy;
+
+OnInit:
+ end;
+}
+
+// This function only meant to be called by TreasureDig's puppet.
+// Main digging round handling logic happens here, spawns + dig fallouts
+// Input: Arg0: round #
+// Arg1: players str
+// Returns: 0 if all ok, 1 = failure, 9 = max round reached.
+function|script|treasure_dig_round
+{
+ set .@round, getarg(0, -1);
+ set .@res, 0; // > 0 halts next rounds, 1 = failure, 9 = "failed to find treasure"
+ set .@rounds0, 2; // # of rounds configuration.
+ set .@rounds1, 6;
+ set .@rounds2, 12;
+ set .@rounds3, 18;
+ set .@rounds4, 22;
+ if ($TREASURE_DEBUG) debugmes "treasure_digg_round: round # " +.@round + " r4=" + .@rounds4;
+ if (.@round < 1) goto L_Failed;
+ if ((.@round >= .@rounds4)) goto L_Done;
+ setarray .@mobs_0[0], CaveMaggot, HouseMaggot, VoidMaggot, Ratto; // Mobs for round spawns
+ setarray .@mobs_1[0], AngryScorpion, Hyvern, Snake, Spider, Archant, RedSlime, AngrySeaSlime, AngryGreenSlime;
+ setarray .@mobs_2[0], VoidSnake, MountainSnake, GrassSnake, SoulSnake, BlackScorpion, CrotcherScorpion, VoidBat, HuntsmanSpider;
+ setarray .@mobs_3[0], Skeleton, LadySkeleton, Wight, RedBone, SoulEater;
+ setarray .@mobs_4[0], Thug, Swashbuckler, Grenadier;
+ if (.@round <= .@rounds0) set .@mobID, .@mobs_0[rand(getarraysize(.@mobs_0))]; // Pick random mob for i-th round
+ elif (.@round <= .@rounds1) set .@mobID, .@mobs_1[rand(getarraysize(.@mobs_1))]; // Make mobs progressiveky harder
+ elif (.@round <= .@rounds2) set .@mobID, .@mobs_2[rand(getarraysize(.@mobs_2))];
+ elif (.@round <= .@rounds3) set .@mobID, .@mobs_3[rand(getarraysize(.@mobs_3))];
+ elif (.@round <= .@rounds4) set .@mobID, .@mobs_4[rand(getarraysize(.@mobs_4))];
+ else set .@mobID, MobMoubootaur; // Failsafe :)
+ set .@rand, rand(1, 100); // Does digging site blows up, releases poison or stays stable?
+ if (.@rand < 22) set .@dig_action$, "treasure_dig_poison";
+ elif (.@rand > 78) set .@dig_action$, "treasure_dig_blowup";
+ else /* 30..70 */ set .@dig_action$, "treasure_dig_stable";
+ if ($TREASURE_DEBUG) debugmes "treasure_digg_round: round # " + .dig_round + " .@rand=" + .@rand + " .@dig_action$=" + .@dig_action$;
+ void call(.@dig_action$, .dig_round); // Avoids goto spaghetti but chosen func MUST exist, or server WILL crash!
+ set .@round_power, call("treasure_estimate_team"); // get team level
+ if ($TREASURE_DEBUG) debugmes "treasure_dig_round: round power0=" + .@round_power;
+ set .@round_power, (.@round_power * $TREASURE_DIFFICULTY) / 130 + (.@round / 7) + rand(3); // Adjust & randomize
+ if ($TREASURE_DEBUG) debugmes "treasure_dig_round: round power1=" + .@round_power;
+ addtimer 0, "TreasureDigAux::OnCollateral1", .digger;
+ void call("spawn_in_radius", strnpcinfo(3), getnpcx(), getnpcy(), 4, .@mobID, .@round_power, "TreasureDigAux::OnMobKill");
+ // Show some fancy messages
+ if (.@round <= .@rounds2) npctalk strnpcinfo(0), "Digging : [" +.@round + "] " + .diggernm$ + " hit monster nest!";
+ elif (.@round <= .@rounds3) npctalk strnpcinfo(0), "Digging : [" +.@round + "] " + .diggernm$ + " Yuck! Skeleton I found moves!";
+ elif (.@round <= .@rounds4) npctalk strnpcinfo(0), "Digging : [" +.@round + "] " + .diggernm$ + " pirates got curious what this noise all about";
+ else npctalk strnpcinfo(0), "Digging : [" +.@round + "] " + .diggernm$ + " ?!?!?!";
+ return 0;
+
+L_Done:
+ if ($TREASURE_DEBUG) debugmes "treasure_digg_round: rounds done";
+ return 9; // Inform quest max rounds reached and no treasure been found.
+
+L_Failed:
+ debugmes "treasure_digg_round: call failed, arg0=" + getarg(0) + "arg1=" + getarg(1);
+ return 1;
+}
+
+// This spawns mobs in a given radius. Fallbacks to spot it it not fits map.
+// This function can be called in any context.
+// Input: Arg0: map where to spawn
+// Arg1: X
+// Arg2: Y
+// Arg3: Radius
+// Arg4: Mob id
+// Arg5: # of mobs
+// Arg6: Event for mob death (must be given, even as "")
+function|script|spawn_in_radius
+{
+ set .@map$, getarg(0, "");
+ set .@x, getarg(1, -1);
+ set .@y, getarg(2, -1);
+ set .@r, getarg(3, -1);
+ set .@mob, getarg(4, -1);
+ set .@qty, getarg(5, -1);
+ set .@evt$, getarg(6, "");
+ // Args check.
+ if ((.@map$ == "") || (.@evt$ == "6") || (.@mob < 1) ||
+ (.@x < 1) || (.@x > getmapmaxx(.@map$)) || (.@r < 1) || (.@qty < 1) ||
+ (.@y < 1) || (.@y > getmapmaxy(.@map$)))
+ goto L_Fail;
+ // Does (x-r, y-r, x+r, y+r) rectangle fits map?
+ if ((.@x > .@r) && (.@y > .@r) &&
+ ((.@x + .@r) < getmapmaxx(.@map$)) &&
+ ((.@y + .@r) < getmapmaxy(.@map$))) //Enough room? Use area.
+ areamonster .@map$, (.@x-.@r), (.@y-.@r), (.@x+.@r), .@y+.@r, "", .@mob, .@qty, .@evt$;
+ else // Rectangle does not fits, fallback
+ monster .@map$, .@x, .@y, "", .@mob, .@qty, .evt$;
+ return;
+
+L_Fail:
+ debugmes "spawn_in_radius: call failed, arg0=" + getarg(0) + " arg1=" + getarg(1) +
+ " arg2=" + getarg(2) + " arg3=" + getarg(3) + " arg4=" + getarg(4) +
+ " arg5=" + getarg(5)+ " arg6=" + getarg(6);
+ return;
+}
+
+// This function meant to be run in context of TreasureDig's *puppet* only
+function|script|treasure_dig_poison
+{
+ if ($TREASURE_DEBUG) debugmes "TreasureDigg: dig_poison";
+ npctalk strnpcinfo(0), "Digging : ["+getarg(0)+"] attempt to dig released poisonous gas!"; // Next throws events in digger (player) context
+ foreach 0, strnpcinfo(3), (getnpcx() - 7), (getnpcy() - 7), (getnpcx() + 7), (getnpcy() + 7), "TreasureDigAux::OnPoisonousGasPlayer", .digger;
+ foreach 2, strnpcinfo(3), (getnpcx() - 4), (getnpcy() - 4), (getnpcx() + 4), (getnpcy() + 4), "TreasureDigAux::OnPoisonousGasMob", .digger;
+ return;
+}
+
+// This function meant to be run in context of TreasureDig's *puppet* only
+function|script|treasure_dig_blowup
+{
+ if ($TREASURE_DEBUG) debugmes "TreasureDigg: dig_blowup";
+ npctalk strnpcinfo(0), "Digging : ["+getarg(0)+"] underground gas bubble blows up!"; // Next throws events in digger (player) context
+ foreach 0, strnpcinfo(3), (getnpcx() - 7), (getnpcy() - 7), (getnpcx() + 7), (getnpcy() + 7), "TreasureDigAux::OnBlowUpPlayer", .digger;
+ foreach 2, strnpcinfo(3), (getnpcx() - 4), (getnpcy() - 4), (getnpcx() + 4), (getnpcy() + 4), "TreasureDigAux::OnBlowUpMob", .digger;
+ return;
+}
+
+// This function meant to be run in context of TreasureDig's *puppet* only
+function|script|treasure_dig_stable
+{
+ if ($TREASURE_DEBUG) debugmes "TreasureDigg: dig_stable";
+ return;
+}
+
+// This function meant to be run in context of TreasureDig's *puppet* only
+function|script|treasure_is_here
+{
+ if ($TREASURE_DEBUG) debugmes "treasure_is_here ->";
+ set .@res, 0;
+ if (($TREASURE_MAP$ == strnpcinfo(3)) &&
+ ($TREASURE_X == getnpcx()) &&
+ ($TREASURE_Y == getnpcy()))
+ set .@res, 1;
+ if ($TREASURE_DEBUG) debugmes "treasure_is_here <- .@res=" + .@res;
+ return .@res;
+}
+
+// This function meant to be run in context of TreasureDig's *puppet* only
+function|script|treasure_estimate_team
+{
+ if ($TREASURE_DEBUG) debugmes "treasure_estimate_team: ->";
+ set @treasure_estimate_team, 1, .digger; // Prepare digger's context
+ if ($TREASURE_DEBUG) debugmes "team_est0 = " + get(@treasure_estimate_team, .digger); // This throws events in digger's context
+ foreach 0, strnpcinfo(3), (getnpcx() - 7), (getnpcy() - 7), (getnpcx() + 7), (getnpcy() + 7), "TreasureDigAux::OnPlayerEstimate", .digger;
+ if ($TREASURE_DEBUG) debugmes "team_est1 = " + get(@treasure_estimate_team, .digger); // This throws events in digger's context
+ return get(@treasure_estimate_team, .digger);
+}
+
+// This NPC handles aux things like poisoning, blow up, statuses cleanup, items placement, ...
+-|script|TreasureDigAux|32767
+{
+ end;
+
+// This cleans players statues like leftovers of poison or blowup stunning.
+// Invoked by timer set by site blowup/poison gas handlers
+OnPlayerStatusCleanup:
+ if ($TREASURE_DEBUG) debugmes "TreasureDigAux: status cleanup, BL ID=" + BL_ID;
+ if (sc_check(SC_POISON)) sc_end SC_POISON;
+ if (sc_check(SC_SLOWMOVE)) sc_end SC_SLOWMOVE;
+ if (sc_check(SC_HALT_REGENERATE)) sc_end SC_HALT_REGENERATE;
+ end;
+
+// Dig site poisonous gas - invoked per player (hurts players)
+OnPoisonousGasPlayer:
+// debugmes "TreasureDigAux: poison/player, target ID=" + @target_id;
+ misceffect FX_EMOTE_DISGUST, strcharinfo(0, @target_id);
+ sc_start SC_POISON, 1, 60, @target_id; // Poison player
+ sc_start SC_HALT_REGENERATE, 5000, 0; // Even if fails, at least halt regen.
+ addtimer 5000, "TreasureDigAux::OnPlayerStatusCleanup"; // clean PC statuses
+ end;
+
+// Dig site poisonous gas - invoked per mob (aggravates mobs)
+OnPoisonousGasMob:
+// debugmes "TreasureDigAux: poison/mob, target ID=" + @target_id;
+ set .@type, get(Class, @target_id); // Dont poison undead
+ if ((.@type != Skeleton) && (.@type != LadySkeleton) && (.@type != Wight) &&
+ (.@type != RedBone) && (.@type != SoulEater))
+ sc_start SC_POISON, 1, 10, @target_id; // Poison MOBS, too.
+ aggravate @target_id; // This aggravates mobs.
+ end;
+
+// Dig site blow up - invoked per player (hurts players)
+OnBlowUpPlayer:
+// debugmes "TreasureDigAux: blowup/player, target ID=" + @target_id;
+ misceffect FX_MEDIUM_SMOKE, strcharinfo(0, @target_id); // Show slow effect
+ sc_start SC_SLOWMOVE, 3000, 300, @target_id; // Slow player temporarily
+ sc_start SC_HALT_REGENERATE, 5000, 0; // Stop regen temporarily
+ set Hp, (get(Hp, @target_id) * 2 / 3), @target_id; // Yes explosion hurts.
+ addtimer 5000, "TreasureDigAux::OnPlayerStatusCleanup"; // clean statuses
+ end;
+
+// Dig site blow up - invoked per mob (aggravates mobs)
+OnBlowUpMob:
+// debugmes "TreasureDigAux: blowup/mob, target ID=" + @target_id;
+ injure BL_ID, @target_id, get(Hp, @target_id) / 3; // Yes, explosion can hurt mobs, too!
+ aggravate @target_id; // This aggravates them!
+ end;
+
+// Event thrown when quest mobs die.
+OnMobKill:
+ if ($TREASURE_DEBUG) debugmes "TreasureDigAux: mob killed, @mobID=" + @mobID;
+ end;
+
+OnPirateKill:
+ if ($TREASURE_DEBUG) debugmes "TreasureDigAux: pirate killed, @mobID=" + @mobID;
+ end;
+
+// Event invoked by team estimation function.
+OnPlayerEstimate:
+ if (get(Hp, @target_id) > 0) set @treasure_estimate_team, @treasure_estimate_team + (get(BaseLevel, @target_id) / 10);
+ if ($TREASURE_DEBUG) debugmes "TreasureDigAux: player_estimate: @treasure_estimate_team=" + @treasure_estimate_team;
+ end;
+
+// Emit few collateral items spawner
+OnCollateral1:
+ if ($TREASURE_DEBUG) debugmes "OnCollateral1";
+ setarray .@items1[0], SulphurPowder, IronPowder, BlackScorpionStinger, TreasureKey, Bone, Skull;
+ set .@itemID, .@items1[rand(getarraysize(.@items1))]; // random collateral
+ if ($TREASURE_DEBUG) debugmes "OnCollateral1 .@itemID=" + .@itemID;
+ makeitem .@itemID, 1, getmap(), rand(POS_X-2,POS_X+2), rand(POS_Y-2,POS_Y+2);
+ end;
+
+// Emit plenty of collateral items spawner (treasure reward mode)
+OnCollateral10:
+ if ($TREASURE_DEBUG) debugmes "OnCollateral10";
+ setarray .@items10[0], Pearl, Sapphire, Amethyst, GoldenTooth, GoldOre, CoinBag;
+ set .@count, 0;
+ goto L_RandomItems;
+
+L_RandomItems:
+ set .@itemID, .@items10[rand(getarraysize(.@items10))]; // random collateral
+ makeitem .@itemID, 4+rand(16), getmap(), rand(POS_X-3,POS_X+3), rand(POS_Y-3,POS_Y+3);
+ set .@count, .@count + 1;
+ if (.@count < 25) goto L_RandomItems;
+ end;
+
+// Hand over rewards + extra "collateral"
+// This handler invoked on digger who initiated digging session and won.
+OnMainBooty:
+ addtimer 0, "TreasureDigAux::OnCollateral10";
+ gmlog strcharinfo(0) + " found treasure!";
+ wgm strcharinfo(0) + " found treasure!";
+ getitem $TREASURE_REWARD, 1;
+ message strcharinfo(0), "Treasure Hunt : Success! You found [" + getitemlink($TREASURE_REWARD) + "]";
+ set $TREASURE_REWARD, 0; // Deny re-runs, treasure acquired
+ end;
+
+OnInit:
+ end;
+}
diff --git a/world/map/npc/guild/_import.txt b/world/map/npc/guild/_import.txt
new file mode 100644
index 00000000..80ea053b
--- /dev/null
+++ b/world/map/npc/guild/_import.txt
@@ -0,0 +1,6 @@
+// Map guild: Guild Bot Area
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+map: guild
+npc: npc/guild/_mobs.txt
+npc: npc/guild/_nodes.txt
+npc: npc/guild/_warps.txt
diff --git a/world/map/npc/guild/_mobs.txt b/world/map/npc/guild/_mobs.txt
new file mode 100644
index 00000000..5faafe87
--- /dev/null
+++ b/world/map/npc/guild/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Guild Bot Area mobs
+
diff --git a/world/map/npc/guild/_nodes.txt b/world/map/npc/guild/_nodes.txt
new file mode 100644
index 00000000..629ccce8
--- /dev/null
+++ b/world/map/npc/guild/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Guild Bot Area nodes
+
+// (no nodes)
diff --git a/world/map/npc/guild/_warps.txt b/world/map/npc/guild/_warps.txt
new file mode 100644
index 00000000..748604a3
--- /dev/null
+++ b/world/map/npc/guild/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Guild Bot Area warps
+
diff --git a/world/map/npc/items/maps.txt b/world/map/npc/items/maps.txt
index 29d54e7d..c7f33d83 100644
--- a/world/map/npc/items/maps.txt
+++ b/world/map/npc/items/maps.txt
@@ -1,5 +1,6 @@
function|script|readMap
-{
+{ // call Treasure Hunt quest. If quest handled use, skip message. See "treasure_hunt.txt"
+ if (call("treasure_try_map", @MapName$)) goto L_Return;
message strcharinfo(0), "You have no clue how to use this item yet.";
goto L_Return;
diff --git a/world/map/npc/items/shovel.txt b/world/map/npc/items/shovel.txt
index 8dcbd175..7023f2ec 100644
--- a/world/map/npc/items/shovel.txt
+++ b/world/map/npc/items/shovel.txt
@@ -1,5 +1,7 @@
function|script|useShovel
-{
+{ // call Treasure Hunt quest. If quest handled use, skip message. See "treasure_hunt.txt"
+ if (call("treasure_try_shovel", @ShovelName$)) goto L_Return;
+ // More quests can be plugged in here.
message strcharinfo(0), "You have no clue how to use this item yet.";
goto L_Return;
diff --git a/world/map/npc/prison/_import.txt b/world/map/npc/prison/_import.txt
new file mode 100644
index 00000000..ba495023
--- /dev/null
+++ b/world/map/npc/prison/_import.txt
@@ -0,0 +1,6 @@
+// Map prison: Prison
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+map: prison
+npc: npc/prison/_mobs.txt
+npc: npc/prison/_nodes.txt
+npc: npc/prison/_warps.txt
diff --git a/world/map/npc/prison/_mobs.txt b/world/map/npc/prison/_mobs.txt
new file mode 100644
index 00000000..5f4bbb79
--- /dev/null
+++ b/world/map/npc/prison/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Prison mobs
+
diff --git a/world/map/npc/prison/_nodes.txt b/world/map/npc/prison/_nodes.txt
new file mode 100644
index 00000000..fcfcd7e3
--- /dev/null
+++ b/world/map/npc/prison/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Prison nodes
+
+// (no nodes)
diff --git a/world/map/npc/prison/_warps.txt b/world/map/npc/prison/_warps.txt
new file mode 100644
index 00000000..26f3dd9d
--- /dev/null
+++ b/world/map/npc/prison/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Prison warps
+
+prison,46,22|warp|-1,-1,001-2,60,49
diff --git a/world/map/npc/scripts.conf b/world/map/npc/scripts.conf
index b2565af8..66606bd8 100644
--- a/world/map/npc/scripts.conf
+++ b/world/map/npc/scripts.conf
@@ -37,6 +37,7 @@ npc: npc/functions/ghost.txt
npc: npc/functions/vault.txt
npc: npc/functions/global_event_handler.txt
npc: npc/functions/teleport_manager.txt
+npc: npc/functions/treasure_hunt.txt
npc: npc/functions/spawns_on_mobkill.txt
// Item Functions