summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
m---------client-data0
-rw-r--r--world/map/data/011-1.wlkbin19100 -> 19100 bytes
-rw-r--r--world/map/data/012-4.wlkbin109204 -> 109204 bytes
-rw-r--r--world/map/data/013-3.wlkbin40004 -> 40004 bytes
-rw-r--r--world/map/data/099-7.wlkbin19604 -> 19604 bytes
-rw-r--r--world/map/db/const-quest.txt77
-rw-r--r--world/map/db/item_db_chest.txt2
-rw-r--r--world/map/db/item_db_foot.txt2
-rw-r--r--world/map/db/item_db_hand.txt2
-rw-r--r--world/map/db/item_db_head.txt1
-rw-r--r--world/map/db/item_db_leg.txt2
-rw-r--r--world/map/db/item_db_trinket.txt9
-rw-r--r--world/map/news.d/93-news-2021-04-22.txt61
-rw-r--r--world/map/news.d/94-news-2021-05-28.txt35
-rw-r--r--world/map/npc/001-2/heathin.txt2
-rw-r--r--world/map/npc/002-1/luca.txt112
-rw-r--r--world/map/npc/012-3/mana-seed.txt42
-rw-r--r--world/map/npc/027-3/_warps.txt2
-rw-r--r--world/map/npc/099-7/boss.txt2
-rw-r--r--world/map/npc/annuals/halloween/config.txt1
-rw-r--r--world/map/npc/annuals/halloween/munro.txt67
-rw-r--r--world/map/npc/functions/clear_vars.txt30
-rw-r--r--world/map/npc/functions/gm_island.txt35
-rw-r--r--world/map/npc/items/manapearl_item.txt29
-rw-r--r--world/map/npc/magic/level2-magic-knuckles.txt17
-rw-r--r--world/map/npc/scripts.conf1
26 files changed, 412 insertions, 119 deletions
diff --git a/client-data b/client-data
-Subproject 15893625fe70159e19db403f20f2bb04ce6bd79
+Subproject 15d304213edf016983c5a7c30286824606352fe
diff --git a/world/map/data/011-1.wlk b/world/map/data/011-1.wlk
index bcd21991..ceb12317 100644
--- a/world/map/data/011-1.wlk
+++ b/world/map/data/011-1.wlk
Binary files differ
diff --git a/world/map/data/012-4.wlk b/world/map/data/012-4.wlk
index 1d642c07..4784cc41 100644
--- a/world/map/data/012-4.wlk
+++ b/world/map/data/012-4.wlk
Binary files differ
diff --git a/world/map/data/013-3.wlk b/world/map/data/013-3.wlk
index 79e4426d..0513d327 100644
--- a/world/map/data/013-3.wlk
+++ b/world/map/data/013-3.wlk
Binary files differ
diff --git a/world/map/data/099-7.wlk b/world/map/data/099-7.wlk
index cef306af..6dc44e32 100644
--- a/world/map/data/099-7.wlk
+++ b/world/map/data/099-7.wlk
Binary files differ
diff --git a/world/map/db/const-quest.txt b/world/map/db/const-quest.txt
index 7f88c005..8e434049 100644
--- a/world/map/db/const-quest.txt
+++ b/world/map/db/const-quest.txt
@@ -90,47 +90,54 @@ DIVORCE_FEE_PER_LEVEL 500
WEDDING_MIN_LEVEL 32
// Flags for the magic quests.
-MFLAG_DRANK_POTION 1 // Character drank at least one magic potion as prerequisite for the Mana Seed quest.
-MFLAG_KNOWS_MANASEED 2 // Character has found the Mana Seed.
-MFLAG_TOUCHED_MANASEED 4 // Character has touched the Mana Seed.
-MFLAG_MANASEED_MAXEDOUT 8 // Character has touched the Mana Seed while maxed out on magic.
+MFLAG_DRANK_POTION 1 // Character drank at least one magic potion as prerequisite for the Mana Seed quest.
+MFLAG_KNOWS_MANASEED 2 // Character has found the Mana Seed.
+MFLAG_TOUCHED_MANASEED 4 // Character has touched the Mana Seed.
+MFLAG_MANASEED_MAXEDOUT 8 // Character has touched the Mana Seed while maxed out on magic.
-MFLAG_KNOWS_AULDSBEL 16 // Character has met Auldsbel.
-MFLAG_KNOWS_WYARA 32 // Character has met Wyara.
-MFLAG_KNOWS_SAGATHA 64 // Character has met Sagatha.
-MFLAG_KNOWS_MANAPOTION 128 // Has heard about the Mana Potion.
+MFLAG_KNOWS_AULDSBEL 16 // Character has met Auldsbel.
+MFLAG_KNOWS_WYARA 32 // Character has met Wyara.
+MFLAG_KNOWS_SAGATHA 64 // Character has met Sagatha.
+MFLAG_KNOWS_MANAPOTION 128 // Has heard about the Mana Potion.
-MFLAG_MANASEED_RUMOUR 256 // Has heard rumour about Mana Seed.
-MFLAG_KNOWS_CUTTREE 512 // Knows about the 'cut the tree' quest.
-MFLAG_DID_CUTTREE 1024 // Did cut off a branch from the druid tree.
-MFLAG_KNOWS_DRUIDTREE 2048 // Knows about the druid tree quest.
+MFLAG_MANASEED_RUMOUR 256 // Has heard rumour about Mana Seed.
+MFLAG_KNOWS_CUTTREE 512 // Knows about the 'cut the tree' quest.
+MFLAG_DID_CUTTREE 1024 // Did cut off a branch from the druid tree.
+MFLAG_KNOWS_DRUIDTREE 2048 // Knows about the druid tree quest.
-MFLAG_KNOWS_IMP 4096 // Knows about the imprisoned forest spirit.
-MFLAG_KNOWS_OLD_WIZARD 8192 // Knows Bjorn's old wizard.
-MFLAG_MADE_CONC_POTION 16384 // Made a concentration potion with T15 and/or T16.
-MFLAG_ELANORE_OMAR 32768 // Told Omar about Elanore's involvement.
+MFLAG_KNOWS_IMP 4096 // Knows about the imprisoned forest spirit.
+MFLAG_KNOWS_OLD_WIZARD 8192 // Knows Bjorn's old wizard.
+MFLAG_MADE_CONC_POTION 16384 // Made a concentration potion with T15 and/or T16.
+MFLAG_ELANORE_OMAR 32768 // Told Omar about Elanore's involvement.
-MFLAG_KNOWS_UNFOCUS_RECIPE 65536 // Has been told about unfocus by Luca.
+MFLAG_KNOWS_UNFOCUS_RECIPE 65536 // Has been told about unfocus by Luca.
+
+MFLAG_GOT_MANA_PEARL 131072 // Had enough magic exp to get the Mana Pearl.
// Flags set in the FLAGS variable:
-FLAG_HAS_BOWLER_BURNSDAY 1 // every year's poem at burns day, shannon gives you a bowler hat
-FLAG_OPENED_UNDERGROUND 2 // this flag is a replacement for variable Open_Underground_Palace_Barrier, which was used only as bool
-FLAG_GOT_NAEM_GLOVES 4 // this replaces Naem_Quest_Done, which was used as a bool variable
-FLAG_GOT_GRADUATIONCAP 8 // this is a bit which was to be found in Tut_var second bit
-FLAG_TOWEL_HELPED 16 // gave the towel npc the stuff he wants
-FLAG_TOWEL_COMPLETED 32 // got the towel from the towel npc
-FLAG_ANDRA_HELPED 64 // Knows Andra and agreed to help her
-FLAG_ROSSI_COMPLETED 128 // Completed the Rossi Quest
-FLAG_TUTORIAL_DONE 256 // player completed tutorial (or entered the tutorial area from outside after it was added)
-FLAG_SNOWMAN 512 // player gave candy to the snowman
-FLAG_SANTAS_HELPER 1024 // player gave presents to Santa's helper
-FLAG_HURNSMINE_CHEST 2048 // player opened the chest with the short sword in Hurnscald mines
-FLAG_GOT_BEANIEHAT 4096 // player got Beanie Copter Hat from Milly
-FLAG_DECLINED_BEANIEHAT 8192 // player declined Beanie Copter Hat from Milly
-FLAG_KESHLAM_FLAWEDLENS 16384 // player got the Flawed Lens from Keshlam's Chest
-FLAG_KESHLAM_RAREDROP 32768 // player got the super rare from Keshlam's Chest
-FLAG_BEHEADER_MASK 65536 // traded with The Beheader
-FLAG_GOT_BEHEADER_SWORD 131072 // Obtained the Beheader Sword
+FLAG_HAS_BOWLER_BURNSDAY 1 // every year's poem at burns day, shannon gives you a bowler hat
+FLAG_OPENED_UNDERGROUND 2 // this flag is a replacement for variable Open_Underground_Palace_Barrier, which was used only as bool
+FLAG_GOT_NAEM_GLOVES 4 // this replaces Naem_Quest_Done, which was used as a bool variable
+FLAG_GOT_GRADUATIONCAP 8 // this is a bit which was to be found in Tut_var second bit
+FLAG_TOWEL_HELPED 16 // gave the towel npc the stuff he wants
+FLAG_TOWEL_COMPLETED 32 // got the towel from the towel npc
+FLAG_ANDRA_HELPED 64 // Knows Andra and agreed to help her
+FLAG_ROSSI_COMPLETED 128 // Completed the Rossi Quest
+FLAG_TUTORIAL_DONE 256 // player completed tutorial (or entered the tutorial area from outside after it was added)
+FLAG_SNOWMAN 512 // player gave candy to the snowman
+FLAG_SANTAS_HELPER 1024 // player gave presents to Santa's helper
+FLAG_HURNSMINE_CHEST 2048 // player opened the chest with the short sword in Hurnscald mines
+FLAG_GOT_BEANIEHAT 4096 // player got Beanie Copter Hat from Milly
+FLAG_DECLINED_BEANIEHAT 8192 // player declined Beanie Copter Hat from Milly
+FLAG_KESHLAM_FLAWEDLENS 16384 // player got the Flawed Lens from Keshlam's Chest
+FLAG_KESHLAM_RAREDROP 32768 // player got the super rare from Keshlam's Chest
+FLAG_BEHEADER_MASK 65536 // traded with The Beheader
+FLAG_GOT_BEHEADER_SWORD 131072 // Obtained the Beheader Sword
+FLAG_LUCA_GOT_SIX_SKILLS 262144 // player learned all six Focus Skills
+FLAG_LUCA_2SKILLS_MAXED 524288 // player got 2 Focus Skills at lvl 9
+FLAG_LUCA_4SKILLS_MAXED 1048576 // player got 4 Focus Skills at lvl 9
+FLAG_LUCA_6SKILLS_MAXED 2097152 // player got 6 Focus Skills at lvl 9
+FLAG_LUCA_FIX 4194304 // fixed a bug
// Flags for the battle caves.
BATTLE_CAVE1 1
diff --git a/world/map/db/item_db_chest.txt b/world/map/db/item_db_chest.txt
index 5383dc34..c9c75f54 100644
--- a/world/map/db/item_db_chest.txt
+++ b/world/map/db/item_db_chest.txt
@@ -19,7 +19,7 @@
689, ShortTankTop, 5, 600, 300, 8, 0, 2, 0, -4, 0, 2, 512, 0, 0, 0, {}, {}
720, SilkRobe, 5, 8000, 4000, 5, 0, 5, 0, 0, 0, 2, 512, 0, 0, 0, {}, {}
726, GMRobe, 5, 8000, 4000, 40, 0, 5, 0, 0, 0, 2, 512, 0, 0, 0, {}, {callfunc "RestrictedItem";}
-755, AssassinShirt, 5, 10000, 3000, 15, 0, 15, 0, -5, 0, 2, 512, 0, 90, 0, {}, {callfunc "BrawlingItem"; bonus bAgi, 15;bonus bSpeedAddRate, 10;bonus bFlee, 20;bonus bHit, 20;bonus bMaxHP, 200;}
+755, AssassinShirt, 5, 10000, 3000, 15, 0, 20, 0, -5, 0, 2, 512, 0, 90, 0, {}, {callfunc "BrawlingItem"; bonus bAgi, 15; bonus bSpeedAddRate, 10; bonus bFlee, 20; bonus bHit, 20; bonus bMaxHP, 200;}
767, TerraniteChestArmor, 5, 100000, 3000, 800, 0, 20, 0, -70, 0, 2, 512, 0, 0, 0, {}, {bonus bDex, 1;bonus bMdef, 10;}
782, ForestArmor, 5, 3000, 1500, 40, 0, 10, 0, -20, 0, 2, 512, 0, 0, 0, {}, {bonus bDex, 3;}
783, PlatynaRedDress, 5, 100000, 50000, 35, 0, 15, 0, 3, 0, 2, 512, 0, 0, 0, {}, {}
diff --git a/world/map/db/item_db_foot.txt b/world/map/db/item_db_foot.txt
index 2b744c3b..b65b6335 100644
--- a/world/map/db/item_db_foot.txt
+++ b/world/map/db/item_db_foot.txt
@@ -4,7 +4,7 @@
655, FurBoots, 5, 5000, 600, 50, 0, 3, 0, -3, 0, 2, 64, 0, 0, 0, {}, {}
734, BlackBoots, 5, 20000, 3000, 25, 0, 3, 0, -10, 0, 2, 64, 0, 0, 0, {}, {}
735, CottonBoots, 5, 2000, 500, 10, 0, 1, 0, 1, 0, 2, 64, 0, 0, 0, {}, {}
-757, AssassinBoots, 5, 7000, 2000, 10, 0, 3, 0, -3, 0, 2, 64, 0, 0, 0, {}, {callfunc "BrawlingItem";bonus bAgi, 4;}
+757, AssassinBoots, 5, 7000, 2000, 10, 0, 4, 0, -3, 0, 2, 64, 0, 0, 0, {}, {callfunc "BrawlingItem"; bonus bAgi, 4; bonus bSpeedAddRate, 5; bonus bFlee, 5;}
792, BromenalBoots, 5, 8000, 500, 30, 0, 1, 0, -2, 0, 2, 64, 0, 0, 0, {}, {}
876, WarlordBoots, 5, 19000, 2000, 550, 0, 5, 0, -22, 0, 2, 64, 0, 0, 0, {}, {}
2150, RedCottonBoots, 5, 2000, 500, 30, 0, 1, 0, 1, 0, 2, 64, 0, 0, 0, {}, {}
diff --git a/world/map/db/item_db_hand.txt b/world/map/db/item_db_hand.txt
index 8765af1e..3e98da26 100644
--- a/world/map/db/item_db_hand.txt
+++ b/world/map/db/item_db_hand.txt
@@ -4,7 +4,7 @@
532, LeatherGloves, 5, 6000, 2000, 20, 0, 4, 0, -20, 0, 2, 4, 0, 0, 0, {}, {}
563, WinterGloves, 5, 6000, 3000, 20, 0, 3, 0, -15, 0, 2, 4, 0, 0, 0, {}, {}
741, CottonGloves, 5, 2000, 500, 10, 0, 1, 0, -10, 0, 2, 4, 0, 0, 0, {}, {}
-756, AssassinGloves, 5, 7000, 2000, 9, 0, 3, 0, -3, 0, 2, 4, 0, 0, 0, {}, {callfunc "BrawlingItem";bonus bAgi, 4;}
+756, AssassinGloves, 5, 7000, 2000, 9, 15, 4, 0, -3, 0, 2, 4, 0, 0, 0, {}, {callfunc "BrawlingItem"; bonus bAgi, 4; bonus bCritical, 5; bonus bAspdRate, 5;}
794, BromenalGloves, 5, 6000, 2000, 40, 0, 4, 0, -20, 0, 2, 4, 0, 0, 0, {}, {}
868, SilkGloves, 5, 5000, 2500, 4, 0, 1, 0, 0, 0, 2, 4, 0, 0, 0, {}, {}
2160, RedCottonGloves, 5, 2000, 500, 20, 0, 1, 0, -10, 0, 2, 4, 0, 0, 0, {}, {}
diff --git a/world/map/db/item_db_head.txt b/world/map/db/item_db_head.txt
index 798adefe..c6ffe993 100644
--- a/world/map/db/item_db_head.txt
+++ b/world/map/db/item_db_head.txt
@@ -226,3 +226,4 @@
5264, BlueWolfHelmet, 5, 1000, 500, 50, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {}, {}
5266, CloverHat, 5, 1000, 500, 50, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {}, {bonus bLuk, 1;}
//ID, Name___________________, Type, Price, Sell, Weight, ATK, DEF, Range, Mbonus, Slot, Gender, Loc, wLV, eLV, View, {UseScript}, {EquipScript}
+5267, AssassinMask, 5, 30000, 3000, 10, 0, 6, 0, -5, 0, 2, 256, 0, 0, 0, {}, {callfunc "BrawlingItem"; bonus bMdef, 5; bonus bAgi, 9; bonus bDex, 1; bonus bMaxHP, 70; bonus bDoubleAddRate, 15; bonus bCritical, 15; bonus bAspdRate, 15;}
diff --git a/world/map/db/item_db_leg.txt b/world/map/db/item_db_leg.txt
index 455550f7..5ff86274 100644
--- a/world/map/db/item_db_leg.txt
+++ b/world/map/db/item_db_leg.txt
@@ -5,7 +5,7 @@
632, CottonSkirt, 5, 1000, 500, 10, 0, 4, 0, -8, 0, 2, 1, 0, 1, 0, {}, {}
642, JeansChaps, 5, 2000, 1000, 60, 0, 6, 0, -12, 0, 2, 1, 0, 0, 0, {}, {}
648, CottonTrousers, 5, 1500, 750, 25, 0, 4, 0, -6, 0, 2, 1, 0, 1, 0, {}, {}
-731, AssassinPants, 5, 10000, 3000, 20, 0, 4, 0, -5, 0, 2, 1, 0, 0, 0, {}, {callfunc "BrawlingItem";bonus bAgi, 5;}
+731, AssassinPants, 5, 10000, 3000, 20, 0, 5, 0, -5, 0, 2, 1, 0, 0, 0, {}, {callfunc "BrawlingItem"; bonus bAgi, 5; bonus bSpeedAddRate, 5; bonus bFlee, 5;}
768, TerraniteLegs, 5, 10000, 3000, 30, 0, 5, 0, -8, 0, 2, 1, 0, 0, 0, {}, {bonus bAgi, 1;bonus bMdef, 5;}
771, Miniskirt, 5, 1000, 500, 8, 0, 4, 0, -8, 0, 2, 1, 0, 1, 0, {}, {}
796, BromenalLegs, 5, 2000, 1000, 150, 0, 6, 0, -12, 0, 2, 1, 0, 0, 0, {}, {}
diff --git a/world/map/db/item_db_trinket.txt b/world/map/db/item_db_trinket.txt
index 1ce7db96..f230466d 100644
--- a/world/map/db/item_db_trinket.txt
+++ b/world/map/db/item_db_trinket.txt
@@ -9,7 +9,7 @@
832, GoldenFourLeafAmulet, 5, 40000, 4000, 10, 0, 0, 0, 0, 0, 2, 8, 0, 0, 0, {}, {bonus bLuk, 4;}
865, Grimoire, 5, 5000, 2500, 100, 0, 0, 0, 5, 0, 2, 8, 0, 0, 0, {}, {bonus bMaxSP, 30;}
879, HeartOfIsis, 5, 70000, 35000, 40, 0, 0, 0, 0, 0, 2, 8, 0, 85, 0, {}, {bonus bMaxHPrate, 15; bonus bHPrecovRate, 65;}
-1227, EnchantersAmulet, 5, 1000, 1, 1, 0, 0, 0, 0, 0, 2, 16, 0, 0, 0, {}, {bonus bHit, 22;}
+1227, EnchantersAmulet, 5, 0, 0, 1, 0, 0, 0, 0, 0, 2, 16, 0, 0, 0, {}, {bonus bHit, 22;}
1244, DarkTalisman, 5, 0, 0, 0, 0, 0, 0, 100, 0, 2, 8, 0, 0, 0, {}, {bonus bMdef, 30;}
4008, DiamondRing, 5, 5000, 2500, 1, 0, 0, 0, 0, 0, 2, 128, 0, 0, 0, {}, {bonus bVit, 1;}
4009, RubyRing, 5, 5000, 2500, 1, 0, 0, 0, 0, 0, 2, 128, 0, 0, 0, {}, {bonus bStr, 1;}
@@ -19,5 +19,8 @@
4013, AmethystRing, 5, 5000, 2500, 1, 0, 0, 0, 0, 0, 2, 128, 0, 0, 0, {}, {bonus bDex, 1;}
4014, SimpleRing, 5, 100000, 2500, 1, 0, 0, 0, 0, 0, 2, 128, 0, 0, 0, {}, {}
677, HeartNecklace, 5, 2500, 0, 10, 0, 0, 0, 0, 0, 2, 8, 0, 0, 0, {}, {}
-5252, GuardianWings, 5, 0, 0, 1, 0, 0, 0, 0, 0, 2, 16, 0, 0, 0, {}, {}
-5253, MageRing, 5, 0, 0, 1, 0, 0, 0, 0, 0, 2, 128, 0, 0, 0, {}, {bonus bInt, 1;}
+5252, GuardianWings, 5, 0, 0, 1, 0, 0, 0, 0, 0, 2, 16, 0, 0, 0, {}, {}
+5253, MageRing, 5, 0, 0, 1, 0, 0, 0, 0, 0, 2, 128, 0, 0, 0, {}, {bonus bInt, 1;}
+5268, AssassinRing, 5, 0, 0, 1, 0, 0, 0, 0, 0, 2, 128, 0, 0, 0, {}, {callfunc "BrawlingItem"; bonus bAgi, 1; bonus bCritical, 5; bonus bAspdRate, 5;}
+5269, AssassinAmulet, 5, 0, 0, 1, 0, 0, 0, 0, 0, 2, 16, 0, 0, 0, {}, {callfunc "BrawlingItem"; bonus bAgi, 1; bonus bDoubleAddRate, 5; bonus bHit, 25;}
+5270, ManaPearl, 5, 0, 0, 0, 0, 0, 0, 11, 0, 2, 16, 0, 0, 0, {}, {callfunc "ManaPearlItem"; bonus bInt, 1; bonus bMdef, 11; bonus bMaxSP, 55;}
diff --git a/world/map/news.d/93-news-2021-04-22.txt b/world/map/news.d/93-news-2021-04-22.txt
new file mode 100644
index 00000000..08a0285f
--- /dev/null
+++ b/world/map/news.d/93-news-2021-04-22.txt
@@ -0,0 +1,61 @@
+{title:The Mana World}
+{date:2021-04-23}
+
+{b}ManaPlus Self-Fork Release{/b}
+
+By popular demand, Jak1's official ManaPlus fork will now be provided by default
+on our Downloads page. {link:https://themanaworld.org/downloads}
+
+It has only a few improvements over the original ManaPlus.
+You're not required to use it, but it is a good idea if you plan playing in...
+
+{b}TMW Evolved Public Beta{/b}
+
+The Mana World Development Team has a surprise for all of you.
+
+We have decided to deprecate tmwAthena definitely. Instructions for building TMWA
+servers were already removed from the wiki; Other tmwa sections will soon follow.
+
+We have begun a side-project, dubbed TMW Evolved (working name "The Mess World").
+It contains all TMW Legacy data, as faithfully as possible, but in the new, modern
+Evol2 servers. It has new bugs which needs to be found, reported and fixed.
+
+There is no ETA for when the player data will be transfered from TMW Legacy to
+TMW Evolved and the current tmwa-based server shut down forever.
+
+If you are using the self-fork release, select our test server, opt for using
+"TMW Evolved updates", and then select "TMW Evolved" for world selection.
+
+Official ManaPlus will require a workaround which will be on forums later.
+
+{b}FAQ - How different is Evolved from Legacy?{/b}
+
+TMW Evolved {b}is{/b} TMW Legacy, but in a more modern code. This does have some
+implications, specially with magic. Spells will remain mostly the same, but the
+way to obtain and use them have changed. It also allows stats to go up to 100 and
+max level is 140 instead of 135. Not that we think anyone will reach, anyway.
+
+We're also working on Magic Tier 3 code, which was flat out ruled as impractical
+to be done on TMWA but is not so impossible on Evol2 code. At least that's what
+was on the comments. It is not on the beta yet.
+
+{b}FAQ - What about TMW rEvolt?{/b}
+
+It is not immediately affected by these changes.
+
+For now, please bear with us (and help us!) to make TMW Legacy transition between
+code bases the smoothest possible; And in due time we'll reveal the plan for TMW
+rEvolt and Steam Release.
+
+{b}Unofficial new quests{/b}
+
+To celebrate the end of TMWA and because HoraK volunteered to write them, we have
+added a new quest for the Assassin Gear. As Magic Tier 2 is finally coming to a
+close, HoraK added a nice parting gift for it.
+
+Both new quests will be different on TMW Evolved. For one, because Magic Tier 3.
+For two, because magic in overall has changed.
+
+That's it for today, HAVE FUN!
+
+{author:Jesusalva}
diff --git a/world/map/news.d/94-news-2021-05-28.txt b/world/map/news.d/94-news-2021-05-28.txt
new file mode 100644
index 00000000..6de82ecb
--- /dev/null
+++ b/world/map/news.d/94-news-2021-05-28.txt
@@ -0,0 +1,35 @@
+{title:IRC Migration}
+{date:2021-05-28}
+
+{b}We are moving to Libera.Chat on IRC.{/b}
+
+Game Chat, Discord Integration, et cetera are unaffected. All our bots have moved
+as well. For those whom do not use IRC directly, no action is needed.
+
+There weren't many votes on our community poll, but after witnessing with our own
+eyes a channel being taken over without any sort of warning or whatsoever, we
+have decided that Freenode no longer provides any sort of reliable operational
+stability.
+
+We are NOT taking this decision based on rumors - both true and fake - which are
+circulating from both sides; We are taking this decision based on what we witnessed.
+
+Therefore, we have settled to move all our infrastructure to Libera Chat, based
+among other things, on the community will.
+
+This is a strictly technical decision; Operational stability has always been a
+priority for us, from backup to the choice of applications which are exposed to
+the public, like our wiki and forums backbone. IRC is no exception to this rule.
+
+We also have decided to DROP the bridge which was maintaining a link between
+both networks for the reasons mentioned above. Therefore, users connecting to the
+old network WON'T be able to receive any support whatsoever. Our other bots have
+also withdrawn.
+
+{b}Improvements to #upmarmu{/b}
+
+dangerDuck did some improvements to upmarmu (brawling skill).
+
+Check it out if you are a brawler!
+
+{author:Jesusalva}
diff --git a/world/map/npc/001-2/heathin.txt b/world/map/npc/001-2/heathin.txt
index 321b6e0f..53cc8b68 100644
--- a/world/map/npc/001-2/heathin.txt
+++ b/world/map/npc/001-2/heathin.txt
@@ -20,7 +20,7 @@
if (QL_TERRANITE_ARMOR == 2) && (BaseLevel >= 70) goto L_Hood;
if (QL_TERRANITE_ARMOR == 2) && (BaseLevel >= 60) goto L_Forge_Thanks;
if (QL_TERRANITE_ARMOR == 1) && (BaseLevel >= 60) goto L_Forge_Award;
- if (BaseLevel >= 60) goto L_Start;
+ if (QL_TERRANITE_ARMOR < 1) && (BaseLevel >= 60) goto L_Start;
mes "[Heathin]";
mes "\"Hello, friend. I am Heathin, a smith of exotic metals. \"";
diff --git a/world/map/npc/002-1/luca.txt b/world/map/npc/002-1/luca.txt
index 8db36cf9..4a05b757 100644
--- a/world/map/npc/002-1/luca.txt
+++ b/world/map/npc/002-1/luca.txt
@@ -4,6 +4,18 @@
{
set @EXP_BRAWLING, 2000;
+ setarray @luca_reward_item_id,
+ 756, // "AssassinGloves", // player learned all six Focus Skills
+ 757, // "AssassinBoots", // player got 2 Focus Skills at lvl 9
+ 731, // "AssassinPants", // player got 4 Focus Skills at lvl 9
+ 5267; // "AssassinMask"; // player got 6 Focus Skills at lvl 9
+
+ setarray @luca_reward_exp,
+ 60000, // player learned all six Focus Skills
+ 70000, // player got 2 Focus Skills at lvl 9
+ 80000, // player got 4 Focus Skills at lvl 9
+ 90000; // player got 6 Focus Skills at lvl 9
+
if (BaseLevel >= 35) goto L_teach;
if (BaseLevel >= 25) goto L_teach_soon;
@@ -38,6 +50,8 @@ L_teach_soon:
goto L_Close;
L_teach:
+ // Bugfix death
+ if (!(FLAGS & FLAG_LUCA_FIX)) goto L_Nev;
if (getskilllv(SKILL_POOL)) goto L_teachmore;
mes "[Luca the Hunter]";
@@ -214,6 +228,104 @@ L_teachmore:
mes "[Luca the Hunter]";
mes "\"Good to see you again!\"";
next;
+
+ set @mallard, getskilllv(SKILL_MALLARDS_EYE);
+ set @brawling, getskilllv(SKILL_BRAWLING);
+ set @speed, getskilllv(SKILL_SPEED);
+ set @poison, getskilllv(SKILL_RESIST_POISON);
+ set @astralsoul, getskilllv(SKILL_ASTRAL_SOUL);
+ set @raging, getskilllv(SKILL_RAGING);
+
+ set @lvl9skills, 0;
+ if (@mallard >= 9)
+ set @lvl9skills, @lvl9skills + 1;
+ if (@brawling >= 9)
+ set @lvl9skills, @lvl9skills + 1;
+ if (@speed >= 9)
+ set @lvl9skills, @lvl9skills + 1;
+ if (@poison >= 9)
+ set @lvl9skills, @lvl9skills + 1;
+ if (@astralsoul >= 9)
+ set @lvl9skills, @lvl9skills + 1;
+ if (@raging >= 9)
+ set @lvl9skills, @lvl9skills + 1;
+
+ if ((FLAGS & FLAG_LUCA_GOT_SIX_SKILLS) &&
+ (FLAGS & FLAG_LUCA_2SKILLS_MAXED) &&
+ (FLAGS & FLAG_LUCA_4SKILLS_MAXED) &&
+ (FLAGS & FLAG_LUCA_6SKILLS_MAXED)) goto L_CheckSkillsEnd;
+
+ if (!(@mallard && @brawling && @speed && @poison && @astralsoul && @raging) || (FLAGS & FLAG_LUCA_GOT_SIX_SKILLS)) goto L_Check2Skills;
+ mes "[Luca the Hunter]";
+ mes "I've heard you learned all six Focus Skills.";
+ mes "For that, the other teachers and I want to give you a reward!";
+ next;
+ getinventorylist;
+ if (@inventorylist_count == 100) goto L_InvFull;
+ mes "Here take the [@@" + @luca_reward_item_id[0] + "|@@].";
+ mes "[" + @luca_reward_exp[0] + " experience points]";
+ getitem @luca_reward_item_id[0], 1;
+ getexp @luca_reward_exp[0], 0;
+ set FLAGS, FLAGS | FLAG_LUCA_GOT_SIX_SKILLS;
+ next;
+ goto L_Check2Skills;
+
+L_Check2Skills:
+ if (@lvl9skills < 2 || (FLAGS & FLAG_LUCA_2SKILLS_MAXED)) goto L_Check4Skills;
+ mes "[Luca the Hunter]";
+ mes "I sense you have maxed out two Focus Skills!";
+ mes "For that I give you a reward!";
+ next;
+ getinventorylist;
+ if (@inventorylist_count == 100) goto L_InvFull;
+ mes "Here take the [@@" + @luca_reward_item_id[1] + "|@@].";
+ mes "[" + @luca_reward_exp[1] + " experience points]";
+ getitem @luca_reward_item_id[1], 1;
+ getexp @luca_reward_exp[1], 0;
+ set FLAGS, FLAGS | FLAG_LUCA_2SKILLS_MAXED;
+ next;
+ goto L_Check4Skills;
+
+L_Check4Skills:
+ if (@lvl9skills < 4 || (FLAGS & FLAG_LUCA_4SKILLS_MAXED)) goto L_Check6Skills;
+ mes "[Luca the Hunter]";
+ mes "I sense you have maxed out four Focus Skills!";
+ mes "For that I give the next reward!";
+ next;
+ getinventorylist;
+ if (@inventorylist_count == 100) goto L_InvFull;
+ mes "Here take the [@@" + @luca_reward_item_id[2] + "|@@].";
+ mes "[" + @luca_reward_exp[2] + " experience points]";
+ getitem @luca_reward_item_id[2], 1;
+ getexp @luca_reward_exp[2], 0;
+ set FLAGS, FLAGS | FLAG_LUCA_4SKILLS_MAXED;
+ next;
+ goto L_Check6Skills;
+
+L_Check6Skills:
+ if (@lvl9skills < 6 || (FLAGS & FLAG_LUCA_6SKILLS_MAXED)) goto L_CheckSkillsEnd;
+ mes "[Luca the Hunter]";
+ mes "I sense you have maxed out six Focus Skills!";
+ mes "For that I give the final reward!";
+ next;
+ getinventorylist;
+ if (@inventorylist_count == 100) goto L_InvFull;
+ mes "Here take the [@@" + @luca_reward_item_id[3] + "|@@].";
+ mes "[" + @luca_reward_exp[3] + " experience points]";
+ getitem @luca_reward_item_id[3], 1;
+ getexp @luca_reward_exp[3], 0;
+ set FLAGS, FLAGS | FLAG_LUCA_6SKILLS_MAXED;
+ next;
+ goto L_CheckSkillsEnd;
+
+L_InvFull:
+ mes "[Luca the Hunter]";
+ mes "Looks like your bag is full!";
+ mes "To get your reward you must make some room first!";
+ next;
+ goto L_CheckSkillsEnd;
+
+L_CheckSkillsEnd:
goto L_teachmore2;
L_teachmore2:
diff --git a/world/map/npc/012-3/mana-seed.txt b/world/map/npc/012-3/mana-seed.txt
index c75125e4..33536c7a 100644
--- a/world/map/npc/012-3/mana-seed.txt
+++ b/world/map/npc/012-3/mana-seed.txt
@@ -48,6 +48,14 @@
// Set up SkillUp function
set @SUP_id, SKILL_MAGIC;
set @SUP_name$, "Magic";
+
+ set @manapearl_id, 5270;
+ set @manapearl_exp, 500000;
+ set @manapearl_lvl_for_reward, 50;
+ set @manapearl_mexp_for_reward, 5404;
+ // At 5404 #abizit returned always:
+ // "Magic flows naturally from you, readily and with ease. Your understanding of what you can currently control at present is flawless, far beyond your requirements to cast magic at this level.";
+ // So i take this as needed magic exp.
if (@has_magic)
goto L_magic_start;
@@ -138,6 +146,40 @@ L_nomagic_destroy:
// Magic main menu ------------------------------------------------------------
L_magic_start:
+
+ if (MAGIC_FLAGS & MFLAG_GOT_MANA_PEARL) goto L_ManaPearlEnd;
+
+ set @debug_mask, 65535;
+ set @debug_shift, 0;
+ set @mexp, ((MAGIC_EXPERIENCE & @debug_mask) >> @debug_shift);
+
+ if (! (@mexp >= @manapearl_mexp_for_reward && BaseLevel >= @manapearl_lvl_for_reward)) goto L_ManaPearlEnd;
+ getinventorylist;
+ if (countitem("Pearl") > 1 && @inventorylist_count == 100) goto L_ManaPearlHasNoRoom;
+ //if (!countitem("Pearl") >= 1) goto L_ManaPearlEnd; // without the brackets it crashes the server!
+ if (!(countitem("Pearl") >= 1)) goto L_ManaPearlEnd;
+ mes "As you approach the Mana Seed, suddenly a pearl from your bag starts to float and shine in a blue light.";
+ mes "It seems since Magic flows naturally from you, you and the Mana Seed are in resonance now";
+ mes "and the crystalline structure of that pearl was different from other pearls which let it also resonate with that flow.";
+ mes "Since this resonance is established, the Mana Pearl channels some power from the Mana Seed to you.";
+ next;
+ mes "You gain the [@@" + @manapearl_id + "|@@].";
+ mes "[" + @manapearl_exp + " experience points]";
+ delitem "Pearl", 1;
+ getitem @manapearl_id, 1;
+ getexp @manapearl_exp, 0;
+ set MAGIC_FLAGS, MAGIC_FLAGS | MFLAG_GOT_MANA_PEARL;
+ next;
+ goto L_ManaPearlEnd;
+
+L_ManaPearlHasNoRoom:
+ mes "Something in your bag is moving but it seems it is stuck since your bag too stuffed.";
+ mes "Maybe you should make some room first.";
+ next;
+ goto L_ManaPearlEnd;
+
+L_ManaPearlEnd:
+
mes "[Mana Seed]";
mes "The Mana Seed is still in the same place as during your last visit, spreading its light throughout the cavern.";
mes "What would you like to do?";
diff --git a/world/map/npc/027-3/_warps.txt b/world/map/npc/027-3/_warps.txt
index d2f23685..3b589a77 100644
--- a/world/map/npc/027-3/_warps.txt
+++ b/world/map/npc/027-3/_warps.txt
@@ -2,4 +2,4 @@
// Crypt Basement warps
027-3,26,67|warp|2,-1,027-2,36,77
-027-3,126,98|warp|1,-1,027-4,125,18
+027-3,127,99|warp|1,-1,027-4,125,18
diff --git a/world/map/npc/099-7/boss.txt b/world/map/npc/099-7/boss.txt
index 8ce2ef8d..7362690f 100644
--- a/world/map/npc/099-7/boss.txt
+++ b/world/map/npc/099-7/boss.txt
@@ -770,7 +770,7 @@ L_No:
}
099-7,73,20,0|script|#NoobKytty01|400,0,0
{
- warp "099-7", 72, 17;
+ warp "099-7", 74, 17;
end;
}
099-7,73,17,0|script|#NoobKytty02|400,0,0
diff --git a/world/map/npc/annuals/halloween/config.txt b/world/map/npc/annuals/halloween/config.txt
index 6eb20caa..ffe9dfbe 100644
--- a/world/map/npc/annuals/halloween/config.txt
+++ b/world/map/npc/annuals/halloween/config.txt
@@ -327,7 +327,6 @@ L_Main:
set $@halloween_react_veryscary$[$@n], "\"Darkest day of my life, blacker then the darkest chocolate.\"";
set $@halloween_num_npcs, $@n + 1;
- set $@halloween_all_npc_bits, -1 << (32 - $@halloween_num_npcs);
set $@n, 0;
diff --git a/world/map/npc/annuals/halloween/munro.txt b/world/map/npc/annuals/halloween/munro.txt
index e664680e..cbbbf233 100644
--- a/world/map/npc/annuals/halloween/munro.txt
+++ b/world/map/npc/annuals/halloween/munro.txt
@@ -29,73 +29,8 @@ L_Halloween:
L_Exit:
close;
-
-// Spawn Tormenta if not alive and HW
-OnClock0000:
- goto L_Tormenta;
-OnClock0100:
- goto L_Tormenta;
-OnClock0200:
- goto L_Tormenta;
-OnClock0300:
- goto L_Tormenta;
-OnClock0400:
- goto L_Tormenta;
-OnClock0500:
- goto L_Tormenta;
-OnClock0600:
- goto L_Tormenta;
-OnClock0700:
- goto L_Tormenta;
-OnClock0800:
- goto L_Tormenta;
-OnClock0900:
- goto L_Tormenta;
-OnClock1000:
- goto L_Tormenta;
-OnClock1100:
- goto L_Tormenta;
-OnClock1200:
- goto L_Tormenta;
-OnClock1300:
- goto L_Tormenta;
-OnClock1400:
- goto L_Tormenta;
-OnClock1500:
- goto L_Tormenta;
-OnClock1600:
- goto L_Tormenta;
-OnClock1700:
- goto L_Tormenta;
-OnClock1800:
- goto L_Tormenta;
-OnClock1900:
- goto L_Tormenta;
-OnClock2000:
- goto L_Tormenta;
-OnClock2100:
- goto L_Tormenta;
-OnClock2200:
- goto L_Tormenta;
-OnClock2300:
- goto L_Tormenta;
-
-// Debug
-OnInit:
- goto L_Tormenta;
-
-L_Tormenta:
- // This code is going to get removed so I'll reuse it this time...
- if (gettime(5) != 17)
- end;
-
- areamonster "008-1", 20, 20, 142, 100, "", 1037, 100;
- areamonster "007-1", 20, 20, 124, 100, "", 1037, 80;
- areamonster "011-1", 20, 20, 130, 120, "", 1037, 80;
- areamonster "018-1", 20, 20, 180, 100, "", 1037, 140;
- end;
-
}
+
function|script|SpawnMunro
{
if ($@halloween_time)
diff --git a/world/map/npc/functions/clear_vars.txt b/world/map/npc/functions/clear_vars.txt
index e98def7d..2abfb118 100644
--- a/world/map/npc/functions/clear_vars.txt
+++ b/world/map/npc/functions/clear_vars.txt
@@ -18,6 +18,7 @@ function|script|ClearVariables
callsub S_Flags;
callsub S_Bitmask;
callsub S_BlueSage;
+ callsub S_Luca;
callsub S_Easter;
callsub S_Easter2008;
@@ -236,6 +237,35 @@ S_BlueSage:
set QUEST_BlueSage, QUEST_BlueSage & ~((1<<5)|(1<<6)|(1<<7));
return;
+S_Luca:
+ if (FLAGS & FLAG_LUCA_FIX) goto S_Return;
+ if (FLAGS & FLAG_LUCA_6SKILLS_MAXED) goto S_Luca6;
+ if (FLAGS & FLAG_LUCA_4SKILLS_MAXED) goto S_Luca4;
+ if (FLAGS & FLAG_LUCA_2SKILLS_MAXED) goto S_Luca2;
+ goto S_LucaX;
+
+S_Luca6:
+ if (countitem("AssassinMask") < 1) goto S_Return;
+ delitem "AssassinMask", 1;
+ set FLAGS, FLAGS ^ FLAG_LUCA_6SKILLS_MAXED;
+ goto S_Luca4;
+
+S_Luca4:
+ if (countitem("AssassinPants") < 1) goto S_Return;
+ delitem "AssassinPants", 1;
+ set FLAGS, FLAGS ^ FLAG_LUCA_4SKILLS_MAXED;
+ goto S_Luca2;
+
+S_Luca2:
+ if (countitem("AssassinBoots") < 1) goto S_Return;
+ delitem "AssassinBoots", 1;
+ set FLAGS, FLAGS ^ FLAG_LUCA_2SKILLS_MAXED;
+ goto S_LucaX;
+
+S_LucaX:
+ set FLAGS, FLAGS | FLAG_LUCA_FIX;
+ return;
+
S_Flags:
if (Open_Underground_Palace_Barrier)
set FLAGS, FLAGS | FLAG_OPENED_UNDERGROUND;
diff --git a/world/map/npc/functions/gm_island.txt b/world/map/npc/functions/gm_island.txt
index 3e1127c4..e2763bbf 100644
--- a/world/map/npc/functions/gm_island.txt
+++ b/world/map/npc/functions/gm_island.txt
@@ -9,6 +9,41 @@ OnInit:
disablenpc "Gm Event#3";
end;
}
+-|script|#Puppet|32767
+{
+ mes "You found me! Now please send my coordinates to staff.";
+ close;
+
+OnSpawn:
+ if (GM < G_SYSOP) goto L_GM;
+ callfunc "argv_splitter";
+ if (@argv$[4] == "") goto L_Failed;
+ set $@PMAP$, @argv$[0];
+ set $@PX, @argv$[1];
+ set $@PY, @argv$[2];
+ set $@PNAME$, @argv$[3];
+ set $@PNPC, @argv$[4];
+ if (puppet($@PMAP$, $@PX, $@PY, $@PNAME$, $@PNPC) > 0)
+ gmlog "@puppeter " + @args$;
+ set $@PMAP$, "";
+ set $@PX, 0;
+ set $@PY, 0;
+ set $@PNAME$, "";
+ set $@PNPC, 0;
+ end;
+
+L_Failed:
+ message strcharinfo(0), "Syntax: @puppeter MAP X Y NAME NPCID";
+ end;
+
+L_GM:
+ message strcharinfo(0), "puppeter : GM command is level "+ G_SYSOP +", but you are level " + GM;
+ end;
+
+OnInit:
+ registercmd chr(ATCMD_SYMBOL) + "puppeter", strnpcinfo(0)+"::OnSpawn";
+ end;
+}
function|script|GmWarp
{
if ($@GM_EVENT_WARP == 1) warp "028-1", 110, 30;
diff --git a/world/map/npc/items/manapearl_item.txt b/world/map/npc/items/manapearl_item.txt
new file mode 100644
index 00000000..9c1f1c04
--- /dev/null
+++ b/world/map/npc/items/manapearl_item.txt
@@ -0,0 +1,29 @@
+// The Mana Pearl can only be used when player has a natural mana flow:
+// "Magic flows naturally from you, readily and with ease. Your understanding of what you can currently control at present is flawless, far beyond your requirements to cast magic at this level.";
+// Variables passed to this script:
+// @slotId The slot in which the item would have been equipped in. This is passed automagically when called in an equip script.
+
+function|script|ManaPearlItem
+{
+
+ set @debug_mask, 65535;
+ set @debug_shift, 0;
+ set @mexp, ((MAGIC_EXPERIENCE & @debug_mask) >> @debug_shift);
+
+ set @manapearl_mexp_needed, 5404;
+
+ if ( @mexp >= @manapearl_mexp_needed )
+ goto L_Return;
+
+ message strcharinfo(0), "You are not expirienced enough to keep up the mana flow that is needed to stay in resonance with the Mana Pearl.";
+
+ // This is for debug
+ if (debug)
+ goto L_Return;
+
+ callfunc "UnequipLater";
+ goto L_Return;
+
+L_Return:
+ return;
+}
diff --git a/world/map/npc/magic/level2-magic-knuckles.txt b/world/map/npc/magic/level2-magic-knuckles.txt
index 95ab9120..ab74d474 100644
--- a/world/map/npc/magic/level2-magic-knuckles.txt
+++ b/world/map/npc/magic/level2-magic-knuckles.txt
@@ -1,10 +1,11 @@
-|script|magic-knuckles|32767
{
- if(call("magic_checks")) end;
+ if (call("magic_checks")) end;
if (Sp < 20) end;
if (getskilllv(SKILL_MAGIC) < .level) end;
set .@level, getskilllv(.school);
if (.@level < .level) end;
+ if (getequipid(equip_hand1) != -1 || getequipid(equip_hand2) != -1) end;
if (.@level <= 3 && countitem("Beer") >= 1) delitem "Beer", 1;
elif (.@level <= 3) end;
set @_M_BLOCK, 1; // block casting, until the timer clears it
@@ -13,16 +14,18 @@
set Sp, Sp - 20;
misceffect FX_MAGIC_KNUCKLE_CAST, strcharinfo(0);
setarray @upmarmuspell[0],
- @spellpower,
- ((@spellpower/10) + 10), // charges
- (((200 - Agi) * 1300) / 200), // delay
- Str; // do not allow to equip light armor, cast, and then switch to heavy armor to get bonus str
+ (BASE_ATK), // dmg
+ ((Dex/3) + 10), // charges
+ (sqrt(300 - (Agi * 2))+(5/2)), // delay
+ Agi, // dmg bonus
+ ((sqrt(BaseLevel + 9) + Str) * 2); // do not allow to equip light armor, cast, and then switch to heavy armor to get bonus str
callfunc "magic_exp";
goto L_FreeRecast;
OnAttack:
+ if (getequipid(equip_hand1) != -1 || getequipid(equip_hand2) != -1) goto OnDischarge;
if (target(BL_ID, @target_id, 22) != 22) goto L_FreeRecast; // 0x10 | 0x02 | 0x04
- void call("melee_damage", @upmarmuspell[0], @target_id, (30 + rand((@upmarmuspell[3]*2) + 5)));
+ void call("elt_damage", @upmarmuspell[0], (@upmarmuspell[3] + @upmarmuspell[4]), ELT_WATER, ELT_FIRE, FX_NONE);
set @upmarmuspell[1], @upmarmuspell[1] - 1;
goto L_FreeRecast;
@@ -39,7 +42,7 @@ OnDischarge:
end;
OnSetRecast:
- overrideattack @upmarmuspell[2], 1, ATTACK_ICON_GENERIC, OVERRIDE_KNUCKLES, strnpcinfo(0)+"::OnAttack", @upmarmuspell[1];
+ overrideattack (@upmarmuspell[2] * @upmarmuspell[2]), 1, ATTACK_ICON_GENERIC, OVERRIDE_KNUCKLES, strnpcinfo(0)+"::OnAttack", @upmarmuspell[1]; // delay neeeds to be squared
end;
OnInit:
diff --git a/world/map/npc/scripts.conf b/world/map/npc/scripts.conf
index de85f8b4..114cc924 100644
--- a/world/map/npc/scripts.conf
+++ b/world/map/npc/scripts.conf
@@ -54,6 +54,7 @@ npc: npc/items/drugs.txt
npc: npc/items/max_stat.txt
npc: npc/items/nobow_item.txt
npc: npc/items/love_potion.txt
+npc: npc/items/manapearl_item.txt
import: npc/_import.txt
// magic