summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--GNUmakefile9
m---------client-data0
m---------tools0
-rw-r--r--world/map/conf/.gitignore4
-rwxr-xr-xworld/map/conf/build-magic.sh19
-rw-r--r--world/map/conf/magic-anchors.sex66
-rw-r--r--world/map/conf/magic-config.sex68
-rw-r--r--world/map/conf/magic-level0.sex39
-rw-r--r--world/map/conf/magic-level1.sex494
-rw-r--r--world/map/conf/magic-level2.sex1462
-rw-r--r--world/map/conf/magic-level3.sex179
-rw-r--r--world/map/conf/magic-level4.sex3
-rw-r--r--world/map/conf/magic-level5.sex55
-rw-r--r--world/map/conf/magic-misc.sex217
-rw-r--r--world/map/conf/magic-procedures.sex345
-rw-r--r--world/map/conf/magic-quests.sex154
-rw-r--r--world/map/conf/magic-quickdebug.sex10
-rw-r--r--world/map/conf/magic-secrets.sex.template241
-rw-r--r--world/map/conf/permissions.txt21
-rw-r--r--world/map/conf/permissions_local.txt.example10
-rw-r--r--world/map/conf/tmwa-map.conf19
-rw-r--r--world/map/data/005-3.wlkbin13924 -> 19192 bytes
-rw-r--r--world/map/data/006-1.wlkbin19604 -> 19604 bytes
-rw-r--r--world/map/data/009-8.wlkbin0 -> 5304 bytes
-rw-r--r--world/map/data/011-6.wlkbin90004 -> 90004 bytes
-rw-r--r--world/map/data/016-2.wlkbin0 -> 5304 bytes
-rw-r--r--world/map/data/043-4.wlkbin44004 -> 44004 bytes
-rw-r--r--world/map/data/resnametable.txt2
-rw-r--r--world/map/db/const-magic.txt62
-rw-r--r--world/map/db/const.txt81
-rw-r--r--world/map/db/item_db_generic.txt1
-rw-r--r--world/map/db/item_db_head.txt24
-rw-r--r--world/map/db/item_db_trinket.txt1
-rw-r--r--world/map/db/params.txt56
-rw-r--r--world/map/db/quest-log.txt2
-rw-r--r--world/map/news.d/57-v2016.4.21.txt15
-rw-r--r--world/map/npc/001-1/_import.txt1
-rw-r--r--world/map/npc/001-1/_mobs.txt31
-rw-r--r--world/map/npc/001-1/_nodes.txt4
-rw-r--r--world/map/npc/001-1/ched.txt20
-rw-r--r--world/map/npc/001-1/children.txt2
-rw-r--r--world/map/npc/001-1/guards.txt2
-rw-r--r--world/map/npc/001-2/_import.txt1
-rw-r--r--world/map/npc/001-2/_mobs.txt6
-rw-r--r--world/map/npc/001-2/_nodes.txt16
-rw-r--r--world/map/npc/001-2/government_building.txt8
-rw-r--r--world/map/npc/001-2/pauline.txt10
-rw-r--r--world/map/npc/001-2/tondar.txt2
-rw-r--r--world/map/npc/001-2/wizards.txt100
-rw-r--r--world/map/npc/001-3/_import.txt1
-rw-r--r--world/map/npc/001-3/_mobs.txt13
-rw-r--r--world/map/npc/001-3/_nodes.txt4
-rw-r--r--world/map/npc/002-1/_import.txt1
-rw-r--r--world/map/npc/002-1/_mobs.txt57
-rw-r--r--world/map/npc/002-1/_nodes.txt4
-rw-r--r--world/map/npc/002-1/_warps.txt2
-rw-r--r--world/map/npc/002-1/elanore.txt16
-rw-r--r--world/map/npc/002-2/_import.txt1
-rw-r--r--world/map/npc/002-2/_mobs.txt6
-rw-r--r--world/map/npc/002-2/_nodes.txt4
-rw-r--r--world/map/npc/002-2/stranger.txt235
-rw-r--r--world/map/npc/002-3/_import.txt1
-rw-r--r--world/map/npc/002-3/_mobs.txt6
-rw-r--r--world/map/npc/002-3/_nodes.txt4
-rw-r--r--world/map/npc/002-4/_import.txt1
-rw-r--r--world/map/npc/002-4/_mobs.txt49
-rw-r--r--world/map/npc/002-4/_nodes.txt4
-rw-r--r--world/map/npc/002-5/_import.txt1
-rw-r--r--world/map/npc/002-5/_mobs.txt65
-rw-r--r--world/map/npc/002-5/_nodes.txt4
-rw-r--r--world/map/npc/004-3/_import.txt1
-rw-r--r--world/map/npc/004-3/_mobs.txt35
-rw-r--r--world/map/npc/004-3/_nodes.txt4
-rw-r--r--world/map/npc/004-4/_import.txt1
-rw-r--r--world/map/npc/004-4/_mobs.txt39
-rw-r--r--world/map/npc/004-4/_nodes.txt4
-rw-r--r--world/map/npc/004-5/_import.txt1
-rw-r--r--world/map/npc/004-5/_mobs.txt45
-rw-r--r--world/map/npc/004-5/_nodes.txt4
-rw-r--r--world/map/npc/005-3/_import.txt1
-rw-r--r--world/map/npc/005-3/_mobs.txt29
-rw-r--r--world/map/npc/005-3/_nodes.txt4
-rw-r--r--world/map/npc/005-3/_warps.txt18
-rw-r--r--world/map/npc/006-1/_import.txt1
-rw-r--r--world/map/npc/006-1/_mobs.txt73
-rw-r--r--world/map/npc/006-1/_nodes.txt4
-rw-r--r--world/map/npc/006-1/_warps.txt5
-rw-r--r--world/map/npc/006-1/spirit.txt4
-rw-r--r--world/map/npc/006-1/tree.txt6
-rw-r--r--world/map/npc/006-2/_import.txt1
-rw-r--r--world/map/npc/006-2/_mobs.txt6
-rw-r--r--world/map/npc/006-2/_nodes.txt4
-rw-r--r--world/map/npc/006-3/_import.txt1
-rw-r--r--world/map/npc/006-3/_mobs.txt78
-rw-r--r--world/map/npc/006-3/_nodes.txt4
-rw-r--r--world/map/npc/006-3/_warps.txt4
-rw-r--r--world/map/npc/007-1/_import.txt1
-rw-r--r--world/map/npc/007-1/_mobs.txt69
-rw-r--r--world/map/npc/007-1/_nodes.txt4
-rw-r--r--world/map/npc/007-2/_import.txt1
-rw-r--r--world/map/npc/007-2/_mobs.txt6
-rw-r--r--world/map/npc/007-2/_nodes.txt4
-rw-r--r--world/map/npc/007-2/witch.txt46
-rw-r--r--world/map/npc/008-1/_import.txt1
-rw-r--r--world/map/npc/008-1/_mobs.txt69
-rw-r--r--world/map/npc/008-1/_nodes.txt4
-rw-r--r--world/map/npc/008-1/annualeaster.txt323
-rw-r--r--world/map/npc/008-1/hinnak.txt2
-rw-r--r--world/map/npc/009-1/_import.txt1
-rw-r--r--world/map/npc/009-1/_mobs.txt36
-rw-r--r--world/map/npc/009-1/_nodes.txt4
-rw-r--r--world/map/npc/009-2/_import.txt1
-rw-r--r--world/map/npc/009-2/_mobs.txt6
-rw-r--r--world/map/npc/009-2/_nodes.txt4
-rw-r--r--world/map/npc/009-2/misc.txt2
-rw-r--r--world/map/npc/009-2/selim.txt5
-rw-r--r--world/map/npc/009-2/wyara.txt6
-rw-r--r--world/map/npc/009-3/_import.txt1
-rw-r--r--world/map/npc/009-3/_mobs.txt34
-rw-r--r--world/map/npc/009-3/_nodes.txt4
-rw-r--r--world/map/npc/009-3/sword.txt4
-rw-r--r--world/map/npc/009-4/_import.txt1
-rw-r--r--world/map/npc/009-4/_mobs.txt35
-rw-r--r--world/map/npc/009-4/_nodes.txt4
-rw-r--r--world/map/npc/009-5/_import.txt1
-rw-r--r--world/map/npc/009-5/_mobs.txt6
-rw-r--r--world/map/npc/009-5/_nodes.txt4
-rw-r--r--world/map/npc/009-6/_import.txt1
-rw-r--r--world/map/npc/009-6/_mobs.txt6
-rw-r--r--world/map/npc/009-6/_nodes.txt4
-rw-r--r--world/map/npc/009-6/brodomir.txt2
-rw-r--r--world/map/npc/009-7/_import.txt1
-rw-r--r--world/map/npc/009-7/_mobs.txt6
-rw-r--r--world/map/npc/009-7/_nodes.txt4
-rw-r--r--world/map/npc/009-7/eventHandler.txt2
-rw-r--r--world/map/npc/009-7/rouge.txt4
-rw-r--r--world/map/npc/009-8/_import.txt8
-rw-r--r--world/map/npc/009-8/_mobs.txt3
-rw-r--r--world/map/npc/009-8/_nodes.txt4
-rw-r--r--world/map/npc/009-8/_warps.txt5
-rw-r--r--world/map/npc/009-8/celestia.txt306
-rw-r--r--world/map/npc/009-8/mapflags.txt2
-rw-r--r--world/map/npc/010-1/_import.txt1
-rw-r--r--world/map/npc/010-1/_mobs.txt92
-rw-r--r--world/map/npc/010-1/_nodes.txt4
-rw-r--r--world/map/npc/010-2/_import.txt1
-rw-r--r--world/map/npc/010-2/_mobs.txt6
-rw-r--r--world/map/npc/010-2/_nodes.txt4
-rw-r--r--world/map/npc/011-1/_import.txt1
-rw-r--r--world/map/npc/011-1/_mobs.txt99
-rw-r--r--world/map/npc/011-1/_nodes.txt4
-rw-r--r--world/map/npc/011-1/auldsbel.txt20
-rw-r--r--world/map/npc/011-3/_import.txt1
-rw-r--r--world/map/npc/011-3/_mobs.txt20
-rw-r--r--world/map/npc/011-3/_nodes.txt4
-rw-r--r--world/map/npc/011-4/_import.txt1
-rw-r--r--world/map/npc/011-4/_mobs.txt40
-rw-r--r--world/map/npc/011-4/_nodes.txt4
-rw-r--r--world/map/npc/011-6/_import.txt1
-rw-r--r--world/map/npc/011-6/_mobs.txt140
-rw-r--r--world/map/npc/011-6/_nodes.txt4
-rw-r--r--world/map/npc/012-1/_import.txt1
-rw-r--r--world/map/npc/012-1/_mobs.txt83
-rw-r--r--world/map/npc/012-1/_nodes.txt4
-rw-r--r--world/map/npc/012-3/_import.txt1
-rw-r--r--world/map/npc/012-3/_mobs.txt53
-rw-r--r--world/map/npc/012-3/_nodes.txt4
-rw-r--r--world/map/npc/012-3/mana-seed.txt2
-rw-r--r--world/map/npc/012-4/_import.txt1
-rw-r--r--world/map/npc/012-4/_mobs.txt174
-rw-r--r--world/map/npc/012-4/_nodes.txt4
-rw-r--r--world/map/npc/013-1/_import.txt1
-rw-r--r--world/map/npc/013-1/_mobs.txt91
-rw-r--r--world/map/npc/013-1/_nodes.txt4
-rw-r--r--world/map/npc/013-1/sagatha.txt14
-rw-r--r--world/map/npc/013-2/_import.txt1
-rw-r--r--world/map/npc/013-2/_mobs.txt6
-rw-r--r--world/map/npc/013-2/_nodes.txt4
-rw-r--r--world/map/npc/013-2/wizard.txt2
-rw-r--r--world/map/npc/013-3/_import.txt1
-rw-r--r--world/map/npc/013-3/_mobs.txt107
-rw-r--r--world/map/npc/013-3/_nodes.txt4
-rw-r--r--world/map/npc/014-1/_import.txt1
-rw-r--r--world/map/npc/014-1/_mobs.txt98
-rw-r--r--world/map/npc/014-1/_nodes.txt4
-rw-r--r--world/map/npc/014-1/wedding-officiator.txt12
-rw-r--r--world/map/npc/014-3/_import.txt1
-rw-r--r--world/map/npc/014-3/_mobs.txt13
-rw-r--r--world/map/npc/014-3/_nodes.txt4
-rw-r--r--world/map/npc/015-1/_import.txt1
-rw-r--r--world/map/npc/015-1/_mobs.txt76
-rw-r--r--world/map/npc/015-1/_nodes.txt4
-rw-r--r--world/map/npc/015-1/sword.txt6
-rw-r--r--world/map/npc/015-3/_import.txt1
-rw-r--r--world/map/npc/015-3/_mobs.txt29
-rw-r--r--world/map/npc/015-3/_nodes.txt4
-rw-r--r--world/map/npc/016-1/_import.txt1
-rw-r--r--world/map/npc/016-1/_mobs.txt66
-rw-r--r--world/map/npc/016-1/_nodes.txt4
-rw-r--r--world/map/npc/016-2/_import.txt6
-rw-r--r--world/map/npc/016-2/_mobs.txt3
-rw-r--r--world/map/npc/016-2/_nodes.txt4
-rw-r--r--world/map/npc/016-2/_warps.txt5
-rw-r--r--world/map/npc/017-1/_import.txt1
-rw-r--r--world/map/npc/017-1/_mobs.txt117
-rw-r--r--world/map/npc/017-1/_nodes.txt4
-rw-r--r--world/map/npc/017-2/_import.txt1
-rw-r--r--world/map/npc/017-2/_mobs.txt6
-rw-r--r--world/map/npc/017-2/_nodes.txt4
-rw-r--r--world/map/npc/017-3/_import.txt1
-rw-r--r--world/map/npc/017-3/_mobs.txt6
-rw-r--r--world/map/npc/017-3/_nodes.txt4
-rw-r--r--world/map/npc/017-4/_import.txt1
-rw-r--r--world/map/npc/017-4/_mobs.txt6
-rw-r--r--world/map/npc/017-4/_nodes.txt4
-rw-r--r--world/map/npc/017-4/waric.txt12
-rw-r--r--world/map/npc/017-9/_import.txt1
-rw-r--r--world/map/npc/017-9/_mobs.txt6
-rw-r--r--world/map/npc/017-9/_nodes.txt4
-rw-r--r--world/map/npc/017-9/npcs.txt17
-rw-r--r--world/map/npc/018-1/_import.txt1
-rw-r--r--world/map/npc/018-1/_mobs.txt125
-rw-r--r--world/map/npc/018-1/_nodes.txt4
-rw-r--r--world/map/npc/018-2/_import.txt1
-rw-r--r--world/map/npc/018-2/_mobs.txt13
-rw-r--r--world/map/npc/018-2/_nodes.txt4
-rw-r--r--world/map/npc/018-3/_import.txt1
-rw-r--r--world/map/npc/018-3/_mobs.txt107
-rw-r--r--world/map/npc/018-3/_nodes.txt4
-rw-r--r--world/map/npc/019-1/_import.txt1
-rw-r--r--world/map/npc/019-1/_mobs.txt34
-rw-r--r--world/map/npc/019-1/_nodes.txt4
-rw-r--r--world/map/npc/019-3/_import.txt1
-rw-r--r--world/map/npc/019-3/_mobs.txt20
-rw-r--r--world/map/npc/019-3/_nodes.txt4
-rw-r--r--world/map/npc/019-4/_import.txt1
-rw-r--r--world/map/npc/019-4/_mobs.txt34
-rw-r--r--world/map/npc/019-4/_nodes.txt4
-rw-r--r--world/map/npc/020-1/_import.txt1
-rw-r--r--world/map/npc/020-1/_mobs.txt13
-rw-r--r--world/map/npc/020-1/_nodes.txt4
-rw-r--r--world/map/npc/020-2/_import.txt1
-rw-r--r--world/map/npc/020-2/_mobs.txt6
-rw-r--r--world/map/npc/020-2/_nodes.txt4
-rw-r--r--world/map/npc/020-3/_import.txt1
-rw-r--r--world/map/npc/020-3/_mobs.txt24
-rw-r--r--world/map/npc/020-3/_nodes.txt4
-rw-r--r--world/map/npc/021-3/_import.txt1
-rw-r--r--world/map/npc/021-3/_mobs.txt51
-rw-r--r--world/map/npc/021-3/_nodes.txt4
-rw-r--r--world/map/npc/025-1/_import.txt1
-rw-r--r--world/map/npc/025-1/_mobs.txt71
-rw-r--r--world/map/npc/025-1/_nodes.txt4
-rw-r--r--world/map/npc/025-3/_import.txt1
-rw-r--r--world/map/npc/025-3/_mobs.txt34
-rw-r--r--world/map/npc/025-3/_nodes.txt4
-rw-r--r--world/map/npc/025-4/_import.txt1
-rw-r--r--world/map/npc/025-4/_mobs.txt15
-rw-r--r--world/map/npc/025-4/_nodes.txt4
-rw-r--r--world/map/npc/026-1/_import.txt1
-rw-r--r--world/map/npc/026-1/_mobs.txt63
-rw-r--r--world/map/npc/026-1/_nodes.txt4
-rw-r--r--world/map/npc/027-1/_import.txt1
-rw-r--r--world/map/npc/027-1/_mobs.txt75
-rw-r--r--world/map/npc/027-1/_nodes.txt4
-rw-r--r--world/map/npc/027-2/_import.txt1
-rw-r--r--world/map/npc/027-2/_mobs.txt46
-rw-r--r--world/map/npc/027-2/_nodes.txt16
-rw-r--r--world/map/npc/027-3/_import.txt1
-rw-r--r--world/map/npc/027-3/_mobs.txt47
-rw-r--r--world/map/npc/027-3/_nodes.txt4
-rw-r--r--world/map/npc/027-4/_import.txt1
-rw-r--r--world/map/npc/027-4/_mobs.txt26
-rw-r--r--world/map/npc/027-4/_nodes.txt4
-rw-r--r--world/map/npc/027-5/_import.txt1
-rw-r--r--world/map/npc/027-5/_mobs.txt45
-rw-r--r--world/map/npc/027-5/_nodes.txt4
-rw-r--r--world/map/npc/027-6/_import.txt1
-rw-r--r--world/map/npc/027-6/_mobs.txt6
-rw-r--r--world/map/npc/027-6/_nodes.txt4
-rw-r--r--world/map/npc/027-6/general_krukan.txt4
-rw-r--r--world/map/npc/027-7/_import.txt1
-rw-r--r--world/map/npc/027-7/_mobs.txt6
-rw-r--r--world/map/npc/027-7/_nodes.txt4
-rw-r--r--world/map/npc/027-7/general_razha.txt4
-rw-r--r--world/map/npc/027-8/_import.txt1
-rw-r--r--world/map/npc/027-8/_mobs.txt6
-rw-r--r--world/map/npc/027-8/_nodes.txt4
-rw-r--r--world/map/npc/027-8/general_terogan.txt4
-rw-r--r--world/map/npc/028-1/_import.txt1
-rw-r--r--world/map/npc/028-1/_mobs.txt6
-rw-r--r--world/map/npc/028-1/_nodes.txt4
-rw-r--r--world/map/npc/028-3/_import.txt1
-rw-r--r--world/map/npc/028-3/_mobs.txt6
-rw-r--r--world/map/npc/028-3/_nodes.txt4
-rw-r--r--world/map/npc/029-1/_import.txt1
-rw-r--r--world/map/npc/029-1/_mobs.txt43
-rw-r--r--world/map/npc/029-1/_nodes.txt4
-rw-r--r--world/map/npc/029-1/barrier.txt2
-rw-r--r--world/map/npc/029-2/_import.txt2
-rw-r--r--world/map/npc/029-2/_mobs.txt13
-rw-r--r--world/map/npc/029-2/_nodes.txt16
-rw-r--r--world/map/npc/029-2/alchemy.txt99
-rw-r--r--world/map/npc/029-2/morgan.txt8
-rw-r--r--world/map/npc/029-2/sorfina.txt36
-rw-r--r--world/map/npc/029-2/tanisha.txt2
-rw-r--r--world/map/npc/029-3/_import.txt1
-rw-r--r--world/map/npc/029-3/_mobs.txt6
-rw-r--r--world/map/npc/029-3/_nodes.txt4
-rw-r--r--world/map/npc/029-3/parua.txt6
-rw-r--r--world/map/npc/030-2/_import.txt1
-rw-r--r--world/map/npc/030-2/_mobs.txt6
-rw-r--r--world/map/npc/030-2/_nodes.txt4
-rw-r--r--world/map/npc/030-3/_import.txt1
-rw-r--r--world/map/npc/030-3/_mobs.txt6
-rw-r--r--world/map/npc/030-3/_nodes.txt4
-rw-r--r--world/map/npc/030-4/_import.txt1
-rw-r--r--world/map/npc/030-4/_mobs.txt6
-rw-r--r--world/map/npc/030-4/_nodes.txt4
-rw-r--r--world/map/npc/030-4/mana_battery.txt6
-rw-r--r--world/map/npc/031-1/_import.txt1
-rw-r--r--world/map/npc/031-1/_mobs.txt34
-rw-r--r--world/map/npc/031-1/_nodes.txt4
-rw-r--r--world/map/npc/031-2/_import.txt1
-rw-r--r--world/map/npc/031-2/_mobs.txt6
-rw-r--r--world/map/npc/031-2/_nodes.txt4
-rw-r--r--world/map/npc/031-3/_import.txt1
-rw-r--r--world/map/npc/031-3/_mobs.txt224
-rw-r--r--world/map/npc/031-3/_nodes.txt4
-rw-r--r--world/map/npc/031-4/_import.txt1
-rw-r--r--world/map/npc/031-4/_mobs.txt6
-rw-r--r--world/map/npc/031-4/_nodes.txt4
-rw-r--r--world/map/npc/031-4/cindyCave.txt4
-rw-r--r--world/map/npc/032-3/_import.txt1
-rw-r--r--world/map/npc/032-3/_mobs.txt71
-rw-r--r--world/map/npc/032-3/_nodes.txt4
-rw-r--r--world/map/npc/033-1/_import.txt1
-rw-r--r--world/map/npc/033-1/_mobs.txt34
-rw-r--r--world/map/npc/033-1/_nodes.txt4
-rw-r--r--world/map/npc/033-1/kimarr.txt2
-rw-r--r--world/map/npc/034-1/_import.txt1
-rw-r--r--world/map/npc/034-1/_mobs.txt48
-rw-r--r--world/map/npc/034-1/_nodes.txt4
-rw-r--r--world/map/npc/034-2/_import.txt1
-rw-r--r--world/map/npc/034-2/_mobs.txt6
-rw-r--r--world/map/npc/034-2/_nodes.txt4
-rw-r--r--world/map/npc/035-2/_import.txt1
-rw-r--r--world/map/npc/035-2/_mobs.txt6
-rw-r--r--world/map/npc/035-2/_nodes.txt4
-rw-r--r--world/map/npc/036-2/_import.txt1
-rw-r--r--world/map/npc/036-2/_mobs.txt6
-rw-r--r--world/map/npc/036-2/_nodes.txt4
-rw-r--r--world/map/npc/043-3/_import.txt1
-rw-r--r--world/map/npc/043-3/_mobs.txt49
-rw-r--r--world/map/npc/043-3/_nodes.txt4
-rw-r--r--world/map/npc/043-3/_warps.txt2
-rw-r--r--world/map/npc/043-4/_import.txt3
-rw-r--r--world/map/npc/043-4/_mobs.txt84
-rw-r--r--world/map/npc/043-4/_nodes.txt4
-rw-r--r--world/map/npc/043-4/_warps.txt3
-rw-r--r--world/map/npc/045-1/_import.txt1
-rw-r--r--world/map/npc/045-1/_mobs.txt66
-rw-r--r--world/map/npc/045-1/_nodes.txt4
-rw-r--r--world/map/npc/046-1/_import.txt1
-rw-r--r--world/map/npc/046-1/_mobs.txt63
-rw-r--r--world/map/npc/046-1/_nodes.txt4
-rw-r--r--world/map/npc/046-3/_import.txt1
-rw-r--r--world/map/npc/046-3/_mobs.txt66
-rw-r--r--world/map/npc/046-3/_nodes.txt4
-rw-r--r--world/map/npc/047-1/_import.txt1
-rw-r--r--world/map/npc/047-1/_mobs.txt95
-rw-r--r--world/map/npc/047-1/_nodes.txt4
-rw-r--r--world/map/npc/047-3/_import.txt1
-rw-r--r--world/map/npc/047-3/_mobs.txt78
-rw-r--r--world/map/npc/047-3/_nodes.txt4
-rw-r--r--world/map/npc/048-2/_import.txt1
-rw-r--r--world/map/npc/048-2/_mobs.txt6
-rw-r--r--world/map/npc/048-2/_nodes.txt4
-rw-r--r--world/map/npc/051-1/_import.txt1
-rw-r--r--world/map/npc/051-1/_mobs.txt20
-rw-r--r--world/map/npc/051-1/_nodes.txt4
-rw-r--r--world/map/npc/051-3/_import.txt1
-rw-r--r--world/map/npc/051-3/_mobs.txt78
-rw-r--r--world/map/npc/051-3/_nodes.txt4
-rw-r--r--world/map/npc/051-3/ambush.txt4
-rw-r--r--world/map/npc/051-3/reinforcements.txt4
-rw-r--r--world/map/npc/052-1/_import.txt1
-rw-r--r--world/map/npc/052-1/_mobs.txt13
-rw-r--r--world/map/npc/052-1/_nodes.txt4
-rw-r--r--world/map/npc/052-1/channelling.txt10
-rw-r--r--world/map/npc/052-2/_import.txt1
-rw-r--r--world/map/npc/052-2/_mobs.txt6
-rw-r--r--world/map/npc/052-2/_nodes.txt4
-rw-r--r--world/map/npc/052-2/lobby.txt2
-rw-r--r--world/map/npc/052-2/partyroom.txt8
-rw-r--r--world/map/npc/052-2/storage.txt10
-rw-r--r--world/map/npc/055-1/_import.txt1
-rw-r--r--world/map/npc/055-1/_mobs.txt100
-rw-r--r--world/map/npc/055-1/_nodes.txt16
-rw-r--r--world/map/npc/055-1/pumpkins.txt124
-rw-r--r--world/map/npc/055-3/_import.txt1
-rw-r--r--world/map/npc/055-3/_mobs.txt52
-rw-r--r--world/map/npc/055-3/_nodes.txt4
-rw-r--r--world/map/npc/056-2/_import.txt1
-rw-r--r--world/map/npc/056-2/_mobs.txt6
-rw-r--r--world/map/npc/056-2/_nodes.txt4
-rw-r--r--world/map/npc/057-1/_import.txt1
-rw-r--r--world/map/npc/057-1/_mobs.txt97
-rw-r--r--world/map/npc/057-1/_nodes.txt16
-rw-r--r--world/map/npc/_import.txt2
-rw-r--r--world/map/npc/annuals/fathertime.txt8
-rw-r--r--world/map/npc/annuals/halloween/debug.txt1
-rw-r--r--world/map/npc/annuals/xmas/debug.txt1
-rw-r--r--world/map/npc/botcheck/_import.txt1
-rw-r--r--world/map/npc/botcheck/_mobs.txt6
-rw-r--r--world/map/npc/botcheck/_nodes.txt4
-rw-r--r--world/map/npc/commands/_import.txt10
-rw-r--r--world/map/npc/commands/_procedures.txt53
-rw-r--r--world/map/npc/commands/changesex.txt32
-rw-r--r--world/map/npc/commands/class.txt31
-rw-r--r--[-rwxr-xr-x]world/map/npc/commands/debug.txt (renamed from world/map/npc/functions/debug.txt)46
-rw-r--r--world/map/npc/commands/destroynpc.txt35
-rw-r--r--world/map/npc/commands/marry.txt69
-rw-r--r--world/map/npc/commands/numa.txt132
-rw-r--r--world/map/npc/commands/pullrabbit.txt (renamed from world/map/npc/items/magic_gm_top_hat.txt)16
-rw-r--r--world/map/npc/commands/remotecmd.txt62
-rw-r--r--world/map/npc/commands/zeny.txt79
-rw-r--r--world/map/npc/functions/DyeConfig.txt4
-rw-r--r--world/map/npc/functions/clear_vars.txt3
-rw-r--r--world/map/npc/functions/default_npc_checks.txt1
-rw-r--r--world/map/npc/functions/game_rules.txt19
-rw-r--r--world/map/npc/functions/global_event_handler.txt10
-rw-r--r--world/map/npc/functions/hug.txt23
-rw-r--r--world/map/npc/functions/mob_points.txt11
-rw-r--r--world/map/npc/functions/quiz.txt5
-rw-r--r--world/map/npc/functions/strangerquiz.txt8
-rw-r--r--world/map/npc/functions/superdebug.txt65
-rw-r--r--world/map/npc/items/check_wand.txt65
-rw-r--r--world/map/npc/magic/README.md54
-rw-r--r--world/map/npc/magic/_import.txt42
-rw-r--r--world/map/npc/magic/_procedures.txt170
-rw-r--r--world/map/npc/magic/level0-wand.txt76
-rw-r--r--world/map/npc/magic/level1-aggravate.txt23
-rw-r--r--world/map/npc/magic/level1-detect-magic.txt30
-rw-r--r--world/map/npc/magic/level1-experience.txt41
-rw-r--r--world/map/npc/magic/level1-flare-dart.txt45
-rw-r--r--world/map/npc/magic/level1-grow-alizarin.txt38
-rw-r--r--world/map/npc/magic/level1-grow-cobalt.txt38
-rw-r--r--world/map/npc/magic/level1-grow-gamboge.txt38
-rw-r--r--world/map/npc/magic/level1-grow-mauve.txt38
-rw-r--r--world/map/npc/magic/level1-lesser-heal.txt52
-rw-r--r--world/map/npc/magic/level1-magic-blade.txt48
-rw-r--r--world/map/npc/magic/level1-make-sulphur.txt25
-rw-r--r--world/map/npc/magic/level1-sense-spouse.txt25
-rw-r--r--world/map/npc/magic/level1-summon-maggots.txt53
-rw-r--r--world/map/npc/magic/level1-transmute-wood.txt37
-rw-r--r--world/map/npc/magic/level2-arrow-hail.txt115
-rw-r--r--world/map/npc/magic/level2-barrier.txt51
-rw-r--r--world/map/npc/magic/level2-detect-players.txt34
-rw-r--r--world/map/npc/magic/level2-enchant-lifestone.txt36
-rw-r--r--world/map/npc/magic/level2-flying-backpack.txt42
-rw-r--r--world/map/npc/magic/level2-happy-curse.txt44
-rw-r--r--world/map/npc/magic/level2-hide.txt46
-rw-r--r--world/map/npc/magic/level2-lay-on-hands.txt61
-rw-r--r--world/map/npc/magic/level2-lightning-strike.txt80
-rw-r--r--world/map/npc/magic/level2-magic-knuckles.txt45
-rw-r--r--world/map/npc/magic/level2-make-arrows.txt27
-rw-r--r--world/map/npc/magic/level2-make-iron-powder.txt27
-rw-r--r--world/map/npc/magic/level2-make-shirt.txt25
-rw-r--r--world/map/npc/magic/level2-make-short-tanktop.txt25
-rw-r--r--world/map/npc/magic/level2-make-tanktop.txt25
-rw-r--r--world/map/npc/magic/level2-protect.txt51
-rw-r--r--world/map/npc/magic/level2-rain.txt104
-rw-r--r--world/map/npc/magic/level2-shear.txt60
-rw-r--r--world/map/npc/magic/level2-summon-fluffies.txt54
-rw-r--r--world/map/npc/magic/level2-summon-mouboo.txt54
-rw-r--r--world/map/npc/magic/level2-summon-pinkie.txt54
-rw-r--r--world/map/npc/magic/level2-summon-snakes.txt55
-rw-r--r--world/map/npc/magic/level2-summon-spiky-mushroom.txt54
-rw-r--r--world/map/npc/magic/level2-summon-wickedmushroom.txt55
-rw-r--r--world/map/npc/magic/level2-toxic-dart.txt51
-rw-r--r--world/map/npc/magic/level3-necromancy.txt55
-rw-r--r--world/map/npc/scripts.conf11
483 files changed, 5502 insertions, 7780 deletions
diff --git a/GNUmakefile b/GNUmakefile
index d5a29c2a..edde25a3 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -7,15 +7,10 @@ maps:
% : | %.example
cp "$|" "$@"
-conf: world/map/conf/magic-secrets.sex \
-login/conf/login_local.conf login/conf/ladmin_local.conf login/save/gm_account.txt login/save/account.txt \
+conf: login/conf/login_local.conf login/conf/ladmin_local.conf login/save/gm_account.txt login/save/account.txt \
world/conf/char_local.conf \
world/map/conf/map_local.conf world/map/conf/battle_local.conf world/map/conf/atcommand_local.conf world/map/db/const-debugflag.txt \
-world/map/npc/functions/motd.txt
-
-world/map/conf/magic-secrets.sex: world/map/conf/magic-secrets.sex.template world/map/conf/secrets-build
- cd world/map/conf && ./build-magic.sh
-world/map/conf/secrets-build:
+world/map/npc/functions/motd.txt world/map/conf/permissions_local.txt
format:
find world/map/npc -type f -exec sed -ri \
diff --git a/client-data b/client-data
-Subproject 05fdf1a5cbbb63ed35bbd173437465c200e6599
+Subproject c3d873a7122a79662d42adef54f1d3ec82a8808
diff --git a/tools b/tools
-Subproject ac88cc365e1f35764bab5ff9c27549fc3a02d65
+Subproject 934e57d6982153e45e85fa66070b16fd63a7f46
diff --git a/world/map/conf/.gitignore b/world/map/conf/.gitignore
index c2b48eb6..a1c73f43 100644
--- a/world/map/conf/.gitignore
+++ b/world/map/conf/.gitignore
@@ -1,4 +1,2 @@
/*_local.conf
-/magic-secrets.conf
-/magic-secrets.sex
-/secrets-build
+/*_local.txt
diff --git a/world/map/conf/build-magic.sh b/world/map/conf/build-magic.sh
deleted file mode 100755
index 77337df7..00000000
--- a/world/map/conf/build-magic.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#! /bin/bash
-
-OUTPUT=magic-secrets.sex
-INPUT=$OUTPUT.template
-RSCRIPT=secrets-build
-
-if ! grep -q -s '/bin/sed' $RSCRIPT; then
- echo '#! /bin/sed -f' > $RSCRIPT;
- chmod a+x $RSCRIPT
-fi
-
-for n in `grep -o '"#..."' $INPUT`; do
- if ! grep -q $n $RSCRIPT; then
- echo "New secret ${n} needs to be set in $RSCRIPT!"
- echo "s/${n}/${n}/" >> $RSCRIPT;
- fi
-done
-
-./$RSCRIPT $INPUT > $OUTPUT
diff --git a/world/map/conf/magic-anchors.sex b/world/map/conf/magic-anchors.sex
deleted file mode 100644
index 3bb16f75..00000000
--- a/world/map/conf/magic-anchors.sex
+++ /dev/null
@@ -1,66 +0,0 @@
-"--------------------------------------------------------------------------------"
-" Teleport anchors(disabled) "
-" As of now, only the #vorp spell(disabled) uses them "
-"--------------------------------------------------------------------------------"
-(DISABLED
- (TELEPORT-ANCHOR tulimshar "tulimshar"
- (@+
- (@ "001-1" 43 66)
- 3
- 3)))
-
-(DISABLED
- (TELEPORT-ANCHOR hurnscald "hurnscald"
- (@+
- (@ "009-1" 55 37)
- 3
- 3)))
-
-(DISABLED
- (TELEPORT-ANCHOR nivalis "nivalis"
- (@+
- (@ "020-1" 75 63)
- 19
- 12)))
-
-(DISABLED
- (TELEPORT-ANCHOR wizardhut "##00"
- (@+
- (@ "013-1" 41 92)
- 3
- 3)))
-
-(DISABLED
- (TELEPORT-ANCHOR pachua "##01"
- (@+
- (@ "006-1" 22 101)
- 3
- 3)))
-
-(DISABLED
- (TELEPORT-ANCHOR desert "##02"
- (@+
- (@ "005-1" 160 64)
- 5
- 5)))
-
-(DISABLED
- (TELEPORT-ANCHOR forest "##03"
- (@+
- (@ "015-1" 35 35)
- 40
- 40)))
-
-(DISABLED
- (TELEPORT-ANCHOR snakecave "##04"
- (@+
- (@ "011-4" 50 75)
- 3
- 3)))
-
-(DISABLED
- (TELEPORT-ANCHOR dimondscove "##05"
- (@+
- (@ "010-2" 23 79)
- 3
- 3)))
diff --git a/world/map/conf/magic-config.sex b/world/map/conf/magic-config.sex
deleted file mode 100644
index a130becf..00000000
--- a/world/map/conf/magic-config.sex
+++ /dev/null
@@ -1,68 +0,0 @@
-"Special-purpose globals"
-(SET obscure_chance 95)
-(SET min_casttime 200)
-
-"Schools of magic"
-(CONST MAGIC 340)
-(CONST LIFE 341)
-(CONST WAR 342)
-(CONST TRANSMUTE 343)
-(CONST NATURE 344)
-(CONST ASTRAL 345)
-(CONST DARK 346)
-
-"Elements"
-(CONST ELT_NEUTRAL 0)
-(CONST ELT_WATER 1)
-(CONST ELT_EARTH 2)
-(CONST ELT_FIRE 3)
-(CONST ELT_WIND 4)
-(CONST ELT_POISON 5)
-(CONST ELT_SHADOW 6)
-(CONST ELT_HOLY 7)
-(CONST ELT_GHOST 8)
-(CONST ELT_UNDEAD 9)
-
-"Status effects"
-(CONST SC_POISON 132)
-(CONST SC_SHEARED 194) "This is the same as SC_HIDE, since mobs can't hide and shearing is only used for mobs. Feel free to fix!"
-(CONST SC_HIDE 194)
-(CONST SC_HALT_REGENERATE 195)
-(CONST SC_FLYING_BACKPACK 196)
-(CONST SC_MBARRIER 197)
-(CONST SC_HASTE 198)
-(CONST SC_PHYS_SHIELD 199)
-(CONST SO_GMHIDE 64)
-(CONST SO_GMINVISIBLE 4096)
-
-"Special effects"
-(CONST SFX_DEFAULT 10)
-(CONST SFX_SUMMON_START 21)
-(CONST SFX_SUMMON_FIRE 22)
-(CONST SFX_TELEPORT 24)
-(CONST SFX_RAIN 25)
-(CONST SFX_HIT 25)
-(CONST SFX_ARROW_HAIL 27)
-(CONST SFX_BARRIER 10)
-(CONST SFX_UNBARRIER 10)
-(CONST SFX_HEAL 3)
-(CONST SFX_LIGHTNING 18)
-
-"Magic Spell Const"
-(CONST MIN_MARRY_LEVEL 32)
-(CONST MAX_RAIN_SPELL_RADIUS 15)
-(CONST MAX_MAGIC_LEVEL 2) "Increase up to 5 as each new magic level is completed."
-(CONST MAGIC_FLAGS "MAGIC_FLAGS")
-(CONST MFLAG_MADE_CONC_POTION 16384)
-(CONST MFLAG_MADE_CONC_POTION_SHIFT 14)
-(CONST SCRIPT_XP "MAGIC_EXPERIENCE")
-(CONST SCRIPT_XP_MASK 0xffff)
-(CONST SCRIPT_XP_SHIFT 0)
-(CONST SCRIPT_LASTSPELL_MASK 0xff)
-(CONST SCRIPT_LASTSPELL_SHIFT 16)
-(CONST SCRIPT_HEALSPELL_MASK 0xff)
-(CONST SCRIPT_HEALSPELL_SHIFT 24)
-(CONST DEBUG 0)
-(CONST ATTACK_ICON_GENERIC 2000)
-(CONST ATTACK_ICON_SHEARING 2001)
-(CONST E10_FLAG_USED_FREE_WARP_SHIFT 17)
diff --git a/world/map/conf/magic-level0.sex b/world/map/conf/magic-level0.sex
deleted file mode 100644
index f376b2cd..00000000
--- a/world/map/conf/magic-level0.sex
+++ /dev/null
@@ -1,39 +0,0 @@
-"--------------------------------------------------------------------------------"
-" Level 0 spells "
-"--------------------------------------------------------------------------------"
-(SPELL () wand "#confringo" ()
- (LET school MAGIC)
- (=>
- (GUARD
- (CASTTIME 500))
- (EFFECT
- (SCRIPT "{callfunc \"CheckWand\";}")
- (IF (==
- (script_int caster "@Wand")
- 0)
- (ABORT))
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL install_attack_spell
- (+ (script_int caster "@Wand")
- (/ spellpower 10))
- 1200
- 3
- (script_int caster "@WandID"))
- (CALL gain_xp 1 3)
- (ATTRIGGER
- (CALL attack_check target)
- (SCRIPT "{callfunc \"WandMana\";}")
- (IF (==
- (script_int caster "@WandAttack")
- 0)
- (ABORT))
- (SET damage
- (* (script_int caster "@Wand")
- (/ spellpower
- 3)))
- (SET damage_bonus
- (* (script_int caster "@Wand")
- (/ spellpower
- 3)))
- (CALL elt_damage target damage damage_bonus ELT_NEUTRAL ELT_NEUTRAL 5)))))
diff --git a/world/map/conf/magic-level1.sex b/world/map/conf/magic-level1.sex
deleted file mode 100644
index da29ad22..00000000
--- a/world/map/conf/magic-level1.sex
+++ /dev/null
@@ -1,494 +0,0 @@
-"--------------------------------------------------------------------------------"
-" Level 1 spells "
-"--------------------------------------------------------------------------------"
-(SPELL () ask-magic-exp "#abizit" ()
- (LET level 1)
- (LET school MAGIC)
- (=>
- (GUARD
- (MANA 1)
- (CASTTIME 1000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level)))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (SET level
- (skill caster MAGIC))
- (SET experience
- (&
- (>>
- (script_int caster SCRIPT_XP)
- SCRIPT_XP_SHIFT)
- SCRIPT_XP_MASK))
- (IF (&&
- (== experience SCRIPT_XP_MASK)
- (> level 4))
- (message caster "You are as proficient at magic as you can possibly be.")
- (BLOCK "This duplicates the table in mana-seed.txt"
- (IF (> level 4)
- (SET max_experience SCRIPT_XP_MASK)
- (IF (== level 4)
- (SET max_experience 40000)
- (IF (== level 3)
- (SET max_experience 8000)
- (IF (== level 2)
- (SET max_experience 1200)
- (SET max_experience 100)))))
- (SET ratio
- (/
- (-
- (* 10 experience)
- (random
- (/ max_experience 30)))
- max_experience)) "Randomness: jitter a bit at the transitions to give more precise information if used frequently"
- (IF (>= ratio 45)
- (message caster
- (+ "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."
- (if_then_else
- (>= level MAX_MAGIC_LEVEL)
- ""
- " Surely the Mana Seed will more than readily offer more magic for such a proficient user.")))
- (IF (>= ratio 20)
- (message caster "You have perfect control of what you understand now, but there is now a distinct sensation of something more, something indescribable. If only the Mana Seed would give more magic to you...")
- (IF (>= ratio 10)
- (message caster
- (+ "You feel in perfect control of your magic"
- (if_then_else
- (>= level MAX_MAGIC_LEVEL)
- "."
- ", and seem on the verge of something more... perhaps you should see the Mana Seed to ask for more magic?")))
- (IF (>= ratio 9)
- (message caster "You feel in almost perfect control of your magic.")
- (IF (>= ratio 8)
- (message caster "You feel that you have very good control of your magic.")
- (IF (>= ratio 7)
- (message caster "You feel quite in control of your magic.")
- (IF (>= ratio 6)
- (message caster "You feel mostly in control of your magic.")
- (IF (>= ratio 5)
- (message caster "You feel somewhat in control of your magic.")
- (IF (>= ratio 4)
- (message caster "You feel you still have a few difficulties in controlling your magic.")
- (IF (>= ratio 3)
- (message caster "Trying to control your magic is still rather troublesome.")
- (IF (>= ratio 2)
- (message caster "You feel that you have only the bare minimum of control over your magic.")
- (IF (>= ratio 1)
- (message caster "You feel quite overwhelmed by your magic, but are beginning to see patterns.")
- (message caster "You feel completely overwhelmed by your magic."))))))))))))))))))
-
-(SPELL () transmute-wood-to-figurine "#parum" (STRING name)
- (LET level 1)
- (LET school TRANSMUTE)
- (=>
- (GUARD
- (MANA 5)
- (CASTTIME 4000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (COMPONENTS "RawLog"))
- (|
- (=>
- (REQUIRE
- (== name "boo"))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL create_item "MoubooFigurine" 1 "WarpedLog" 40)
- (CALL gain_xp 1 0)))
- (=>
- (REQUIRE
- (== name "lurk"))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL create_item "WarpedLog" 1 "WarpedLog" 40)
- (message caster "You have no idea what a Skytlurk looks like."))))))
-
-(SPELL () make-sulphur "#gole" ()
- (LET level 1)
- (LET school TRANSMUTE)
- (=>
- (GUARD
- (MANA 4)
- (CASTTIME 4000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (COMPONENTS "PileOfAsh"))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL create_item "SulphurPowder"
- (+
- (+ 1
- (/ spellpower 100))
- (/
- (random
- (max 1
- (- 800 spellpower)))
- 180))
- "PileOfAsh"
- 50)
- (CALL gain_xp 1 1))))
-
-(SPELL () lesser-heal "#lum" (STRING target)
- (LET level 1)
- (LET school LIFE)
- (=>
- (GUARD
- (MANA 6)
- (CASTTIME 500)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (if_then_else
- (failed
- (pc target))
- 1
- (<
- (rdistance
- (location caster)
- (location
- (pc target)))
- (+ 2
- (/ spellpower 100)))))
- (GUARD
- (COMPONENTS "Lifestone")))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (IF (failed
- (pc target))
- (BLOCK
- (IF (&&
- (||
- (== target "mouboo")
- (== target "Mouboo"))
- (<
- (rdistance
- (location caster)
- (location
- (npc "Mouboo")))
- (+ 2
- (/ spellpower 100))))
- (SCRIPT "{
- mes \"Your spell seems to have no effect on the mouboo.\";
- close;
- }")
- (SET target caster)))
- (BLOCK
- (SET target
- (pc target))
- (IF (is_dead target)
- (ABORT))))
- (CALL gain_heal_xp
- (min 200
- (-
- (max_hp target)
- (hp target)))
- 1
- 2
- 2) "report half values for non-instaheal"
- (CALL heal target 200)
- (IF (>
- (skill caster DARK)
- 1)
- (status_change caster SC_HALT_REGENERATE 0 0 0 0 2000))
- (CALL gain_xp 1 2))))
-
-(SPELL () flare-dart "#flar" ()
- (LET level 1)
- (LET school WAR)
- (=>
- (GUARD
- (MANA 10)
- (CASTTIME 500)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (GUARD
- (OR
- (REQUIRE
- (>
- (skill caster school)
- 2))
- (COMPONENTS "SulphurPowder"))))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (SET damage
- (* 5
- (sqrt spellpower)))
- (SET damage_bonus
- (+ 5
- (/
- (level caster)
- 3)))
- (CALL install_attack_spell
- (+ 3
- (/ spellpower 50))
- 1200
- 4
- 31)
- (CALL gain_xp 1 3)
- (ATTRIGGER
- (CALL attack_check target)
- (CALL elt_damage target damage damage_bonus ELT_WATER ELT_FIRE 15)))))
-
-(SPELL () magic-blade "#chiza" ()
- (LET level 1)
- (LET school WAR)
- (=>
- (GUARD
- (MANA 9)
- (CASTTIME 500)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level)))
- (|
- (=>
- (COMPONENTS "SharpKnife")
- (EFFECT
- (CALL adjust_spellpower WAR)
- (CALL default_effect)
- (CALL install_melee_spell
- (+ 10
- (/ spellpower 15))
- 1200
- 30)
- (CALL gain_xp 1 4)
- (ATTRIGGER
- (CALL melee_damage target 60
- (+ 5
- (str caster))))))
- (=>
- (COMPONENTS "Knife")
- (EFFECT
- (CALL adjust_spellpower WAR)
- (CALL default_effect)
- (CALL install_melee_spell
- (+ 10
- (/ spellpower 15))
- 1200
- 30)
- (CALL gain_xp 1 5)
- (ATTRIGGER
- (CALL melee_damage target 40
- (+ 5
- (str caster)))))))))
-
-(SPELL () aggravate "#itenplz" ()
- (LET level 1)
- (LET school NATURE)
- (=>
- (GUARD
- (MANA 3)
- (CASTTIME 1000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level)))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (FOREACH MOB target
- (rbox
- (location caster)
- (+ 2
- (/ spellpower 50)))
- (IF (line_of_sight
- (location caster)
- (location target))
- (BLOCK
- (CALL sfx_generic target)
- (aggravate target 0 caster)))))))
-
-(SPELL () grow-mauve "#modrilax" ()
- (LET level 1)
- (LET school NATURE)
- (=>
- (GUARD
- (MANA 4)
- (CASTTIME 2000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (COMPONENTS "MauveHerb" "Root"))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL gain_xp 1 6)
- (CALL summon_spell 1029
- (+
- (/
- (skill caster school)
- 2)
- 1)
- (- 4000
- (* spellpower 9))
- (+ 10000
- (* spellpower 50))
- 999999
- school))))
-
-(SPELL () grow-alizarin "#modriphoo" ()
- (LET level 1)
- (LET school NATURE)
- (=>
- (GUARD
- (MANA 4)
- (CASTTIME 2000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (COMPONENTS "AlizarinHerb" "Root"))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL gain_xp 1 7)
- (CALL summon_spell 1032
- (+
- (/
- (skill caster school)
- 2)
- 1)
- (- 4000
- (* spellpower 9))
- (+ 10000
- (* spellpower 50))
- 999999
- school))))
-
-(SPELL () grow-gamboge "#modriyikam" ()
- (LET level 1)
- (LET school NATURE)
- (=>
- (GUARD
- (MANA 4)
- (CASTTIME 2000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (COMPONENTS "GambogeHerb" "Root"))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL gain_xp 1 8)
- (CALL summon_spell 1031
- (+
- (/
- (skill caster school)
- 2)
- 1)
- (- 4000
- (* spellpower 9))
- (+ 10000
- (* spellpower 50))
- 999999
- school))))
-
-(SPELL () grow-cobalt "#modrisump" ()
- (LET level 1)
- (LET school NATURE)
- (=>
- (GUARD
- (MANA 4)
- (CASTTIME 2000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (COMPONENTS "CobaltHerb" "Root"))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL gain_xp 1 9)
- (CALL summon_spell 1030
- (+
- (/
- (skill caster school)
- 2)
- 1)
- (- 4000
- (* spellpower 9))
- (+ 10000
- (* spellpower 50))
- 999999
- school))))
-
-(SPELL (LOCAL) summon-maggots "#kalmurk" ()
- (LET level 1)
- (LET school ASTRAL)
- (=>
- (GUARD
- (MANA 21)
- (CASTTIME 20000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (COMPONENTS "MaggotSlime" "Root"))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL gain_xp 1 10)
- (CALL summon_spell 1002
- (+ 1
- (/
- (+
- (sqrt spellpower)
- (/ spellpower 15))
- 5))
- (- 5000
- (* spellpower 5))
- (+ 10000
- (* spellpower 50))
- 1
- school))))
-
-(SPELL () detect-magic "#miteyo" ()
- (LET level 1)
- (LET school MAGIC)
- (=>
- (GUARD
- (MANA 3)
- (CASTTIME 6000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level)))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (SET range
- (+ 1
- (/ spellpower 50)))
- (FOREACH NPC n
- (rbox
- (location caster)
- range)
- (IF (||
- (contains_string
- (name_of n)
- "#MAGIC")
- (contains_string
- (name_of n)
- "#_M"))
- (sfx n SFX_DEFAULT 0)))
- (FOREACH SPELL s (rbox
- (location caster)
- range) (IF (!= s self_invocation)
- (sfx s SFX_DEFAULT 0))))))
diff --git a/world/map/conf/magic-level2.sex b/world/map/conf/magic-level2.sex
deleted file mode 100644
index e4bd6908..00000000
--- a/world/map/conf/magic-level2.sex
+++ /dev/null
@@ -1,1462 +0,0 @@
-"--------------------------------------------------------------------------------"
-" Level 2 spells "
-"--------------------------------------------------------------------------------"
-(SPELL () make-arrows "#kularzufrill" ()
- (LET level 2)
- (LET school TRANSMUTE)
- (=>
- (GUARD
- (MANA 8)
- (CASTTIME 5000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (COMPONENTS "RawLog"))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL create_item "Arrow"
- (+
- (+ 1
- (/ spellpower 40))
- (/
- (random
- (max 1
- (- 800 spellpower)))
- 80))
- "WarpedLog"
- 500)
- (CALL gain_xp 1 11))))
-
-(SPELL () make-shirt "#patmuploo" ()
- (LET level 2)
- (LET school TRANSMUTE)
- (=>
- (GUARD
- (MANA 25)
- (CASTTIME 5000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (COMPONENTS
- (5 "CottonCloth")))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL create_item "CottonShirt" 1 "CottonCloth" 425)
- (CALL gain_xp 2 12))))
-
-(SPELL () make-tanktop "#patloree" ()
- (LET level 2)
- (LET school TRANSMUTE)
- (=>
- (GUARD
- (MANA 25)
- (CASTTIME 5000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (COMPONENTS
- (4 "CottonCloth")))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL create_item "TankTop" 1 "CottonCloth" 350)
- (CALL gain_xp 2 13))))
-
-(SPELL () make-short-tanktop "#patviloree" ()
- (LET level 2)
- (LET school TRANSMUTE)
- (=>
- (GUARD
- (MANA 25)
- (CASTTIME 5000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (COMPONENTS
- (3 "CottonCloth")))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL create_item "ShortTankTop" 1 "CottonCloth" 250)
- (CALL gain_xp 2 14))))
-
-(SPELL () make-iron-powder "#zukminbirf" ()
- (LET level 2)
- (LET school TRANSMUTE)
- (=>
- (GUARD
- (MANA 8)
- (CASTTIME 5000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (COMPONENTS "IronOre"))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL create_item "IronPowder"
- (+
- (+ 1
- (/ spellpower 140))
- (/
- (random
- (max 1
- (- 900 spellpower)))
- 220))
- "IronOre"
- 700)
- (CALL gain_xp 3 15))))
-
-(SPELL () make-concentration-potion "#loshira" ()
- (LET level 2)
- (LET school TRANSMUTE)
- (=>
- (GUARD
- (MANA 8)
- (CASTTIME 5000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (COMPONENTS "BottleOfWater"
- (2 "CobaltHerb")
- (2 "PinkPetal")))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL create_item
- (if_then_else
- (<
- (random
- (+ 2000 experience))
- experience)
- "ConcentrationPotion"
- "DarkConcentrationPotion")
- 1
- (if_then_else
- (random 2)
- "DilutedConcentrationPot"
- "DarkConcentrationPotion")
- 2000)
- (IF success
- (CALL set_var MAGIC_FLAGS 1 MFLAG_MADE_CONC_POTION_SHIFT 1))
- (CALL gain_xp 4 16))))
-
-(SPELL () merge-concentration-potions "#skrimp" ()
- (LET level 2)
- (LET school TRANSMUTE)
- (=>
- (GUARD
- (MANA 8)
- (CASTTIME 5000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (COMPONENTS "DarkConcentrationPotion" "DilutedConcentrationPot"))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL create_item "ConcentrationPotion" 1 "DilutedConcentrationPot" 1000)
- (message caster
- (+ "success = " success))
- (IF success
- (CALL set_var MAGIC_FLAGS 1 MFLAG_MADE_CONC_POTION_SHIFT 1))
- (CALL gain_xp 4 17))))
-
-(SPELL () lay-on-hands "#inma" (STRING target)
- (LET level 2)
- (LET school LIFE)
- (=>
- (GUARD
- (MANA 10)
- (CASTTIME 500)
- (REQUIRE
- (>
- (hp caster)
- (/
- (max_hp caster)
- 20)))
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (REQUIRE
- (if_then_else
- (failed
- (pc target))
- 1
- (&&
- (&&
- (&&
- (!=
- (pc target)
- caster)
- (<
- (rdistance
- (location caster)
- (location
- (pc target)))
- (+ 2
- (/
- (+
- (* 12
- (sqrt spellpower))
- spellpower)
- 100))))
- (not
- (running_status_update
- (pc target)
- SC_HALT_REGENERATE)))
- (not
- (is_equipped
- (pc target)
- "MagicGMTopHat"))))))
- (EFFECT
- (CALL adjust_spellpower school)
- (IF (not target)
- (ABORT))
- (IF (failed
- (pc target))
- (BLOCK
- (IF (&&
- (||
- (== target "mouboo")
- (== target "Mouboo"))
- (<
- (rdistance
- (location caster)
- (location
- (npc "Mouboo")))
- (+ 2
- (/ spellpower 100))))
- (BLOCK
- (SET needed 1000)
- (SCRIPT "{
- set @spell, 1;
- callfunc \"QuestMoubooHeal\";
- }"))
- (ABORT)))
- (BLOCK
- (SET target
- (pc target))
- (SET needed
- (-
- (max_hp target)
- (hp target)))))
- (SET pay_fraction
- (max 80
- (- 200
- (+
- (vit caster)
- (/ spellpower 10))))) "Pay at least 40%"
- (SET payment
- (/
- (* needed pay_fraction)
- 200))
- (SET available
- (-
- (hp caster)
- (/
- (max_hp caster)
- 20)))
- (IF (< payment available)
- (SET power needed)
- (BLOCK
- (SET payment available)
- (SET power
- (/
- (* available 200)
- pay_fraction))))
- (CALL gain_heal_xp power 1 1 3)
- (CALL quickheal target power)
- (SET t 5000) "with dark magic skill you pay 1/20 of max hp but the regenerate cooldown is cut in half"
- (SET school DARK)
- (SET h
- (*
- (/
- (max_hp caster)
- 20)
- -1))
- (IF (>=
- (skill caster school)
- level)
- (itemheal caster h 0))
- (IF (>=
- (skill caster school)
- level)
- (SET t 10000))
- (status_change caster SC_HALT_REGENERATE 0 0 0 0 t)
- (CALL gain_xp
- (min 4
- (/ payment 100))
- 18))))
-
-(SPELL () lightning-strike "#ingrav" ()
- (LET level 2)
- (LET school WAR)
- (=>
- (GUARD
- (MANA 20)
- (CASTTIME 1000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (GUARD
- (OR
- (REQUIRE
- (>=
- (skill caster school) "The spell is free at magic lv 4"
- 4))
- (COMPONENTS "IronPowder"))))
- (EFFECT
- (CALL adjust_spellpower school)
- (SET damage spellpower)
- (SET damage_bonus
- (+ 1
- (/ spellpower 2)))
- (CALL install_attack_spell
- (+ 1
- (/ spellpower 90))
- 3000
- 8
- 31)
- (CALL gain_xp 2 19)
- (ATTRIGGER
- (CALL attack_check target)
- (SET in_rain 0)
- (SET area
- (location caster))
- (FOREACH SPELL s (rbox
- (location caster)
- (+ MAX_RAIN_SPELL_RADIUS 1)) (IF (==
- (name_of s)
- "rain")
- (BLOCK
- (IF (is_in
- (location caster)
- (. s area))
- (BLOCK
- (SET in_rain
- (| in_rain 1))
- (SET area
- (+ area
- (. s area)))))
- (IF (is_in
- (location target)
- (. s area))
- (SET in_rain
- (| in_rain 2))))))
- (IF (& in_rain 1)
- (BLOCK "caster standing in the rain? This is going to be fun."
- (SET used 0)
- (FOREACH TARGET t area
- (IF (>
- (+
- (random 200)
- (luk caster))
- 175)
- (BLOCK
- (SET used
- (+ used 1))
- (CALL elt_damage t
- (/ damage 6)
- (+ 1
- (/ damage_bonus 3))
- ELT_EARTH
- ELT_WIND
- (+ 17
- (random 3))))))
- (IF (||
- (not used)
- (<
- (+
- (random 200)
- (luk caster))
- 150))
- (BLOCK
- (sfx caster
- (+ 17
- (random 3))
- 0)
- (itemheal caster
- (-
- (- 0 damage)
- (random damage_bonus))
- 0))))
- (CALL elt_damage target damage damage_bonus ELT_EARTH ELT_WIND
- (+ 17
- (random 3))))))))
-
-(SPELL (LOCAL) arrow-hail "#frillyar" ()
- (LET level 2)
- (LET school WAR)
- (=>
- (GUARD
- (MANA 25)
- (CASTTIME 5000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (REQUIRE
- (is_exterior
- (location caster)))
- (GUARD
- (OR
- (COMPONENTS
- (20 "Arrow"))
- (COMPONENTS
- (20 "IronArrow"))))
- (GUARD
- (OR
- (REQUIRE
- (>
- (skill caster school)
- 3))
- (COMPONENTS "SulphurPowder"))))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL abort_on_area_shield
- (location caster))
- (SET range 7)
- (SET area
- (rbox
- (awayfrom
- (location caster)
- (dir caster)
- (+ 1 range))
- range))
- (FOREACH SPELL s (rbox
- (awayfrom
- (location caster)
- (dir caster)
- (+ 1 range))
- (* range 2)) (IF (&&
- (!= s self_invocation)
- (==
- (name_of s)
- "arrow-hail"))
- (BLOCK
- (message caster "A nearby arrow hail spell absorbs your magic!")
- (ABORT))))
- (SET damage 125)
- (SET damage_bonus
- (/ spellpower 5))
- (CALL gain_xp 2 20)
- (FOR i 0
- (/ spellpower 8)
- (BLOCK
- (IF (not (pc caster))
- (ABORT))
- (FOR j 0 2
- (BLOCK
- (IF (not (pc caster))
- (ABORT))
- (SET location
- (random_location area))
- (sfx location SFX_ARROW_HAIL 0)
- (SET done 0)
- (FOREACH TARGET target
- (rbox location 0)
- (BLOCK
- (injure caster target
- (+
- (+ damage
- (random damage_bonus))
- (random damage_bonus))
- 0)
- (SET done 1)
- (BREAK)))
- (IF (&&
- (==
- (location caster)
- location)
- (not done))
- (BLOCK
- (itemheal caster
- (- 0
- (+
- (+ damage
- (random damage_bonus))
- (random damage_bonus)))
- 0)
- (sfx caster SFX_HIT 0)))))
- (WAIT
- (+
- (+ 250
- (random 50))
- (random 50))))))))
-
-(SPELL () magic-knuckles "#upmarmu" ()
- (LET level 2)
- (LET school WAR)
- (=>
- (GUARD
- (MANA 20)
- (CASTTIME 500)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (GUARD
- (OR
- (REQUIRE
- (>
- (skill caster school)
- 3))
- (COMPONENTS "Beer"))))
- (EFFECT
- (CALL adjust_spellpower WAR)
- (SET str
- (str caster))
- (CALL install_melee_spell
- (+ 10
- (/ spellpower 10))
- 1300
- 34)
- (ATTRIGGER
- (CALL melee_damage target 30
- (+ 5
- (* str 2)))))))
-
-(SPELL (LOCAL) summon-snakes "#halhiss" ()
- (LET level 2)
- (LET school DARK)
- (=>
- (GUARD
- (MANA 40)
- (CASTTIME 15000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (REQUIRE
- (>
- (script_int caster "OrumQuest")
- 40))
- (COMPONENTS "DarkCrystal" "SnakeEgg"))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL gain_xp 3 31)
- (CALL summon_spell 1010
- (+ 1
- (/ spellpower 300))
- (- 4000
- (* spellpower 9))
- (* spellpower 80)
- 2
- school))))
-
-(SPELL () toxic-dart "#phlex" ()
- (LET level 2)
- (LET school DARK)
- (=>
- (GUARD
- (MANA 15)
- (CASTTIME 500)
- (REQUIRE
- (>
- (script_int caster "OrumQuest")
- 37))
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (GUARD
- (OR
- (REQUIRE
- (>=
- (skill caster school)
- 3))
- (COMPONENTS
- (2 "Root")))))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (SET damage
- (* 5
- (sqrt spellpower)))
- (SET damage_bonus
- (+ 5
- (/
- (level caster)
- 3)))
- (CALL install_attack_spell
- (+ 3
- (/ spellpower 75))
- 1200
- 4
- 31)
- (CALL gain_xp 3 35)
- (ATTRIGGER
- (CALL attack_check target)
- (CALL elt_damage target damage damage_bonus ELT_NEUTRAL ELT_POISON 15)
- (IF (&&
- (is_pc target)
- (!= caster target))
- (status_change target SC_POISON
- (+ 5
- (max 15
- (/ spellpower 15)))
- 0
- 0
- 0
- (+ 5000
- (* spellpower 1200))))))))
-
-(SPELL (LOCAL) summon-wickedmushroom "#helorp" ()
- (LET level 2)
- (LET school DARK)
- (=>
- (GUARD
- (MANA 35)
- (CASTTIME 15000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>
- (script_int caster "OrumQuest")
- 36))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (COMPONENTS "SmallMushroom" "DarkCrystal"))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL gain_xp 3 36)
- (CALL summon_spell 1106
- (+ 1
- (/ spellpower 250))
- (- 4000
- (* spellpower 9))
- (* spellpower 80)
- 2
- school))))
-
-(SPELL () flying-backpack "#plugh" (PC target)
- (LET level 2)
- (LET school NATURE)
- (=>
- (GUARD
- (MANA 12)
- (CASTTIME 1000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (GUARD
- (OR
- (REQUIRE
- (>
- (skill caster school)
- 3))
- (COMPONENTS "SilkCocoon")))
- (REQUIRE
- (<
- (rdistance
- (location target)
- (location caster))
- (+ 2
- (/ spellpower 30)))))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (IF (!= caster target)
- (sfx caster 2 0))
- (status_change target SC_FLYING_BACKPACK 0 0 0 0
- (+ 5000
- (* spellpower 500)))
- (message target "Your backpack is lifted by a mystical force; you no longer feel it pressing on your back.")
- (CALL gain_xp 1 21)
- (ATEND
- (message target "Your backpack is no longer levitating.")
- (sfx target 2 0)))))
-
-(SPELL () protect "#betsanc" (PC target)
- (LET level 2)
- (LET school NATURE)
- (=>
- (GUARD
- (MANA 14)
- (CASTTIME 1500)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (REQUIRE
- (not
- (is_equipped
- (pc target)
- "MagicGMTopHat")))
- (GUARD
- (OR
- (REQUIRE
- (>=
- (skill caster school)
- 4))
- (COMPONENTS "HardSpike")))
- (REQUIRE
- (<
- (rdistance
- (location target)
- (location caster))
- (+ 2
- (/ spellpower 30)))))
- (EFFECT
- (CALL adjust_spellpower school)
- (sfx target 11 0)
- (IF (!= caster target)
- (CALL default_effect))
- (status_change target SC_PHYS_SHIELD
- (+ 5
- (max 15
- (/ spellpower 20)))
- 0
- 0
- 0
- (+ 5000
- (* spellpower 1000)))
- (message target "You feel more protected.")
- (CALL gain_xp 2 22)
- (ATEND
- (message target "You feel less protected.")
- (sfx target 111 0)))))
-
-(SPELL () happy-curse "#joyplim" (PC target)
- (LET level 2)
- (LET school NATURE)
- (=>
- (GUARD
- (MANA 13)
- (CASTTIME 1000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (GUARD
- (OR
- (REQUIRE
- (>
- (skill caster school)
- 3))
- (COMPONENTS "GingerBreadMan")))
- (REQUIRE
- (<
- (rdistance
- (location target)
- (location caster))
- (+ 1
- (/ spellpower 100)))))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (IF (>
- (skill caster DARK)
- 1)
- (FOR i 0
- (/ spellpower 10)
- (BLOCK
- (emote target 5)
- (WAIT 500)))
- (FOR i 0
- (/ spellpower 10)
- (BLOCK
- (emote target 3)
- (WAIT 500))))
- (CALL gain_xp 1 23))))
-
-(SPELL (LOCAL) rain "#kaflosh" ()
- (LET level 2)
- (LET school NATURE)
- (=>
- (GUARD
- (MANA 17)
- (CASTTIME 3000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (REQUIRE
- (is_exterior
- (location caster)))
- (GUARD
- (OR
- (REQUIRE
- (>=
- (skill caster school)
- 4))
- (COMPONENTS "BottleOfWater"))))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL abort_on_area_shield
- (location caster))
- (FOREACH SPELL s (rbox
- (location caster)
- (+ MAX_RAIN_SPELL_RADIUS 1)) (IF (&&
- (!= s self_invocation)
- (==
- (name_of s)
- "rain"))
- (BLOCK
- (message caster "A nearby raincloud absorbs your magic.")
- (ABORT))))
- (CALL gain_xp 1 24)
- (SET range
- (min MAX_RAIN_SPELL_RADIUS
- (+ 3
- (/
- (min spellpower 200)
- 30))))
- (SET area
- (rbox
- (location caster)
- range))
- (IF (||
- (is_in
- (location
- (npc "#DruidTree0#_M"))
- area)
- (is_in
- (location
- (npc "#DruidTree1#_M"))
- area))
- (SCRIPT "{
- set @flag, 1;
- callfunc \"QuestTreeTrigger\";
- close;
- }"))
- (IF (is_in
- (location caster)
- (@+
- (@ "011-1" 94 38)
- 9
- 7))
- (SCRIPT "{
- callfunc \"HalloweenQuestWaterPumpkins\";
- }")) "Halloween quest"
- (FOR i 0
- (/ spellpower 3)
- (BLOCK
- (IF (not (pc caster))
- (ABORT))
- (FOR j 0
- (/
- (min
- (/ spellpower 2)
- 200)
- 100)
- (BLOCK
- (IF (not (pc caster))
- (ABORT))
- (SET location
- (random_location area))
- (sfx location SFX_RAIN 0)
- (FOREACH TARGET target
- (rbox location 1)
- (IF (==
- (element target)
- ELT_FIRE)
- (injure caster target
- (+ 2
- (random
- (+ 5
- (/ spellpower 15))))
- 0)))))
- (WAIT
- (+ 400
- (random 100))))))))
-
-(PROCEDURE shear-drop (target target2 item prob)
- (IF (||
- (== target name)
- (== target2 name))
- (BLOCK
- (IF (< score prob)
- (drop_item_for place item 1 60000 caster 5000)))))
-
-(PROCEDURE shear-drop2 (target target2 item prob item2 prob2)
- (IF (||
- (== target name)
- (== target2 name))
- (BLOCK
- (IF (< score prob)
- (drop_item_for place item 1 60000 caster 5000)
- (CALL shear-drop target target2 item2
- (+ prob2 prob))))))
-
-(PROCEDURE shear-drop3 (target target2 item prob item2 prob2 item3 prob3)
- (IF (||
- (== target name)
- (== target2 name))
- (BLOCK
- (IF (< score prob)
- (drop_item_for place item 1 60000 caster 5000)
- (CALL shear-drop2 target target2 item2
- (+ prob2 prob)
- item3
- (+ prob3 prob))))))
-
-(SPELL () shear "#chipchip" ()
- (LET level 2)
- (LET school NATURE)
- (=>
- (GUARD
- (MANA 23)
- (CASTTIME 1000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level)))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (override_attack caster 1 2000 1 ATTACK_ICON_SHEARING 30 0)
- (ATTRIGGER
- (IF (not
- (is_pc target))
- (BLOCK
- (SET score
- (random
- (- 1000
- (random spellpower)))) "lower score -> more valuable item"
- (SET name
- (name_of target))
- (SET place
- (random_location
- (rbox
- (location target)
- 1)))
- (IF (running_status_update target SC_SHEARED)
- (ABORT))
- (status_change target SC_SHEARED 0 0 0 0 600000) "10 minutes"
- (CALL shear-drop "Fluffy" "Fluffy" "WhiteFur" 300)
- (CALL shear-drop "EasterFluffy" "Easter Fluffy" "WhiteFur" 300)
- (CALL shear-drop "SpikyMushroom" "Spiky Mushroom" "HardSpike" 250)
- (CALL shear-drop "Mouboo" "Mouboo" "CottonCloth" 175)
- (CALL shear-drop "Cobalt" "CobaltPlant" "CobaltHerb" 700)
- (CALL shear-drop "Alizarin" "AlizarinPlant" "AlizarinHerb" 700)
- (CALL shear-drop "Gamboge" "GambogePlant" "GambogeHerb" 700)
- (CALL shear-drop "Mauve" "MauvePlant" "MauveHerb" 700)
- (CALL shear-drop "SilkWorm" "Silkworm" "SilkCocoon" 300)
- (CALL shear-drop "Pinkie" "Pinkie" "PinkAntenna" 180)
- (IF (&&
- (||
- (||
- (== name "Fluffy")
- (== name "Mouboo"))
- (== name "Pinkie"))
- (random 2))
- (SCRIPT "{
- set @value, 1;
- callfunc \"QuestSagathaHappy\";
- }"))))))))
-
-(SPELL () barrier "#asorm" (PC target)
- (LET level 2)
- (LET school ASTRAL)
- (=>
- (GUARD
- (MANA 16)
- (CASTTIME 1000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (REQUIRE
- (not
- (is_equipped
- (pc target)
- "MagicGMTopHat")))
- (GUARD
- (OR
- (REQUIRE
- (>
- (skill caster school)
- 3))
- (COMPONENTS "SmallMushroom")))
- (REQUIRE
- (<
- (rdistance
- (location target)
- (location caster))
- (+ 2
- (/ spellpower 30)))))
- (EFFECT
- (CALL adjust_spellpower school)
- (sfx target SFX_BARRIER 0)
- (IF (!= caster target)
- (CALL default_effect))
- (status_change target SC_MBARRIER
- (+ 20
- (max 30
- (/ spellpower 8)))
- 0
- 0
- 0
- (+ 2000
- (* spellpower 200)))
- (message target "You are surrounded by a magical barrier.")
- (CALL gain_xp 3 25)
- (ATEND
- (message target "Your magical barrier dissipates.")
- (sfx target SFX_UNBARRIER 0)))))
-
-(SPELL (LOCAL) summon-spiky-mushrooms "#kalrenk" ()
- (LET level 2)
- (LET school ASTRAL)
- (=>
- (GUARD
- (MANA 33)
- (CASTTIME 20000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (COMPONENTS "HardSpike" "Root"))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL gain_xp 1 26)
- (CALL summon_spell 1019
- (+ 1
- (/ spellpower 120))
- (- 5000
- (* spellpower 9))
- (* spellpower 400)
- 2
- school))))
-
-(SPELL (LOCAL) summon-fluffies "#kalakarenk" ()
- (LET level 2)
- (LET school ASTRAL)
- (=>
- (GUARD
- (MANA 39)
- (CASTTIME 20000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (COMPONENTS "WhiteFur" "Root"))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL gain_xp 1 27)
- (CALL summon_spell 1020
- (+
- (+ 1
- (/ spellpower 170))
- (/ spellpower 430))
- (- 5000
- (* spellpower 8))
- (* spellpower 350)
- 2
- school))))
-
-(SPELL (LOCAL) summon-mouboo "#kalboo" ()
- (LET level 2)
- (LET school ASTRAL)
- (=>
- (GUARD
- (MANA 35)
- (CASTTIME 20000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (COMPONENTS "MoubooFigurine" "Root"))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL gain_xp 2 37)
- (CALL summon_spell 1028
- (+ 1
- (/ spellpower 270))
- (- 4000
- (* spellpower 9))
- (* spellpower 100)
- 2
- school))))
-
-(SPELL (LOCAL) summon-pinkie "#kalgina" ()
- (LET level 2)
- (LET school ASTRAL)
- (=>
- (GUARD
- (MANA 35)
- (CASTTIME 20000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (COMPONENTS "PinkAntenna" "Root"))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (CALL gain_xp 2 38)
- (CALL summon_spell 1018
- (+ 1
- (/ spellpower 120))
- (- 5000
- (* spellpower 9))
- (* spellpower 150)
- 2
- school))))
-
-(SPELL () detect-players "#inwilt" ()
- (LET level 2)
- (LET school MAGIC)
- (=>
- (GUARD
- (MANA 7)
- (CASTTIME 300)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level)))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (SET message "")
- (FOREACH PC target
- (rbox
- (location caster)
- (/ spellpower 2))
- (IF (&&
- (&&
- (!= target caster)
- (not
- (running_status_update
- (pc target)
- SC_HIDE)))
- (not
- (status_option target SO_GMINVISIBLE)))
- (BLOCK
- (IF (!= message "")
- (SET message
- (+ message ", ")))
- (SET message
- (+ message
- (name_of target)))
- (IF (> spellpower 99)
- (SET message
- (+
- (+
- (+ message "(")
- (level target))
- ")"))))))
- (IF (== message "")
- (message caster "You sense no-one else nearby.")
- (message caster
- (+ "You sense the following: " message))))))
-
-(SPELL () enchant-lifestone "#manpahil" ()
- (LET level 2)
- (LET school MAGIC)
- (=>
- (GUARD
- (MANA 15)
- (CASTTIME 4000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (GUARD
- (OR
- (OR
- (COMPONENTS "BugLeg")
- (COMPONENTS "MaggotSlime"))
- (COMPONENTS "MauveHerb" "AlizarinHerb" "CobaltHerb" "GambogeHerb"))))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (create_item caster "Lifestone" 1)
- (CALL gain_xp 1 28))))
-
-(SPELL () sense-spouse "#inzuwilt" ()
- (LET level 2)
- (LET school MAGIC)
- (=>
- (GUARD
- (MANA 7)
- (CASTTIME 400)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (REQUIRE
- (is_married caster))
- (REQUIRE
- (is_equipped caster "WeddingRing")))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (IF (||
- (failed
- (partner caster))
- (not
- (is_equipped
- (partner caster)
- "WeddingRing")))
- (BLOCK
- (message caster "You cannot sense your partner.")
- (ABORT)))
- (SET partner
- (partner caster))
- (SET name
- (name_of partner))
- (IF (||
- (is_dead partner)
- (!=
- (map_nr
- (location partner))
- (map_nr
- (location caster))))
- (BLOCK
- (message caster
- (+
- (+ "You cannot sense " name)
- " nearby."))
- (ABORT)))
- (IF (&&
- (>
- (map_level
- (location partner))
- 2)
- (<
- (map_level
- (location caster))
- (map_level
- (location partner))))
- (BLOCK
- (message caster
- (+
- (+ "You sense " name)
- " somewhere below."))
- (ABORT)))
- (IF (&&
- (>
- (map_level
- (location caster))
- 2)
- (<
- (map_level
- (location partner))
- (map_level
- (location caster))))
- (BLOCK
- (message caster
- (+
- (+ "You sense " name)
- " somewhere above."))
- (ABORT)))
- (IF (!=
- (map_level
- (location caster))
- (map_level
- (location partner)))
- (message caster
- (+
- (+ "You sense " name)
- " somewhere in the vincinity."))
- (BLOCK
- (SET distance
- (rdistance
- (location caster)
- (location partner)))
- (SET dir
- (dir_towards
- (location caster)
- (location partner)
- 1))
- (IF (< distance 3)
- (message caster
- (+
- (+ "You sense " name)
- " right next to you."))
- (IF (< distance 30)
- (message caster
- (+
- (+
- (+
- (+ "You sense " name)
- " close by, towards the ")
- dir)
- "."))
- (IF (< distance 200)
- (message caster
- (+
- (+
- (+
- (+ "You sense " name)
- " nearby, towards the ")
- dir)
- "."))
- (message caster
- (+
- (+
- (+
- (+ "You sense " name)
- " in the ")
- dir)
- "."))))))))))
-
-(SPELL () hide "#anwiltyp" (PC target)
- (LET level 2)
- (LET school ASTRAL)
- (=>
- (GUARD
- (MANA 11)
- (CASTTIME 1000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (GUARD
- (OR
- (REQUIRE
- (>
- (skill caster school)
- 3))
- (COMPONENTS "CottonCloth")))
- (REQUIRE
- (<
- (rdistance
- (location target)
- (location caster))
- (+ 2
- (/ spellpower 30)))))
- (EFFECT
- (CALL adjust_spellpower school)
- (sfx target SFX_DEFAULT 0)
- (IF (!= caster target)
- (CALL default_effect))
- (status_change target SC_HIDE 0 0 0 0
- (+ 5000
- (* spellpower 2500)))
- (CALL gain_xp 2 29)
- (message target "You are hidden!")
- (IF (!= caster target)
- (message caster "You hid someone!"))
- (ATEND
- (message target "You are no longer hidden.")))))
diff --git a/world/map/conf/magic-level3.sex b/world/map/conf/magic-level3.sex
deleted file mode 100644
index 5d4d7374..00000000
--- a/world/map/conf/magic-level3.sex
+++ /dev/null
@@ -1,179 +0,0 @@
-"--------------------------------------------------------------------------------"
-" Level 3 spells "
-"--------------------------------------------------------------------------------"
-(DISABLED
- (SPELL () cure-poison "#anju" (PC target)
- (LET level 3)
- (LET school LIFE)
- (=>
- (GUARD
- (MANA 15)
- (CASTTIME 1000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (REQUIRE
- (<
- (rdistance
- (location caster)
- (location
- (pc target)))
- (+ 1
- (/ spellpower 60))))
- (COMPONENTS "GambogeHerb"))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (IF (running_status_update target SC_POISON)
- (BLOCK
- (CALL gain_heal_xp 40 1 2 2)
- (stop_status_change target SC_POISON)
- (CALL gain_xp 2 30)
- (IF (!= caster target)
- (sfx target SFX_HEAL 0))))))))
-
-(DISABLED
- (SPELL () fire-ball "#flarfol" ()
- (LET level 3)
- (LET school WAR)
- (=>
- (GUARD
- (MANA 30)
- (CASTTIME 1000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (COMPONENTS "PileOfAsh"))
- (EFFECT
- (CALL adjust_spellpower school)
- (SET damage
- (min
- (+ 50
- (*
- (skill caster school)
- 40))
- (+ 30
- (/
- (* spellpower 3)
- 2))))
- (SET damage_bonus
- (+
- (level caster)
- (* spellpower 2)))
- (SET radius
- (+ 2
- (/ spellpower 50)))
- (CALL install_attack_spell
- (+ 1
- (/ spellpower 60))
- 5000
- 10
- 31)
- (ATTRIGGER
- (CALL attack_check target)
- (SET loc
- (location target))
- (DISABLED (WAIT 500))
- (sfx loc 16 0)
- (FOREACH TARGET target
- (rbox loc radius)
- (IF (line_of_sight loc
- (location target))
- (BLOCK
- (SET divisor
- (+ 3
- (rdistance loc
- (location target))))
- (CALL elt_damage target
- (/
- (* damage 3)
- divisor)
- (/
- (* damage_bonus 3)
- divisor)
- ELT_WATER
- ELT_FIRE
- 15)))))))))
-
-(DISABLED
- (SPELL () summon-partner "#kalzumin" ()
- (LET level 3)
- (LET school ASTRAL)
- (=>
- (GUARD
- (MANA 30)
- (CASTTIME 2000)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level))
- (REQUIRE
- (is_married caster))
- (REQUIRE
- (is_equipped caster "WeddingRing")))
- (EFFECT
- (CALL adjust_spellpower school)
- (CALL default_effect)
- (IF (failed
- (partner caster))
- (message caster "You call out for your partner, but there is no response.")
- (BLOCK
- (message caster
- (+
- (+ "You call out for "
- (name_of
- (partner caster)))
- "."))
- (message
- (partner caster)
- (+
- (name_of caster)
- " is calling for your aid!"))
- (sfx
- (partner caster)
- 2
- 0)
- (WAIT
- (max 5000
- (- 30000
- (* spellpower 60))))
- (IF (failed
- (partner caster))
- (message caster "Your partner has abandoned you.")
- (IF (is_dead
- (partner caster))
- (message caster
- (+
- (+ "Something seems to have happened to "
- (name_of
- (partner caster)))
- "."))
- (BLOCK
- (sfx
- (location
- (partner caster))
- SFX_TELEPORT
- 0)
- (SET dest
- (awayfrom
- (location caster)
- (random_dir 1)
- 1))
- (warp
- (partner caster)
- dest)
- (sfx dest SFX_TELEPORT 0))))))))))
diff --git a/world/map/conf/magic-level4.sex b/world/map/conf/magic-level4.sex
deleted file mode 100644
index f04092f4..00000000
--- a/world/map/conf/magic-level4.sex
+++ /dev/null
@@ -1,3 +0,0 @@
-"--------------------------------------------------------------------------------"
-" Level 4 spells "
-"--------------------------------------------------------------------------------"
diff --git a/world/map/conf/magic-level5.sex b/world/map/conf/magic-level5.sex
deleted file mode 100644
index 056c9e50..00000000
--- a/world/map/conf/magic-level5.sex
+++ /dev/null
@@ -1,55 +0,0 @@
-"--------------------------------------------------------------------------------"
-" Level 5 spells "
-"--------------------------------------------------------------------------------"
-(DISABLED
- (SPELL () shroud "#anwilvimar" ()
- (LET level 5)
- (LET school NATURE)
- (=>
- (GUARD
- (MANA 40)
- (CASTTIME 400)
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level)))
- (EFFECT
- (CALL default_effect)
- (shroud caster 0x04)))))
-
-(DISABLED
- (SPELL () teleport "#vorp" (STRING destination)
- (LET level 5)
- (LET school ASTRAL)
- (=>
- (GUARD
- (MANA 80)
- (CASTTIME 400)
- (COMPONENT "EtherEssence")
- (CATALYSTS "TeleportCrystal")
- (REQUIRE
- (>=
- (skill caster MAGIC)
- level))
- (REQUIRE
- (>=
- (skill caster school)
- level)))
- (EFFECT
- (CALL default_effect)
- (WAIT
- (+ 1000
- (/ 200000
- (+ spellpower 10))))
- (sfx
- (location caster)
- SFX_TELEPORT
- 200)
- (warp caster
- (random_location
- (anchor destination)))
- (sfx caster SFX_TELEPORT 200)))))
diff --git a/world/map/conf/magic-misc.sex b/world/map/conf/magic-misc.sex
deleted file mode 100644
index 15672f4c..00000000
--- a/world/map/conf/magic-misc.sex
+++ /dev/null
@@ -1,217 +0,0 @@
-"--------------------------------------------------------------------------------"
-" Special-purpose quasispells "
-"--------------------------------------------------------------------------------"
-(SPELL (NONMAGIC) dueloff "#dueloff" ()
- (=>
- (GUARD
- (REQUIRE
- (== (substr (location caster) 2 5) "009-7")))
- (EFFECT
- (IF (== (script_int caster "@Duels_Off") 1)
- (BLOCK
- (SCRIPT "{set @Duels_Off, 0;}")
- (message caster "Now accepting incoming duel requests.")
- (ABORT)))
- (SCRIPT "{set @Duels_Off, 1;}")
- (message caster "Now blocking incoming duel requests."))))
-
-(SPELL (NONMAGIC) duel "#duel" (PC target)
- (=>
- (GUARD
- (REQUIRE
- (== (& (script_int target "$SANGUINE") (script_int target "$@SV_FCDBit")) 0)))
- (EFFECT
- (IF (== target caster)
- (BLOCK
- (message caster "You can not fight against yourself.")
- (ABORT)))
- (IF (is_dead target)
- (BLOCK
- (message caster "You can not fight against a corpse.")
- (ABORT)))
- (IF (status_option caster SO_GMINVISIBLE)
- (BLOCK
- (message caster "You can not fight while being invisible.")
- (ABORT)))
- (IF (status_option target SO_GMHIDE)
- (BLOCK
- (message caster "This player have @hide enabled.")
- (ABORT)))
- (IF (status_option target SO_GMINVISIBLE)
- (ABORT))
- (IF (status_option caster SO_GMHIDE)
- (ABORT))
- (IF (!= (substr (location caster) 2 5) "009-7")
- (BLOCK
- (message caster "You need to be in the fight club to challenge someone to a duel.")
- (ABORT)))
- (IF (!= (substr (location target) 2 5) "009-7")
- (BLOCK
- (message caster "This player is not in the fight club at the moment.")
- (ABORT)))
- (IF (> (script_int target "@Duels_Off") 0)
- (BLOCK
- (message caster "This player is automatically ignoring incoming duel requests.")
- (ABORT)))
- (IF (> (script_int caster "$@Duel_Queue_ID[($@Duel_QueueLimit)]") 0)
- (BLOCK
- (message caster (+ (+ "There is already " (script_int caster "$@Duel_QueueLimit")) " duel(s) in the queue, which is the maximum."))
- (ABORT)))
- (IF (> (script_int target "@Duel_Queue[($@Duel_PlayerQueueLimit)]") 0)
- (BLOCK
- (message caster (+ (+ "There is already " (script_int caster "$@Duel_PlayerQueueLimit")) " duel request(s) in the queue of this player, which is the maximum."))
- (ABORT)))
- (SET script_target target)
- (SCRIPT "{callfunc \"fightclub_sendrequest\";}"))))
-
-(SPELL (NONMAGIC SILENT) marriage "marry" (PC target)
- (=>
- (GUARD
- (REQUIRE
- (||
- (is_in
- (location caster)
- (@+
- (@ "014-1" 28 39)
- 8
- 6))
- (is_in
- (location caster)
- (@+
- (@ "001-2" 21 27)
- 4
- 4)))))
- (EFFECT
- (IF (== target caster)
- (ABORT)) "no valid target or tried to marry self?"
- (IF (<
- (level caster)
- MIN_MARRY_LEVEL)
- (BLOCK
- (message caster
- (+
- (+ "You must be level " MIN_MARRY_LEVEL)
- " or higher to marry!"))
- (ABORT)))
- (IF (<
- (level target)
- MIN_MARRY_LEVEL)
- (BLOCK
- (message caster
- (+
- (+ "Your partner must be level " MIN_MARRY_LEVEL)
- " or higher to marry!"))
- (ABORT)))
- (IF (==
- (partner caster)
- target)
- (BLOCK
- (message caster
- (+
- (+ "You and "
- (name_of target))
- " are already married."))
- (ABORT)))
- (IF (is_married caster)
- (BLOCK
- (message caster "You are already married!")
- (ABORT)))
- (IF (is_married target)
- (BLOCK
- (message caster
- (+
- (name_of target)
- " is already married."))
- (ABORT)))
- (IF (!=
- (distance
- (location caster)
- (location target))
- 1)
- (BLOCK
- (message caster "You need to stand next to each other.")
- (ABORT)))
- (IF (||
- (==
- (count_item caster "WeddingRing")
- 0)
- (==
- (count_item target "WeddingRing")
- 0))
- (BLOCK
- (message caster "You must both be wearing your wedding rings!")
- (ABORT)))
- (SET script_target target)
- (SCRIPT "{
- announce @caster_name$ + \" is asking \" + strcharinfo(0) + \" for marriage.\", 2;
- mes @caster_name$ + \" wishes to marry you.\";
- mes \"Do you accept?\";
- next;
- menu
- \"Yes, I do!\", L_yes,
- \"No.\", L_Close;
-
- L_yes:
- if (marriage(@caster_name$))
- announce @caster_name$ + \" and \" + strcharinfo(0) + \" are now married!\", 0;
- goto L_Close;
-
- L_Close:
- close;
- }")
- (IF (not
- (is_married caster))
- (message caster
- (+
- (name_of target)
- " turned down your marriage offer."))))))
-
-(DISABLED
- (SPELL (LOCAL) mouboo-groan "#g" ()
- (=>
- (GUARD
- (MANA 1)
- (REQUIRE
- (==
- (name_of caster)
- "MOUBOOTAUR")))
- (EFFECT
- (FOREACH PC p
- (rbox
- (location caster)
- 200)
- (SET distance
- (rdistance
- (location caster)
- (location p))))
- (IF (< distance 15)
- (message p "The moubootaur's groaning rings in your ears!")
- (IF (< distance 70)
- (message p "You hear a loud groaning noise, not far away...")
- (message p "You hear an odd groaning noise in the distance...")))))))
-
-(DISABLED
- (SPELL (LOCAL) mouboo-smell "#s" ()
- (=>
- (GUARD
- (MANA 1)
- (REQUIRE
- (==
- (name_of caster)
- "MOUBOOTAUR")))
- (EFFECT
- (WAIT 30000)
- (FOREACH PC p
- (rbox
- (location caster)
- 30)
- (message p "You notice a strange smell all around you."))))))
-
-(SPELL (NONMAGIC) killgm0 "#pullrabbit" ()
- (=>
- (REQUIRE
- (is_equipped caster "MagicGMTopHat"))
- (EFFECT
- (SCRIPT "{
- callfunc \"ActivateMagicGMTophat\";
- }"))))
diff --git a/world/map/conf/magic-procedures.sex b/world/map/conf/magic-procedures.sex
deleted file mode 100644
index ea62f50f..00000000
--- a/world/map/conf/magic-procedures.sex
+++ /dev/null
@@ -1,345 +0,0 @@
-"Default sfx on caster"
-(PROCEDURE default_effect ()
- (sfx caster
- (+
- (- school MAGIC)
- 2)
- 0))
-
-(PROCEDURE sfx_generic (target)
- (sfx target SFX_DEFAULT 0))
-
-(PROCEDURE sfx_lightning (target)
- (sfx target SFX_LIGHTNING 0))
-
-(PROCEDURE set_var (name mask shift value)
- (set_script_variable caster name
- (|
- (&
- (script_int caster name)
- (neg
- (<< mask shift)))
- (<<
- (& value mask)
- shift))))
-
-"value is How many HP we healed"
-"gain is how many life magic experience points we can potentially gain"
-"heal_xp_value_divisor is 1 for instaheal, 2 for slow heal"
-"base_exp_factor is the factor for how many base experience points (max) the player should be allowed to gain"
-(PROCEDURE gain_heal_xp (value gain heal_xp_value_divisor base_exp_factor)
- (SET last_heal_xp
- (&
- (>>
- (script_int caster SCRIPT_XP)
- SCRIPT_HEALSPELL_SHIFT)
- SCRIPT_HEALSPELL_MASK))
- (IF (&&
- (!= target caster)
- (>
- (/ value heal_xp_value_divisor)
- (+
- (+
- (+ 10 last_heal_xp)
- (random
- (+ last_heal_xp 1)))
- (random
- (+ last_heal_xp 1)))))
- (BLOCK
- (SET heal_xp
- (+ last_heal_xp gain))
- (IF (> heal_xp SCRIPT_HEALSPELL_MASK)
- (SET heal_xp SCRIPT_HEALSPELL_MASK))
- (CALL set_var SCRIPT_XP SCRIPT_HEALSPELL_MASK SCRIPT_HEALSPELL_SHIFT heal_xp)))
- (IF (!= target caster)
- (gain_experience caster
- (* base_exp_factor
- (extract_healer_experience target value))
- 0
- 1)))
-
-(PROCEDURE gain_xp (gain index)
- "Level 4 and 5 magic users don't gain anything from spell levels 0 resp. 0+1"
- (IF (>
- (+ level 3)
- (skill caster MAGIC))
- (BLOCK
- (SET last_index
- (&
- (>>
- (script_int caster SCRIPT_XP)
- SCRIPT_LASTSPELL_SHIFT)
- SCRIPT_LASTSPELL_MASK))
- (SET last_xp
- (&
- (>>
- (script_int caster SCRIPT_XP)
- SCRIPT_XP_SHIFT)
- SCRIPT_XP_MASK))
- (IF (!= index last_index)
- (BLOCK "Some variation observed"
- (SET xp
- (+ last_xp gain))
- (IF (> xp SCRIPT_XP_MASK)
- (SET xp SCRIPT_XP_MASK))
- (CALL set_var SCRIPT_XP SCRIPT_XP_MASK SCRIPT_XP_SHIFT xp)
- (CALL set_var SCRIPT_XP SCRIPT_LASTSPELL_MASK SCRIPT_LASTSPELL_SHIFT index)
- (IF DEBUG
- (message caster
- (+ "Spell xp = " xp))))
- (IF DEBUG
- (message caster
- (+ "Re-cast same spell, xp remain at " last_xp)))))))
-
-(PROCEDURE create_item (good_item count bad_item difficulty)
- (SET success 1)
- (SET score
- (+ experience
- (random
- (min spellpower
- (+
- (/ experience 3)
- 1)))))
- (IF (>= score difficulty)
- (create_item caster good_item count)
- (BLOCK
- (SET success 0)
- (SET score
- (+
- (+ score
- (random
- (luk caster)))
- (random
- (luk caster))))
- (IF (< score
- (/ difficulty 3))
- (BLOCK
- (message caster "Your spell backfires!")
- (IF (<
- (random 110)
- (luk caster))
- (itemheal caster
- (- 0
- (*
- (*
- (+ level 1)
- (+ level 2))
- (+ 3
- (random 28))))
- 0)
- (itemheal caster
- (- 0
- (+ level 1))
- 0)))
- (IF (< score
- (/
- (* difficulty 2)
- 3))
- (BLOCK
- (IF (==
- (random 5)
- 0)
- (BLOCK
- (message caster "Your spell solidifies into the shape of a mysterious object!")
- (create_item caster "Iten" 1))
- (message caster "Your spell escapes!")))
- (BLOCK
- (message caster "Your spell takes on a mind of its own!")
- (IF (==
- (random 3)
- 0)
- (create_item caster bad_item 1))))))))
-
-"Increase spellpower by school and general magic skill"
-(PROCEDURE adjust_spellpower (school)
- (SET experience
- (&
- (>>
- (script_int caster SCRIPT_XP)
- SCRIPT_XP_SHIFT)
- SCRIPT_XP_MASK))
- (SET spellpower
- (+ spellpower
- (*
- (+
- (skill caster MAGIC)
- (skill caster school))
- 10)))
- "Below, we adjust by special items"
- (IF (&&
- (not
- (failed target))
- (||
- (== school LIFE)
- (== school NATURE)))
- (IF target
- (IF (==
- (pc target)
- (partner caster))
- (BLOCK
- (SET spellpower
- (+ spellpower 200))
- (IF (is_equipped caster "WeddingRing")
- (SET spellpower
- (+ spellpower 50)))
- (IF (is_equipped
- (pc target)
- "WeddingRing")
- (SET spellpower
- (+ spellpower 50))))))))
-
-(PROCEDURE heal (target max_heal)
- (CALL default_effect)
- (IF (!= caster target)
- (sfx target SFX_HEAL 0))
- (SET power
- (+ spellpower
- (vit caster)))
- (SET power
- (min max_heal
- (/
- (* max_heal power)
- 250)))
- (itemheal target power 0))
-
-"Goes through instaheal instead of itemheal"
-(PROCEDURE quickheal (target power)
- (CALL default_effect)
- (IF (!= caster target)
- (sfx target SFX_HEAL 0))
- (instaheal target power 0))
-
-"Can attack the target? Imports attack_range from dynamic environment"
-(PROCEDURE attack_check (target)
- (IF (not
- (line_of_sight
- (location caster)
- (location target)))
- (ABORT))
- (IF (not
- (<=
- (rdistance
- (location caster)
- (location target))
- attack_range))
- (ABORT)))
-
-"Cause elemental damage. bonus_elt grants an attack bonus, malus_elt reduces the attack. `effect' is the sfx ID."
-(PROCEDURE elt_damage (target damage dmgplus bonus_elt malus_elt effect)
- (SET d
- (+ damage
- (random dmgplus)))
- (IF (==
- (element target)
- malus_elt)
- (SET d
- (/ d 3)))
- (IF (==
- (element target)
- bonus_elt)
- (SET d
- (/
- (* d
- (+ 4
- (element_level target)))
- 4)))
- (sfx target effect 0)
- (injure caster target d 0))
-
-(PROCEDURE melee_damage (target damage dmgplus)
- (CALL attack_check target)
- (SET d
- (+ damage
- (random dmgplus)))
- (SET evade
- (+
- (level target)
- (mdef target)))
- (IF (<
- (- spellpower
- (random 100))
- evade)
- (SET d 0))
- (injure caster target d 0))
-
-(PROCEDURE install_attack_spell (charges base_delay range attack_animation)
- (CALL default_effect)
- (SET attack_range range)
- (override_attack caster charges
- (/
- (*
- (- 200
- (agi caster))
- base_delay)
- 200)
- range
- ATTACK_ICON_GENERIC
- attack_animation
- 0))
-
-(PROCEDURE install_melee_spell (charges base_delay attack_animation)
- (CALL install_attack_spell charges base_delay 1 attack_animation))
-
-(PROCEDURE summon_spell (mob_id count delay lifetime control_level school)
- (CALL default_effect)
- (sfx location SFX_SUMMON_START 0)
- (WAIT delay)
- (sfx location SFX_SUMMON_FIRE 0)
- (spawn
- (rbox location (if_then_else
- (is_in (location caster)
- (@+
- (@ "009-7" (- (script_int caster "$@fightclub_x1") 2) (- (script_int caster "$@fightclub_y1") 2))
- (+ (- (script_int caster "$@fightclub_x2") (script_int caster "$@fightclub_x1")) 5)
- (+ (- (script_int caster "$@fightclub_y2") (script_int caster "$@fightclub_y1")) 5))) 1 2))
- caster
- mob_id
- (if_then_else
- (>=
- (skill caster school)
- control_level)
- 2
- 1)
- count
- lifetime)) "pets when level is high enough"
-
-(PROCEDURE abort_on_area_shield (pos)
- (IF (&&
- (==
- (is_exterior pos)
- 1)
- (||
- (||
- (==
- (map_nr pos)
- 1)
- (==
- (map_nr pos)
- 9))
- (==
- (map_nr pos)
- 20)))
- (BLOCK "1 is Tulimshar, 9 is Hurnscald and 20 is Nivalis"
- (message caster "A powerful magic drains your spell just as it is beginning to take shape!")
- (ABORT))))
-
-(PROCEDURE script_split_str (d str v m)
- (FOR a 0 m
- (BLOCK
- (IF (< (strlen str) 1) (BREAK))
- (SET arglen (strlen str))
- (SET argoffset
- (if_then_else
- (contains_string str d)
- (strstr str d)
- arglen))
- (SET arg
- (if_then_else (== arglen argoffset)
- str
- (substr str 0 argoffset)))
- (set_script_str caster (+ (+ "@" v) (+ a "$")) arg)
- (SET str
- (if_then_else
- (> arglen (- argoffset 1))
- (substr str (+ argoffset 1) arglen)
- "")))))
diff --git a/world/map/conf/magic-quests.sex b/world/map/conf/magic-quests.sex
deleted file mode 100644
index 4b8a822c..00000000
--- a/world/map/conf/magic-quests.sex
+++ /dev/null
@@ -1,154 +0,0 @@
-(PROCEDURE hug_tree (target)
- (IF (||
- (||
- (||
- (||
- (||
- (||
- (||
- (||
- (== target "")
- (== target "tree"))
- (== target "tree*"))
- (== target "Tree"))
- (== target "Tree*"))
- (== target "druid"))
- (== target "druid*"))
- (== target "Druid"))
- (== target "Druid*"))
- (SCRIPT "{
- set @flag, 2;
- callfunc \"QuestTreeTrigger\";
- close;
- }")))
-
-(SPELL (NONMAGIC) hug0 "hug" (STRING target)
- (=>
- (REQUIRE
- (||
- (<=
- (rdistance
- (location caster)
- (location
- (npc "#DruidTree0#_M")))
- 1)
- (<=
- (rdistance
- (location caster)
- (location
- (npc "#DruidTree1#_M")))
- 1)))
- (EFFECT
- (CALL hug_tree target))))
-
-(SPELL (NONMAGIC) hug1 "*hug*" (STRING target)
- (=>
- (REQUIRE
- (||
- (<=
- (rdistance
- (location caster)
- (location
- (npc "#DruidTree0#_M")))
- 1)
- (<=
- (rdistance
- (location caster)
- (location
- (npc "#DruidTree1#_M")))
- 1)))
- (EFFECT
- (CALL hug_tree target))))
-
-(SPELL (NONMAGIC) hug2 "*hug" (STRING target)
- (=>
- (REQUIRE
- (||
- (<=
- (rdistance
- (location caster)
- (location
- (npc "#DruidTree0#_M")))
- 1)
- (<=
- (rdistance
- (location caster)
- (location
- (npc "#DruidTree1#_M")))
- 1)))
- (EFFECT
- (CALL hug_tree target))))
-
-(SPELL (NONMAGIC) hug3 "hugs" (STRING target)
- (=>
- (REQUIRE
- (||
- (<=
- (rdistance
- (location caster)
- (location
- (npc "#DruidTree0#_M")))
- 1)
- (<=
- (rdistance
- (location caster)
- (location
- (npc "#DruidTree1#_M")))
- 1)))
- (EFFECT
- (CALL hug_tree target))))
-
-(SPELL (NONMAGIC) hug4 "*hugs*" (STRING target)
- (=>
- (REQUIRE
- (||
- (<=
- (rdistance
- (location caster)
- (location
- (npc "#DruidTree0#_M")))
- 1)
- (<=
- (rdistance
- (location caster)
- (location
- (npc "#DruidTree1#_M")))
- 1)))
- (EFFECT
- (CALL hug_tree target))))
-
-(SPELL (NONMAGIC) hug5 "*hugs" (STRING target)
- (=>
- (REQUIRE
- (||
- (<=
- (rdistance
- (location caster)
- (location
- (npc "#DruidTree0#_M")))
- 1)
- (<=
- (rdistance
- (location caster)
- (location
- (npc "#DruidTree1#_M")))
- 1)))
- (EFFECT
- (CALL hug_tree target))))
-
-"--------------------------------------------------------------------------------"
-"Illia spell"
-"--------------------------------------------------------------------------------"
-(SPELL (NONMAGIC) illia0 "#catalazuli" ()
- (=>
- (REQUIRE
- (==
- (rdistance
- (location caster)
- (location
- (npc "#Power Circle")))
- 0))
- (EFFECT
- (SCRIPT "{
- callfunc \"StartChannelling\";}
- "))))
diff --git a/world/map/conf/magic-quickdebug.sex b/world/map/conf/magic-quickdebug.sex
deleted file mode 100644
index 1b5f582c..00000000
--- a/world/map/conf/magic-quickdebug.sex
+++ /dev/null
@@ -1,10 +0,0 @@
-"--------------------------------------------------------------------------------"
-"Quickdebug Spells"
-"--------------------------------------------------------------------------------"
-(SPELL (NONMAGIC SILENT) debug0 "#debug" ()
- (EFFECT
- (SCRIPT "{if(!debug&&(getgmlevel()<99))end;callfunc \"Debug\";}")))
-
-(SPELL (NONMAGIC SILENT) debug1 "#numa" ()
- (EFFECT
- (SCRIPT "{if(!debug&&(getgmlevel()<99))end;callfunc \"SuperDebug\";}")))
diff --git a/world/map/conf/magic-secrets.sex.template b/world/map/conf/magic-secrets.sex.template
deleted file mode 100644
index 78d5e5d7..00000000
--- a/world/map/conf/magic-secrets.sex.template
+++ /dev/null
@@ -1,241 +0,0 @@
-" coding of generic spellinvocations"
-" #[indicates difficulty level][indicates questionnumber][indicates answerpossibility]"
-" X = easy; Y = medium; Z = hard"
-" each question have a number of possible answers (mostly using capital letters or not)"
-(SPELL (NONMAGIC) towelanswer00a "#X00" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer00b "#X01" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer01a "#X10" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer01b "#X11" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer02a "#X20" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer02b "#X21" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer03a "#X30" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer03b "#X31" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer04a "#X40" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer04b "#X41" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer05a "#X50" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer05b "#X51" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer05c "#X52" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer05d "#X53" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer06a "#X60" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer06b "#X61" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer06c "#X62" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer06d "#X63" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer07a "#X70" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer07b "#X71" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer08a "#X80" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer08b "#X81" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer08c "#X82" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer08d "#X83" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer09a "#X90" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer09b "#X91" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer10a "#Y00" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer10b "#Y01" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer11a "#Y10" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer11b "#Y11" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer12a "#Y20" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer12b "#Y21" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer13a "#Y30" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer13b "#Y31" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer14a "#Y40" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer14b "#Y41" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer15a "#Y50" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer15b "#Y51" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer15c "#Y52" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer16a "#Y60" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer16b "#Y61" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer17a "#Y70" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer17b "#Y71" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer18a "#Y80" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer18b "#Y81" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer18c "#Y82" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer18d "#Y83" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer19a "#Y90" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer19b "#Y91" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer19c "#Y92" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer19d "#Y93" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer110a "#YA0" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer110b "#YA1" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer111a "#YB0" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer111b "#YB1" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer20a "#Z00" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer20b "#Z01" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer20c "#Z02" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer20d "#Z03" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer21a "#Z10" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer21b "#Z11" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer22a "#Z20" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer22b "#Z21" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer23a "#Z30" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer23b "#Z31" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer24a "#Z40" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer24b "#Z41" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer25a "#Z50" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer25b "#Z51" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer26a "#Z60" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer26b "#Z61" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer27a "#Z62" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer27b "#Z63" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer27c "#Z70" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer27d "#Z71" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer28a "#Z72" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer28b "#Z73" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer29a "#Z80" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
-(SPELL (NONMAGIC) towelanswer29b "#Z81" ()
- (EFFECT
- (SCRIPT "{ message strcharinfo(0), \"\"; }")))
diff --git a/world/map/conf/permissions.txt b/world/map/conf/permissions.txt
new file mode 100644
index 00000000..0b8cb79a
--- /dev/null
+++ b/world/map/conf/permissions.txt
@@ -0,0 +1,21 @@
+// command permissions below
+CMD_ZENY 80
+CMD_CHARZENY 99
+CMD_DEBUG 80
+CMD_CHANGESEX 40
+CMD_CHARCHANGESEX 60
+CMD_CLASS 40
+CMD_CHARCLASS 50
+CMD_DESTROYNPC 99
+CMD_REMOTECMD 40
+
+// special permissions below
+MAP_LOUNGE 20 // level to enter the GM Lounge & talk to Numa
+EVT_KILLTHEGM 50 // this is both for the event and the magic gm top hat
+DBG_HOLIDAY 40 // holiday debug (xmas, halloween, ...)
+EVT_DEBUG 50 // event debug (open portals, disguise, ...)
+DBG_SCHEDULED 40 // scheduled broadcasts (schedule broadcast, stop broadcast, trigger broadcast, ...)
+DBG_MOTD 40 // motd debug (show/hide motd)
+
+// very specific debug menus
+DBG_VALIA 40 // illia quest debug info
diff --git a/world/map/conf/permissions_local.txt.example b/world/map/conf/permissions_local.txt.example
new file mode 100644
index 00000000..422da753
--- /dev/null
+++ b/world/map/conf/permissions_local.txt.example
@@ -0,0 +1,10 @@
+// in this file you can overwrite anything from permissions.txt
+
+
+// Template for test server:
+//CMD_ZENY 0
+//CMD_DEBUG 0
+//CMD_CHANGESEX 0
+//CMD_CLASS 0
+//MAP_LOUNGE 0
+//DBG_VALIA 0
diff --git a/world/map/conf/tmwa-map.conf b/world/map/conf/tmwa-map.conf
index 849779af..53926ffb 100644
--- a/world/map/conf/tmwa-map.conf
+++ b/world/map/conf/tmwa-map.conf
@@ -9,10 +9,14 @@ map_conf: conf/map_athena.conf
battle_conf: conf/battle_athena.conf
atcommand_conf: conf/atcommand_athena.conf
+const_db: db/params.txt
const_db: db/const.txt
+const_db: db/const-magic.txt
const_db: db/const-quest.txt
const_db: db/const-mapflags.txt
const_db: db/const-debugflag.txt
+const_db: conf/permissions.txt
+const_db: conf/permissions_local.txt
quest_db: db/quest-log.txt
@@ -35,19 +39,4 @@ mob_db: db/mob_db_over_100.txt
mob_skill_db: db/mob_skill_db.txt
skill_db: db/skill_db.txt
-magic_conf: conf/magic-config.sex
-magic_conf: conf/magic-procedures.sex
-magic_conf: conf/magic-level0.sex
-magic_conf: conf/magic-level1.sex
-magic_conf: conf/magic-level2.sex
-magic_conf: conf/magic-level3.sex
-magic_conf: conf/magic-level4.sex
-magic_conf: conf/magic-level5.sex
-magic_conf: conf/magic-misc.sex
-magic_conf: conf/magic-quests.sex
-magic_conf: conf/magic-anchors.sex
-magic_conf: conf/magic-quickdebug.sex
-
-magic_conf: conf/magic-secrets.sex
-
resnametable: data/resnametable.txt
diff --git a/world/map/data/005-3.wlk b/world/map/data/005-3.wlk
index a1dcecee..26dc436d 100644
--- a/world/map/data/005-3.wlk
+++ b/world/map/data/005-3.wlk
Binary files differ
diff --git a/world/map/data/006-1.wlk b/world/map/data/006-1.wlk
index f2de1da0..8bfc19ee 100644
--- a/world/map/data/006-1.wlk
+++ b/world/map/data/006-1.wlk
Binary files differ
diff --git a/world/map/data/009-8.wlk b/world/map/data/009-8.wlk
new file mode 100644
index 00000000..838fcfe2
--- /dev/null
+++ b/world/map/data/009-8.wlk
Binary files differ
diff --git a/world/map/data/011-6.wlk b/world/map/data/011-6.wlk
index 5efeeaad..5f322060 100644
--- a/world/map/data/011-6.wlk
+++ b/world/map/data/011-6.wlk
Binary files differ
diff --git a/world/map/data/016-2.wlk b/world/map/data/016-2.wlk
new file mode 100644
index 00000000..6db17215
--- /dev/null
+++ b/world/map/data/016-2.wlk
Binary files differ
diff --git a/world/map/data/043-4.wlk b/world/map/data/043-4.wlk
index f88880f8..04f2c2a0 100644
--- a/world/map/data/043-4.wlk
+++ b/world/map/data/043-4.wlk
Binary files differ
diff --git a/world/map/data/resnametable.txt b/world/map/data/resnametable.txt
index c303fb65..50a7b029 100644
--- a/world/map/data/resnametable.txt
+++ b/world/map/data/resnametable.txt
@@ -23,6 +23,7 @@
009-5#009-5.wlk#
009-6#009-6.wlk#
009-7#009-7.wlk#
+009-8#009-8.wlk#
010-1#010-1.wlk#
010-2#010-2.wlk#
011-1#011-1.wlk#
@@ -40,6 +41,7 @@
015-1#015-1.wlk#
015-3#015-3.wlk#
016-1#016-1.wlk#
+016-2#016-2.wlk#
017-1#017-1.wlk#
017-2#017-2.wlk#
017-3#017-3.wlk#
diff --git a/world/map/db/const-magic.txt b/world/map/db/const-magic.txt
new file mode 100644
index 00000000..9bf8e063
--- /dev/null
+++ b/world/map/db/const-magic.txt
@@ -0,0 +1,62 @@
+// NOTE: I think min_casttime should be in battle config if we don't make it a variable
+MIN_CASTTIME 200
+
+// Magic Skills
+SKILL_MAGIC 340
+SKILL_MAGIC_LIFE 341
+SKILL_MAGIC_WAR 342
+SKILL_MAGIC_TRANSMUTE 343
+SKILL_MAGIC_NATURE 344
+SKILL_MAGIC_ASTRAL 345
+SKILL_MAGIC_DARK 346
+
+// Elements
+ELT_NEUTRAL 0
+ELT_WATER 1
+ELT_EARTH 2
+ELT_FIRE 3
+ELT_WIND 4
+ELT_POISON 5
+ELT_SHADOW 6
+ELT_HOLY 7
+ELT_GHOST 8
+ELT_UNDEAD 9
+
+// Status effects
+SC_SHEARED 194
+SC_HIDE 194
+SC_HALT_REGENERATE 195
+SC_FLYING_BACKPACK 196
+SC_MBARRIER 197
+SC_HASTE 198
+SC_PHYS_SHIELD 199
+SO_GMHIDE 64
+SO_GMINVISIBLE 4096
+
+// Special effects
+SFX_DEFAULT 10
+SFX_SUMMON_START 21
+SFX_SUMMON_FIRE 22
+SFX_TELEPORT 24
+SFX_RAIN 25
+SFX_HIT 25
+SFX_ARROW_HAIL 27
+SFX_BARRIER 10
+SFX_UNBARRIER 10
+SFX_HEAL 3
+SFX_LIGHTNING 18
+
+// Magic Spell Const
+MIN_MARRY_LEVEL 32
+MAX_RAIN_SPELL_RADIUS 15
+MAX_MAGIC_LEVEL 2
+MFLAG_MADE_CONC_POTION 16384
+MFLAG_MADE_CONC_POTION_SHIFT 14
+// SCRIPT_XP "MAGIC_EXPERIENCE"
+SCRIPT_XP_MASK 65535
+SCRIPT_XP_SHIFT 0
+SCRIPT_HEALSPELL_MASK 255
+SCRIPT_HEALSPELL_SHIFT 24
+ATTACK_ICON_GENERIC 2000
+ATTACK_ICON_SHEARING 2001
+E10_FLAG_USED_FREE_WARP_SHIFT 17
diff --git a/world/map/db/const.txt b/world/map/db/const.txt
index d3b42ee4..a76f16b9 100644
--- a/world/map/db/const.txt
+++ b/world/map/db/const.txt
@@ -1,39 +1,6 @@
// Constants usable in scripts.
+// TODO remove all the bSomething and move them to params instead
-// BEFORE UNCOMMENTING ANYTHING, TALK TO o11c!
-
-// Note: the type-1 constants and the bWhatever are actually
-// the same type internally, but they must be used differently.
-// A *few* can be used for both ...
-// TODO resolve that last, and change the names to match SP_*
-
-// BEFORE UNCOMMENTING ANYTHING, TALK TO o11c!
-//BaseExp 1 1
-//JobExp 2 1
-Hp 5 1
-MaxHp 6 1
-Sp 7 1
-MaxSp 8 1
-StatusPoint 9 1
-BaseLevel 11 1
-//SkillPoint 12 1
-Class 19 1
-Zeny 20 1
-Sex 21 1
-//NextBaseExp 22 1
-//NextJobExp 23 1
-Weight 24 1
-MaxWeight 25 1
-//JobLevel 55 1
-//Upper 56 1
-Str 13 1
-Agi 14 1
-Vit 15 1
-Int 16 1
-Dex 17 1
-Luk 18 1
-
-// BEFORE UNCOMMENTING ANYTHING, TALK TO o11c!
bMaxHP 6
bMaxSP 8
bStr 13
@@ -44,7 +11,7 @@ bDex 17
bLuk 18
//bAtk 41
//bAtk2 42
-//bMatk1 43
+bMatk1 43
//bMatk2 44
//bDef 45
bMdef 47
@@ -102,8 +69,6 @@ bDeaf 70
// Those which can be used with the arrow are only bCritical, bAtkEle, bHit, bAddEle, bAddRace, bAddSize and bAddEff. The other bonuses are ignored.
// For more information, have a look here: http://code.google.com/p/eathena/source/browse/trunk/doc/item_bonus.txt
-// BEFORE UNCOMMENTING ANYTHING, TALK TO o11c!
-
bAtkRange 1000 // A range bonus of n (bAtkRange,n;).
//bAtkEle 1001 // Gives the player's attacks a n element (bAtkEle,n;).
//bDefEle 1002 // Gives the player's defense a n element (bDefEle,n;).
@@ -265,6 +230,13 @@ sc_poison 132
sc_slowpoison 14
sc_raiseattackspeed0 37
sc_raiseattackstrength 185
+SC_SHEARED 194
+SC_HIDE 194
+SC_HALT_REGENERATE 195
+SC_FLYING_BACKPACK 196
+SC_MBARRIER 197
+SC_HASTE 198
+SC_PHYS_SHIELD 199
// Emotions
EMOTE_DISGUST 1
@@ -311,6 +283,11 @@ EMOTE_TROLL 126
EMOTE_PAIN 127
EMOTE_TEARS 128
+// symbols used for registercmd (ASCII)
+MAGIC_SYMBOL 35 //#
+ATCMD_SYMBOL 64 //@
+DEBUG_SYMBOL 37 //%
+
sfx_skillup 1
sfx_magic_generic 2
sfx_magic_life 3
@@ -362,6 +339,7 @@ FX_MAGIC_BLUE_TELEPORT 41
FX_MAGIC_DARK_EXPLOSION 42
FX_PUMPKIN_EXPLOSION 43
FX_GETITEM 44
+FX_HUG 49
FX_MAGIC_SHIELD_ENDS 111
FX_ELECTRICITY_RED 114
FX_ELECTRICITY_BLUE 115
@@ -426,11 +404,24 @@ SKILL_RESIST_POISON 353
SKILL_ASTRAL_SOUL 354
SKILL_RAGING 355
-// Magic Skills
-SKILL_MAGIC 340
-SKILL_MAGIC_LIFE 341
-SKILL_MAGIC_WAR 342
-SKILL_MAGIC_TRANSMUTE 343
-SKILL_MAGIC_NATURE 344
-SKILL_MAGIC_ASTRAL 345
-SKILL_MAGIC_DARK 346
+// GM groups
+G_PLAYER 0
+G_BOT 1
+G_TESTER 20
+G_DEV 40
+G_EVENT 50
+G_GM 60
+G_ADMIN 80
+G_SYSOP 99
+
+// Server Message Types (smsg builtin)
+SMSG_DEBUG 0
+SMSG_GM 1
+SMSG_WARNING 2
+SMSG_SUCCESS 3
+SMSG_FAILURE 4
+SMSG_ERROR 5
+SMSG_LEGAL 6
+SMSG_MOTD 7
+SMSG_AUTOMATIC 8
+SMSG_EVENT 9
diff --git a/world/map/db/item_db_generic.txt b/world/map/db/item_db_generic.txt
index 16934102..7aefbc31 100644
--- a/world/map/db/item_db_generic.txt
+++ b/world/map/db/item_db_generic.txt
@@ -49,7 +49,6 @@
672, WhiteTulip, 3, 80, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {}, {}
673, PinkTulip, 3, 80, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {}, {}
674, OrangeTulip, 3, 80, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {}, {}
-677, HeartNecklace, 3, 2500, 1000, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {}, {}
680, MauveHerb, 3, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {}, {}
681, CobaltHerb, 3, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {}, {}
682, GambogeHerb, 3, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {}, {}
diff --git a/world/map/db/item_db_head.txt b/world/map/db/item_db_head.txt
index 9cd56c4e..1f819e67 100644
--- a/world/map/db/item_db_head.txt
+++ b/world/map/db/item_db_head.txt
@@ -63,7 +63,7 @@
885, GreenEggshellHat, 5, 7000, 5000, 15, 0, 9, 0, 3, 0, 2, 256, 0, 1, 0, {}, {}
886, OrangeEggshellHat, 5, 7000, 5000, 15, 0, 9, 0, 3, 0, 2, 256, 0, 1, 0, {}, {}
887, DarkEggshellHat, 5, 7000, 5000, 15, 0, 9, 0, 3, 0, 2, 256, 0, 1, 0, {}, {}
-888, MagicGMTopHat, 5, 4200, 1900, 30, 0, 60, 0, 20, 0, 2, 256, 0, 0, 0, {}, {set @minLvl, 60; callfunc "RestrictedItem"; bonus bMaxHP, 31000; bonus bFlee, -200; bonus bHPrecovRate, -400; bonus bCriticalDef, 250; bonus bMdef, 89;}
+888, MagicGMTopHat, 5, 4200, 1900, 30, 0, 60, 0, 20, 0, 2, 256, 0, 0, 0, {}, {set @minLvl, EVT_KILLTHEGM; callfunc "RestrictedItem"; bonus bMaxHP, 31000; bonus bFlee, -200; bonus bHPrecovRate, -400; bonus bCriticalDef, 250; bonus bMdef, 89;}
889, MurdererCrown, 5, 75000, 12000, 240, 0, 4, 0, 0, 0, 2, 256, 0, 0, 0, {}, {}
890, BeanieCopter, 5, 8000, 2000, 20, 0, 4, 0, 2, 0, 2, 256, 0, 0, 0, {}, {}
897, RedRoseHat, 5, 5000, 1000, 0, 0, 1, 0, 8, 0, 2, 256, 0, 0, 0, {}, {}
@@ -77,7 +77,7 @@
1174, CashiersShade, 5, 4000, 500, 15, 0, 2, 0, -10, 0, 2, 256, 0, 0, 0, {}, {}
1175, AutumnMask, 5, 5000, 500, 10, 0, 1, 0, 4, 0, 2, 256, 0, 0, 0, {}, {}
1190, NutcrackerHat, 5, 1000, 500, 20, 0, 5, 0, 2, 0, 2, 256, 0, 0, 0, {}, {}
-1196, Beret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {bonus bAgi, 2;}, {}
+1196, Beret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {}, {bonus bAgi, 2;}
1203, RangerHat, 5, 1000, 500, 20, 0, 2, 0, -1, 0, 2, 256, 0, 0, 0, {}, {}
1204, AntlerHat, 5, 1000, 500, 15, 0, 4, 0, 2, 0, 2, 256, 0, 0, 0, {}, {}
1205, ChristmasTreeHat, 5, 2000, 1000, 20, 0, 2, 0, 4, 0, 2, 256, 0, 0, 0, {}, {}
@@ -159,16 +159,16 @@
2237, OrangeBowlerHatBrown, 5, 2500, 1250, 30, 0, 10, 0, 2, 0, 2, 256, 0, 0, 0, {}, {}
2238, PurpleBowlerHatBrown, 5, 2500, 1250, 30, 0, 10, 0, 2, 0, 2, 256, 0, 0, 0, {}, {}
2239, DarkGreenBowlerHatBrown, 5, 2500, 1250, 30, 0, 10, 0, 2, 0, 2, 256, 0, 0, 0, {}, {}
-2260, RedBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {bonus bAgi, 2;}, {}
-2261, GreenBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {bonus bAgi, 2;}, {}
-2262, DarkBlueBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {bonus bAgi, 2;}, {}
-2263, YellowBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {bonus bAgi, 2;}, {}
-2264, LightBlueBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {bonus bAgi, 2;}, {}
-2265, PinkBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {bonus bAgi, 2;}, {}
-2266, BlackBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {bonus bAgi, 2;}, {}
-2267, OrangeBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {bonus bAgi, 2;}, {}
-2268, PurpleBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {bonus bAgi, 2;}, {}
-2269, DarkGreenBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {bonus bAgi, 2;}, {}
+2260, RedBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {}, {bonus bAgi, 2;}
+2261, GreenBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {}, {bonus bAgi, 2;}
+2262, DarkBlueBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {}, {bonus bAgi, 2;}
+2263, YellowBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {}, {bonus bAgi, 2;}
+2264, LightBlueBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {}, {bonus bAgi, 2;}
+2265, PinkBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {}, {bonus bAgi, 2;}
+2266, BlackBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {}, {bonus bAgi, 2;}
+2267, OrangeBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {}, {bonus bAgi, 2;}
+2268, PurpleBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {}, {bonus bAgi, 2;}
+2269, DarkGreenBeret, 5, 1000, 500, 20, 0, 3, 0, 0, 0, 2, 256, 0, 0, 0, {}, {bonus bAgi, 2;}
//ID, Name___________________, Type, Price, Sell, Weight, ATK, DEF, Range, Mbonus, Slot, Gender, Loc, wLV, eLV, View, {UseScript}, {EquipScript}
4020, CandleHelmet, 5, 20000, 2000, 450, 0, 16, 0, -25, 0, 2, 256, 0, 0, 0, {}, {bonus bInt, 1;bonus bAgi, -1;}
4027, YetiMask, 5, 6000, 3000, 10, 0, 4, 0, -10, 0, 2, 256, 0, 0, 0, {}, {}
diff --git a/world/map/db/item_db_trinket.txt b/world/map/db/item_db_trinket.txt
index 0f5c589f..7e1f499f 100644
--- a/world/map/db/item_db_trinket.txt
+++ b/world/map/db/item_db_trinket.txt
@@ -18,3 +18,4 @@
4012, TopazRing, 5, 5000, 2500, 1, 0, 0, 0, 0, 0, 2, 128, 0, 0, 0, {}, {bonus bAgi, 1;}
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, {}, {}
diff --git a/world/map/db/params.txt b/world/map/db/params.txt
new file mode 100644
index 00000000..66a5f1bb
--- /dev/null
+++ b/world/map/db/params.txt
@@ -0,0 +1,56 @@
+// Params usable in scripts
+// see SP enum in clif.t.hpp
+
+// TODO finish that list and add comments
+// TODO refactor: make the names match their SP:: counterpart <== halfway done
+
+BASEEXP 1 1
+JOBEXP 2 1
+Hp 5 1
+MaxHp 6 1
+Sp 7 1
+MaxSp 8 1
+STATUSPOINT 9 1
+HEALXP 10 1
+BaseLevel 11 1
+SKILLPOINT 12 1
+Str 13 1
+Agi 14 1
+Vit 15 1
+Int 16 1
+Dex 17 1
+Luk 18 1
+Class 19 1
+Zeny 20 1
+Sex 21 1
+NEXTBASEEXP 22 1
+NEXTJOBEXP 23 1
+Weight 24 1
+MaxWeight 25 1
+ATK1 41 1
+ATK2 42 1
+MATK1 43 1
+MATK2 44 1
+DEF1 45 1
+DEF2 46 1
+MDEF1 47 1
+MDEF2 48 1
+HIT 49 1
+FLEE1 50 1
+FLEE2 51 1
+CRITICAL 52 1
+JOBLEVEL 55 1
+PARTNER 57 1
+GM 500 1
+ATTACKRANGE 1000 1
+ELTLVL 1001 1
+ELTTYPE 1002 1
+BASE_ATK 1014 1
+POS_X 1074 1
+POS_Y 1075 1
+PVP_CHANNEL 1076 1
+BL_ID 1077 1
+BL_TYPE 1078 1
+CHAR_ID 1079 1
+INVISIBLE 1080 1
+HIDDEN 1081 1
diff --git a/world/map/db/quest-log.txt b/world/map/db/quest-log.txt
index 131dd2f6..37e137f3 100644
--- a/world/map/db/quest-log.txt
+++ b/world/map/db/quest-log.txt
@@ -26,3 +26,5 @@
18,QL_ANWAR,QUEST_NorthTulimshar,3,4
19,QL_KYLIAN,QUEST_NorthTulimshar,5,4
20,QL_TERRANITE_ARMOR,QUEST_NorthTulimshar,6,4
+// 21 => assassin quest
+22,QL_CELESTIA,QUEST_Hurnscald,2,8
diff --git a/world/map/news.d/57-v2016.4.21.txt b/world/map/news.d/57-v2016.4.21.txt
new file mode 100644
index 00000000..78bb095d
--- /dev/null
+++ b/world/map/news.d/57-v2016.4.21.txt
@@ -0,0 +1,15 @@
+{title:Magic-v3}
+{date:2016-04-21}
+
+This release changes a lot server-side, but there is
+not much visible changes for the players.
+
+Release Notes v2016.04.21
+{ul}
+{li}Rewrite every single magic spells.{/li}
+{li}Fix some bugs with magic.{/li}
+{li}Add alchemy benches.{/li}
+{li}Add Celestia quest (introduces two new items).{/li}
+{/ul}
+
+{author:TMW Development Team}
diff --git a/world/map/npc/001-1/_import.txt b/world/map/npc/001-1/_import.txt
index 9b7ca66f..3122724c 100644
--- a/world/map/npc/001-1/_import.txt
+++ b/world/map/npc/001-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 001-1
npc: npc/001-1/_mobs.txt
+npc: npc/001-1/_nodes.txt
npc: npc/001-1/_warps.txt
npc: npc/001-1/adrian.txt
npc: npc/001-1/ched.txt
diff --git a/world/map/npc/001-1/_mobs.txt b/world/map/npc/001-1/_mobs.txt
index 6fc46da5..ebc1b007 100644
--- a/world/map/npc/001-1/_mobs.txt
+++ b/world/map/npc/001-1/_mobs.txt
@@ -1,29 +1,8 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Tulimshar Port mobs
-001-1,32,59,10,11|monster|GreenSlime|1005,8,100000ms,30000ms,Mob001-1::On1005
-001-1,45,100,10,11|monster|GreenSlime|1005,8,100000ms,30000ms,Mob001-1::On1005
-001-1,37,75,8,34|monster|SeaSlime|1033,8,100000ms,30000ms,Mob001-1::On1033
-001-1,86,84,65,55|monster|Maggot|1002,11,100000ms,30000ms,Mob001-1::On1002
-001-1,86,84,65,55|monster|SeaSlime|1033,8,100000ms,30000ms,Mob001-1::On1033
-
-
-001-1,0,0,0|script|Mob001-1|32767
-{
- end;
-
-On1002:
- set @mobID, 1002;
- callfunc "MobPoints";
- end;
-
-On1005:
- set @mobID, 1005;
- callfunc "MobPoints";
- end;
-
-On1033:
- set @mobID, 1033;
- callfunc "MobPoints";
- end;
-}
+001-1,32,59,10,11|monster|GreenSlime|1005,8,100000ms,30000ms
+001-1,45,100,10,11|monster|GreenSlime|1005,8,100000ms,30000ms
+001-1,37,75,8,34|monster|SeaSlime|1033,8,100000ms,30000ms
+001-1,86,84,65,55|monster|Maggot|1002,11,100000ms,30000ms
+001-1,86,84,65,55|monster|SeaSlime|1033,8,100000ms,30000ms
diff --git a/world/map/npc/001-1/_nodes.txt b/world/map/npc/001-1/_nodes.txt
new file mode 100644
index 00000000..8d82cc96
--- /dev/null
+++ b/world/map/npc/001-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Tulimshar Port nodes
+
+// (no nodes)
diff --git a/world/map/npc/001-1/ched.txt b/world/map/npc/001-1/ched.txt
index ddfddd95..1710ff1e 100644
--- a/world/map/npc/001-1/ched.txt
+++ b/world/map/npc/001-1/ched.txt
@@ -3,23 +3,9 @@
001-1,43,48,0|script|Ched|113
{
mes "[Ched]";
- mes "\"I'm trying to get a spell to work, but I'm having some trouble.\"";
- mes "\"It's supposed to combine two potions, but I can't seem to figure out which two to combine...\"";
+ mes "\"I'm trying to get work on my Alchemy homework, but I'm having some trouble.\"";
+ mes "\"I'm supposed to combine two potions to create a " + getitemlink("ConcentrationPotion") + ", but I can't seem to figure out which two to combine...\"";
next;
- menu
- "Good luck with that.", L_Done,
- "What spell is it?", L_Next;
-
-L_Next:
- mes "";
- mes "[Ched]";
- mes "\"Well, I don't remember what it's called... I took it out of 'Timbleweed's Advanced Transmutations,' but it seems awfully hard to cast.\"";
- next;
- mes "\"If you want to try it, the invocation is '" + getspellinvocation("merge-concentration-potions") + ".' I just can't get the hang of it though.\"";
- next;
- mes "\"Maybe I should go back to practicing '" + getspellinvocation("detect-magic") + "' until I can cast it properly.\" %%6";
- goto L_Done;
-
-L_Done:
+ mes "\"Maybe I should go back to practicing '" + get(.invocation$, "detect-magic") + "' until I can make potions properly.\" %%6";
close;
}
diff --git a/world/map/npc/001-1/children.txt b/world/map/npc/001-1/children.txt
index 5ad738a9..83718566 100644
--- a/world/map/npc/001-1/children.txt
+++ b/world/map/npc/001-1/children.txt
@@ -78,7 +78,7 @@ L_keepword:
L_giveword:
mes "[Aisha]";
mes "Aisha looks around as she leans in and hushes you to silence. After a few seconds, she whispers to you:";
- mes "\"I like you, so I'll tell you the bad word. But you can't tell anyone else about it! The bad word is '" + getspellinvocation("aggravate") + ".'\"";
+ mes "\"I like you, so I'll tell you the bad word. But you can't tell anyone else about it! The bad word is '" + get(.invocation$, "spell-aggravate") + ".'\"";
next;
mes "[Aisha]";
diff --git a/world/map/npc/001-1/guards.txt b/world/map/npc/001-1/guards.txt
index 0167510e..df25a13e 100644
--- a/world/map/npc/001-1/guards.txt
+++ b/world/map/npc/001-1/guards.txt
@@ -91,6 +91,6 @@ L_message:
mes "[Ryan the Town Guard]";
mes "\" Watch out for Black Scorpions. They are extremely dangerous!\"";
next;
- mes "\"Whenever one approaches the town gate, Ekinu has me run around shouting '" + getspellinvocation("aggravate") + ".' Somehow, this distracts it so Ekinu can kill it.\"";
+ mes "\"Whenever one approaches the town gate, Ekinu has me run around shouting '" + $@SPELL_AGGRAVATE$ + ".' Somehow, this distracts it so Ekinu can kill it.\"";
close;
}
diff --git a/world/map/npc/001-2/_import.txt b/world/map/npc/001-2/_import.txt
index 338ec411..ee75d70e 100644
--- a/world/map/npc/001-2/_import.txt
+++ b/world/map/npc/001-2/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 001-2
npc: npc/001-2/_mobs.txt
+npc: npc/001-2/_nodes.txt
npc: npc/001-2/_warps.txt
npc: npc/001-2/bank.txt
npc: npc/001-2/david.txt
diff --git a/world/map/npc/001-2/_mobs.txt b/world/map/npc/001-2/_mobs.txt
index 167e1f2e..570c1234 100644
--- a/world/map/npc/001-2/_mobs.txt
+++ b/world/map/npc/001-2/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// South Tulimshar Indoor mobs
-
-
-001-2,0,0,0|script|Mob001-2|32767
-{
- end;
-}
diff --git a/world/map/npc/001-2/_nodes.txt b/world/map/npc/001-2/_nodes.txt
new file mode 100644
index 00000000..9d4b5dab
--- /dev/null
+++ b/world/map/npc/001-2/_nodes.txt
@@ -0,0 +1,16 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// South Tulimshar Indoor nodes
+
+001-2,0,0,0|script|Node001-2|32767
+{
+ end;
+OnInit:
+ setarray .m$, "_N-Alchemy", "001-2", "001-2", "001-2", "001-2";
+ setarray .x1, "_N-Alchemy", 92, 98, 92, 98;
+ setarray .y1, "_N-Alchemy", 76, 89, 89, 76;
+ setarray .x2, "_N-Alchemy", 0, 0, 0, 0;
+ setarray .y2, "_N-Alchemy", 0, 0, 0, 0;
+ setarray .id, "_N-Alchemy", 0, 0, 0, 0;
+ donpcevent "_N-Alchemy::OnMaybeStart";
+ destroy;
+}
diff --git a/world/map/npc/001-2/government_building.txt b/world/map/npc/001-2/government_building.txt
index 51b43a8c..03c3eaf7 100644
--- a/world/map/npc/001-2/government_building.txt
+++ b/world/map/npc/001-2/government_building.txt
@@ -6,7 +6,7 @@
mes "[Estard]";
mes "\"Hello. What can I do for you?\"";
next;
- if (getpartnerid2())
+ if (PARTNER)
goto L_main_married;
menu
@@ -35,7 +35,7 @@ L_marry_do:
callsub S_give_rings;
mes "";
mes "[Estard]";
- mes "\"Here are your rings. In order to marry each other, you both must stand within one of the designated areas (like that small rug over there in the corner), wear your rings, and say 'marry (your partner's name).'\"";
+ mes "\"Here are your rings. In order to marry each other, you both must stand within one of the designated areas (like that small rug over there in the corner), wear your rings, and say '#marry (your partner's name).'\"";
close;
L_marry_too_young:
@@ -93,8 +93,8 @@ L_do_divorce:
if (Zeny < @divorce_cost)
goto L_not_enough_money;
- if (divorce())
- goto L_divorce_done;
+ set PARTNER, 0, PARTNER; // divorce the partner first, which will also divorce the rid if succesful
+ if (PARTNER < 1) goto L_divorce_done;
mes "";
mes "[Estard]";
diff --git a/world/map/npc/001-2/pauline.txt b/world/map/npc/001-2/pauline.txt
index 4fbd5a5f..6925d554 100644
--- a/world/map/npc/001-2/pauline.txt
+++ b/world/map/npc/001-2/pauline.txt
@@ -92,7 +92,7 @@ L_Spells:
L_Next1:
mes "[Pauline]";
mes "\"Well I could only read the invocations. So I don't exactly know what kind of ingredients you are going to need.\"";
- mes "\"The first one for the mouboo was " + getspellinvocation("summon-mouboo") + " and the one for the pinkie was " + getspellinvocation("summon-pinkie") +".\"";
+ mes "\"The first one for the mouboo was " + get(.invocation$, "smmouboo") + " and the one for the pinkie was " + get(.invocation$, "smpinkie") +".\"";
next;
mes "\"For the pinkie spell my suggestion is to try similar ingredients to the other Astral spells. Try a root and some item typical for pinkies.\"";
mes "\"The mouboo spell might be more complicated. From what I could translate, one of the spell components is crafted by magic.\"";
@@ -157,7 +157,7 @@ L_Next4:
goto L_DidNotWorkMouboo;
L_DidNotWorkMouboo:
- mes "The Witch takes " + @pauline_ingredient1$ + " and " + @pauline_ingredient2$ + " and puts them together calling " + getspellinvocation("summon-mouboo") + ".";
+ mes "The Witch takes " + @pauline_ingredient1$ + " and " + @pauline_ingredient2$ + " and puts them together calling " + get(.invocation$, "summon-mouboo") + ".";
mes "Nothing happens.";
mes "[Pauline]";
mes "\"It seems you did not tell me the correct ingredients. Come back when you find the correct ones.\"";
@@ -174,7 +174,7 @@ L_Pass2Mouboo:
goto L_DidNotWorkMouboo;
L_TrySpellMouboo:
- mes "The Witch takes " + @pauline_ingredient1$ + " and " + @pauline_ingredient2$ + " and puts them together calling " + getspellinvocation("summon-mouboo") + ".";
+ mes "The Witch takes " + @pauline_ingredient1$ + " and " + @pauline_ingredient2$ + " and puts them together calling " + get(.invocation$, "summon-mouboo") + ".";
monster "001-1", 55,68, "Good", 1028, 1;
mes "[Pauline]";
mes "\"It worked!\"";
@@ -220,7 +220,7 @@ L_Next5:
goto L_DidNotWorkPinkie;
L_DidNotWorkPinkie:
- mes "The Witch takes " + @pauline_ingredient1$ + " and " + @pauline_ingredient2$ + " and puts them together calling " + getspellinvocation("summon-pinkie") + ".";
+ mes "The Witch takes " + @pauline_ingredient1$ + " and " + @pauline_ingredient2$ + " and puts them together calling " + get(.invocation$, "summon-pinkie") + ".";
mes "Nothing happens.";
mes "[Pauline]";
mes "\"It seems you did not tell me the correct ingredients. Come back when you find the correct ones.\"";
@@ -237,7 +237,7 @@ L_Pass2Pinkie:
goto L_DidNotWorkPinkie;
L_TrySpellPinkie:
- mes "The Witch takes " + @pauline_ingredient1$ + " and " + @pauline_ingredient2$ + " and puts them together calling " + getspellinvocation("summon-pinkie") + ".";
+ mes "The Witch takes " + @pauline_ingredient1$ + " and " + @pauline_ingredient2$ + " and puts them together calling " + get(.invocation$, "summon-pinkie") + ".";
monster "001-1", 54,68, "Good", 1018, 1;
mes "[Pauline]";
mes "\"It worked!\"";
diff --git a/world/map/npc/001-2/tondar.txt b/world/map/npc/001-2/tondar.txt
index ba4c0fff..d7fd3531 100644
--- a/world/map/npc/001-2/tondar.txt
+++ b/world/map/npc/001-2/tondar.txt
@@ -41,7 +41,7 @@ L_askspell:
L_spell:
mes "[Tondar]";
- mes "\"Well, all right; this one can't do much harm. Press your hands together and say `" + getspellinvocation("ask-magic-exp") + "'.\"";
+ mes "\"Well, all right; this one can't do much harm. Press your hands together and say `" + get(.invocation$, "spell-experience") + "'.\"";
mes "\"This will release a steady flow of magic within you. Focus and try to control it; it is a good meditative practice.\"";
close;
diff --git a/world/map/npc/001-2/wizards.txt b/world/map/npc/001-2/wizards.txt
index 37efa8bd..3c7d6ecf 100644
--- a/world/map/npc/001-2/wizards.txt
+++ b/world/map/npc/001-2/wizards.txt
@@ -1,90 +1,26 @@
// Council of Ruling Wizards Room
-// manaseed
-001-2,104,19,0|script|Desert Mana Seed#_M|166
+-|script|Magic Council|32767
{
- mes "Strangely, you feel nothing – as if its membrane is closed to you.";
+ explode .@n, strnpcinfo(0), "#";
+ if (.@n[1] == 9) mes "The arch wizard seems to be busy.";
+ elif (.@n[1]) mes "The wizard seems to ignore you.";
+ else mes "Strangely, you feel nothing – as if its membrane is closed to you.";
next;
mes "Perhaps you should come back later.";
close;
-}
-
-//
-001-2,99,22,0|script|Wizard#1|355
-{
- mes "The wizard seems to ignore you.";
- next;
- mes "Perhaps you should come back later.";
- close;
-}
-
-//
-001-2,92,24,0|script|Wizard#2|356
-{
- mes "The wizard seems to ignore you.";
- next;
- mes "Perhaps you should come back later.";
- close;
-}
-
-//
-001-2,92,30,0|script|Wizard#3|357
-{
- mes "The wizard seems to ignore you.";
- next;
- mes "Perhaps you should come back later.";
- close;
-}
-
-//
-001-2,99,32,0|script|Wizard#4|358
-{
- mes "The wizard seems to ignore you.";
- next;
- mes "Perhaps you should come back later.";
- close;
-}
-
-//
-001-2,110,22,0|script|Wizard#5|359
-{
- mes "The wizard seems to ignore you.";
- next;
- mes "Perhaps you should come back later.";
- close;
-}
-
-//
-001-2,117,24,0|script|Wizard#6|360
-{
- mes "The wizard seems to ignore you.";
- next;
- mes "Perhaps you should come back later.";
- close;
-}
-
-//
-001-2,117,30,0|script|Wizard#7|361
-{
- mes "The wizard seems to ignore you.";
- next;
- mes "Perhaps you should come back later.";
- close;
-}
-//
-001-2,110,32,0|script|Wizard#8|362
-{
- mes "The wizard seems to ignore you.";
- next;
- mes "Perhaps you should come back later.";
- close;
-}
-//
-001-2,104,27,0|script|Arch-Wizard#9|354
-{
- mes "The arch wizard seems to be busy.";
- next;
- mes "Perhaps you should come back later.";
- close;
+OnInit:
+ void
+ puppet("001-2", 104, 19, "Desert Mana Seed#_M", 166),
+ puppet("001-2", 99, 22, "Wizard#1", 355),
+ puppet("001-2", 92, 24, "Wizard#2", 356),
+ puppet("001-2", 92, 30, "Wizard#3", 357),
+ puppet("001-2", 99, 32, "Wizard#4", 358),
+ puppet("001-2", 110, 22, "Wizard#5", 359),
+ puppet("001-2", 117, 24, "Wizard#6", 360),
+ puppet("001-2", 117, 30, "Wizard#7", 361),
+ puppet("001-2", 110, 32, "Wizard#8", 362),
+ puppet("001-2", 104, 27, "Arch-Wizard#9", 354);
+ end;
}
diff --git a/world/map/npc/001-3/_import.txt b/world/map/npc/001-3/_import.txt
index 92e0e964..5c821ae4 100644
--- a/world/map/npc/001-3/_import.txt
+++ b/world/map/npc/001-3/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 001-3
npc: npc/001-3/_mobs.txt
+npc: npc/001-3/_nodes.txt
npc: npc/001-3/_warps.txt
npc: npc/001-3/guards.txt
npc: npc/001-3/mapflags.txt
diff --git a/world/map/npc/001-3/_mobs.txt b/world/map/npc/001-3/_mobs.txt
index 1c76eac9..63e16e8c 100644
--- a/world/map/npc/001-3/_mobs.txt
+++ b/world/map/npc/001-3/_mobs.txt
@@ -1,15 +1,4 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Tulimshar Arena mobs
-001-3,0,0,0,0|monster|Maggot|1002,10,0ms,0ms,Mob001-3::On1002
-
-
-001-3,0,0,0|script|Mob001-3|32767
-{
- end;
-
-On1002:
- set @mobID, 1002;
- callfunc "MobPoints";
- end;
-}
+001-3,0,0,0,0|monster|Maggot|1002,10,0ms,0ms
diff --git a/world/map/npc/001-3/_nodes.txt b/world/map/npc/001-3/_nodes.txt
new file mode 100644
index 00000000..8a03ab93
--- /dev/null
+++ b/world/map/npc/001-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Tulimshar Arena nodes
+
+// (no nodes)
diff --git a/world/map/npc/002-1/_import.txt b/world/map/npc/002-1/_import.txt
index 66366b6c..1e4e50cf 100644
--- a/world/map/npc/002-1/_import.txt
+++ b/world/map/npc/002-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 002-1
npc: npc/002-1/_mobs.txt
+npc: npc/002-1/_nodes.txt
npc: npc/002-1/_warps.txt
npc: npc/002-1/anwar.txt
npc: npc/002-1/bard.txt
diff --git a/world/map/npc/002-1/_mobs.txt b/world/map/npc/002-1/_mobs.txt
index 19933fab..63282a48 100644
--- a/world/map/npc/002-1/_mobs.txt
+++ b/world/map/npc/002-1/_mobs.txt
@@ -1,47 +1,16 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Tulimshar South mobs
-002-1,93,62,24,9|monster|Maggot|1002,11,100000ms,30000ms,Mob002-1::On1002
-002-1,112,62,11,9|monster|Maggot|1002,11,100000ms,30000ms,Mob002-1::On1002
-002-1,108,73,11,9|monster|Maggot|1002,11,100000ms,30000ms,Mob002-1::On1002
-002-1,62,28,3,15|monster|Maggot|1002,6,100000ms,30000ms,Mob002-1::On1002
-002-1,74,96,24,33|monster|Scorpion|1003,12,100000ms,30000ms,Mob002-1::On1003
-002-1,113,114,10,7|monster|Maggot|1002,11,100000ms,30000ms,Mob002-1::On1002
-002-1,43,61,10,70|monster|Scorpion|1003,6,100000ms,30000ms,Mob002-1::On1003
-002-1,70,92,49,19|monster|Scorpion|1003,10,100000ms,30000ms,Mob002-1::On1003
-002-1,40,93,19,20|monster|RedScorpion|1004,10,100000ms,30000ms,Mob002-1::On1004
-002-1,42,40,8,29|monster|SeaSlime|1033,8,100000ms,30000ms,Mob002-1::On1033
-002-1,33,75,9,40|monster|SeaSlime|1033,8,100000ms,30000ms,Mob002-1::On1033
-002-1,99,62,37,9|monster|Scorpion|1003,6,100000ms,30000ms,Mob002-1::On1003
-002-1,73,105,20,21|monster|FireGoblin|1011,6,100000ms,30000ms,Mob002-1::On1011
-
-
-002-1,0,0,0|script|Mob002-1|32767
-{
- end;
-
-On1002:
- set @mobID, 1002;
- callfunc "MobPoints";
- end;
-
-On1003:
- set @mobID, 1003;
- callfunc "MobPoints";
- end;
-
-On1004:
- set @mobID, 1004;
- callfunc "MobPoints";
- end;
-
-On1011:
- set @mobID, 1011;
- callfunc "MobPoints";
- end;
-
-On1033:
- set @mobID, 1033;
- callfunc "MobPoints";
- end;
-}
+002-1,93,62,24,9|monster|Maggot|1002,11,100000ms,30000ms
+002-1,112,62,11,9|monster|Maggot|1002,11,100000ms,30000ms
+002-1,108,73,11,9|monster|Maggot|1002,11,100000ms,30000ms
+002-1,62,28,3,15|monster|Maggot|1002,6,100000ms,30000ms
+002-1,74,96,24,33|monster|Scorpion|1003,12,100000ms,30000ms
+002-1,113,114,10,7|monster|Maggot|1002,11,100000ms,30000ms
+002-1,43,61,10,70|monster|Scorpion|1003,6,100000ms,30000ms
+002-1,70,92,49,19|monster|Scorpion|1003,10,100000ms,30000ms
+002-1,40,93,19,20|monster|RedScorpion|1004,10,100000ms,30000ms
+002-1,42,40,8,29|monster|SeaSlime|1033,8,100000ms,30000ms
+002-1,33,75,9,40|monster|SeaSlime|1033,8,100000ms,30000ms
+002-1,99,62,37,9|monster|Scorpion|1003,6,100000ms,30000ms
+002-1,73,105,20,21|monster|FireGoblin|1011,6,100000ms,30000ms
diff --git a/world/map/npc/002-1/_nodes.txt b/world/map/npc/002-1/_nodes.txt
new file mode 100644
index 00000000..7e192e45
--- /dev/null
+++ b/world/map/npc/002-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Tulimshar South nodes
+
+// (no nodes)
diff --git a/world/map/npc/002-1/_warps.txt b/world/map/npc/002-1/_warps.txt
index 4350dc94..55271d57 100644
--- a/world/map/npc/002-1/_warps.txt
+++ b/world/map/npc/002-1/_warps.txt
@@ -14,6 +14,6 @@
002-1,73,35|warp|-1,-1,002-2,44,33
002-1,57,35|warp|-1,-1,002-2,120,94
002-1,67,29|warp|-1,-1,002-2,23,109
-002-1,113,107|warp|-1,-1,005-3,52,35
+002-1,113,107|warp|-1,-1,005-3,52,37
002-1,49,20|warp|-1,-1,004-3,24,94
002-1,57,26|warp|-1,-1,002-2,119,131
diff --git a/world/map/npc/002-1/elanore.txt b/world/map/npc/002-1/elanore.txt
index ea3b78bf..b235c5b4 100644
--- a/world/map/npc/002-1/elanore.txt
+++ b/world/map/npc/002-1/elanore.txt
@@ -19,8 +19,6 @@ function|script|ElanoreFix
function|script|elanore_decrease_exp
{
- if (attachrid(@killerrid) == 0)
- goto L_Return;
set @Q_heal_exp, MAGIC_EXPERIENCE >> 24;
if (@Q_heal_exp < 8) goto L_OnPcKillWipe;
set @Q_heal_exp, @Q_heal_exp - 8;
@@ -233,7 +231,7 @@ L_MakeSelf:
goto L_MakeSelf_yes;
L_MakeSelf_yes:
- mes "\"Oh, but of course! You are powerful enough to make your own lifestones, using the enchantment '" + getspellinvocation("enchant-lifestone") + "'. This will consume a bug leg or a maggot slime or one of each of the four healing herbs, though.\"";
+ mes "\"Oh, but of course! You are powerful enough to make your own lifestones, using the enchantment '" + get(.invocation$, "enchant-lifestone") + "'. This will consume a bug leg or a maggot slime or one of each of the four healing herbs, though.\"";
goto L_Close;
L_MakeSelf_no:
@@ -265,15 +263,15 @@ L_T_Initial:
next;
mes "[Elanore the Healer]";
mes "\"To heal someone, first locate the injury. As a beginner, you have to touch the wound; with practice, it will be enough to think about it. Hold the lifestone in one hand, touching the wound with the other.\"";
- mes "\"Then say, '" + getspellinvocation("lesser-heal") + "', followed by the name of the one you wish to heal.\"";
+ mes "\"Then say, '" + get(.invocation$, "lesser-heal") + "', followed by the name of the one you wish to heal.\"";
next;
mes "[Elanore the Healer]";
mes "\"You might want to write that down, actually. In fact, you might want to make sure to keep notes of all spells you hear, for you never know if you will hear them again!\"";
- mes "\"The invocation was '" + getspellinvocation("lesser-heal") + "'.\"";
+ mes "\"The invocation was '" + get(.invocation$, "lesser-heal") + "'.\"";
next;
mes "[Elanore the Healer]";
mes "\"This will only cure cuts and bruises, though, and it will take some time to take effect. It will be useless to mend broken bones or more severe injuries!\"";
- mes "\"To heal yourself, it's enough to just say '" + getspellinvocation("lesser-heal") + "' by itself.\"";
+ mes "\"To heal yourself, it's enough to just say '" + get(.invocation$, "lesser-heal") + "' by itself.\"";
next;
mes "[Elanore the Healer]";
mes "\"Let me give you a lifestone to get started with.\"";
@@ -344,7 +342,7 @@ L_T_ChkAdvToLOH:
mes "\"I will now teach you how to heal by laying on your hands. The technique is similar to the spell I taught you at the beginning, but this time you transfer your own health instead of drawing health from a lifestone.\"";
next;
mes "[Elanore the Healer]";
- mes "\"First, lay your hand on the person you wish to heal. You needn't touch the injury itself, though you have to touch the skin until you are a little more experienced. Then, medidate on the word '" + getspellinvocation("lay-on-hands") + "'\"";
+ mes "\"First, lay your hand on the person you wish to heal. You needn't touch the injury itself, though you have to touch the skin until you are a little more experienced. Then, medidate on the word '" + get(.invocation$, "lay-on-hands") + "'\"";
next;
mes "[Elanore the Healer]";
mes "\"This will let your own life force flow into the person you are healing. If you are badly injured yourself, you will not be able to do this.\"";
@@ -500,11 +498,11 @@ L_T_CurePosion:
next;
mes "[Elanore the Healer]";
mes "\"If you would like to cure someone who is poisoned, first rub a Gamboge leaf between your hands. Your hands must be covered in Gamboge liquid for this to work.\"";
- mes "\"Speak the invocation, `" + getspellinvocation("cure-poison") + "'.\"";
+ mes "\"Speak the invocation, `" + get(.invocation$, "cure-poison") + "'.\"";
mes "\"Next, you either touch the poisoned person with your hands, or speak their name. You have to be close for this to work, though.\"";
next;
mes "[Elanore the Healer]";
- mes "\"Once again, the invocation is `" + getspellinvocation("cure-poison") + "'.\"";
+ mes "\"Once again, the invocation is `" + get(.invocation$, "cure-poison") + "'.\"";
mes "\"Come back again soon; there is another spell I would like to teach you.\"";
next;
set @Q_status, @STATUS_LEARNED_CURE_POISON;
diff --git a/world/map/npc/002-2/_import.txt b/world/map/npc/002-2/_import.txt
index c2bd041a..3f90a1d8 100644
--- a/world/map/npc/002-2/_import.txt
+++ b/world/map/npc/002-2/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 002-2
npc: npc/002-2/_mobs.txt
+npc: npc/002-2/_nodes.txt
npc: npc/002-2/_warps.txt
npc: npc/002-2/bakery.txt
npc: npc/002-2/barber.txt
diff --git a/world/map/npc/002-2/_mobs.txt b/world/map/npc/002-2/_mobs.txt
index aad2a871..0d9b84e4 100644
--- a/world/map/npc/002-2/_mobs.txt
+++ b/world/map/npc/002-2/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Sandstorm Desert Indoors mobs
-
-
-002-2,0,0,0|script|Mob002-2|32767
-{
- end;
-}
diff --git a/world/map/npc/002-2/_nodes.txt b/world/map/npc/002-2/_nodes.txt
new file mode 100644
index 00000000..875c3c60
--- /dev/null
+++ b/world/map/npc/002-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Sandstorm Desert Indoors nodes
+
+// (no nodes)
diff --git a/world/map/npc/002-2/stranger.txt b/world/map/npc/002-2/stranger.txt
index 8186636b..e323293e 100644
--- a/world/map/npc/002-2/stranger.txt
+++ b/world/map/npc/002-2/stranger.txt
@@ -58,171 +58,104 @@ L_Towel:
mes "\"The first one is easy.\"";
next;
- setarray @easy_questions$,
- "What two words are written in big friendly letters on the back cover?",
- "What's the name of the paranoid robot?",
- "What is the answer to life, the universe and everything?",
- "What is the first name of the author of the hitchhikers guide?",
- "What is the last name of the author of the hitchhikers guide?",
- "Who is the male human protagonist?",
- "Who is the female human protagonist?",
- "According to the Guide, space is ____?",
- "What is the name of the spaceship which was stolen by the president of the universe?",
- "How many heads does Zaphod Beeblebrox have?";
-
- setarray @easy_answers_amount,2,2,2,2,2,4,4,2,4,2;
-
- set @random, rand(10);
- mes "\"" + @easy_questions$[@random] + "\"";
- input @answer$;
-
- if (@easy_answers_amount[@random] < 4)
- goto L_Easy_Skip4;
- set @quizparam$, "towelanswer0" + @random + "d";
- callfunc "StrangerQuiz";
- if (("###" + @answer$ == @quizanswer$))
- goto L_Right_Answer_Easy;
- goto L_Easy_Skip4;
-
-L_Easy_Skip4:
- if (@easy_answers_amount[@random] < 3)
- goto L_Easy_Skip3;
- set @quizparam$, "towelanswer0" + @random + "c";
- callfunc "StrangerQuiz";
- if (("###" + @answer$ == @quizanswer$))
- goto L_Right_Answer_Easy;
- goto L_Easy_Skip3;
-
-L_Easy_Skip3:
- set @quizparam$, "towelanswer0" + @random + "b";
- callfunc "StrangerQuiz";
- if (("###" + @answer$ == @quizanswer$))
- goto L_Right_Answer_Easy;
-
- set @quizparam$, "towelanswer0" + @random + "a";
- callfunc "StrangerQuiz";
- if (("###" + @answer$ == @quizanswer$))
- goto L_Right_Answer_Easy;
-
- goto L_Wrong_Answer;
-
-L_Right_Answer_Easy:
+ setarray @quiz_questions$[0],
+ "What two words are written in big friendly letters on the back cover?",
+ "What's the name of the paranoid robot?",
+ "What is the answer to life, the universe and everything?",
+ "What is the first name of the author of the hitchhikers guide?",
+ "What is the last name of the author of the hitchhikers guide?",
+ "Who is the male human protagonist?",
+ "Who is the female human protagonist?",
+ "According to the Guide, space is ___?",
+ "What is the name of the spaceship which was stolen by the president of the universe?",
+ "How many heads does Zaphod Beeblebrox have?";
+ setarray @quiz_answers$[0],
+ "Don't Panic",
+ "Marvin",
+ "42",
+ "Douglas",
+ "Adams",
+ "Arthur Philip Dent",
+ "Trillian",
+ "Big",
+ "Heart of Gold",
+ "2";
+
+ callfunc "MultiQuiz";
+ if (@success == 0) goto L_Wrong_Answer;
+
mes "[Stranger]";
mes "\"You're absolutely right. The next one will be more tricky.\"";
next;
- setarray @medium_questions$,
- "What is the name of the rock group claiming to be the loudest band in the universe?",
- "What star is near Ford's home planet?",
- "Which country does the human protagonist come from?",
- "What is the name of the computer on The Heart of Gold?",
- "What color is a Babel Fish?",
- "What did the bowl of petunias think?",
- "What body orifice should a babel fish be inserted in to work properly?",
- "What is the name of the super computer?",
- "What were the second most intelligent creatures on Earth?",
- "What race creates the worst poetry in universe?",
- "What is the name of the Vogon home planet?",
- "What is the name of the Restaurant at the End of the Universe?";
-
- setarray @medium_answers_amount,2,2,2,2,2,3,2,2,4,4,2,2;
-
- set @random, rand(12);
- mes "\"" + @medium_questions$[@random] + "\"";
- input @answer$;
-
- if (@medium_answers_amount[@random] < 4)
- goto L_Medium_Skip4;
-
- set @quizparam$, "towelanswer1" + @random + "d";
- callfunc "StrangerQuiz";
- if (("###" + @answer$ == @quizanswer$))
- goto L_Right_Answer_Medium;
- goto L_Medium_Skip4;
-
-L_Medium_Skip4:
- if (@medium_answers_amount[@random] < 3)
- goto L_Medium_Skip3;
- set @quizparam$, "towelanswer1" + @random + "c";
- callfunc "StrangerQuiz";
- if (("###" + @answer$ == @quizanswer$))
- goto L_Right_Answer_Medium;
- goto L_Medium_Skip3;
-
-L_Medium_Skip3:
- set @quizparam$, "towelanswer1" + @random + "b";
- callfunc "StrangerQuiz";
- if (("###" + @answer$ == @quizanswer$))
- goto L_Right_Answer_Medium;
-
- set @quizparam$, "towelanswer1" + @random + "a";
- callfunc "StrangerQuiz";
- if (("###" + @answer$ == @quizanswer$))
- goto L_Right_Answer_Medium;
-
- goto L_Wrong_Answer;
-
-L_Right_Answer_Medium:
+ setarray @quiz_questions$[0],
+ "What is the name of the rock group claiming to be the loudest band in the universe?",
+ "What star is near Ford's home planet?",
+ "Which country does the human protagonist come from?",
+ "What is the name of the computer on The Heart of Gold?",
+ "What color is a Babel Fish?",
+ "What did the bowl of petunias think?",
+ "What body orifice should a babel fish be inserted in to work properly?",
+ "What is the name of the super computer?",
+ "What were the second most intelligent creatures on Earth?",
+ "What race creates the worst poetry in universe?",
+ "What is the name of the Vogon home planet?",
+ "What is the name of the Restaurant at the End of the Universe?";
+ setarray @quiz_answers$[0],
+ "Disaster Area",
+ "Betelgeuse",
+ "England",
+ "Eddie",
+ "Yellow",
+ "Oh no, not again",
+ "Ear",
+ "Deep Thought",
+ "Dolphins",
+ "Vogons",
+ "Vogsphere",
+ "Milliways";
+
+ callfunc "MultiQuiz";
+ if (@success == 0) goto L_Wrong_Answer;
+
mes "[Stranger]";
mes "\"Not bad, not bad. Let's see if you can answer an even more difficult one.\"";
next;
- setarray @hard_questions$,
- "Drinking what drink is like having your brain smashed out by a slice of lemon wrapped round a large gold brick?",
- "How many pints of beers should you drink before hitchhiking?",
- "What initials are carved into Zaphod Beeblebrox's brain?",
- "What is Ford Prefect's nickname?",
- "Who is responsible for the fjords of Norway?",
- "What game is played on earth as a relict of memories to an ancient war?",
- "What is the name of the triple-breasted whore from Eroticon VI?",
- "Who will insult every living being in the universe, because he is immortal and getting bored?",
- "What is the name of the piteous creature that is continually reincarnated and subsequently killed, each time unknowingly, by Arthur Dent?";
-
- setarray @hard_answers_amount,4,2,2,2,2,2,2,4,2;
-
- set @random, rand(9);
- mes "\"" + @hard_questions$[@random] + "\"";
- input @answer$;
-
- if (@hard_answers_amount[@random] < 4)
- goto L_Hard_Skip4;
- set @quizparam$, "towelanswer2" + @random + "d";
- callfunc "StrangerQuiz";
- if (("###" + @answer$ == @quizanswer$))
- goto L_Right_Answer_Hard;
- goto L_Hard_Skip4;
-
-L_Hard_Skip4:
- if (@hard_answers_amount[@random] < 3)
- goto L_Hard_Skip3;
- set @quizparam$, "towelanswer2" + @random + "c";
- callfunc "StrangerQuiz";
- if (("###" + @answer$ == @quizanswer$))
- goto L_Right_Answer_Hard;
- goto L_Hard_Skip3;
-
-L_Hard_Skip3:
- set @quizparam$, "towelanswer2" + @random + "b";
- callfunc "StrangerQuiz";
- if (("###" + @answer$ == @quizanswer$))
- goto L_Right_Answer_Hard;
-
- set @quizparam$, "towelanswer2" + @random + "a";
- callfunc "StrangerQuiz";
- if (("###" + @answer$ == @quizanswer$))
- goto L_Right_Answer_Hard;
-
- goto L_Wrong_Answer;
-
-L_Right_Answer_Hard:
+ setarray @quiz_questions$[0],
+ "Drinking what drink is like having your brain smashed out by a slice of lemon wrapped round a large gold brick?",
+ "How many pints of beers should you drink before hitchhiking?",
+ "What initials are carved into Zaphod Beeblebrox's brain?",
+ "What is Ford Prefect's nickname?",
+ "Who is responsible for the fjords of Norway?",
+ "What game is played on earth as a relict of memories to an ancient war?",
+ "What is the name of the triple-breasted whore from Eroticon VI?",
+ "Who will insult every living being in the universe, because he is immortal and getting bored?",
+ "What is the name of the piteous creature that is continually reincarnated and subsequently killed, each time unknowingly, by Arthur Dent?";
+ setarray @quiz_answers$[0],
+ "Pan Galactic Gargle Blaster",
+ "3",
+ "ZB",
+ "Ix",
+ "Slartibartfast",
+ "Cricket",
+ "Eccentrica Gallumbits",
+ "Wowbagger",
+ "Agrajag";
+
+ callfunc "MultiQuiz";
+ if (@success == 0) goto L_Wrong_Answer;
+
mes "[Stranger]";
mes "\"Unbelievable! You're really a wise person.\"";
next;
mes "\"One last question, but this shouldn't be a problem for you.\"";
next;
mes "\"What is the most important item for every hitchhiker to have?\"";
- input @answer$;
- if (@answer$ != "Towel" && @answer$ != "towel")
+ mes "";
+ mes "##BDrag & drop the item from your inventory##b.";
+ requestitem .@answer$[0];
+ if (.@answer$[0] != "Towel" && .@answer$[0] != "HitchhikersTowel")
goto L_Wrong_Answer;
mes "[Stranger]";
diff --git a/world/map/npc/002-3/_import.txt b/world/map/npc/002-3/_import.txt
index bb5e72d3..ec14b916 100644
--- a/world/map/npc/002-3/_import.txt
+++ b/world/map/npc/002-3/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 002-3
npc: npc/002-3/_mobs.txt
+npc: npc/002-3/_nodes.txt
npc: npc/002-3/_warps.txt
npc: npc/002-3/mapflags.txt
npc: npc/002-3/merchant.txt
diff --git a/world/map/npc/002-3/_mobs.txt b/world/map/npc/002-3/_mobs.txt
index 963b8e36..a0552ba2 100644
--- a/world/map/npc/002-3/_mobs.txt
+++ b/world/map/npc/002-3/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Tulimshar Mining Camp mobs
-
-
-002-3,0,0,0|script|Mob002-3|32767
-{
- end;
-}
diff --git a/world/map/npc/002-3/_nodes.txt b/world/map/npc/002-3/_nodes.txt
new file mode 100644
index 00000000..eb53d136
--- /dev/null
+++ b/world/map/npc/002-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Tulimshar Mining Camp nodes
+
+// (no nodes)
diff --git a/world/map/npc/002-4/_import.txt b/world/map/npc/002-4/_import.txt
index 7f617989..44a09e1d 100644
--- a/world/map/npc/002-4/_import.txt
+++ b/world/map/npc/002-4/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 002-4
npc: npc/002-4/_mobs.txt
+npc: npc/002-4/_nodes.txt
npc: npc/002-4/_warps.txt
npc: npc/002-4/mapflags.txt
npc: npc/002-4/mine_triggerone.txt
diff --git a/world/map/npc/002-4/_mobs.txt b/world/map/npc/002-4/_mobs.txt
index 0a461429..0643fb93 100644
--- a/world/map/npc/002-4/_mobs.txt
+++ b/world/map/npc/002-4/_mobs.txt
@@ -1,38 +1,17 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Desert Mines mobs
-002-4,39,37,15,11|monster|CaveMaggot|1056,5,100000ms,30000ms,Mob002-4::On1056
-002-4,91,41,17,20|monster|AngryFireGoblin|1108,3,100000ms,30000ms,Mob002-4::On1108
-002-4,71,35,25,17|monster|CaveMaggot|1056,4,100000ms,30000ms,Mob002-4::On1056
-002-4,69,100,8,5|monster|AngryFireGoblin|1108,2,100000ms,30000ms,Mob002-4::On1108
-002-4,68,57,26,24|monster|AngryScorpion|1057,5,100000ms,30000ms,Mob002-4::On1057
-002-4,49,58,4,15|monster|AngryScorpion|1057,5,100000ms,30000ms,Mob002-4::On1057
-002-4,38,76,15,22|monster|AngryScorpion|1057,4,100000ms,30000ms,Mob002-4::On1057
-002-4,58,78,6,17|monster|CaveMaggot|1056,4,100000ms,30000ms,Mob002-4::On1056
-002-4,89,68,11,32|monster|AngryScorpion|1057,4,100000ms,30000ms,Mob002-4::On1057
-002-4,84,93,19,17|monster|CaveMaggot|1056,4,100000ms,30000ms,Mob002-4::On1056
-002-4,72,77,21,14|monster|AngryFireGoblin|1108,3,100000ms,30000ms,Mob002-4::On1108
-002-4,67,91,11,12|monster|AngryScorpion|1057,4,100000ms,30000ms,Mob002-4::On1057
-002-4,58,95,6,13|monster|CaveMaggot|1056,4,100000ms,30000ms,Mob002-4::On1056
-002-4,63,100,2,5|monster|AngryScorpion|1057,3,100000ms,30000ms,Mob002-4::On1057
-
-
-002-4,0,0,0|script|Mob002-4|32767
-{
- end;
-
-On1056:
- set @mobID, 1056;
- callfunc "MobPoints";
- end;
-
-On1057:
- set @mobID, 1057;
- callfunc "MobPoints";
- end;
-
-On1108:
- set @mobID, 1108;
- callfunc "MobPoints";
- end;
-}
+002-4,39,37,15,11|monster|CaveMaggot|1056,5,100000ms,30000ms
+002-4,91,41,17,20|monster|AngryFireGoblin|1108,3,100000ms,30000ms
+002-4,71,35,25,17|monster|CaveMaggot|1056,4,100000ms,30000ms
+002-4,69,100,8,5|monster|AngryFireGoblin|1108,2,100000ms,30000ms
+002-4,68,57,26,24|monster|AngryScorpion|1057,5,100000ms,30000ms
+002-4,49,58,4,15|monster|AngryScorpion|1057,5,100000ms,30000ms
+002-4,38,76,15,22|monster|AngryScorpion|1057,4,100000ms,30000ms
+002-4,58,78,6,17|monster|CaveMaggot|1056,4,100000ms,30000ms
+002-4,89,68,11,32|monster|AngryScorpion|1057,4,100000ms,30000ms
+002-4,84,93,19,17|monster|CaveMaggot|1056,4,100000ms,30000ms
+002-4,72,77,21,14|monster|AngryFireGoblin|1108,3,100000ms,30000ms
+002-4,67,91,11,12|monster|AngryScorpion|1057,4,100000ms,30000ms
+002-4,58,95,6,13|monster|CaveMaggot|1056,4,100000ms,30000ms
+002-4,63,100,2,5|monster|AngryScorpion|1057,3,100000ms,30000ms
diff --git a/world/map/npc/002-4/_nodes.txt b/world/map/npc/002-4/_nodes.txt
new file mode 100644
index 00000000..ddcec23c
--- /dev/null
+++ b/world/map/npc/002-4/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Desert Mines nodes
+
+// (no nodes)
diff --git a/world/map/npc/002-5/_import.txt b/world/map/npc/002-5/_import.txt
index 7b2a4daa..d50b74a4 100644
--- a/world/map/npc/002-5/_import.txt
+++ b/world/map/npc/002-5/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 002-5
npc: npc/002-5/_mobs.txt
+npc: npc/002-5/_nodes.txt
npc: npc/002-5/_warps.txt
npc: npc/002-5/chest.txt
npc: npc/002-5/mapflags.txt
diff --git a/world/map/npc/002-5/_mobs.txt b/world/map/npc/002-5/_mobs.txt
index c6894850..700685c8 100644
--- a/world/map/npc/002-5/_mobs.txt
+++ b/world/map/npc/002-5/_mobs.txt
@@ -1,51 +1,20 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Deep Desert Mines mobs
-002-5,37,89,12,7|monster|AngryFireGoblin|1108,3,100000ms,30000ms,Mob002-5::On1108
-002-5,33,76,3,11|monster|CaveMaggot|1056,3,100000ms,30000ms,Mob002-5::On1056
-002-5,40,68,7,5|monster|AngryScorpion|1057,3,100000ms,30000ms,Mob002-5::On1057
-002-5,40,38,18,5|monster|Archant|1060,3,100000ms,30000ms,Mob002-5::On1060
-002-5,56,97,2,5|monster|Archant|1060,1,100000ms,30000ms,Mob002-5::On1060
-002-5,68,100,12,2|monster|YellowSlime|1007,4,100000ms,30000ms,Mob002-5::On1007
-002-5,91,80,1,5|monster|Archant|1060,1,100000ms,30000ms,Mob002-5::On1060
-002-5,89,94,1,5|monster|Archant|1060,1,100000ms,30000ms,Mob002-5::On1060
-002-5,74,78,1,5|monster|Archant|1060,2,100000ms,30000ms,Mob002-5::On1060
-002-5,94,72,2,4|monster|Archant|1060,1,100000ms,30000ms,Mob002-5::On1060
-002-5,90,61,6,2|monster|YellowSlime|1007,1,100000ms,30000ms,Mob002-5::On1007
-002-5,74,35,1,5|monster|Archant|1060,1,100000ms,30000ms,Mob002-5::On1060
-002-5,84,33,1,5|monster|Archant|1060,1,100000ms,30000ms,Mob002-5::On1060
-002-5,84,46,1,5|monster|Archant|1060,1,100000ms,30000ms,Mob002-5::On1060
-002-5,99,38,1,5|monster|Archant|1060,1,100000ms,30000ms,Mob002-5::On1060
-002-5,93,38,8,2|monster|YellowSlime|1007,2,100000ms,30000ms,Mob002-5::On1007
-002-5,62,62,5,43|monster|AngryFireGoblin|1108,3,100000ms,30000ms,Mob002-5::On1108
-
-
-002-5,0,0,0|script|Mob002-5|32767
-{
- end;
-
-On1007:
- set @mobID, 1007;
- callfunc "MobPoints";
- end;
-
-On1056:
- set @mobID, 1056;
- callfunc "MobPoints";
- end;
-
-On1057:
- set @mobID, 1057;
- callfunc "MobPoints";
- end;
-
-On1060:
- set @mobID, 1060;
- callfunc "MobPoints";
- end;
-
-On1108:
- set @mobID, 1108;
- callfunc "MobPoints";
- end;
-}
+002-5,37,89,12,7|monster|AngryFireGoblin|1108,3,100000ms,30000ms
+002-5,33,76,3,11|monster|CaveMaggot|1056,3,100000ms,30000ms
+002-5,40,68,7,5|monster|AngryScorpion|1057,3,100000ms,30000ms
+002-5,40,38,18,5|monster|Archant|1060,3,100000ms,30000ms
+002-5,56,97,2,5|monster|Archant|1060,1,100000ms,30000ms
+002-5,68,100,12,2|monster|YellowSlime|1007,4,100000ms,30000ms
+002-5,91,80,1,5|monster|Archant|1060,1,100000ms,30000ms
+002-5,89,94,1,5|monster|Archant|1060,1,100000ms,30000ms
+002-5,74,78,1,5|monster|Archant|1060,2,100000ms,30000ms
+002-5,94,72,2,4|monster|Archant|1060,1,100000ms,30000ms
+002-5,90,61,6,2|monster|YellowSlime|1007,1,100000ms,30000ms
+002-5,74,35,1,5|monster|Archant|1060,1,100000ms,30000ms
+002-5,84,33,1,5|monster|Archant|1060,1,100000ms,30000ms
+002-5,84,46,1,5|monster|Archant|1060,1,100000ms,30000ms
+002-5,99,38,1,5|monster|Archant|1060,1,100000ms,30000ms
+002-5,93,38,8,2|monster|YellowSlime|1007,2,100000ms,30000ms
+002-5,62,62,5,43|monster|AngryFireGoblin|1108,3,100000ms,30000ms
diff --git a/world/map/npc/002-5/_nodes.txt b/world/map/npc/002-5/_nodes.txt
new file mode 100644
index 00000000..d3890f4a
--- /dev/null
+++ b/world/map/npc/002-5/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Deep Desert Mines nodes
+
+// (no nodes)
diff --git a/world/map/npc/004-3/_import.txt b/world/map/npc/004-3/_import.txt
index 1c5bc475..97d4e69b 100644
--- a/world/map/npc/004-3/_import.txt
+++ b/world/map/npc/004-3/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 004-3
npc: npc/004-3/_mobs.txt
+npc: npc/004-3/_nodes.txt
npc: npc/004-3/_warps.txt
npc: npc/004-3/mapflags.txt
diff --git a/world/map/npc/004-3/_mobs.txt b/world/map/npc/004-3/_mobs.txt
index dce2ec02..26c4d595 100644
--- a/world/map/npc/004-3/_mobs.txt
+++ b/world/map/npc/004-3/_mobs.txt
@@ -1,31 +1,10 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Pirate Caves First Floor mobs
-004-3,43,72,7,8|monster|Thug|1119,2,100000ms,30000ms,Mob004-3::On1119
-004-3,43,72,7,8|monster|Swashbuckler|1120,1,100000ms,30000ms,Mob004-3::On1120
-004-3,43,72,7,8|monster|Grenadier|1121,1,100000ms,30000ms,Mob004-3::On1121
-004-3,28,69,8,2|monster|Thug|1119,2,100000ms,30000ms,Mob004-3::On1119
-004-3,71,63,7,8|monster|Thug|1119,2,100000ms,30000ms,Mob004-3::On1119
-004-3,39,39,7,3|monster|Swashbuckler|1120,2,100000ms,30000ms,Mob004-3::On1120
-004-3,71,63,7,8|monster|Grenadier|1121,1,100000ms,30000ms,Mob004-3::On1121
-
-
-004-3,0,0,0|script|Mob004-3|32767
-{
- end;
-
-On1119:
- set @mobID, 1119;
- callfunc "MobPoints";
- end;
-
-On1120:
- set @mobID, 1120;
- callfunc "MobPoints";
- end;
-
-On1121:
- set @mobID, 1121;
- callfunc "MobPoints";
- end;
-}
+004-3,43,72,7,8|monster|Thug|1119,2,100000ms,30000ms
+004-3,43,72,7,8|monster|Swashbuckler|1120,1,100000ms,30000ms
+004-3,43,72,7,8|monster|Grenadier|1121,1,100000ms,30000ms
+004-3,28,69,8,2|monster|Thug|1119,2,100000ms,30000ms
+004-3,71,63,7,8|monster|Thug|1119,2,100000ms,30000ms
+004-3,39,39,7,3|monster|Swashbuckler|1120,2,100000ms,30000ms
+004-3,71,63,7,8|monster|Grenadier|1121,1,100000ms,30000ms
diff --git a/world/map/npc/004-3/_nodes.txt b/world/map/npc/004-3/_nodes.txt
new file mode 100644
index 00000000..9ebc3e80
--- /dev/null
+++ b/world/map/npc/004-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Pirate Caves First Floor nodes
+
+// (no nodes)
diff --git a/world/map/npc/004-4/_import.txt b/world/map/npc/004-4/_import.txt
index d241e73e..6b0490c3 100644
--- a/world/map/npc/004-4/_import.txt
+++ b/world/map/npc/004-4/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 004-4
npc: npc/004-4/_mobs.txt
+npc: npc/004-4/_nodes.txt
npc: npc/004-4/_warps.txt
npc: npc/004-4/mapflags.txt
diff --git a/world/map/npc/004-4/_mobs.txt b/world/map/npc/004-4/_mobs.txt
index 525a7215..0216ba6d 100644
--- a/world/map/npc/004-4/_mobs.txt
+++ b/world/map/npc/004-4/_mobs.txt
@@ -1,33 +1,12 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Pirate Caves Second Floor mobs
-004-4,36,62,5,20|monster|Grenadier|1121,1,100000ms,30000ms,Mob004-4::On1121
-004-4,37,61,5,21|monster|Swashbuckler|1120,2,100000ms,30000ms,Mob004-4::On1120
-004-4,62,52,12,7|monster|Thug|1119,2,100000ms,30000ms,Mob004-4::On1119
-004-4,34,87,12,7|monster|Thug|1119,2,100000ms,30000ms,Mob004-4::On1119
-004-4,37,62,6,22|monster|Thug|1119,2,100000ms,30000ms,Mob004-4::On1119
-004-4,34,88,10,6|monster|Swashbuckler|1120,2,100000ms,30000ms,Mob004-4::On1120
-004-4,63,52,10,6|monster|Swashbuckler|1120,2,100000ms,30000ms,Mob004-4::On1120
-004-4,62,52,11,4|monster|Grenadier|1121,1,100000ms,30000ms,Mob004-4::On1121
-004-4,34,88,10,4|monster|Grenadier|1121,1,100000ms,30000ms,Mob004-4::On1121
-
-
-004-4,0,0,0|script|Mob004-4|32767
-{
- end;
-
-On1119:
- set @mobID, 1119;
- callfunc "MobPoints";
- end;
-
-On1120:
- set @mobID, 1120;
- callfunc "MobPoints";
- end;
-
-On1121:
- set @mobID, 1121;
- callfunc "MobPoints";
- end;
-}
+004-4,36,62,5,20|monster|Grenadier|1121,1,100000ms,30000ms
+004-4,37,61,5,21|monster|Swashbuckler|1120,2,100000ms,30000ms
+004-4,62,52,12,7|monster|Thug|1119,2,100000ms,30000ms
+004-4,34,87,12,7|monster|Thug|1119,2,100000ms,30000ms
+004-4,37,62,6,22|monster|Thug|1119,2,100000ms,30000ms
+004-4,34,88,10,6|monster|Swashbuckler|1120,2,100000ms,30000ms
+004-4,63,52,10,6|monster|Swashbuckler|1120,2,100000ms,30000ms
+004-4,62,52,11,4|monster|Grenadier|1121,1,100000ms,30000ms
+004-4,34,88,10,4|monster|Grenadier|1121,1,100000ms,30000ms
diff --git a/world/map/npc/004-4/_nodes.txt b/world/map/npc/004-4/_nodes.txt
new file mode 100644
index 00000000..2ca90a45
--- /dev/null
+++ b/world/map/npc/004-4/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Pirate Caves Second Floor nodes
+
+// (no nodes)
diff --git a/world/map/npc/004-5/_import.txt b/world/map/npc/004-5/_import.txt
index 3114b117..234d6cde 100644
--- a/world/map/npc/004-5/_import.txt
+++ b/world/map/npc/004-5/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 004-5
npc: npc/004-5/_mobs.txt
+npc: npc/004-5/_nodes.txt
npc: npc/004-5/_warps.txt
npc: npc/004-5/chest.txt
npc: npc/004-5/mapflags.txt
diff --git a/world/map/npc/004-5/_mobs.txt b/world/map/npc/004-5/_mobs.txt
index 2d3acc7e..b7425fb5 100644
--- a/world/map/npc/004-5/_mobs.txt
+++ b/world/map/npc/004-5/_mobs.txt
@@ -1,36 +1,15 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Pirate Den mobs
-004-5,41,70,6,5|monster|Grenadier|1121,1,100000ms,30000ms,Mob004-5::On1121
-004-5,41,70,7,3|monster|Swashbuckler|1120,2,100000ms,30000ms,Mob004-5::On1120
-004-5,40,70,8,2|monster|Thug|1119,2,100000ms,30000ms,Mob004-5::On1119
-004-5,35,86,6,5|monster|Grenadier|1121,1,100000ms,30000ms,Mob004-5::On1121
-004-5,34,86,8,2|monster|Thug|1119,2,100000ms,30000ms,Mob004-5::On1119
-004-5,35,86,7,3|monster|Swashbuckler|1120,2,100000ms,30000ms,Mob004-5::On1120
-004-5,54,38,6,5|monster|Grenadier|1121,1,100000ms,30000ms,Mob004-5::On1121
-004-5,53,38,8,2|monster|Thug|1119,2,100000ms,30000ms,Mob004-5::On1119
-004-5,54,38,7,3|monster|Swashbuckler|1120,2,100000ms,30000ms,Mob004-5::On1120
-004-5,81,38,6,5|monster|Grenadier|1121,1,100000ms,30000ms,Mob004-5::On1121
-004-5,80,38,8,2|monster|Thug|1119,2,100000ms,30000ms,Mob004-5::On1119
-004-5,81,38,7,3|monster|Swashbuckler|1120,2,100000ms,30000ms,Mob004-5::On1120
-
-
-004-5,0,0,0|script|Mob004-5|32767
-{
- end;
-
-On1119:
- set @mobID, 1119;
- callfunc "MobPoints";
- end;
-
-On1120:
- set @mobID, 1120;
- callfunc "MobPoints";
- end;
-
-On1121:
- set @mobID, 1121;
- callfunc "MobPoints";
- end;
-}
+004-5,41,70,6,5|monster|Grenadier|1121,1,100000ms,30000ms
+004-5,41,70,7,3|monster|Swashbuckler|1120,2,100000ms,30000ms
+004-5,40,70,8,2|monster|Thug|1119,2,100000ms,30000ms
+004-5,35,86,6,5|monster|Grenadier|1121,1,100000ms,30000ms
+004-5,34,86,8,2|monster|Thug|1119,2,100000ms,30000ms
+004-5,35,86,7,3|monster|Swashbuckler|1120,2,100000ms,30000ms
+004-5,54,38,6,5|monster|Grenadier|1121,1,100000ms,30000ms
+004-5,53,38,8,2|monster|Thug|1119,2,100000ms,30000ms
+004-5,54,38,7,3|monster|Swashbuckler|1120,2,100000ms,30000ms
+004-5,81,38,6,5|monster|Grenadier|1121,1,100000ms,30000ms
+004-5,80,38,8,2|monster|Thug|1119,2,100000ms,30000ms
+004-5,81,38,7,3|monster|Swashbuckler|1120,2,100000ms,30000ms
diff --git a/world/map/npc/004-5/_nodes.txt b/world/map/npc/004-5/_nodes.txt
new file mode 100644
index 00000000..55ea7bb3
--- /dev/null
+++ b/world/map/npc/004-5/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Pirate Den nodes
+
+// (no nodes)
diff --git a/world/map/npc/005-3/_import.txt b/world/map/npc/005-3/_import.txt
index a1fd70bd..415451c3 100644
--- a/world/map/npc/005-3/_import.txt
+++ b/world/map/npc/005-3/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 005-3
npc: npc/005-3/_mobs.txt
+npc: npc/005-3/_nodes.txt
npc: npc/005-3/_warps.txt
npc: npc/005-3/mapflags.txt
diff --git a/world/map/npc/005-3/_mobs.txt b/world/map/npc/005-3/_mobs.txt
index 63e58847..2bcda8e6 100644
--- a/world/map/npc/005-3/_mobs.txt
+++ b/world/map/npc/005-3/_mobs.txt
@@ -1,27 +1,8 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Snake Pit mobs
-005-3,58,57,62,57|monster|Snake|1010,50,100000ms,30000ms,Mob005-3::On1010
-005-3,58,57,62,57|monster|BlackScorpion|1009,15,100000ms,30000ms,Mob005-3::On1009
-005-3,58,57,62,57|monster|GiantMaggot|1006,20,100000ms,30000ms,Mob005-3::On1006
-
-
-005-3,0,0,0|script|Mob005-3|32767
-{
- end;
-
-On1006:
- set @mobID, 1006;
- callfunc "MobPoints";
- end;
-
-On1009:
- set @mobID, 1009;
- callfunc "MobPoints";
- end;
-
-On1010:
- set @mobID, 1010;
- callfunc "MobPoints";
- end;
-}
+005-3,59,63,48,57|monster|Snake|1010,50,100000ms,30000ms
+005-3,56,64,53,49|monster|BlackScorpion|1009,15,100000ms,30000ms
+005-3,59,68,58,42|monster|GiantMaggot|1006,20,100000ms,30000ms
+005-3,95,52,10,61|monster|Troll|1054,7,100000ms,30000ms
+005-3,53,26,64,12|monster|Troll|1054,5,100000ms,30000ms
diff --git a/world/map/npc/005-3/_nodes.txt b/world/map/npc/005-3/_nodes.txt
new file mode 100644
index 00000000..0e704ee5
--- /dev/null
+++ b/world/map/npc/005-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Snake Pit nodes
+
+// (no nodes)
diff --git a/world/map/npc/005-3/_warps.txt b/world/map/npc/005-3/_warps.txt
index 02894dc8..c1877197 100644
--- a/world/map/npc/005-3/_warps.txt
+++ b/world/map/npc/005-3/_warps.txt
@@ -1,10 +1,14 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Snake Pit warps
-005-3,52,33|warp|-1,-1,002-1,113,109
-005-3,63,46|warp|-1,-1,006-3,89,45
-005-3,85,49|warp|-1,-1,006-3,125,65
-005-3,86,30|warp|-1,-1,006-1,55,47
-005-3,73,60|warp|-1,-1,006-1,51,69
-005-3,78,88|warp|-1,-1,043-3,116,37
-005-3,33,82|warp|-1,-1,043-3,31,35
+005-3,52,35|warp|-1,-1,002-1,113,109
+005-3,63,48|warp|-1,-1,006-3,89,45
+005-3,85,51|warp|-1,-1,006-3,125,65
+005-3,86,32|warp|-1,-1,006-1,55,47
+005-3,73,62|warp|-1,-1,006-1,51,69
+005-3,78,90|warp|-1,-1,043-3,116,37
+005-3,33,84|warp|-1,-1,043-3,31,35
+005-3,107,102|warp|-1,-1,006-1,64,78
+005-3,27,41|warp|-1,-1,043-5,126,27
+005-3,101,30|warp|-1,-1,005-3,101,35
+005-3,110,79|warp|-1,-1,005-3,110,75
diff --git a/world/map/npc/006-1/_import.txt b/world/map/npc/006-1/_import.txt
index 0885c461..44f1375d 100644
--- a/world/map/npc/006-1/_import.txt
+++ b/world/map/npc/006-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 006-1
npc: npc/006-1/_mobs.txt
+npc: npc/006-1/_nodes.txt
npc: npc/006-1/_warps.txt
npc: npc/006-1/mapflags.txt
npc: npc/006-1/mika.txt
diff --git a/world/map/npc/006-1/_mobs.txt b/world/map/npc/006-1/_mobs.txt
index 2288ec92..c18464c8 100644
--- a/world/map/npc/006-1/_mobs.txt
+++ b/world/map/npc/006-1/_mobs.txt
@@ -1,55 +1,24 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Desert Mountains mobs
-006-1,49,52,7,3|monster|Snake|1010,1,100000ms,30000ms,Mob006-1::On1010
-006-1,53,36,16,13|monster|MountainSnake|1026,3,150000ms,10000ms,Mob006-1::On1026
-006-1,89,26,33,13|monster|MountainSnake|1026,5,15000ms,75000ms,Mob006-1::On1026
-006-1,113,41,12,37|monster|MountainSnake|1026,8,15000ms,75000ms,Mob006-1::On1026
-006-1,113,51,6,3|monster|MountainSnake|1026,3,15000ms,75000ms,Mob006-1::On1026
-006-1,86,46,29,5|monster|MountainSnake|1026,3,15000ms,75000ms,Mob006-1::On1026
-006-1,105,73,21,14|monster|MountainSnake|1026,3,15000ms,75000ms,Mob006-1::On1026
-006-1,73,102,8,13|monster|MountainSnake|1026,4,15000ms,75000ms,Mob006-1::On1026
-006-1,104,100,11,15|monster|MountainSnake|1026,8,15000ms,75000ms,Mob006-1::On1026
-006-1,82,72,25,16|monster|MountainSnake|1026,8,15000ms,75000ms,Mob006-1::On1026
-006-1,95,114,17,4|monster|MountainSnake|1026,5,15000ms,75000ms,Mob006-1::On1026
-006-1,57,119,18,2|monster|MountainSnake|1026,4,15000ms,75000ms,Mob006-1::On1026
-006-1,33,97,27,33|monster|Scorpion|1003,10,100000ms,30000ms,Mob006-1::On1003
-006-1,58,49,3,3|monster|GreenSlime|1005,3,100000ms,30000ms,Mob006-1::On1005
-006-1,34,50,5,4|monster|Snake|1010,2,40000ms,50000ms,Mob006-1::On1010
-006-1,96,92,20,48|monster|Snake|1010,2,40000ms,50000ms,Mob006-1::On1010
-006-1,35,97,28,29|monster|Maggot|1002,20,100000ms,30000ms,Mob006-1::On1002
-006-1,28,73,3,2|monster|GreenSlime|1005,2,100000ms,30000ms,Mob006-1::On1005
-006-1,33,59,3,2|monster|GreenSlime|1005,2,100000ms,30000ms,Mob006-1::On1005
-006-1,37,73,7,3|monster|Snake|1010,1,100000ms,30000ms,Mob006-1::On1010
-006-1,100,36,38,24|monster|Snake|1010,2,40000ms,50000ms,Mob006-1::On1010
-
-
-006-1,0,0,0|script|Mob006-1|32767
-{
- end;
-
-On1002:
- set @mobID, 1002;
- callfunc "MobPoints";
- end;
-
-On1003:
- set @mobID, 1003;
- callfunc "MobPoints";
- end;
-
-On1005:
- set @mobID, 1005;
- callfunc "MobPoints";
- end;
-
-On1010:
- set @mobID, 1010;
- callfunc "MobPoints";
- end;
-
-On1026:
- set @mobID, 1026;
- callfunc "MobPoints";
- end;
-}
+006-1,49,52,7,3|monster|Snake|1010,1,100000ms,30000ms
+006-1,53,36,16,13|monster|MountainSnake|1026,3,150000ms,10000ms
+006-1,89,26,33,13|monster|MountainSnake|1026,5,15000ms,75000ms
+006-1,113,41,12,37|monster|MountainSnake|1026,8,15000ms,75000ms
+006-1,113,51,6,3|monster|MountainSnake|1026,3,15000ms,75000ms
+006-1,86,46,29,5|monster|MountainSnake|1026,3,15000ms,75000ms
+006-1,105,73,21,14|monster|MountainSnake|1026,3,15000ms,75000ms
+006-1,73,102,8,13|monster|MountainSnake|1026,4,15000ms,75000ms
+006-1,104,100,11,15|monster|MountainSnake|1026,8,15000ms,75000ms
+006-1,82,72,25,16|monster|MountainSnake|1026,8,15000ms,75000ms
+006-1,95,114,17,4|monster|MountainSnake|1026,5,15000ms,75000ms
+006-1,57,119,18,2|monster|MountainSnake|1026,4,15000ms,75000ms
+006-1,33,97,27,33|monster|Scorpion|1003,10,100000ms,30000ms
+006-1,58,49,3,3|monster|GreenSlime|1005,3,100000ms,30000ms
+006-1,34,50,5,4|monster|Snake|1010,2,40000ms,50000ms
+006-1,96,92,20,48|monster|Snake|1010,2,40000ms,50000ms
+006-1,35,97,28,29|monster|Maggot|1002,20,100000ms,30000ms
+006-1,28,73,3,2|monster|GreenSlime|1005,2,100000ms,30000ms
+006-1,33,59,3,2|monster|GreenSlime|1005,2,100000ms,30000ms
+006-1,37,73,7,3|monster|Snake|1010,1,100000ms,30000ms
+006-1,100,36,38,24|monster|Snake|1010,2,40000ms,50000ms
diff --git a/world/map/npc/006-1/_nodes.txt b/world/map/npc/006-1/_nodes.txt
new file mode 100644
index 00000000..e53e7619
--- /dev/null
+++ b/world/map/npc/006-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Desert Mountains nodes
+
+// (no nodes)
diff --git a/world/map/npc/006-1/_warps.txt b/world/map/npc/006-1/_warps.txt
index c1d32cc9..1a2b0169 100644
--- a/world/map/npc/006-1/_warps.txt
+++ b/world/map/npc/006-1/_warps.txt
@@ -27,6 +27,7 @@
006-1,21,108|warp|-1,-1,006-2,65,72
006-1,37,26|warp|-1,-1,006-1,37,23
006-1,37,24|warp|-1,-1,006-1,37,27
-006-1,55,46|warp|-1,-1,005-3,86,31
+006-1,55,46|warp|-1,-1,005-3,86,33
006-1,20,48|warp|-1,0,002-1,118,95
-006-1,51,68|warp|-1,-1,005-3,73,59
+006-1,51,68|warp|-1,-1,005-3,73,61
+006-1,64,77|warp|-1,-1,005-3,107,101
diff --git a/world/map/npc/006-1/spirit.txt b/world/map/npc/006-1/spirit.txt
index 8c7155fa..68e1bbe7 100644
--- a/world/map/npc/006-1/spirit.txt
+++ b/world/map/npc/006-1/spirit.txt
@@ -178,7 +178,7 @@ L_Next5:
mes "\"Kekeke... excellent! Yes, here goes your first spell, the flying backpack! If you are overloaded, it will take the load off your shoulders.\"";
next;
mes "[Earth Spirit]";
- mes "\"Take a cocoon, living or dead, and suffuse it in magic. Whisper '" + getspellinvocation("flying-backpack") + "', and feel it float!\"";
+ mes "\"Take a cocoon, living or dead, and suffuse it in magic. Whisper '" + get(.invocation$, "flying-backpack") + "', and feel it float!\"";
goto L_Q_magic_finish;
L_Q_magic_3:
@@ -196,7 +196,7 @@ L_Next6:
mes "\"Yeees, good! This one is a protection spell, making your skin harder. You need a hard spike for it, though. Hold that spike in your hands, and focus on it.\"";
next;
mes "[Earth Spirit]";
- mes "\"Next, say '" + getspellinvocation("protect") + "', and feel your skin grow rigid! Very useful against stings and stabs and pokes and pricks and that sort of stuff.\"";
+ mes "\"Next, say '" + get(.invocation$, "protect") + "', and feel your skin grow rigid! Very useful against stings and stabs and pokes and pricks and that sort of stuff.\"";
goto L_Q_magic_finish;
L_Q_magic_4:
diff --git a/world/map/npc/006-1/tree.txt b/world/map/npc/006-1/tree.txt
index 6740312e..57209d24 100644
--- a/world/map/npc/006-1/tree.txt
+++ b/world/map/npc/006-1/tree.txt
@@ -160,9 +160,3 @@ L_Close:
callfunc "QuestTreeTouch";
close;
}
-
-006-1,83,59,0|script|#DruidTree1#_M|400
-{
- callfunc "QuestTreeTouch";
- close;
-}
diff --git a/world/map/npc/006-2/_import.txt b/world/map/npc/006-2/_import.txt
index 0730bd46..2d22f31c 100644
--- a/world/map/npc/006-2/_import.txt
+++ b/world/map/npc/006-2/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 006-2
npc: npc/006-2/_mobs.txt
+npc: npc/006-2/_nodes.txt
npc: npc/006-2/_warps.txt
npc: npc/006-2/mapflags.txt
npc: npc/006-2/npcs.txt
diff --git a/world/map/npc/006-2/_mobs.txt b/world/map/npc/006-2/_mobs.txt
index 13ee9057..e3fe486b 100644
--- a/world/map/npc/006-2/_mobs.txt
+++ b/world/map/npc/006-2/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Pachua's Village mobs
-
-
-006-2,0,0,0|script|Mob006-2|32767
-{
- end;
-}
diff --git a/world/map/npc/006-2/_nodes.txt b/world/map/npc/006-2/_nodes.txt
new file mode 100644
index 00000000..ae0f0147
--- /dev/null
+++ b/world/map/npc/006-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Pachua's Village nodes
+
+// (no nodes)
diff --git a/world/map/npc/006-3/_import.txt b/world/map/npc/006-3/_import.txt
index 6302c3a8..8e52641e 100644
--- a/world/map/npc/006-3/_import.txt
+++ b/world/map/npc/006-3/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 006-3
npc: npc/006-3/_mobs.txt
+npc: npc/006-3/_nodes.txt
npc: npc/006-3/_warps.txt
npc: npc/006-3/mapflags.txt
diff --git a/world/map/npc/006-3/_mobs.txt b/world/map/npc/006-3/_mobs.txt
index 3fa25c29..93d6102c 100644
--- a/world/map/npc/006-3/_mobs.txt
+++ b/world/map/npc/006-3/_mobs.txt
@@ -1,55 +1,29 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Desert Mountain Cave mobs
-006-3,108,25,36,8|monster|MountainSnake|1026,3,15000ms,90000ms,Mob006-3::On1026
-006-3,99,50,14,13|monster|MountainSnake|1026,1,15000ms,90000ms,Mob006-3::On1026
-006-3,89,63,14,11|monster|MountainSnake|1026,2,15000ms,90000ms,Mob006-3::On1026
-006-3,86,90,29,9|monster|MountainSnake|1026,3,15000ms,90000ms,Mob006-3::On1026
-006-3,109,78,12,9|monster|MountainSnake|1026,1,15000ms,90000ms,Mob006-3::On1026
-006-3,119,117,15,14|monster|MountainSnake|1026,4,15000ms,90000ms,Mob006-3::On1026
-006-3,106,64,14,17|monster|MountainSnake|1026,3,15000ms,90000ms,Mob006-3::On1026
-006-3,65,71,31,35|monster|MountainSnake|1026,10,15000ms,90000ms,Mob006-3::On1026
-006-3,57,105,27,30|monster|MountainSnake|1026,8,15000ms,90000ms,Mob006-3::On1026
-006-3,73,120,16,5|monster|MountainSnake|1026,3,15000ms,90000ms,Mob006-3::On1026
-006-3,117,54,11,9|monster|MountainSnake|1026,4,15000ms,90000ms,Mob006-3::On1026
-006-3,123,62,10,5|monster|MountainSnake|1026,3,15000ms,90000ms,Mob006-3::On1026
-006-3,72,36,24,25|monster|MountainSnake|1026,10,15000ms,90000ms,Mob006-3::On1026
-006-3,84,27,5,7|monster|MountainSnake|1026,1,15000ms,90000ms,Mob006-3::On1026
-006-3,40,40,36,28|monster|MountainSnake|1026,8,15000ms,90000ms,Mob006-3::On1026
-006-3,34,60,27,11|monster|MountainSnake|1026,3,15000ms,90000ms,Mob006-3::On1026
-006-3,87,74,26,9|monster|RedSlime|1008,3,15000ms,10000ms,Mob006-3::On1008
-006-3,120,76,9,21|monster|RedSlime|1008,3,15000ms,10000ms,Mob006-3::On1008
-006-3,101,85,14,8|monster|RedSlime|1008,4,15000ms,10000ms,Mob006-3::On1008
-006-3,44,124,29,7|monster|MountainSnake|1026,5,15000ms,90000ms,Mob006-3::On1026
-006-3,90,125,17,7|monster|MountainSnake|1026,5,15000ms,90000ms,Mob006-3::On1026
-006-3,30,88,13,20|monster|RedSlime|1008,3,90000ms,30000ms,Mob006-3::On1008
-006-3,122,98,10,16|monster|Spider|1012,3,90000ms,30000ms,Mob006-3::On1012
-006-3,112,104,7,13|monster|Spider|1012,1,90000ms,30000ms,Mob006-3::On1012
-006-3,103,108,9,9|monster|Spider|1012,1,90000ms,30000ms,Mob006-3::On1012
-006-3,83,107,13,14|monster|YellowSlime|1007,6,90000ms,30000ms,Mob006-3::On1007
-
-
-006-3,0,0,0|script|Mob006-3|32767
-{
- end;
-
-On1007:
- set @mobID, 1007;
- callfunc "MobPoints";
- end;
-
-On1008:
- set @mobID, 1008;
- callfunc "MobPoints";
- end;
-
-On1012:
- set @mobID, 1012;
- callfunc "MobPoints";
- end;
-
-On1026:
- set @mobID, 1026;
- callfunc "MobPoints";
- end;
-}
+006-3,108,25,36,8|monster|MountainSnake|1026,3,15000ms,90000ms
+006-3,99,50,14,13|monster|MountainSnake|1026,1,15000ms,90000ms
+006-3,89,63,14,11|monster|MountainSnake|1026,2,15000ms,90000ms
+006-3,86,90,29,9|monster|MountainSnake|1026,3,15000ms,90000ms
+006-3,109,78,12,9|monster|MountainSnake|1026,1,15000ms,90000ms
+006-3,119,117,15,14|monster|MountainSnake|1026,4,15000ms,90000ms
+006-3,106,64,14,17|monster|MountainSnake|1026,3,15000ms,90000ms
+006-3,65,71,31,35|monster|MountainSnake|1026,10,15000ms,90000ms
+006-3,57,105,27,30|monster|MountainSnake|1026,8,15000ms,90000ms
+006-3,73,120,16,5|monster|MountainSnake|1026,3,15000ms,90000ms
+006-3,117,54,11,9|monster|MountainSnake|1026,4,15000ms,90000ms
+006-3,123,62,10,5|monster|MountainSnake|1026,3,15000ms,90000ms
+006-3,72,36,24,25|monster|MountainSnake|1026,10,15000ms,90000ms
+006-3,84,27,5,7|monster|MountainSnake|1026,1,15000ms,90000ms
+006-3,40,40,36,28|monster|MountainSnake|1026,8,15000ms,90000ms
+006-3,34,60,27,11|monster|MountainSnake|1026,3,15000ms,90000ms
+006-3,87,74,26,9|monster|RedSlime|1008,3,15000ms,10000ms
+006-3,120,76,9,21|monster|RedSlime|1008,3,15000ms,10000ms
+006-3,101,85,14,8|monster|RedSlime|1008,4,15000ms,10000ms
+006-3,44,124,29,7|monster|MountainSnake|1026,5,15000ms,90000ms
+006-3,90,125,17,7|monster|MountainSnake|1026,5,15000ms,90000ms
+006-3,30,88,13,20|monster|RedSlime|1008,3,90000ms,30000ms
+006-3,122,98,10,16|monster|Spider|1012,3,90000ms,30000ms
+006-3,112,104,7,13|monster|Spider|1012,1,90000ms,30000ms
+006-3,103,108,9,9|monster|Spider|1012,1,90000ms,30000ms
+006-3,83,107,13,14|monster|YellowSlime|1007,6,90000ms,30000ms
diff --git a/world/map/npc/006-3/_nodes.txt b/world/map/npc/006-3/_nodes.txt
new file mode 100644
index 00000000..c039867e
--- /dev/null
+++ b/world/map/npc/006-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Desert Mountain Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/006-3/_warps.txt b/world/map/npc/006-3/_warps.txt
index 67c33574..7ecb5a5b 100644
--- a/world/map/npc/006-3/_warps.txt
+++ b/world/map/npc/006-3/_warps.txt
@@ -19,5 +19,5 @@
006-3,51,90|warp|-1,-1,006-1,51,92
006-3,38,121|warp|-1,-1,006-1,38,123
006-3,79,120|warp|-1,-1,006-1,83,119
-006-3,125,66|warp|-1,-1,005-3,85,50
-006-3,89,46|warp|-1,-1,005-3,63,47
+006-3,125,66|warp|-1,-1,005-3,85,52
+006-3,89,46|warp|-1,-1,005-3,63,49
diff --git a/world/map/npc/007-1/_import.txt b/world/map/npc/007-1/_import.txt
index eca15081..f6f86a36 100644
--- a/world/map/npc/007-1/_import.txt
+++ b/world/map/npc/007-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 007-1
npc: npc/007-1/_mobs.txt
+npc: npc/007-1/_nodes.txt
npc: npc/007-1/_warps.txt
npc: npc/007-1/mapflags.txt
npc: npc/007-1/voltain.txt
diff --git a/world/map/npc/007-1/_mobs.txt b/world/map/npc/007-1/_mobs.txt
index 846c9fc5..e160e414 100644
--- a/world/map/npc/007-1/_mobs.txt
+++ b/world/map/npc/007-1/_mobs.txt
@@ -1,63 +1,12 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Woodland mobs
-007-1,0,0,0,0|monster|PinkFlower|1014,17,100000ms,30000ms,Mob007-1::On1014
-007-1,0,0,0,0|monster|SpikyMushroom|1019,15,100000ms,30000ms,Mob007-1::On1019
-007-1,0,0,0,0|monster|Snail|1041,25,100000ms,30000ms,Mob007-1::On1041
-007-1,0,0,0,0|monster|MauvePlant|1029,3,270000ms,180000ms,Mob007-1::On1029
-007-1,0,0,0,0|monster|GambogePlant|1031,1,2700000ms,1800000ms,Mob007-1::On1031
-007-1,0,0,0,0|monster|Silkworm|1035,2,60000ms,30000ms,Mob007-1::On1035
-007-1,0,0,0,0|monster|CloverPatch|1037,2,0ms,1000ms,Mob007-1::On1037
-007-1,0,0,0,0|monster|Squirrel|1038,25,30ms,20ms,Mob007-1::On1038
-007-1,0,0,0,0|monster|Butterfly|1055,10,30ms,20ms,Mob007-1::On1055
-
-
-007-1,0,0,0|script|Mob007-1|32767
-{
- end;
-
-On1014:
- set @mobID, 1014;
- callfunc "MobPoints";
- end;
-
-On1019:
- set @mobID, 1019;
- callfunc "MobPoints";
- end;
-
-On1029:
- set @mobID, 1029;
- callfunc "MobPoints";
- end;
-
-On1031:
- set @mobID, 1031;
- callfunc "MobPoints";
- end;
-
-On1035:
- set @mobID, 1035;
- callfunc "MobPoints";
- end;
-
-On1037:
- set @mobID, 1037;
- callfunc "MobPoints";
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1041:
- set @mobID, 1041;
- callfunc "MobPoints";
- end;
-
-On1055:
- set @mobID, 1055;
- callfunc "MobPoints";
- end;
-}
+007-1,0,0,0,0|monster|PinkFlower|1014,17,100000ms,30000ms
+007-1,0,0,0,0|monster|SpikyMushroom|1019,15,100000ms,30000ms
+007-1,0,0,0,0|monster|Snail|1041,25,100000ms,30000ms
+007-1,0,0,0,0|monster|MauvePlant|1029,3,270000ms,180000ms
+007-1,0,0,0,0|monster|GambogePlant|1031,1,2700000ms,1800000ms
+007-1,0,0,0,0|monster|Silkworm|1035,2,60000ms,30000ms
+007-1,0,0,0,0|monster|CloverPatch|1037,2,0ms,1000ms
+007-1,0,0,0,0|monster|Squirrel|1038,25,30ms,20ms
+007-1,0,0,0,0|monster|Butterfly|1055,10,30ms,20ms
diff --git a/world/map/npc/007-1/_nodes.txt b/world/map/npc/007-1/_nodes.txt
new file mode 100644
index 00000000..12c08221
--- /dev/null
+++ b/world/map/npc/007-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Woodland nodes
+
+// (no nodes)
diff --git a/world/map/npc/007-2/_import.txt b/world/map/npc/007-2/_import.txt
index bce6eb02..e68bb71b 100644
--- a/world/map/npc/007-2/_import.txt
+++ b/world/map/npc/007-2/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 007-2
npc: npc/007-2/_mobs.txt
+npc: npc/007-2/_nodes.txt
npc: npc/007-2/_warps.txt
npc: npc/007-2/witch.txt
diff --git a/world/map/npc/007-2/_mobs.txt b/world/map/npc/007-2/_mobs.txt
index ca392cc6..1d91c286 100644
--- a/world/map/npc/007-2/_mobs.txt
+++ b/world/map/npc/007-2/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Illia forsaken inn mobs
-
-
-007-2,0,0,0|script|Mob007-2|32767
-{
- end;
-}
diff --git a/world/map/npc/007-2/_nodes.txt b/world/map/npc/007-2/_nodes.txt
new file mode 100644
index 00000000..38010d03
--- /dev/null
+++ b/world/map/npc/007-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Illia forsaken inn nodes
+
+// (no nodes)
diff --git a/world/map/npc/007-2/witch.txt b/world/map/npc/007-2/witch.txt
index 557b5f62..360f2885 100644
--- a/world/map/npc/007-2/witch.txt
+++ b/world/map/npc/007-2/witch.txt
@@ -23,7 +23,7 @@
set @illia_iced_water, 4;
set $@illia_min_level, 90;
- if (getgmlevel() >= 40 && getequipid(equip_head) == 647)
+ if ((GM >= DBG_VALIA || debug) && getequipid(equip_head) == 647)
goto L_DeveloperBoard;
if (BaseLevel < $@illia_min_level) goto L_Unexperienced;
@@ -35,22 +35,7 @@
end;
L_DeveloperBoard:
- mes "[Developer Board]";
- mes "$Illia_Luvia_Harvest: "+$Illia_Luvia_Harvest;
- mes "$Illia_Win_Counter: "+$Illia_Win_Counter;
- next;
- mes "[Developer Board]";
- mes "$@illia_progress: "+$@illia_progress;
- if ($@illia_begin_time > 0)
- mes "Time: "+(gettimetick(2) - $@illia_begin_time)+"/"+$@illia_max_time;
- mes "";
- mes "$@illia_level_1_progress: "+$@illia_level_1_progress;
- mes "$@illia_level_2_progress: "+$@illia_level_2_progress;
- mes "$@illia_level_3_progress: "+$@illia_level_3_progress;
- mes "$@illia_level_4_progress: "+$@illia_level_4_progress;
- mes "$@illia_level_5_progress: "+$@illia_level_5_progress;
- mes "$@illia_level_6_progress: "+$@illia_level_6_progress;
- mes "$@illia_level_7_progress: "+$@illia_level_7_progress;
+ callfunc "IlliaDebug";
close;
L_Introduce:
@@ -639,10 +624,10 @@ OnTimer34000:
end;
// Trigger 4 areatimers to show the teleport spell
// This is better looking than a basic areawarp
- areatimer "007-2", 0, 0, 57, 55, 3000, "Valia::OnWarpHero";
- areatimer "007-2", 0, 0, 57, 55, 3500, "Valia::OnWarpHelper1";
- areatimer "007-2", 0, 0, 57, 55, 4000, "Valia::OnWarpHelper2";
- areatimer "007-2", 0, 0, 57, 55, 4500, "Valia::OnWarpHelper3";
+ areatimer 0, "007-2", 0, 0, 57, 55, 3000, "Valia::OnWarpHero";
+ areatimer 0, "007-2", 0, 0, 57, 55, 3500, "Valia::OnWarpHelper1";
+ areatimer 0, "007-2", 0, 0, 57, 55, 4000, "Valia::OnWarpHelper2";
+ areatimer 0, "007-2", 0, 0, 57, 55, 4500, "Valia::OnWarpHelper3";
npctalk strnpcinfo(0), "Spiralis Major!";
misceffect FX_BLUE_MAGIC_CAST;
end;
@@ -1020,3 +1005,22 @@ end;
{
end;
}
+
+function|script|IlliaDebug
+{
+ mes "$Illia_Luvia_Harvest: "+$Illia_Luvia_Harvest;
+ mes "$Illia_Win_Counter: "+$Illia_Win_Counter;
+ mes "---";
+ mes "$@illia_progress: "+$@illia_progress;
+ if ($@illia_begin_time > 0)
+ mes "Time: "+(gettimetick(2) - $@illia_begin_time)+"/"+$@illia_max_time;
+ mes "---";
+ mes "$@illia_level_1_progress: "+$@illia_level_1_progress;
+ mes "$@illia_level_2_progress: "+$@illia_level_2_progress;
+ mes "$@illia_level_3_progress: "+$@illia_level_3_progress;
+ mes "$@illia_level_4_progress: "+$@illia_level_4_progress;
+ mes "$@illia_level_5_progress: "+$@illia_level_5_progress;
+ mes "$@illia_level_6_progress: "+$@illia_level_6_progress;
+ mes "$@illia_level_7_progress: "+$@illia_level_7_progress;
+ return;
+}
diff --git a/world/map/npc/008-1/_import.txt b/world/map/npc/008-1/_import.txt
index fc019095..630d4263 100644
--- a/world/map/npc/008-1/_import.txt
+++ b/world/map/npc/008-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 008-1
npc: npc/008-1/_mobs.txt
+npc: npc/008-1/_nodes.txt
npc: npc/008-1/_warps.txt
npc: npc/008-1/andra.txt
npc: npc/008-1/annualeaster.txt
diff --git a/world/map/npc/008-1/_mobs.txt b/world/map/npc/008-1/_mobs.txt
index 33a425e3..6c077242 100644
--- a/world/map/npc/008-1/_mobs.txt
+++ b/world/map/npc/008-1/_mobs.txt
@@ -1,63 +1,12 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Hurnscald Outskirts mobs
-008-1,0,0,0,0|monster|PinkFlower|1014,10,20ms,0ms,Mob008-1::On1014
-008-1,0,0,0,0|monster|Pinkie|1018,18,20ms,0ms,Mob008-1::On1018
-008-1,0,0,0,0|monster|ManaBug|1131,18,30ms,0ms,Mob008-1::On1131
-008-1,0,0,0,0|monster|Maggot|1002,30,30ms,0ms,Mob008-1::On1002
-008-1,0,0,0,0|monster|MauvePlant|1029,2,270000ms,180000ms,Mob008-1::On1029
-008-1,0,0,0,0|monster|Silkworm|1035,2,60000ms,30000ms,Mob008-1::On1035
-008-1,0,0,0,0|monster|CloverPatch|1037,2,0ms,1000ms,Mob008-1::On1037
-008-1,0,0,0,0|monster|Squirrel|1038,10,30ms,20ms,Mob008-1::On1038
-008-1,0,0,0,0|monster|Butterfly|1055,10,30ms,20ms,Mob008-1::On1055
-
-
-008-1,0,0,0|script|Mob008-1|32767
-{
- end;
-
-On1002:
- set @mobID, 1002;
- callfunc "MobPoints";
- end;
-
-On1014:
- set @mobID, 1014;
- callfunc "MobPoints";
- end;
-
-On1018:
- set @mobID, 1018;
- callfunc "MobPoints";
- end;
-
-On1029:
- set @mobID, 1029;
- callfunc "MobPoints";
- end;
-
-On1035:
- set @mobID, 1035;
- callfunc "MobPoints";
- end;
-
-On1037:
- set @mobID, 1037;
- callfunc "MobPoints";
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1055:
- set @mobID, 1055;
- callfunc "MobPoints";
- end;
-
-On1131:
- set @mobID, 1131;
- callfunc "MobPoints";
- end;
-}
+008-1,0,0,0,0|monster|PinkFlower|1014,10,20ms,0ms
+008-1,0,0,0,0|monster|Pinkie|1018,18,20ms,0ms
+008-1,0,0,0,0|monster|ManaBug|1131,18,30ms,0ms
+008-1,0,0,0,0|monster|Maggot|1002,30,30ms,0ms
+008-1,0,0,0,0|monster|MauvePlant|1029,2,270000ms,180000ms
+008-1,0,0,0,0|monster|Silkworm|1035,2,60000ms,30000ms
+008-1,0,0,0,0|monster|CloverPatch|1037,2,0ms,1000ms
+008-1,0,0,0,0|monster|Squirrel|1038,10,30ms,20ms
+008-1,0,0,0,0|monster|Butterfly|1055,10,30ms,20ms
diff --git a/world/map/npc/008-1/_nodes.txt b/world/map/npc/008-1/_nodes.txt
new file mode 100644
index 00000000..d8b67583
--- /dev/null
+++ b/world/map/npc/008-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Hurnscald Outskirts nodes
+
+// (no nodes)
diff --git a/world/map/npc/008-1/annualeaster.txt b/world/map/npc/008-1/annualeaster.txt
index b38aaa0a..1ec95cbe 100644
--- a/world/map/npc/008-1/annualeaster.txt
+++ b/world/map/npc/008-1/annualeaster.txt
@@ -8,250 +8,213 @@
// Easter cannot be before march 22 or after april 25, so activate
// the event in these days.
-
-function|script|AnnualEasterEvent
+008-1,0,0,0|script|Easter Eggs|32767
{
+
+//////////////////////////////////
+// puppet logic below
+
+ if (strnpcinfo(2) == "") end;
+ if (get(.disabled, "Easter Eggs") || $@isEaster < 1) goto L_Destroy;
+ set @npc_distance, 1;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
if ((gettimetick(2)-TUT_var < 5*7*86400) || (BaseLevel < 40)) //player must be created at least 5 weeks ago
goto L_EndTooYoung;
- callsub S_Read_Annual_Quest;
+ set @easter_year, (Annual_Quest & BYTE_1_MASK) >> BYTE_1_SHIFT;
+
if (#EASTERTIMEPENALTY == 0)
goto L_WarmUp;
// prevent clicking multiple times:
- if (gettimetick(2) < #EASTERTIMEPENALTY + $@EASTER_FOUND_WAIT_TIME)
+ if (gettimetick(2) < #EASTERTIMEPENALTY + get(.wait_time, "Easter Eggs"))
goto L_End2;
if (@easter_year > gettime(7) - 2000)
goto L_End3;
set #EASTERTIMEPENALTY, gettimetick(2);
- // global counter to determine reshuffle times of the eggs.
- set $@peopleFoundEggs[@EasterEggID], $@peopleFoundEggs[@EasterEggID]+1;
-
- set @AnnualEasterTries, @AnnualEasterTries + 1;
+ set .found, .found + 1; // this egg has been found X times
+ set @AnnualEasterTries, @AnnualEasterTries + 1; // you tried X times since login
- // give a small reward:
- message strcharinfo(0), "You found something!";
- set @tmp, getarraysize($@SmallAnnualEasterItems$);
- set @random, rand(@tmp + 2);
- if (@random < @tmp) getitem $@SmallAnnualEasterItems$[@random], rand(1, 2);
- if (@random == @tmp) getexp rand(200), 0;
- if (@random == @tmp + 1) set Zeny, Zeny + rand(50);
- misceffect FX_GETITEM, strcharinfo(0);
+ message strcharinfo(0), "Eggs : You found something!";
+ set .@size, get(.small_rewards, "Easter Eggs");
+ set .@random, rand(.@size+2);
+ if (.@random < .@size)
+ getitem get(.small_rewards$[.@random], "Easter Eggs"), rand(1, 2);
+ elif (.@random == .@size)
+ getexp rand(200), 0;
+ else
+ set Zeny, Zeny + rand(50);
- // give out a better reward occasionally:
- // standard case is branch taken, so only if rand yields 0, medium rewarding.
- if (rand($@EASTER_EGG_INV_CHANCE))
+ if (rand(get(.chance, "Easter Eggs")))
goto L_NoEasterEgg;
- set @random, rand(getarraysize($@MediumAnnualEasterRewards$));
- getitem $@MediumAnnualEasterRewards$[@random], 1;
+
+ set .@random, rand(get(.medium_rewards$, "Easter Eggs"));
+ getitem get(.medium_rewards$[.@random], "Easter Eggs"), 1;
misceffect FX_GETITEM, strcharinfo(0);
goto L_NoEasterEgg;
L_NoEasterEgg:
-
- // If you're lucky you get a bigger unique reward per year:
- // so only pass on a small chance iff you don't have the item yet.
- // Usually the journey ends here because @random != 0 -> end
- callsub S_Read_Annual_Quest;
-
- if (@AnnualEasterTries > $@EASTER_FINAL_REW_INV_CHANCE)
- set @AnnualEasterTries, $@EASTER_FINAL_REW_INV_CHANCE;
- set @random, rand($@EASTER_FINAL_REW_INV_CHANCE - @AnnualEasterTries + 1);
- if (@random || @easter_year > gettime(7) - 2000)
- goto L_End1;
+ set .@fchance, get(.final_rew_chance, "Easter Eggs");
+ if (@AnnualEasterTries > .@fchance)
+ set @AnnualEasterTries, .@fchance;
+ set .@random, rand(.@fchance - @AnnualEasterTries + 1);
+ if (.@random || @easter_year > gettime(7) - 2000)
+ goto L_Reward_End;
// block for further items this year:
set @easter_year, gettime(7) - 2000 + 1;
- callsub S_Update_Annual_Quest;
+ set Annual_Quest, (Annual_Quest & ~(BYTE_1_MASK) | (@easter_year << BYTE_1_SHIFT));
// Hand out pretty unique rewards depending on the current year:
// We'll be handing out 2 different items each year, whereas one of them
// will be very common (95 %) and the other rare (5 %) for the players.
// The rare item will become the common item next year.
- set @rewardindex, gettime(7) - 2012;
+ set .@rewardindex, gettime(7) - 2012;
if (rand(100) < 5)
- set @rewardindex, @rewardindex + 1;
-
+ set .@rewardindex, .@rewardindex + 1;
// now hand out the specific item:
- set @rewardindex, @rewardindex % getarraysize($@FinalAnnualEasterReward$);
- getitem $@FinalAnnualEasterReward$[@rewardindex], 1;
+ set .@rewardindex, .@rewardindex % get(.big_rewards, "Easter Eggs");
+ getitem get(.big_rewards$[.@rewardindex], "Easter Eggs"), 1;
misceffect FX_GETITEM, strcharinfo(0);
- message strcharinfo(0), "This is really special. You won't find anything like this again.";
- goto L_End1;
+ message strcharinfo(0), "Eggs : This is really special. You won't find anything like this again.";
+ goto L_Reward_End;
-S_Read_Annual_Quest:
- set @easter_year, (Annual_Quest & BYTE_1_MASK) >> BYTE_1_SHIFT;
- return;
+L_Reward_End:
+ if (.found >= get(.mapcount, "Easter Eggs"))
+ goto L_Destroy;
+ end;
-S_Update_Annual_Quest:
- set Annual_Quest, (Annual_Quest & ~(BYTE_1_MASK) | (@easter_year << BYTE_1_SHIFT));
- return;
+L_Destroy:
+ set .eggs, get(.eggs, "Easter Eggs") - 1, "Easter Eggs"; // tell the puppeteer we lost an egg
+ destroy;
L_EndTooYoung:
- message strcharinfo(0), "The nest is empty.";
- goto L_End1;
+ message strcharinfo(0), "Eggs : The nest is empty.";
+ end;
L_WarmUp:
set #EASTERTIMEPENALTY, gettimetick(2);
getitem "MoubooFigurine", 1;
misceffect FX_GETITEM, strcharinfo(0);
- message strcharinfo(0), "Hmmm eggs! Maybe you can find something nice there!";
- goto L_End1;
+ message strcharinfo(0), "Eggs : Hmmm eggs! Maybe you can find something nice there!";
+ end;
L_End3:
- message strcharinfo(0), "Don't be greedy! You already found something nice.";
- goto L_End1;
+ message strcharinfo(0), "Eggs : Don't be greedy! You already found something nice.";
+ end;
L_End2:
- message strcharinfo(0), "Don't be greedy! You just found something a moment ago.";
+ message strcharinfo(0), "Eggs : Don't be greedy! You just found something a moment ago.";
set #EASTERTIMEPENALTY, #EASTERTIMEPENALTY + 5;
if (#EASTERTIMEPENALTY > gettimetick(2))
set #EASTERTIMEPENALTY, gettimetick(2);
- goto L_End1;
-
-L_End1:
- set @rewardindex, 0;
- set @easter_year, 0;
- set @random, 0;
- set @tmp, 0;
- set @EasterEggID, 0;
- return;
-}
-
-008-1,65,40,0|script|#TestEgg0|375
-{
- set @npc_distance, 1;
- callfunc "PCtoNPCRange";
- if(@npc_check) end;
-
- set @EasterEggID, 0;
- callfunc("AnnualEasterEvent");
end;
-}
-008-1,65,40,0|script|#TestEgg1|375
-{
- set @npc_distance, 1;
- callfunc "PCtoNPCRange";
- if(@npc_check) end;
-
- set @EasterEggID, 1;
- callfunc("AnnualEasterEvent");
+OnTimer5000:
+ if (get(.disabled, "Easter Eggs") || $@isEaster < 1)
+ goto L_Destroy;
+ initnpctimer;
end;
-}
-008-1,65,40,0|script|#TestEgg2|375
-{
- set @npc_distance, 1;
- callfunc "PCtoNPCRange";
- if(@npc_check) end;
-
- set @EasterEggID, 2;
- callfunc("AnnualEasterEvent");
- end;
-}
+//////////////////////////////////
+// puppeteer logic below
-008-1,59,38,0|script|#AnnualEaster|32767
-{
+OnSpawn:
+ set .@e, rand(2,.loc[1]);
+ set .@x, .loc[.@e];
+ set .@y, .loc[(.@e-1)+.loc[1]];
+ set .eID, .eID + 1; // give the egg an id
+ set .@name$, "#--Ee"+chr(3)+.eID;
+ void puppet(strnpcinfo(3), .@x, .@y, .@name$, 375); // spawn the egg
+ initnpctimer .@name$; // init puppeteer check timer
+ if (.eID == 2147483647)
+ set .eID, 0; // start over if id = 0x7FFFFFFF
end;
-OnInit:
- set $@EASTER_FOUND_WAIT_TIME, 15;
- set $@EASTER_FINAL_REW_INV_CHANCE, 70;
- set $@EASTER_EGG_INV_CHANCE, 750;
-
- setarray $@easteregg_posx, 41, 45, 50, 57, 60, 64, 67, 65, 59, 72, 70, 82, 81, 93, 97, 101, 88, 108, 115, 122, 122, 129, 129, 130, 135, 123, 132, 132, 127, 124, 121, 107, 100, 101, 109, 104, 88, 84, 92, 59, 71, 65, 53, 55, 74, 59, 53, 46, 44, 44, 38, 43, 40, 43, 37;
- setarray $@easteregg_posy, 87, 89, 88, 93, 98, 90, 96, 82, 81, 82, 96, 98, 92, 89, 89, 81, 82, 94, 96, 96, 90, 86, 72, 65, 60, 46, 25, 21, 20, 22, 20, 34, 24, 41, 43, 42, 48, 28, 27, 17, 23, 29, 25, 20, 39, 41, 34, 36, 18, 25, 31, 39, 64, 69, 73;
-
- if (getarraysize($@easteregg_posy) != getarraysize($@easteregg_posx))
- goto L_FAULTY_SETUP;
-
- setarray $@SmallAnnualEasterItems$, "AppleCake", "CactusDrink", "CactusPotion", "Cake", "Candy", "CherryCake", "ChocolateBar", "ChocolateCake", "GreenApple", "Orange", "OrangeCake", "OrangeCupcake", "RedApple", "WhiteCake";
-
- setarray $@MediumAnnualEasterRewards$, "RedEasterEgg", "GreenEasterEgg", "BlueEasterEgg", "YellowEasterEgg", "PinkEasterEgg", "TealEasterEgg";
+S_Spawn:
+ if (.eggs >= .max_eggs)
+ goto S_Return;
+ set .eggs, .eggs + 1;
+ addnpctimer 125 + rand(250), strnpcinfo(0) + "::OnSpawn"; // schedule a spawn
+ if (.eggs < .min_eggs)
+ goto S_Spawn;
+ return;
- // DO NOT CHANGE SIZE AFTER EASTER 2013!
- setarray $@FinalAnnualEasterReward$, "RedEggshellHat", "BlueEggshellHat", "YellowEggshellHat", "GreenEggshellHat", "OrangeEggshellHat", "DarkEggshellHat";
+S_Return:
+ return;
- callsub S_disableEggs;
- if (debug >= 2) end;
- initnpctimer;
+OnHeartbeat:
+ if (.max_eggs < 1 || .disabled || $@isEaster < 1) end;
+ set .mapcount, 1 + getmapusers(strnpcinfo(3)) / 3;
+ callsub S_Spawn;
+ addnpctimer 1000, strnpcinfo(0) + "::OnHeartbeat"; // heartbeat
end;
-L_FAULTY_SETUP:
- mapexit;
-
-OnTimer1000:
- setnpctimer 0;
-
- // an egg can be 'found' multiple times, make this number of possible findings
- // depend on the number of players currently on the map.
- set $@AEASTER_mapcount, 1 + getmapusers("008-1") / 3;
-
- set $@isEaster, 0;
+OnCheckEaster:
if ((gettime(6) == 3 && gettime(5) >= 22) || (gettime(6) == 4 && gettime(5) <= 25))
set $@isEaster, 1;
-
- if (!$@wasEaster && $@isEaster)
- goto L_do_update_enable;
- if ($@wasEaster && !$@isEaster)
- goto L_do_update_disable;
- goto L_done_update;
-
-L_do_update_enable:
- callsub S_enableEggs;
- goto L_done_update;
-
-L_do_update_disable:
- callsub S_disableEggs;
- goto L_done_update;
-
-L_done_update:
- set $@wasEaster, $@isEaster;
-
- if (!$@isEaster)
- goto L_End;
-
- set $@EggID, 0;
- callsub S_relocateEasterEgg;
- set $@EggID, 1;
- callsub S_relocateEasterEgg;
- set $@EggID, 2;
- callsub S_relocateEasterEgg;
- // intentional fallthrough to L_End
- goto L_End;
-
-L_End:
- set $@AEASTER_mapcount, 0;
- set $@EggID, 0;
- set $@isEaster, 0;
+ else
+ set $@isEaster, 0;
+ if ($@isEaster && .eggs < 1)
+ donpcevent "Easter Eggs::OnStart";
end;
-S_enableEggs:
- enablenpc "#TestEgg0";
- enablenpc "#TestEgg1";
- enablenpc "#TestEgg2";
- return;
-
-S_disableEggs:
- disablenpc "#TestEgg0";
- disablenpc "#TestEgg1";
- disablenpc "#TestEgg2";
- return;
-
-S_relocateEasterEgg:
- if ($@peopleFoundEggs[$@EggID] < $@AEASTER_mapcount)
- goto S_Return;
-
- set $@peopleFoundEggs[$@EggID], 0;
-
- set $@eastereggPos, rand(getarraysize($@easteregg_posx));
- npcwarp $@easteregg_posx[$@eastereggPos], $@easteregg_posy[$@eastereggPos], "#TestEgg" + $@EggID;
- goto S_Return;
+OnStart:
+ if (.disabled || $@isEaster < 1) end;
+ set .min_eggs, 1; // min number of eggs
+ set .max_eggs, 3; // max number of eggs
+ set .eggs, 0; // virtual amount of eggs
+ set .eID, 0; // last egg id
+ set .wait_time, 15;
+ set .final_rew_chance, 70;
+ set .chance, 750;
+ setarray .loc[0], 0, 1,1, // first row: x, second row: y
+ 41, 45, 50, 57, 60, 64, 67, 65, 59, 72, 70, 82, 81, 93, 97, 101, 88, 108, 115, 122, 122, 129, 129, 130, 135, 123, 132, 132, 127, 124, 121, 107, 100, 101, 109, 104, 88, 84, 92, 59, 71, 65, 53, 55, 74, 59, 53, 46, 44, 44, 38, 43, 40, 43, 37,
+ 87, 89, 88, 93, 98, 90, 96, 82, 81, 82, 96, 98, 92, 89, 89, 81, 82, 94, 96, 96, 90, 86, 72, 65, 60, 46, 25, 21, 20, 22, 20, 34, 24, 41, 43, 42, 48, 28, 27, 17, 23, 29, 25, 20, 39, 41, 34, 36, 18, 25, 31, 39, 64, 69, 73;
+ set .loc[0], (getarraysize(.loc) - 1); // loc 0 and 1 are special (stores array size, and half index)
+ set .loc[1], ((.loc[0]+1)/2);
+ setarray .small_rewards$[0], 0, "AppleCake", "CactusDrink", "CactusPotion", "Cake", "Candy", "CherryCake", "ChocolateBar", "ChocolateCake", "GreenApple", "Orange", "OrangeCake", "OrangeCupcake", "RedApple", "WhiteCake";
+ set .small_rewards, getarraysize(.small_rewards$);
+ setarray .medium_rewards$[0], 0, "RedEasterEgg", "GreenEasterEgg", "BlueEasterEgg", "YellowEasterEgg", "PinkEasterEgg", "TealEasterEgg";
+ setarray .big_rewards$[0], 0, "RedEggshellHat", "BlueEggshellHat", "YellowEggshellHat", "GreenEggshellHat", "OrangeEggshellHat", "DarkEggshellHat";
+ set .big_rewards, getarraysize(.big_rewards$);
+ donpcevent strnpcinfo(0) + "::OnHeartbeat"; // first heartbeat
+ end;
+}
-S_Return:
+function|script|Easter Debug
+{
+ goto L_Menu;
+
+L_Menu:
+ clear;
+ mes "Please choose an option.";
+ if (get(.disabled, "Easter Eggs"))
+ menu
+ "Do Nothing.", L_Return,
+ "Enable eggs.", L_Enable;
+ menu
+ "Do Nothing.", L_Return,
+ "Disable eggs.", L_Disable;
+
+L_Enable:
+ set .disabled, 0, "Easter Eggs";
+ clear;
+ mes "Easter Eggs enabled.";
+ next;
+ goto L_Menu;
+
+L_Disable:
+ set .disabled, 1, "Easter Eggs"; // TODO: (tmwa) automatically destroy puppets when using @disablenpc & also discard timers
+ clear;
+ mes "Easter Eggs disabled.";
+ next;
+ goto L_Menu;
+
+L_Return:
return;
}
diff --git a/world/map/npc/008-1/hinnak.txt b/world/map/npc/008-1/hinnak.txt
index c2360141..d16460c3 100644
--- a/world/map/npc/008-1/hinnak.txt
+++ b/world/map/npc/008-1/hinnak.txt
@@ -217,7 +217,7 @@ L_Sagatha_scary:
L_Sagatha_word:
mes "[Farmer Hinnak]";
- mes "\"Oh, I can't be sure... but something like '" + getspellinvocation("summon-maggots") + "', I think.\"";
+ mes "\"Oh, I can't be sure... but something like '" + get(.invocation$, "summon-maggots") + "', I think.\"";
goto L_Close;
L_NoBeer:
diff --git a/world/map/npc/009-1/_import.txt b/world/map/npc/009-1/_import.txt
index 4c902627..6c27b6c5 100644
--- a/world/map/npc/009-1/_import.txt
+++ b/world/map/npc/009-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 009-1
npc: npc/009-1/_mobs.txt
+npc: npc/009-1/_nodes.txt
npc: npc/009-1/_warps.txt
npc: npc/009-1/constable.txt
npc: npc/009-1/dock.txt
diff --git a/world/map/npc/009-1/_mobs.txt b/world/map/npc/009-1/_mobs.txt
index 247a3797..223569bf 100644
--- a/world/map/npc/009-1/_mobs.txt
+++ b/world/map/npc/009-1/_mobs.txt
@@ -1,34 +1,8 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Hurnscald mobs
-009-1,74,32,2,1|monster|CloverPatch|1037,1,100000ms,120000ms,Mob009-1::On1037
-009-1,29,44,9,13|monster|PinkFlower|1014,2,0ms,250ms,Mob009-1::On1014
-009-1,88,51,15,4|monster|Squirrel|1038,2,0ms,5000ms,Mob009-1::On1038
-009-1,80,38,5,5|monster|Squirrel|1038,1,0ms,5000ms,Mob009-1::On1038
-009-1,0,0,0,0|monster|Butterfly|1055,5,30ms,20ms,Mob009-1::On1055
-
-
-009-1,0,0,0|script|Mob009-1|32767
-{
- end;
-
-On1014:
- set @mobID, 1014;
- callfunc "MobPoints";
- end;
-
-On1037:
- set @mobID, 1037;
- callfunc "MobPoints";
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1055:
- set @mobID, 1055;
- callfunc "MobPoints";
- end;
-}
+009-1,74,32,2,1|monster|CloverPatch|1037,1,100000ms,120000ms
+009-1,29,44,9,13|monster|PinkFlower|1014,2,0ms,250ms
+009-1,88,51,15,4|monster|Squirrel|1038,2,0ms,5000ms
+009-1,80,38,5,5|monster|Squirrel|1038,1,0ms,5000ms
+009-1,0,0,0,0|monster|Butterfly|1055,5,30ms,20ms
diff --git a/world/map/npc/009-1/_nodes.txt b/world/map/npc/009-1/_nodes.txt
new file mode 100644
index 00000000..6d59c8db
--- /dev/null
+++ b/world/map/npc/009-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Hurnscald nodes
+
+// (no nodes)
diff --git a/world/map/npc/009-2/_import.txt b/world/map/npc/009-2/_import.txt
index 2bec98b3..25198d72 100644
--- a/world/map/npc/009-2/_import.txt
+++ b/world/map/npc/009-2/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 009-2
npc: npc/009-2/_mobs.txt
+npc: npc/009-2/_nodes.txt
npc: npc/009-2/_warps.txt
npc: npc/009-2/airlia.txt
npc: npc/009-2/alan.txt
diff --git a/world/map/npc/009-2/_mobs.txt b/world/map/npc/009-2/_mobs.txt
index e0b8a1a0..45fa02a8 100644
--- a/world/map/npc/009-2/_mobs.txt
+++ b/world/map/npc/009-2/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Hurnscald Indoor mobs
-
-
-009-2,0,0,0|script|Mob009-2|32767
-{
- end;
-}
diff --git a/world/map/npc/009-2/_nodes.txt b/world/map/npc/009-2/_nodes.txt
new file mode 100644
index 00000000..161b9c17
--- /dev/null
+++ b/world/map/npc/009-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Hurnscald Indoor nodes
+
+// (no nodes)
diff --git a/world/map/npc/009-2/misc.txt b/world/map/npc/009-2/misc.txt
index b28d43b5..1c1d3897 100644
--- a/world/map/npc/009-2/misc.txt
+++ b/world/map/npc/009-2/misc.txt
@@ -39,7 +39,7 @@ L_magic:
mes "The page after that is once again hastily written, with many crossed out words and sections and side remarks such as 'it almost worked' or 'it worked fine yesterday.'";
next;
mes "[Bookshelf]";
- mes "The last word on that page is '" + getspellinvocation("make-iron-powder") + ",' and it's underlined twice with a comment next to it saying 'finally got it right.'";
+ mes "The last word on that page is '" + get(.invocation$, "make-iron-powder") + ",' and it's underlined twice with a comment next to it saying 'finally got it right.'";
next;
mes "[Bookshelf]";
mes "Unfortunately, you can't make out what the transmutation is for or even whether it requires any materials...";
diff --git a/world/map/npc/009-2/selim.txt b/world/map/npc/009-2/selim.txt
index ce5cc424..708b2e13 100644
--- a/world/map/npc/009-2/selim.txt
+++ b/world/map/npc/009-2/selim.txt
@@ -11,8 +11,13 @@ L_Main:
"Can you dye something for me?", L_clothes_choice,
"Can you also remove color from clothing?", L_ask_bleach,
"About these sorcerer robes...", L_asksorcererrobe,
+ "Can you change my appearance?", L_barber,
"Never mind.", L_Close;
+L_barber:
+ callfunc "Barber";
+ goto L_Main;
+
L_ask_bleach:
mes "[Selim]";
mes "\"I'm afraid no.";
diff --git a/world/map/npc/009-2/wyara.txt b/world/map/npc/009-2/wyara.txt
index ba33d29f..246d458a 100644
--- a/world/map/npc/009-2/wyara.txt
+++ b/world/map/npc/009-2/wyara.txt
@@ -242,7 +242,7 @@ L_M_spell:
L_M_spell3:
mes "[Wyara the Witch]";
- mes "\"Now that you know the basics of nature magic, here is one of my favourites: '" + getspellinvocation("rain") + "' will summon rain, whereever you are standing. It will consume a bottle of water, though.\"";
+ mes "\"Now that you know the basics of nature magic, here is one of my favourites: '" + get(.invocation$, "rain") + "' will summon rain, whereever you are standing. It will consume a bottle of water, though.\"";
if (getskilllv(SKILL_MAGIC) < 2)
mes "\"You are not powerful enough to use it yet, though; you will first have to absorb more magic from the mana seed.\"";
next;
@@ -250,14 +250,14 @@ L_M_spell3:
L_M_spell2:
mes "[Wyara the Witch]";
- mes "\"Here is another useful one: '" + getspellinvocation("detect-players") + "'. It will tell you the names of everyone nearby, but beware that there are ways to protect against it.\"";
+ mes "\"Here is another useful one: '" + get(.invocation$, "detect-players") + "'. It will tell you the names of everyone nearby, but beware that there are ways to protect against it.\"";
if (getskilllv(SKILL_MAGIC) < 2)
mes "\"Hmm. You aren't powerful enough for this one either yet, I think.\"";
next;
if (!(getpartnerid2()))
goto L_M_main;
mes "[Wyara the Witch]";
- mes "\"Married partners can find each other even more easily. Use the '" + getspellinvocation("sense-spouse") + "' spell instead.\"";
+ mes "\"Married partners can find each other even more easily. Use the '" + get(.invocation$, "sense-spouse") + "' spell instead.\"";
next;
goto L_M_main;
diff --git a/world/map/npc/009-3/_import.txt b/world/map/npc/009-3/_import.txt
index f147aa76..6cf14773 100644
--- a/world/map/npc/009-3/_import.txt
+++ b/world/map/npc/009-3/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 009-3
npc: npc/009-3/_mobs.txt
+npc: npc/009-3/_nodes.txt
npc: npc/009-3/_warps.txt
npc: npc/009-3/mapflags.txt
npc: npc/009-3/sword.txt
diff --git a/world/map/npc/009-3/_mobs.txt b/world/map/npc/009-3/_mobs.txt
index ab403a12..64c43145 100644
--- a/world/map/npc/009-3/_mobs.txt
+++ b/world/map/npc/009-3/_mobs.txt
@@ -1,33 +1,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Hurnscald Cave mobs
-009-3,0,0,0,0|monster|YellowSlime|1007,20,0ms,0ms,Mob009-3::On1007
-009-3,62,75,125,150|monster|BlackScorpion|1009,25,0ms,0ms,Mob009-3::On1009
-009-3,63,75,126,150|monster|RedSlime|1008,35,0ms,0ms,Mob009-3::On1008
-009-3,145,75,110,151|monster|CaveMaggot|1056,20,100000ms,30000ms,Mob009-3::On1056
-
-
-009-3,0,0,0|script|Mob009-3|32767
-{
- end;
-
-On1007:
- set @mobID, 1007;
- callfunc "MobPoints";
- end;
-
-On1008:
- set @mobID, 1008;
- callfunc "MobPoints";
- end;
-
-On1009:
- set @mobID, 1009;
- callfunc "MobPoints";
- end;
-
-On1056:
- set @mobID, 1056;
- callfunc "MobPoints";
- end;
-}
+009-3,0,0,0,0|monster|YellowSlime|1007,20,0ms,0ms
+009-3,62,75,125,150|monster|BlackScorpion|1009,25,0ms,0ms
+009-3,63,75,126,150|monster|RedSlime|1008,35,0ms,0ms
+009-3,145,75,110,151|monster|CaveMaggot|1056,20,100000ms,30000ms
diff --git a/world/map/npc/009-3/_nodes.txt b/world/map/npc/009-3/_nodes.txt
new file mode 100644
index 00000000..a4b17b18
--- /dev/null
+++ b/world/map/npc/009-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Hurnscald Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/009-3/sword.txt b/world/map/npc/009-3/sword.txt
index 91366f9e..1a427731 100644
--- a/world/map/npc/009-3/sword.txt
+++ b/world/map/npc/009-3/sword.txt
@@ -103,7 +103,7 @@ L_Next1:
mes "\"So thou art bound to the path of War, as am I, as is my sister...\"";
next;
mes "[Magic Sword]";
- mes "\"So be it, fellow warrior. Hear the incantation for the blade spell: '" + getspellinvocation("magic-blade") + "'\"";
+ mes "\"So be it, fellow warrior. Hear the incantation for the blade spell: '" + get(.invocation$, "magic-blade") + "'\"";
mes "\"Hold a knife, sharp or regular, when thou speakest it.\"";
set @Q_status, @STATUS_LEARNED_MAGICBLADE;
callsub S_update_var;
@@ -152,7 +152,7 @@ L_Next3:
mes "\"The spell I shall teach thee is the hail of arrows spell. It will make arrows fall down from the heavens unto thy enemies.\"";
next;
mes "[Magic Sword]";
- mes "\"Take twenty arrows, sprinkle sulphur powder over them, and then speak '" + getspellinvocation("arrow-hail") + "'. Throw them high up in the air, and watch the hail unfold before thy feet.\"";
+ mes "\"Take twenty arrows, sprinkle sulphur powder over them, and then speak '" + get(.invocation$, "arrow-hail") + "'. Throw them high up in the air, and watch the hail unfold before thy feet.\"";
close;
L_L2_almost_done:
diff --git a/world/map/npc/009-4/_import.txt b/world/map/npc/009-4/_import.txt
index c10d7df3..efddeeb4 100644
--- a/world/map/npc/009-4/_import.txt
+++ b/world/map/npc/009-4/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 009-4
npc: npc/009-4/_mobs.txt
+npc: npc/009-4/_nodes.txt
npc: npc/009-4/_warps.txt
npc: npc/009-4/barriers.txt
npc: npc/009-4/mapflags.txt
diff --git a/world/map/npc/009-4/_mobs.txt b/world/map/npc/009-4/_mobs.txt
index e81f350e..2995d15e 100644
--- a/world/map/npc/009-4/_mobs.txt
+++ b/world/map/npc/009-4/_mobs.txt
@@ -1,31 +1,10 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Orum Caves mobs
-009-4,117,97,24,15|monster|Silkworm|1035,3,20000ms,14000ms,Mob009-4::On1035
-009-4,115,98,24,15|monster|CaveSnake|1021,5,20000ms,14000ms,Mob009-4::On1021
-009-4,103,28,24,15|monster|CaveSnake|1021,3,20000ms,14000ms,Mob009-4::On1021
-009-4,106,27,24,15|monster|Silkworm|1035,3,20000ms,14000ms,Mob009-4::On1035
-009-4,119,45,12,10|monster|Silkworm|1035,3,20000ms,14000ms,Mob009-4::On1035
-009-4,72,130,24,15|monster|Maggot|1002,3,20000ms,14000ms,Mob009-4::On1002
-009-4,38,116,24,15|monster|Maggot|1002,3,20000ms,14000ms,Mob009-4::On1002
-
-
-009-4,0,0,0|script|Mob009-4|32767
-{
- end;
-
-On1002:
- set @mobID, 1002;
- callfunc "MobPoints";
- end;
-
-On1021:
- set @mobID, 1021;
- callfunc "MobPoints";
- end;
-
-On1035:
- set @mobID, 1035;
- callfunc "MobPoints";
- end;
-}
+009-4,117,97,24,15|monster|Silkworm|1035,3,20000ms,14000ms
+009-4,115,98,24,15|monster|CaveSnake|1021,5,20000ms,14000ms
+009-4,103,28,24,15|monster|CaveSnake|1021,3,20000ms,14000ms
+009-4,106,27,24,15|monster|Silkworm|1035,3,20000ms,14000ms
+009-4,119,45,12,10|monster|Silkworm|1035,3,20000ms,14000ms
+009-4,72,130,24,15|monster|Maggot|1002,3,20000ms,14000ms
+009-4,38,116,24,15|monster|Maggot|1002,3,20000ms,14000ms
diff --git a/world/map/npc/009-4/_nodes.txt b/world/map/npc/009-4/_nodes.txt
new file mode 100644
index 00000000..5050be70
--- /dev/null
+++ b/world/map/npc/009-4/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Orum Caves nodes
+
+// (no nodes)
diff --git a/world/map/npc/009-5/_import.txt b/world/map/npc/009-5/_import.txt
index 6cbfcc60..fe3f3fff 100644
--- a/world/map/npc/009-5/_import.txt
+++ b/world/map/npc/009-5/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 009-5
npc: npc/009-5/_mobs.txt
+npc: npc/009-5/_nodes.txt
npc: npc/009-5/_warps.txt
npc: npc/009-5/mapflags.txt
diff --git a/world/map/npc/009-5/_mobs.txt b/world/map/npc/009-5/_mobs.txt
index 78d520be..7e4d996a 100644
--- a/world/map/npc/009-5/_mobs.txt
+++ b/world/map/npc/009-5/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Last man standing mobs
-
-
-009-5,0,0,0|script|Mob009-5|32767
-{
- end;
-}
diff --git a/world/map/npc/009-5/_nodes.txt b/world/map/npc/009-5/_nodes.txt
new file mode 100644
index 00000000..9f0d888e
--- /dev/null
+++ b/world/map/npc/009-5/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Last man standing nodes
+
+// (no nodes)
diff --git a/world/map/npc/009-6/_import.txt b/world/map/npc/009-6/_import.txt
index 11296b22..3bb23125 100644
--- a/world/map/npc/009-6/_import.txt
+++ b/world/map/npc/009-6/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 009-6
npc: npc/009-6/_mobs.txt
+npc: npc/009-6/_nodes.txt
npc: npc/009-6/_warps.txt
npc: npc/009-6/brodomir.txt
npc: npc/009-6/mapflags.txt
diff --git a/world/map/npc/009-6/_mobs.txt b/world/map/npc/009-6/_mobs.txt
index adb1e44e..c03fd729 100644
--- a/world/map/npc/009-6/_mobs.txt
+++ b/world/map/npc/009-6/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Cave mobs
-
-
-009-6,0,0,0|script|Mob009-6|32767
-{
- end;
-}
diff --git a/world/map/npc/009-6/_nodes.txt b/world/map/npc/009-6/_nodes.txt
new file mode 100644
index 00000000..ed02d5dc
--- /dev/null
+++ b/world/map/npc/009-6/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/009-6/brodomir.txt b/world/map/npc/009-6/brodomir.txt
index 02704447..ea73ac36 100644
--- a/world/map/npc/009-6/brodomir.txt
+++ b/world/map/npc/009-6/brodomir.txt
@@ -195,7 +195,7 @@ L_SkipItemback:
L_Check:
if (getareausers("009-5", 20, 20, 80, 80, 1) > 1)
end;
- areatimer "009-5", 20, 20, 80, 80, 0, "Brodomir::OnReward";
+ areatimer 0, "009-5", 20, 20, 80, 80, 0, "Brodomir::OnReward";
goto L_End;
OnReward:
diff --git a/world/map/npc/009-7/_import.txt b/world/map/npc/009-7/_import.txt
index 4ae626ea..a064a519 100644
--- a/world/map/npc/009-7/_import.txt
+++ b/world/map/npc/009-7/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 009-7
npc: npc/009-7/_mobs.txt
+npc: npc/009-7/_nodes.txt
npc: npc/009-7/_warps.txt
npc: npc/009-7/battlemaster.txt
npc: npc/009-7/core.txt
diff --git a/world/map/npc/009-7/_mobs.txt b/world/map/npc/009-7/_mobs.txt
index bb641d0c..5eb4c228 100644
--- a/world/map/npc/009-7/_mobs.txt
+++ b/world/map/npc/009-7/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// The Sanguine Vault mobs
-
-
-009-7,0,0,0|script|Mob009-7|32767
-{
- end;
-}
diff --git a/world/map/npc/009-7/_nodes.txt b/world/map/npc/009-7/_nodes.txt
new file mode 100644
index 00000000..ad714a60
--- /dev/null
+++ b/world/map/npc/009-7/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// The Sanguine Vault nodes
+
+// (no nodes)
diff --git a/world/map/npc/009-7/eventHandler.txt b/world/map/npc/009-7/eventHandler.txt
index d20fff4d..6f6419ca 100644
--- a/world/map/npc/009-7/eventHandler.txt
+++ b/world/map/npc/009-7/eventHandler.txt
@@ -40,7 +40,7 @@ OnBecomeKiller:
end;
OnCommandIntrusion:
- areatimer "009-7", $@fightclub_x1, $@fightclub_y1, $@fightclub_x2, $@fightclub_y2, 0, "#FightClubUtils::OnIntrusion"; // we can not do this directly on #handler because it already have a timer
+ areatimer 0, "009-7", $@fightclub_x1, $@fightclub_y1, $@fightclub_x2, $@fightclub_y2, 0, "#FightClubUtils::OnIntrusion"; // we can not do this directly on #handler because it already have a timer
end;
}
diff --git a/world/map/npc/009-7/rouge.txt b/world/map/npc/009-7/rouge.txt
index 7660683e..b9b8e4cd 100644
--- a/world/map/npc/009-7/rouge.txt
+++ b/world/map/npc/009-7/rouge.txt
@@ -78,13 +78,13 @@ L_Challenge:
next;
mes "[Rouge]";
mes "To challenge a player to a duel, you need to write this command:";
- mes "%%E ##a"+ getspellinvocation("duel") +" (name)##0";
+ mes "%%E ##a"+ ("duel") +" (name)##0";
next;
mes "Your opponent will have to talk to me to accept or decline your offer.";
mes "The request will expire ##2"+ @time$ +"##0 after being sent.";
next;
mes "Keep in mind that you can ignore incoming duel requests with this command:";
- mes "%%E ##a"+ getspellinvocation("dueloff") +"##0";
+ mes "%%E ##a"+ ("dueloff") +"##0";
next;
mes "To un-ignore, simply write the same command again.";
goto L_End;
diff --git a/world/map/npc/009-8/_import.txt b/world/map/npc/009-8/_import.txt
new file mode 100644
index 00000000..315f39b2
--- /dev/null
+++ b/world/map/npc/009-8/_import.txt
@@ -0,0 +1,8 @@
+// Map 009-8: Chez Celestia
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+map: 009-8
+npc: npc/009-8/_mobs.txt
+npc: npc/009-8/_nodes.txt
+npc: npc/009-8/_warps.txt
+npc: npc/009-8/celestia.txt
+npc: npc/009-8/mapflags.txt
diff --git a/world/map/npc/009-8/_mobs.txt b/world/map/npc/009-8/_mobs.txt
new file mode 100644
index 00000000..af8e2169
--- /dev/null
+++ b/world/map/npc/009-8/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Chez Celestia mobs
+
diff --git a/world/map/npc/009-8/_nodes.txt b/world/map/npc/009-8/_nodes.txt
new file mode 100644
index 00000000..0dd108da
--- /dev/null
+++ b/world/map/npc/009-8/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Chez Celestia nodes
+
+// (no nodes)
diff --git a/world/map/npc/009-8/_warps.txt b/world/map/npc/009-8/_warps.txt
new file mode 100644
index 00000000..ff75c4ab
--- /dev/null
+++ b/world/map/npc/009-8/_warps.txt
@@ -0,0 +1,5 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Chez Celestia warps
+
+009-8,26,22|warp|-1,-1,009-1,74,50
+009-8,22,34|warp|-1,-1,009-1,72,54
diff --git a/world/map/npc/009-8/celestia.txt b/world/map/npc/009-8/celestia.txt
new file mode 100644
index 00000000..8b2ee06a
--- /dev/null
+++ b/world/map/npc/009-8/celestia.txt
@@ -0,0 +1,306 @@
+// celestia quest
+// allocation: 8 bit (byte) => QL_CELESTIA (id 22)
+// uses 3rd byte of QUEST_Hurnscald (16th bit to 23th bit)
+// (0000 0000) (0000 0000) (XXXX XXXX) (0000 000-)
+// could stretch to use 7 more bits to the right if need be
+//
+// QL_CELESTIA states:
+// 000 can not do the easy quest
+// 001 can do the easy quest (show quest marker)
+// 002 got the easy quest (show in quest log)
+// 003 completed the easy quest, can not do the adv quest
+// 004 can do the adv quest, scared celestia (show quest marker)
+// 005 got the adv quest (show in quest log)
+// 006 killed 1 yeti
+// [...]
+// 205 killed 200 yetis
+// 206 got reward
+
+009-8,31,23,0|script|Celestia|144
+{
+ callfunc "CelestiaState";
+ if (getequipid(equip_head) == 4027) // check if yeti mask (4027) is equipped
+ goto L_YetiMask;
+ if (getequipid(equip_head) == 647) // check if Developer's Cap (647) is equipped
+ goto L_Debug;
+ if (QL_CELESTIA == 2) // check if the player has the easy quest
+ goto L_ExplainEasy;
+ if (QL_CELESTIA >= 5 && QL_CELESTIA < 206) // check if the player has the adv quest
+ goto L_ExplainAdv;
+ if (QL_CELESTIA > 1) // the player finished a quest or both
+ goto L_ThankYou;
+ goto L_Intro; // if all checks fail go to L_Intro (first meeting)
+
+L_YetiMask:
+ mes "Celestia is clearly alarmed upon seeing you."; // send message to dialog window
+ next; // require the player to press the "next" button in the dialog window
+ mes "Before you have a chance to speak, she screams,"; // every use of "mes" creates a new line
+ mes "##B\"YETI IN MY HOUSE!\"##b"; // here we created a new line to add emphasis (and ##B to make bold)
+ mes "as she jumps back a few feet.";
+ next;
+ mes "You catch a glimpse of a black bow while some kind of dark mist quickly overcomes you.";
+ next;
+ mes "You feel a sharp pain in your heart and everything fades into darkness.";
+ heal -Hp, 0; // set the current hp to 0 (kill the player)
+ set @scared_celestia, 1; // set a temporary variable (resets on log out) in the player scope (variable is stored in the player, not in the npc)
+ close; // terminate the script and require the player to press the "close" button
+
+L_Intro:
+ mes "\"Hi, my name is Celestia.\"";
+ next;
+ mes "\"I used to be a great adventurer who's hunted thousands of yeti single-handedly, though, since I moved to Hurnscald I've been hosting tea parties instead.\"";
+ next;
+ goto L_MainMenu;
+
+L_MainMenu:
+ mes "\"Are you here for this afternoon's tea party?\"";
+ if (QL_CELESTIA == 1) // check if the player can do the easy quest
+ goto L_EasyQuestMenu; // go to a special menu that has one more option to start the easy quest
+ if (QL_CELESTIA == 4) // check if the player can do the quest
+ goto L_AdvQuestMenu; // go to a special menu that has one more option to start the adv quest
+ menu // else we just show a boring menu
+ "Party! Of course I came out for the party!", L_CameForParty,
+ "I'm sorry, life is much too serious for tea.", L_SrsBsns,
+ "(Walk away)", L_InstaClose;
+
+L_EasyQuestMenu:
+ menu // here we display a special menu
+ "Party! Of course I came out for the party!", L_CameForParty,
+ "I'm sorry, life is much too serious for tea.", L_SrsBsns,
+ "Is there anything that I can do to help?", L_OfferHelp, // <= this will start the first quest
+ "(Walk away)", L_InstaClose;
+
+L_AdvQuestMenu:
+ menu // here we display a special menu
+ "Party! Of course I came out for the party!", L_CameForParty,
+ "I'm sorry, life is much too serious for tea.", L_SrsBsns,
+ "I heard you were looking for help from experienced adventurers...", L_Scared, // <= this will start the adv quest
+ "(Walk away)", L_InstaClose;
+
+L_CameForParty:
+ mes "\"Wonderful, I am happy to have you over.";
+ mes "Lets get things started with some puerh tea.\"";
+ next;
+ mes "Celestia hands you a cup filled with some type of tea that is unlike anything you have seen before.";
+ mes "It has a very dark color and an unusual aroma reminiscent of a moist forest.";
+ next;
+ mes "For a moment you wonder if Celestia might have gotten confused and tossed in a handful of forest dirt into the teapot.";
+ mes "You ponder whether or not it would be wise to drink it.";
+ menu
+ "(Drink the tea, hoping for the best)", L_DrinkTea,
+ "Uh are you sure this is fit to drink?", L_QuestionTea;
+
+L_DrinkTea:
+ mes "To your pleasant surprise the tea is actually quite good.";
+ next;
+ mes "Despite its initial dubious fragrance, the tea comes off as very smooth and mellow with a bit of natural sweetness and a touch of an earthy forest like flavour, but in a very good way.";
+ next;
+ mes "Clearly an exotic tea, with a refined flavor fit for a refined woman such as Celestia.";
+ close;
+
+L_QuestionTea:
+ mes "\"Yes, did you really think I was some kind of monster that would try to poison you in my own house?\"";
+ mes "##a(it would be way too messy anyway)##0";
+ next;
+ mes "Celestia then picks up the cup of tea and drinks it in front of you to demonstrate that it is not only harmless but also quite delectable.";
+ close;
+
+L_SrsBsns:
+ mes "\"Have it your way.\"";
+ close;
+
+L_OfferHelp:
+ mes "\"Yes there is.\"";
+ next;
+ mes "\"I am a bit frustrated by the lack of a decent grocery store in Hurnscald, and there is only so much that I can get from Hinnak and Oscar.\"";
+ next;
+ mes "\"This poses a problem as the few items that I am not able to pick up locally are required for the tea parties that I host.\"";
+ next;
+ set QL_CELESTIA, 2; // set state to "got the easy quest"
+ goto L_ExplainEasy;
+
+L_ExplainEasy:
+ npcaction 9; // clear npc dialog to make room for the item list
+ mes "\"Please go out and find these items and I will make it more than worth your time and effort.\"";
+ mes; // send a blank line (line break)
+ mes " %%E 100 ["+ getitemlink("ChocolateBar") +"]"; // use getitemlink to display a click-able item link in the dialog
+ mes " %%E 50 ["+ getitemlink("GingerBreadMan") +"]";
+ next;
+ mes "\"I really hope you can find a reliable provider for these items before it forces me to put an end to my tea parties.\"";
+ if (countitem("ChocolateBar") >= 100 && countitem("GingerBreadMan") >= 50) // check if the player has the items
+ menu // if yes then allow the player to give them
+ "I have the grocery order of Chocolate Bars and Ginger Bread Men for you.", L_GiveGroceries,
+ "I will come back later.", L_InstaClose;
+ close;
+
+L_GiveGroceries:
+ mes "Celestia smiles.";
+ next;
+ mes "\"Wonderful, I am so glad you were able to track them down.";
+ mes "That will be enough to keep me in supply for some time.\"";
+ next;
+ mes "\"Here, take this Beret.";
+ mes "I hope it looks better on you than it does on me, as it does not go well with my fine dresses.\"";
+ next;
+ mes "Celestia also hands you a heavy pouch filled with gold pieces.";
+ mes;
+ mes "["+getitemlink("Beret")+"]";
+ mes "[20,000 GP]";
+ mes "[20,000 EXP]";
+ delitem "ChocolateBar", 100; // remove chocolate bars
+ delitem "GingerBreadMan", 50; // remove ginger bread men
+ getitem "Beret", 1; // give beret
+ getexp 20000, 0; // XXX is this amount reasonable?
+ set Zeny, Zeny + 10000; // XXX is this amount reasonable?
+ set QL_CELESTIA, 3; // set the state to "completed easy quest"
+ close;
+
+L_ThankYou:
+ mes "\"Welcome back %%1\"";
+ next;
+ goto L_MainMenu;
+
+L_Scared:
+ mes "Celestia takes a close look at you and seems to be satisfied.";
+ next;
+ mes "\"Wonderful, I am glad you came out.";
+ mes "I am really concerned about the growing yeti threat.";
+ mes "There simply does not seem to be enough yeti hunters out there to keep their population from growing.\"";
+ next;
+ mes "\"To the point that a few days ago a yeti somehow managed to get inside my house, and I have never heard of one moving this far south before.\"";
+ next;
+ menu
+ "A Yeti in your house, did you kill it?", L_YetiHouse,
+ "A Yeti in your house, are you alright?", L_YetiHouse;
+
+L_YetiHouse:
+ mes "Seemingly out of nowhere Celestia pulls a black bow and a fistful of arrows from her dress.";
+ mes "\"Don't worry about me, I am able to protect myself.";
+ mes "The real concern is the safety of the children of Hurnscald, as yeti tend to prefer children.\"";
+ next;
+ mes "\"It is scary to think about how many children that yeti could have run into before stumbling into my house to meet its doom.";
+ mes "If one yeti has already made it this far south it is only a matter of time before more will follow.\"";
+ next;
+ mes "\"What disturbs me the most is that Hurnscald is a favorite trading post for adventurers, yet none of them did anything when the yeti entered town.\"";
+ next;
+ mes "\"Since they are not concerned about keeping Hurnscald safe I am taking matters into my own hands and recruiting more yeti hunters.\"";
+ next;
+ set QL_CELESTIA, 5; // set state to "got advanced quest";
+ goto L_ExplainAdv;
+
+L_ExplainAdv:
+ mes "\"Please, for the sake of the children of Hurnscald go out and ##Bslay at least 200 yetis##b to help knock down their growing numbers.\"";
+ if (QL_CELESTIA == 205) // check if the player killed 200 yetis
+ menu
+ "I have returned from the great yeti hunt.", L_YetiComplete;
+ if (QL_CELESTIA > 5) // check if at least 1 yeti killed
+ menu
+ "About those yetis...", L_Encourage;
+ close;
+
+L_YetiComplete:
+ mes "\"You are my hero!\"";
+ next;
+ mes "\"Here, take it. This [@@677|family heirloom@@] has been passed from mother to daughter for countless generations now.\"";
+ next;
+ mes "\"It pains me to let it go, as it is the only remaining trinket of my late mother, but you have proven yourself worthy of it.\"";
+ next;
+ menu
+ "Thank you, I will cherish it dearly.", L_AcceptTrinket,
+ "This token is too important, you should keep it.", L_RefuseTrinket;
+
+L_AcceptTrinket:
+ mes "\"May our path cross again.\"";
+ mes;
+ mes "["+getitemlink("HeartNecklace")+"]";
+ getitem "HeartNecklace", 1;
+ set QL_CELESTIA, 206;
+ close;
+
+L_RefuseTrinket:
+ mes "\"Really?\"";
+ next;
+ mes "\"Please at least accept this humble payment for your trouble.\"";
+ next;
+ mes "\"May out path cross again.\"";
+ mes;
+ mes "[150,000 GP]";
+ set Zeny, Zeny + 150000;
+ set QL_CELESTIA, 206;
+ close;
+
+L_Encourage:
+ mes "\"You are doing great so far.";
+ mes "Keep it up and I know you will be able to make a difference in the growing Yeti threat.\"";
+ close;
+
+L_InstaClose:
+ close;
+
+
+
+////////////// BORING DEBUG STUFF BELOW ////////////////
+L_Debug:
+ npcaction 9;
+ mes "state: " + QL_CELESTIA;
+ mes "scared: " + @scared_celestia;
+ mes "---";
+ mes "000 can not do easy quest";
+ mes "001 can do easy quest";
+ mes "002 has gotten easy quest";
+ mes "003 completed easy quest";
+ mes "004 can do adv quest";
+ mes "005 got adv quest";
+ mes "006 killed 1 yeti";
+ mes "[...]";
+ mes "205 killed 200 yeti";
+ mes "206 got adv quest reward";
+ mes "---";
+ if (debug)
+ menu
+ "restart|reset quest", L_ResetState,
+ "toggle|toggle scared", L_ToggleScared,
+ // TODO set state to [...]
+ "edit|set state manually", L_SetState,
+ "close", L_InstaClose;
+ close;
+
+L_ToggleScared:
+ set @scared_celestia, !(@scared_celestia);
+ goto L_Debug;
+
+L_ResetState:
+ set QL_CELESTIA, 0;
+ set @scared_celestia, 0;
+ npcaction 5; // force close dialog
+ warp "009-1", 72, 48;
+ end;
+
+L_SetState:
+ input @cel_state;
+ if (@cel_state >= 0 && @cel_state < 256)
+ set QL_CELESTIA, @cel_state;
+ goto L_Debug;
+}
+
+function|script|CelestiaState
+{
+ if (BaseLevel >= 40 && QL_CELESTIA == 0) // if the player is at least level 40
+ set QL_CELESTIA, 1; // show the quest marker
+ if (BaseLevel >= 90 && QL_CELESTIA == 3 && @scared_celestia) // check if level >= 90, if scared celestia and if easy quest done
+ set QL_CELESTIA, 4; // show the quest marker for the secret advanced quest
+ return;
+}
+
+009-1,74,50,0|script|Celestia Door|32767,0,0
+{
+ warp "009-8", 26, 23;
+ callfunc "CelestiaState";
+ end;
+}
+009-1,72,54,0|script|Celestia BackDoor|32767,0,0
+{
+ warp "009-8", 23, 34;
+ callfunc "CelestiaState";
+ end;
+}
diff --git a/world/map/npc/009-8/mapflags.txt b/world/map/npc/009-8/mapflags.txt
new file mode 100644
index 00000000..2883b7a4
--- /dev/null
+++ b/world/map/npc/009-8/mapflags.txt
@@ -0,0 +1,2 @@
+009-8|mapflag|town
+009-8|mapflag|resave|009-2,149,43
diff --git a/world/map/npc/010-1/_import.txt b/world/map/npc/010-1/_import.txt
index 2bbe3df8..170881fa 100644
--- a/world/map/npc/010-1/_import.txt
+++ b/world/map/npc/010-1/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 010-1
npc: npc/010-1/_mobs.txt
+npc: npc/010-1/_nodes.txt
npc: npc/010-1/_warps.txt
npc: npc/010-1/mapflags.txt
diff --git a/world/map/npc/010-1/_mobs.txt b/world/map/npc/010-1/_mobs.txt
index d73c842f..cf0ebae5 100644
--- a/world/map/npc/010-1/_mobs.txt
+++ b/world/map/npc/010-1/_mobs.txt
@@ -1,82 +1,16 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Woodland mobs
-010-1,82,63,19,19|monster|Scorpion|1003,1,100000ms,30000ms,Mob010-1::On1003
-010-1,49,71,31,19|monster|SpikyMushroom|1019,1,100000ms,30000ms,Mob010-1::On1019
-010-1,0,0,0,0|monster|PinkFlower|1014,30,50ms,0ms,Mob010-1::On1014
-010-1,0,0,0,0|monster|Snail|1041,20,50ms,0ms,Mob010-1::On1041
-010-1,0,0,0,0|monster|SpikyMushroom|1019,45,50ms,0ms,Mob010-1::On1019
-010-1,0,0,0,0|monster|LogHead|1025,40,100ms,0ms,Mob010-1::On1025
-010-1,0,0,0,0|monster|Mouboo|1028,15,0ms,10ms,Mob010-1::On1028
-010-1,0,0,0,0|monster|MauvePlant|1029,3,270000ms,180000ms,Mob010-1::On1029
-010-1,0,0,0,0|monster|CobaltPlant|1030,1,2700000ms,1800000ms,Mob010-1::On1030
-010-1,0,0,0,0|monster|Silkworm|1035,2,60000ms,30000ms,Mob010-1::On1035
-010-1,0,0,0,0|monster|CloverPatch|1037,2,0ms,1000ms,Mob010-1::On1037
-010-1,0,0,0,0|monster|Squirrel|1038,25,30ms,20ms,Mob010-1::On1038
-010-1,0,0,0,0|monster|Butterfly|1055,10,30ms,20ms,Mob010-1::On1055
-
-
-010-1,0,0,0|script|Mob010-1|32767
-{
- end;
-
-On1003:
- set @mobID, 1003;
- callfunc "MobPoints";
- end;
-
-On1014:
- set @mobID, 1014;
- callfunc "MobPoints";
- end;
-
-On1019:
- set @mobID, 1019;
- callfunc "MobPoints";
- end;
-
-On1025:
- set @mobID, 1025;
- callfunc "MobPoints";
- end;
-
-On1028:
- set @mobID, 1028;
- callfunc "MobPoints";
- end;
-
-On1029:
- set @mobID, 1029;
- callfunc "MobPoints";
- end;
-
-On1030:
- set @mobID, 1030;
- callfunc "MobPoints";
- end;
-
-On1035:
- set @mobID, 1035;
- callfunc "MobPoints";
- end;
-
-On1037:
- set @mobID, 1037;
- callfunc "MobPoints";
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1041:
- set @mobID, 1041;
- callfunc "MobPoints";
- end;
-
-On1055:
- set @mobID, 1055;
- callfunc "MobPoints";
- end;
-}
+010-1,82,63,19,19|monster|Scorpion|1003,1,100000ms,30000ms
+010-1,49,71,31,19|monster|SpikyMushroom|1019,1,100000ms,30000ms
+010-1,0,0,0,0|monster|PinkFlower|1014,30,50ms,0ms
+010-1,0,0,0,0|monster|Snail|1041,20,50ms,0ms
+010-1,0,0,0,0|monster|SpikyMushroom|1019,45,50ms,0ms
+010-1,0,0,0,0|monster|LogHead|1025,40,100ms,0ms
+010-1,0,0,0,0|monster|Mouboo|1028,15,0ms,10ms
+010-1,0,0,0,0|monster|MauvePlant|1029,3,270000ms,180000ms
+010-1,0,0,0,0|monster|CobaltPlant|1030,1,2700000ms,1800000ms
+010-1,0,0,0,0|monster|Silkworm|1035,2,60000ms,30000ms
+010-1,0,0,0,0|monster|CloverPatch|1037,2,0ms,1000ms
+010-1,0,0,0,0|monster|Squirrel|1038,25,30ms,20ms
+010-1,0,0,0,0|monster|Butterfly|1055,10,30ms,20ms
diff --git a/world/map/npc/010-1/_nodes.txt b/world/map/npc/010-1/_nodes.txt
new file mode 100644
index 00000000..12c08221
--- /dev/null
+++ b/world/map/npc/010-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Woodland nodes
+
+// (no nodes)
diff --git a/world/map/npc/010-2/_import.txt b/world/map/npc/010-2/_import.txt
index 9c2b3065..7d790a1b 100644
--- a/world/map/npc/010-2/_import.txt
+++ b/world/map/npc/010-2/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 010-2
npc: npc/010-2/_mobs.txt
+npc: npc/010-2/_nodes.txt
npc: npc/010-2/_warps.txt
npc: npc/010-2/band.txt
npc: npc/010-2/chef.txt
diff --git a/world/map/npc/010-2/_mobs.txt b/world/map/npc/010-2/_mobs.txt
index 3b258bd5..5ae78616 100644
--- a/world/map/npc/010-2/_mobs.txt
+++ b/world/map/npc/010-2/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Dimond's Cove mobs
-
-
-010-2,0,0,0|script|Mob010-2|32767
-{
- end;
-}
diff --git a/world/map/npc/010-2/_nodes.txt b/world/map/npc/010-2/_nodes.txt
new file mode 100644
index 00000000..97d1478f
--- /dev/null
+++ b/world/map/npc/010-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Dimond's Cove nodes
+
+// (no nodes)
diff --git a/world/map/npc/011-1/_import.txt b/world/map/npc/011-1/_import.txt
index 13faf23a..161caeb4 100644
--- a/world/map/npc/011-1/_import.txt
+++ b/world/map/npc/011-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 011-1
npc: npc/011-1/_mobs.txt
+npc: npc/011-1/_nodes.txt
npc: npc/011-1/_warps.txt
npc: npc/011-1/alchemist.txt
npc: npc/011-1/auldsbel.txt
diff --git a/world/map/npc/011-1/_mobs.txt b/world/map/npc/011-1/_mobs.txt
index 3a0c0ce3..596c7194 100644
--- a/world/map/npc/011-1/_mobs.txt
+++ b/world/map/npc/011-1/_mobs.txt
@@ -1,88 +1,17 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Woodland mobs
-011-1,0,0,0,0|monster|EvilMushroom|1013,30,0ms,0ms,Mob011-1::On1013
-011-1,0,0,0,0|monster|PinkFlower|1014,20,0ms,0ms,Mob011-1::On1014
-011-1,0,0,0,0|monster|SpikyMushroom|1019,5,0ms,0ms,Mob011-1::On1019
-011-1,0,0,0,0|monster|Snail|1041,1,0ms,0ms,Mob011-1::On1041
-011-1,0,0,0,0|monster|Mouboo|1028,5,0ms,10ms,Mob011-1::On1028
-011-1,0,0,0,0|monster|MauvePlant|1029,3,270000ms,180000ms,Mob011-1::On1029
-011-1,0,0,0,0|monster|AlizarinPlant|1032,1,2700000ms,1800000ms,Mob011-1::On1032
-011-1,0,0,0,0|monster|Silkworm|1035,2,60000ms,30000ms,Mob011-1::On1035
-011-1,0,0,0,0|monster|CloverPatch|1037,2,0ms,1000ms,Mob011-1::On1037
-011-1,0,0,0,0|monster|Squirrel|1038,25,30ms,20ms,Mob011-1::On1038
-011-1,0,0,0,0|monster|Butterfly|1055,10,30ms,20ms,Mob011-1::On1055
-011-1,0,0,0,0|monster|Mouboo|1028,5,0ms,10ms,Mob011-1::On1028
-011-1,1,1,0,0|monster|ManaBug|1131,18,30ms,0ms,Mob011-1::On1131
-011-1,92,44,35,28|monster|Maggot|1002,10,30ms,0ms,Mob011-1::On1002
-
-
-011-1,0,0,0|script|Mob011-1|32767
-{
- end;
-
-On1002:
- set @mobID, 1002;
- callfunc "MobPoints";
- end;
-
-On1013:
- set @mobID, 1013;
- callfunc "MobPoints";
- end;
-
-On1014:
- set @mobID, 1014;
- callfunc "MobPoints";
- end;
-
-On1019:
- set @mobID, 1019;
- callfunc "MobPoints";
- end;
-
-On1028:
- set @mobID, 1028;
- callfunc "MobPoints";
- end;
-
-On1029:
- set @mobID, 1029;
- callfunc "MobPoints";
- end;
-
-On1032:
- set @mobID, 1032;
- callfunc "MobPoints";
- end;
-
-On1035:
- set @mobID, 1035;
- callfunc "MobPoints";
- end;
-
-On1037:
- set @mobID, 1037;
- callfunc "MobPoints";
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1041:
- set @mobID, 1041;
- callfunc "MobPoints";
- end;
-
-On1055:
- set @mobID, 1055;
- callfunc "MobPoints";
- end;
-
-On1131:
- set @mobID, 1131;
- callfunc "MobPoints";
- end;
-}
+011-1,0,0,0,0|monster|EvilMushroom|1013,30,0ms,0ms
+011-1,0,0,0,0|monster|PinkFlower|1014,20,0ms,0ms
+011-1,0,0,0,0|monster|SpikyMushroom|1019,5,0ms,0ms
+011-1,0,0,0,0|monster|Snail|1041,1,0ms,0ms
+011-1,0,0,0,0|monster|Mouboo|1028,5,0ms,10ms
+011-1,0,0,0,0|monster|MauvePlant|1029,3,270000ms,180000ms
+011-1,0,0,0,0|monster|AlizarinPlant|1032,1,2700000ms,1800000ms
+011-1,0,0,0,0|monster|Silkworm|1035,2,60000ms,30000ms
+011-1,0,0,0,0|monster|CloverPatch|1037,2,0ms,1000ms
+011-1,0,0,0,0|monster|Squirrel|1038,25,30ms,20ms
+011-1,0,0,0,0|monster|Butterfly|1055,10,30ms,20ms
+011-1,0,0,0,0|monster|Mouboo|1028,5,0ms,10ms
+011-1,1,1,0,0|monster|ManaBug|1131,18,30ms,0ms
+011-1,92,44,35,28|monster|Maggot|1002,10,30ms,0ms
diff --git a/world/map/npc/011-1/_nodes.txt b/world/map/npc/011-1/_nodes.txt
new file mode 100644
index 00000000..12c08221
--- /dev/null
+++ b/world/map/npc/011-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Woodland nodes
+
+// (no nodes)
diff --git a/world/map/npc/011-1/auldsbel.txt b/world/map/npc/011-1/auldsbel.txt
index 094651e9..f4c328ce 100644
--- a/world/map/npc/011-1/auldsbel.txt
+++ b/world/map/npc/011-1/auldsbel.txt
@@ -236,7 +236,7 @@ L_Sul_t_s:
mes "\"Very well, then. You have been quite helpful with my experiments, after all. As you may have noticed, the spell takes a pile of volcanic ashes. Close your hands around it, then whisper the invocation.\"";
next;
mes "[Auldsbel the Wizard]";
- mes "\"That invocation is '" + getspellinvocation("make-sulphur") + "'.\"";
+ mes "\"That invocation is '" + get(.invocation$, "make-sulphur") + "'.\"";
next;
mes "[Auldsbel the Wizard]";
mes "\"You may find that you can transmute the powder more effectively after a while; that is perfectly natural.\"";
@@ -332,7 +332,7 @@ L_about_nature:
L_about_other_spells:
mes "[Auldsbel the Wizard]";
- mes "\"A few spells are not claimed by any particular school of magic. In practice, this means that anyone can cast them if they just have sufficient magical power. The most prominent example is the 'detect magic' spell, '" + getspellinvocation("detect-magic") + "'.\"";
+ mes "\"A few spells are not claimed by any particular school of magic. In practice, this means that anyone can cast them if they just have sufficient magical power. The most prominent example is the 'detect magic' spell, '" + get(.invocation$, "detect-magic") + "'.\"";
next;
goto L_a_s_minimenu;
@@ -984,10 +984,10 @@ L_learn_spell:
mes "\"This spell is a simple transmutation invocation. All it takes is a clean wooden log. Hold it in your hand, focus your powers, and say the magic invocation.\"";
next;
mes "[Auldsbel the Wizard]";
- mes "\"You can turn the log into a wooden figurine by imagining the creature whose shape you want in your head and saying `" + getspellinvocation("transmute-wood-to-figurine") + ",' followed by the last syllable of the name of the creature you want to shape it into.\"";
+ mes "\"You can turn the log into a wooden figurine by imagining the creature whose shape you want in your head and saying `" + get(.invocation$, "spell-transmute-wood") + ",' followed by the last syllable of the name of the creature you want to shape it into.\"";
next;
mes "[Auldsbel the Wizard]";
- mes "\"So `" + getspellinvocation("transmute-wood-to-figurine") + " lurk' for a Skytlurk figurine, for example. If you know what a Skytlurk is, I mean, otherwise you will have a hard time imagining it. You may want to try some others instead, though.\"";
+ mes "\"So `" + get(.invocation$, "spell-transmute-wood") + " lurk' for a Skytlurk figurine, for example. If you know what a Skytlurk is, I mean, otherwise you will have a hard time imagining it. You may want to try some others instead, though.\"";
next;
mes "[Auldsbel the Wizard]";
mes "\"Oh... and it has to be the old Tritan name. Most creatures nowadays have very different names, but some old Tritan names have survived. Just try some, until you find one that fits.\"";
@@ -1001,7 +1001,7 @@ L_learn_spell:
L_repeat_spell:
mes "[Auldsbel the Wizard]";
- mes "\"The invocation is `" + getspellinvocation("transmute-wood-to-figurine") + ",' followed by the last syllable of the name of the creature you want to shape the log into. So `" + getspellinvocation("transmute-wood-to-figurine") + " lurk' for a Skytlurk figurine.\"";
+ mes "\"The invocation is `" + get(.invocation$, "spell-transmute-wood") + ",' followed by the last syllable of the name of the creature you want to shape the log into. So `" + get(.invocation$, "spell-transmute-wood") + " lurk' for a Skytlurk figurine.\"";
next;
mes "[Auldsbel the Wizard]";
mes "\"But keep two things in mind: First, you must KNOW what the creature looks like – so a Skytlurk probably won't work – and second, you must use the old Tritan name of it. `Fluffy' and `Scorpion' are modern names, so those won't work, you should try some others.\"";
@@ -1092,7 +1092,7 @@ L_Next9:
mes "[1000 experience points]";
next;
mes "[Auldsbel the Wizard]";
- mes "\"Now, listen carefully: to make a short tank top out of three pieces of cloth, you must use the invocation '" + getspellinvocation("make-short-tanktop") + "'.\"";
+ mes "\"Now, listen carefully: to make a short tank top out of three pieces of cloth, you must use the invocation '" + get(.invocation$, "make-short-tanktop") + "'.\"";
next;
mes "[Auldsbel the Wizard]";
mes "\"But be careful; transmutations can go wrong, and that can injure you. When you have more overall spellcasting practice, come back to me.\"";
@@ -1131,7 +1131,7 @@ L_Next10:
mes "[1000 experience points]";
next;
mes "[Auldsbel the Wizard]";
- mes "\"The next spell I have will make a normal tank top out of four pieces of cloth. The invocation is '" + getspellinvocation("make-tanktop") + "', make sure to write this down.\"";
+ mes "\"The next spell I have will make a normal tank top out of four pieces of cloth. The invocation is '" + get(.invocation$, "make-tanktop") + "', make sure to write this down.\"";
next;
goto L_main_menu;
@@ -1161,7 +1161,7 @@ L_Next11:
mes "[1000 experience points]";
next;
mes "[Auldsbel the Wizard]";
- mes "\"To make a shirt, use the invocation '" + getspellinvocation("make-shirt") + "'. This will require five pieces of cloth.\"";
+ mes "\"To make a shirt, use the invocation '" + get(.invocation$, "make-shirt") + "'. This will require five pieces of cloth.\"";
next;
goto L_main_menu;
@@ -1191,7 +1191,7 @@ L_Next12:
mes "[1000 experience points]";
next;
mes "[Auldsbel the Wizard]";
- mes "\"This spell makes arrows out of a single wooden log. Its invocation is '" + getspellinvocation("make-arrows") + "'.\"";
+ mes "\"This spell makes arrows out of a single wooden log. Its invocation is '" + get(.invocation$, "make-arrows") + "'.\"";
next;
goto L_main_menu;
@@ -1205,7 +1205,7 @@ L_stu_3:
L_stu_3_repeat:
mes "[Auldsbel the Wizard]";
- mes "\"This one has the invocation `" + getspellinvocation("make-concentration-potion") + "'. Put two cobalt leaves and two pink flower petals into a bottle of water, hold it up, and speak that phrase.\"";
+ mes "\"This one has the invocation `" + get(.invocation$, "make-concentration-potion") + "'. Put two cobalt leaves and two pink flower petals into a bottle of water, hold it up, and speak that phrase.\"";
next;
mes "[Auldsbel the Wizard]";
mes "\"It is a tricky spell, but if it works out, you will transform the bottle into a concentration potion.\"";
diff --git a/world/map/npc/011-3/_import.txt b/world/map/npc/011-3/_import.txt
index f916fcb2..d8dd3777 100644
--- a/world/map/npc/011-3/_import.txt
+++ b/world/map/npc/011-3/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 011-3
npc: npc/011-3/_mobs.txt
+npc: npc/011-3/_nodes.txt
npc: npc/011-3/_warps.txt
npc: npc/011-3/hermit.txt
npc: npc/011-3/mapflags.txt
diff --git a/world/map/npc/011-3/_mobs.txt b/world/map/npc/011-3/_mobs.txt
index 4e4a504e..f90961fb 100644
--- a/world/map/npc/011-3/_mobs.txt
+++ b/world/map/npc/011-3/_mobs.txt
@@ -1,21 +1,5 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Hermit's Cave mobs
-011-3,0,0,0,0|monster|Bat|1017,10,0ms,0ms,Mob011-3::On1017
-011-3,0,0,0,0|monster|Silkworm|1035,3,60000ms,30000ms,Mob011-3::On1035
-
-
-011-3,0,0,0|script|Mob011-3|32767
-{
- end;
-
-On1017:
- set @mobID, 1017;
- callfunc "MobPoints";
- end;
-
-On1035:
- set @mobID, 1035;
- callfunc "MobPoints";
- end;
-}
+011-3,0,0,0,0|monster|Bat|1017,10,0ms,0ms
+011-3,0,0,0,0|monster|Silkworm|1035,3,60000ms,30000ms
diff --git a/world/map/npc/011-3/_nodes.txt b/world/map/npc/011-3/_nodes.txt
new file mode 100644
index 00000000..d9dd7661
--- /dev/null
+++ b/world/map/npc/011-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Hermit's Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/011-4/_import.txt b/world/map/npc/011-4/_import.txt
index b7b835e1..1b654a65 100644
--- a/world/map/npc/011-4/_import.txt
+++ b/world/map/npc/011-4/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 011-4
npc: npc/011-4/_mobs.txt
+npc: npc/011-4/_nodes.txt
npc: npc/011-4/_warps.txt
npc: npc/011-4/bl_barrier.txt
npc: npc/011-4/mapflags.txt
diff --git a/world/map/npc/011-4/_mobs.txt b/world/map/npc/011-4/_mobs.txt
index 81da8edc..92d32ddf 100644
--- a/world/map/npc/011-4/_mobs.txt
+++ b/world/map/npc/011-4/_mobs.txt
@@ -1,36 +1,10 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Lake Cave mobs
-011-4,52,30,39,39|monster|SpikyMushroom|1019,1,100000ms,30000ms,Mob011-4::On1019
-011-4,93,114,39,39|monster|CaveSnake|1021,1,100000ms,30000ms,Mob011-4::On1021
-011-4,0,0,0,0|monster|CaveSnake|1021,40,0ms,0ms,Mob011-4::On1021
-011-4,0,0,0,0|monster|SpikyMushroom|1019,15,0ms,0ms,Mob011-4::On1019
-011-4,60,78,56,75|monster|CaveMaggot|1056,10,100000ms,30000ms,Mob011-4::On1056
-011-4,63,21,110,35|monster|CaveMaggot|1056,10,100000ms,30000ms,Mob011-4::On1056
-011-4,0,0,0,0|monster|Bat|1017,20,180000ms,40000ms,Mob011-4::On1017
-
-
-011-4,0,0,0|script|Mob011-4|32767
-{
- end;
-
-On1017:
- set @mobID, 1017;
- callfunc "MobPoints";
- end;
-
-On1019:
- set @mobID, 1019;
- callfunc "MobPoints";
- end;
-
-On1021:
- set @mobID, 1021;
- callfunc "MobPoints";
- end;
-
-On1056:
- set @mobID, 1056;
- callfunc "MobPoints";
- end;
-}
+011-4,52,30,39,39|monster|SpikyMushroom|1019,1,100000ms,30000ms
+011-4,93,114,39,39|monster|CaveSnake|1021,1,100000ms,30000ms
+011-4,0,0,0,0|monster|CaveSnake|1021,40,0ms,0ms
+011-4,0,0,0,0|monster|SpikyMushroom|1019,15,0ms,0ms
+011-4,60,78,56,75|monster|CaveMaggot|1056,10,100000ms,30000ms
+011-4,63,21,110,35|monster|CaveMaggot|1056,10,100000ms,30000ms
+011-4,0,0,0,0|monster|Bat|1017,20,180000ms,40000ms
diff --git a/world/map/npc/011-4/_nodes.txt b/world/map/npc/011-4/_nodes.txt
new file mode 100644
index 00000000..d439cbc5
--- /dev/null
+++ b/world/map/npc/011-4/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Lake Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/011-6/_import.txt b/world/map/npc/011-6/_import.txt
index 34a781ad..216402e5 100644
--- a/world/map/npc/011-6/_import.txt
+++ b/world/map/npc/011-6/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 011-6
npc: npc/011-6/_mobs.txt
+npc: npc/011-6/_nodes.txt
npc: npc/011-6/_warps.txt
npc: npc/011-6/barrier.txt
npc: npc/011-6/bryant.txt
diff --git a/world/map/npc/011-6/_mobs.txt b/world/map/npc/011-6/_mobs.txt
index 4ba7f2ee..6a6ea09d 100644
--- a/world/map/npc/011-6/_mobs.txt
+++ b/world/map/npc/011-6/_mobs.txt
@@ -1,96 +1,50 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Bandit Cave mobs
-011-6,152,72,283,127|monster|Silkworm|1035,9,30000ms,100000ms,Mob011-6::On1035
-011-6,263,38,30,34|monster|Bandit|1064,1,30000ms,30000ms,Mob011-6::On1064
-011-6,262,114,38,38|monster|Bandit|1064,1,30000ms,30000ms,Mob011-6::On1064
-011-6,132,119,17,21|monster|Bandit|1064,1,30000ms,30000ms,Mob011-6::On1064
-011-6,170,66,17,21|monster|Bandit|1064,1,30000ms,30000ms,Mob011-6::On1064
-011-6,67,70,17,21|monster|Bandit|1064,1,30000ms,30000ms,Mob011-6::On1064
-011-6,196,107,17,21|monster|Bandit|1064,1,30000ms,30000ms,Mob011-6::On1064
-011-6,196,29,17,21|monster|Bandit|1064,1,30000ms,30000ms,Mob011-6::On1064
-011-6,36,37,17,21|monster|Bandit|1064,1,30000ms,30000ms,Mob011-6::On1064
-011-6,112,40,45,48|monster|Bandit|1064,2,30000ms,60000ms,Mob011-6::On1064
-011-6,31,99,17,21|monster|Bandit|1064,1,30000ms,30000ms,Mob011-6::On1064
-011-6,223,250,123,65|monster|Bat|1017,5,30000ms,100000ms,Mob011-6::On1017
-011-6,224,175,118,25|monster|Bat|1017,3,30000ms,100000ms,Mob011-6::On1017
-011-6,257,77,4,126|monster|Bat|1017,6,30000ms,100000ms,Mob011-6::On1017
-011-6,192,77,4,126|monster|Bat|1017,9,30000ms,100000ms,Mob011-6::On1017
-011-6,167,110,87,13|monster|Bat|1017,9,30000ms,100000ms,Mob011-6::On1017
-011-6,75,70,104,96|monster|Bat|1017,23,30000ms,100000ms,Mob011-6::On1017
-011-6,78,195,129,97|monster|Bat|1017,9,30000ms,100000ms,Mob011-6::On1017
-011-6,168,109,36,37|monster|SpikyMushroom|1019,5,30000ms,100000ms,Mob011-6::On1019
-011-6,199,76,36,37|monster|SpikyMushroom|1019,5,30000ms,100000ms,Mob011-6::On1019
-011-6,88,163,29,27|monster|SpikyMushroom|1019,5,30000ms,100000ms,Mob011-6::On1019
-011-6,48,113,35,19|monster|SpikyMushroom|1019,5,30000ms,100000ms,Mob011-6::On1019
-011-6,177,94,20,28|monster|EvilMushroom|1013,4,30000ms,100000ms,Mob011-6::On1013
-011-6,194,49,20,28|monster|EvilMushroom|1013,2,30000ms,100000ms,Mob011-6::On1013
-011-6,51,115,47,24|monster|EvilMushroom|1013,2,30000ms,100000ms,Mob011-6::On1013
-011-6,63,169,13,17|monster|EvilMushroom|1013,2,30000ms,100000ms,Mob011-6::On1013
-011-6,100,226,29,14|monster|SpikyMushroom|1019,3,30000ms,100000ms,Mob011-6::On1019
-011-6,260,44,53,16|monster|SpikyMushroom|1019,3,30000ms,100000ms,Mob011-6::On1019
-011-6,272,48,21,28|monster|EvilMushroom|1013,2,30000ms,100000ms,Mob011-6::On1013
-011-6,95,78,31,25|monster|YellowSlime|1007,5,30000ms,100000ms,Mob011-6::On1007
-011-6,59,36,19,25|monster|YellowSlime|1007,5,30000ms,100000ms,Mob011-6::On1007
-011-6,26,69,19,25|monster|YellowSlime|1007,5,30000ms,100000ms,Mob011-6::On1007
-011-6,61,101,14,10|monster|YellowSlime|1007,3,30000ms,100000ms,Mob011-6::On1007
-011-6,50,61,9,12|monster|YellowSlime|1007,3,30000ms,100000ms,Mob011-6::On1007
-011-6,128,39,9,12|monster|YellowSlime|1007,3,30000ms,100000ms,Mob011-6::On1007
-011-6,41,178,9,12|monster|YellowSlime|1007,1,30000ms,100000ms,Mob011-6::On1007
-011-6,70,229,9,12|monster|YellowSlime|1007,1,30000ms,100000ms,Mob011-6::On1007
-011-6,20,204,9,12|monster|YellowSlime|1007,1,30000ms,100000ms,Mob011-6::On1007
-011-6,114,190,9,12|monster|YellowSlime|1007,4,30000ms,100000ms,Mob011-6::On1007
-011-6,137,205,9,12|monster|YellowSlime|1007,2,30000ms,100000ms,Mob011-6::On1007
-011-6,79,220,29,14|monster|CaveSnake|1021,3,30000ms,100000ms,Mob011-6::On1021
-011-6,115,210,29,14|monster|CaveSnake|1021,3,30000ms,100000ms,Mob011-6::On1021
-011-6,41,193,31,31|monster|CaveSnake|1021,3,30000ms,100000ms,Mob011-6::On1021
-011-6,70,143,31,31|monster|CaveSnake|1021,3,30000ms,100000ms,Mob011-6::On1021
-011-6,97,183,29,14|monster|CaveSnake|1021,3,30000ms,100000ms,Mob011-6::On1021
-011-6,172,252,9,12|monster|CaveMaggot|1056,4,30000ms,100000ms,Mob011-6::On1056
-011-6,263,236,16,5|monster|CaveMaggot|1056,3,30000ms,100000ms,Mob011-6::On1056
-
-
-011-6,0,0,0|script|Mob011-6|32767
-{
- end;
-
-On1007:
- set @mobID, 1007;
- callfunc "MobPoints";
- end;
-
-On1013:
- set @mobID, 1013;
- callfunc "MobPoints";
- end;
-
-On1017:
- set @mobID, 1017;
- callfunc "MobPoints";
- end;
-
-On1019:
- set @mobID, 1019;
- callfunc "MobPoints";
- end;
-
-On1021:
- set @mobID, 1021;
- callfunc "MobPoints";
- end;
-
-On1035:
- set @mobID, 1035;
- callfunc "MobPoints";
- end;
-
-On1056:
- set @mobID, 1056;
- callfunc "MobPoints";
- end;
-
-On1064:
- set @mobID, 1064;
- callfunc "MobPoints";
- end;
-}
+011-6,152,72,283,127|monster|Silkworm|1035,9,30000ms,100000ms
+011-6,263,38,30,34|monster|Bandit|1064,1,30000ms,30000ms
+011-6,262,114,38,38|monster|Bandit|1064,1,30000ms,30000ms
+011-6,132,119,17,21|monster|Bandit|1064,1,30000ms,30000ms
+011-6,170,66,17,21|monster|Bandit|1064,1,30000ms,30000ms
+011-6,67,70,17,21|monster|Bandit|1064,1,30000ms,30000ms
+011-6,196,107,17,21|monster|Bandit|1064,1,30000ms,30000ms
+011-6,196,29,17,21|monster|Bandit|1064,1,30000ms,30000ms
+011-6,36,37,17,21|monster|Bandit|1064,1,30000ms,30000ms
+011-6,112,40,45,48|monster|Bandit|1064,2,30000ms,60000ms
+011-6,31,99,17,21|monster|Bandit|1064,1,30000ms,30000ms
+011-6,223,250,123,65|monster|Bat|1017,5,30000ms,100000ms
+011-6,224,175,118,25|monster|Bat|1017,3,30000ms,100000ms
+011-6,257,77,4,126|monster|Bat|1017,6,30000ms,100000ms
+011-6,192,77,4,126|monster|Bat|1017,9,30000ms,100000ms
+011-6,167,110,87,13|monster|Bat|1017,9,30000ms,100000ms
+011-6,75,70,104,96|monster|Bat|1017,23,30000ms,100000ms
+011-6,78,195,129,97|monster|Bat|1017,9,30000ms,100000ms
+011-6,168,109,36,37|monster|SpikyMushroom|1019,5,30000ms,100000ms
+011-6,199,76,36,37|monster|SpikyMushroom|1019,5,30000ms,100000ms
+011-6,88,163,29,27|monster|SpikyMushroom|1019,5,30000ms,100000ms
+011-6,48,113,35,19|monster|SpikyMushroom|1019,5,30000ms,100000ms
+011-6,177,94,20,28|monster|EvilMushroom|1013,4,30000ms,100000ms
+011-6,194,49,20,28|monster|EvilMushroom|1013,2,30000ms,100000ms
+011-6,51,115,47,24|monster|EvilMushroom|1013,2,30000ms,100000ms
+011-6,63,169,13,17|monster|EvilMushroom|1013,2,30000ms,100000ms
+011-6,100,226,29,14|monster|SpikyMushroom|1019,3,30000ms,100000ms
+011-6,260,44,53,16|monster|SpikyMushroom|1019,3,30000ms,100000ms
+011-6,272,48,21,28|monster|EvilMushroom|1013,2,30000ms,100000ms
+011-6,95,78,31,25|monster|YellowSlime|1007,5,30000ms,100000ms
+011-6,59,36,19,25|monster|YellowSlime|1007,5,30000ms,100000ms
+011-6,26,69,19,25|monster|YellowSlime|1007,5,30000ms,100000ms
+011-6,61,101,14,10|monster|YellowSlime|1007,3,30000ms,100000ms
+011-6,50,61,9,12|monster|YellowSlime|1007,3,30000ms,100000ms
+011-6,128,39,9,12|monster|YellowSlime|1007,3,30000ms,100000ms
+011-6,41,178,9,12|monster|YellowSlime|1007,1,30000ms,100000ms
+011-6,70,229,9,12|monster|YellowSlime|1007,1,30000ms,100000ms
+011-6,20,204,9,12|monster|YellowSlime|1007,1,30000ms,100000ms
+011-6,114,190,9,12|monster|YellowSlime|1007,4,30000ms,100000ms
+011-6,137,205,9,12|monster|YellowSlime|1007,2,30000ms,100000ms
+011-6,79,220,29,14|monster|CaveSnake|1021,3,30000ms,100000ms
+011-6,115,210,29,14|monster|CaveSnake|1021,3,30000ms,100000ms
+011-6,41,193,31,31|monster|CaveSnake|1021,3,30000ms,100000ms
+011-6,70,143,31,31|monster|CaveSnake|1021,3,30000ms,100000ms
+011-6,97,183,29,14|monster|CaveSnake|1021,3,30000ms,100000ms
+011-6,172,252,9,12|monster|CaveMaggot|1056,4,30000ms,100000ms
+011-6,263,236,16,5|monster|CaveMaggot|1056,3,30000ms,100000ms
diff --git a/world/map/npc/011-6/_nodes.txt b/world/map/npc/011-6/_nodes.txt
new file mode 100644
index 00000000..7a5c6a33
--- /dev/null
+++ b/world/map/npc/011-6/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Bandit Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/012-1/_import.txt b/world/map/npc/012-1/_import.txt
index 0a7ff68b..4ce6c34d 100644
--- a/world/map/npc/012-1/_import.txt
+++ b/world/map/npc/012-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 012-1
npc: npc/012-1/_mobs.txt
+npc: npc/012-1/_nodes.txt
npc: npc/012-1/_warps.txt
npc: npc/012-1/amrak.txt
npc: npc/012-1/flowerpentagram2.txt
diff --git a/world/map/npc/012-1/_mobs.txt b/world/map/npc/012-1/_mobs.txt
index cdcc8730..4f85e2ff 100644
--- a/world/map/npc/012-1/_mobs.txt
+++ b/world/map/npc/012-1/_mobs.txt
@@ -1,75 +1,14 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Woodland Hills mobs
-012-1,0,0,0,0|monster|PinkFlower|1014,13,0ms,100ms,Mob012-1::On1014
-012-1,0,0,0,0|monster|SpikyMushroom|1019,25,0ms,10ms,Mob012-1::On1019
-012-1,0,0,0,0|monster|Mouboo|1028,20,0ms,10ms,Mob012-1::On1028
-012-1,0,0,0,0|monster|MauvePlant|1029,5,2700000ms,1800000ms,Mob012-1::On1029
-012-1,0,0,0,0|monster|CobaltPlant|1030,2,2700000ms,1800000ms,Mob012-1::On1030
-012-1,0,0,0,0|monster|GambogePlant|1031,2,2700000ms,1800000ms,Mob012-1::On1031
-012-1,0,0,0,0|monster|AlizarinPlant|1032,2,2700000ms,1800000ms,Mob012-1::On1032
-012-1,0,0,0,0|monster|Silkworm|1035,5,60000ms,30000ms,Mob012-1::On1035
-012-1,0,0,0,0|monster|CloverPatch|1037,2,0ms,1000ms,Mob012-1::On1037
-012-1,0,0,0,0|monster|Squirrel|1038,25,30ms,20ms,Mob012-1::On1038
-012-1,0,0,0,0|monster|Butterfly|1055,20,30ms,20ms,Mob012-1::On1055
-
-
-012-1,0,0,0|script|Mob012-1|32767
-{
- end;
-
-On1014:
- set @mobID, 1014;
- callfunc "MobPoints";
- end;
-
-On1019:
- set @mobID, 1019;
- callfunc "MobPoints";
- end;
-
-On1028:
- set @mobID, 1028;
- callfunc "MobPoints";
- end;
-
-On1029:
- set @mobID, 1029;
- callfunc "MobPoints";
- end;
-
-On1030:
- set @mobID, 1030;
- callfunc "MobPoints";
- end;
-
-On1031:
- set @mobID, 1031;
- callfunc "MobPoints";
- end;
-
-On1032:
- set @mobID, 1032;
- callfunc "MobPoints";
- end;
-
-On1035:
- set @mobID, 1035;
- callfunc "MobPoints";
- end;
-
-On1037:
- set @mobID, 1037;
- callfunc "MobPoints";
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1055:
- set @mobID, 1055;
- callfunc "MobPoints";
- end;
-}
+012-1,0,0,0,0|monster|PinkFlower|1014,13,0ms,100ms
+012-1,0,0,0,0|monster|SpikyMushroom|1019,25,0ms,10ms
+012-1,0,0,0,0|monster|Mouboo|1028,20,0ms,10ms
+012-1,0,0,0,0|monster|MauvePlant|1029,5,2700000ms,1800000ms
+012-1,0,0,0,0|monster|CobaltPlant|1030,2,2700000ms,1800000ms
+012-1,0,0,0,0|monster|GambogePlant|1031,2,2700000ms,1800000ms
+012-1,0,0,0,0|monster|AlizarinPlant|1032,2,2700000ms,1800000ms
+012-1,0,0,0,0|monster|Silkworm|1035,5,60000ms,30000ms
+012-1,0,0,0,0|monster|CloverPatch|1037,2,0ms,1000ms
+012-1,0,0,0,0|monster|Squirrel|1038,25,30ms,20ms
+012-1,0,0,0,0|monster|Butterfly|1055,20,30ms,20ms
diff --git a/world/map/npc/012-1/_nodes.txt b/world/map/npc/012-1/_nodes.txt
new file mode 100644
index 00000000..13ee4f92
--- /dev/null
+++ b/world/map/npc/012-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Woodland Hills nodes
+
+// (no nodes)
diff --git a/world/map/npc/012-3/_import.txt b/world/map/npc/012-3/_import.txt
index 2f9275c8..82b77be8 100644
--- a/world/map/npc/012-3/_import.txt
+++ b/world/map/npc/012-3/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 012-3
npc: npc/012-3/_mobs.txt
+npc: npc/012-3/_nodes.txt
npc: npc/012-3/_warps.txt
npc: npc/012-3/mana-seed.txt
npc: npc/012-3/mapflags.txt
diff --git a/world/map/npc/012-3/_mobs.txt b/world/map/npc/012-3/_mobs.txt
index 354fc289..e9314763 100644
--- a/world/map/npc/012-3/_mobs.txt
+++ b/world/map/npc/012-3/_mobs.txt
@@ -1,40 +1,19 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Moggun Cave mobs
-012-3,448,65,18,7|monster|Moggun|1061,5,100000ms,30000ms,Mob012-3::On1061
-012-3,442,45,18,7|monster|Moggun|1061,5,100000ms,30000ms,Mob012-3::On1061
-012-3,412,31,18,7|monster|Moggun|1061,5,100000ms,30000ms,Mob012-3::On1061
-012-3,347,39,8,16|monster|Moggun|1061,5,100000ms,30000ms,Mob012-3::On1061
-012-3,363,101,17,18|monster|Moggun|1061,10,100000ms,30000ms,Mob012-3::On1061
-012-3,446,81,18,7|monster|Moggun|1061,5,100000ms,30000ms,Mob012-3::On1061
-012-3,388,138,17,7|monster|Moggun|1061,5,100000ms,30000ms,Mob012-3::On1061
-012-3,409,78,8,17|monster|Moggun|1061,5,100000ms,30000ms,Mob012-3::On1061
-012-3,382,152,17,7|monster|Moggun|1061,5,100000ms,30000ms,Mob012-3::On1061
-012-3,430,117,8,16|monster|Moggun|1061,5,100000ms,30000ms,Mob012-3::On1061
-012-3,330,100,8,16|monster|Moggun|1061,5,100000ms,30000ms,Mob012-3::On1061
-012-3,269,138,17,18|monster|Moggun|1061,10,100000ms,30000ms,Mob012-3::On1061
-012-3,188,52,17,18|monster|Moggun|1061,10,100000ms,30000ms,Mob012-3::On1061
-012-3,165,106,17,18|monster|Moggun|1061,10,100000ms,30000ms,Mob012-3::On1061
-012-3,0,0,0,0|monster|Bat|1017,100,0ms,0ms,Mob012-3::On1017
-012-3,0,0,0,0|monster|CaveSnake|1021,75,0ms,0ms,Mob012-3::On1021
-
-
-012-3,0,0,0|script|Mob012-3|32767
-{
- end;
-
-On1017:
- set @mobID, 1017;
- callfunc "MobPoints";
- end;
-
-On1021:
- set @mobID, 1021;
- callfunc "MobPoints";
- end;
-
-On1061:
- set @mobID, 1061;
- callfunc "MobPoints";
- end;
-}
+012-3,448,65,18,7|monster|Moggun|1061,5,100000ms,30000ms
+012-3,442,45,18,7|monster|Moggun|1061,5,100000ms,30000ms
+012-3,412,31,18,7|monster|Moggun|1061,5,100000ms,30000ms
+012-3,347,39,8,16|monster|Moggun|1061,5,100000ms,30000ms
+012-3,363,101,17,18|monster|Moggun|1061,10,100000ms,30000ms
+012-3,446,81,18,7|monster|Moggun|1061,5,100000ms,30000ms
+012-3,388,138,17,7|monster|Moggun|1061,5,100000ms,30000ms
+012-3,409,78,8,17|monster|Moggun|1061,5,100000ms,30000ms
+012-3,382,152,17,7|monster|Moggun|1061,5,100000ms,30000ms
+012-3,430,117,8,16|monster|Moggun|1061,5,100000ms,30000ms
+012-3,330,100,8,16|monster|Moggun|1061,5,100000ms,30000ms
+012-3,269,138,17,18|monster|Moggun|1061,10,100000ms,30000ms
+012-3,188,52,17,18|monster|Moggun|1061,10,100000ms,30000ms
+012-3,165,106,17,18|monster|Moggun|1061,10,100000ms,30000ms
+012-3,0,0,0,0|monster|Bat|1017,100,0ms,0ms
+012-3,0,0,0,0|monster|CaveSnake|1021,75,0ms,0ms
diff --git a/world/map/npc/012-3/_nodes.txt b/world/map/npc/012-3/_nodes.txt
new file mode 100644
index 00000000..ea6a8cae
--- /dev/null
+++ b/world/map/npc/012-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Moggun Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/012-3/mana-seed.txt b/world/map/npc/012-3/mana-seed.txt
index bb479c2b..c75125e4 100644
--- a/world/map/npc/012-3/mana-seed.txt
+++ b/world/map/npc/012-3/mana-seed.txt
@@ -37,7 +37,7 @@
"You may only be children, but you recognize that it is this man only who can save the world. As the walls rush towards you to crush your small group, you exchange a glance with your twin sister – there is no doubt what you must do...",
"The sacred place is surrounded by nothingness; were it not for your magic, you would have no hope of returning. The old and young man stands nearby; he has been waiting for you, for centuries. He has all the time in the world, after all...",
"Nothing remains behind. The underground castle is empty now, its chambers plundered, its throne destroyed. Shivering, you climb down the stairs, towards the wailing of the underworld that is waiting beneath...",
- "You feel soft, fluffy fur brushing against your skin and are filled with happiness. Somehow, the word `" + getspellinvocation("happy-curse") + "' comes to mind...";
+ "You feel soft, fluffy fur brushing against your skin and are filled with happiness. Somehow, the word `" + get(.invocation$, "happy-curse") + "' comes to mind...";
set @max_magic, 2;
diff --git a/world/map/npc/012-4/_import.txt b/world/map/npc/012-4/_import.txt
index 6dc69dad..ecf5657f 100644
--- a/world/map/npc/012-4/_import.txt
+++ b/world/map/npc/012-4/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 012-4
npc: npc/012-4/_mobs.txt
+npc: npc/012-4/_nodes.txt
npc: npc/012-4/_warps.txt
npc: npc/012-4/mapflags.txt
npc: npc/012-4/pvpflag.txt
diff --git a/world/map/npc/012-4/_mobs.txt b/world/map/npc/012-4/_mobs.txt
index e1a4a259..142ec427 100644
--- a/world/map/npc/012-4/_mobs.txt
+++ b/world/map/npc/012-4/_mobs.txt
@@ -1,113 +1,67 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Terranite Cave mobs
-012-4,217,45,12,3|monster|Moggun|1061,3,100000ms,30000ms,Mob012-4::On1061
-012-4,223,30,12,3|monster|Moggun|1061,3,100000ms,30000ms,Mob012-4::On1061
-012-4,239,48,12,3|monster|Moggun|1061,3,100000ms,30000ms,Mob012-4::On1061
-012-4,197,39,7,8|monster|Moggun|1061,3,100000ms,30000ms,Mob012-4::On1061
-012-4,210,35,7,8|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,241,38,7,8|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,237,59,7,8|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,226,73,7,8|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,209,94,9,5|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,263,29,7,8|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,274,48,7,8|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,267,70,7,8|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,259,79,7,8|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,274,79,7,8|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,268,91,24,15|monster|Moggun|1061,10,100000ms,30000ms,Mob012-4::On1061
-012-4,209,146,69,55|monster|Spider|1012,50,100000ms,30000ms,Mob012-4::On1012
-012-4,254,163,19,46|monster|YellowSlime|1007,10,100000ms,30000ms,Mob012-4::On1007
-012-4,167,175,17,22|monster|YellowSlime|1007,10,100000ms,30000ms,Mob012-4::On1007
-012-4,148,176,17,22|monster|RedSlime|1008,20,100000ms,30000ms,Mob012-4::On1008
-012-4,131,88,17,22|monster|RedSlime|1008,15,100000ms,30000ms,Mob012-4::On1008
-012-4,140,131,17,22|monster|YellowSlime|1007,10,100000ms,30000ms,Mob012-4::On1007
-012-4,42,128,17,9|monster|YellowSlime|1007,10,100000ms,30000ms,Mob012-4::On1007
-012-4,64,62,25,30|monster|Spider|1012,20,100000ms,30000ms,Mob012-4::On1012
-012-4,69,89,17,21|monster|YellowSlime|1007,10,100000ms,30000ms,Mob012-4::On1007
-012-4,34,45,17,33|monster|Terranite|1062,3,100000ms,30000ms,Mob012-4::On1062
-012-4,64,36,24,17|monster|Skeleton|1043,3,100000ms,30000ms,Mob012-4::On1043
-012-4,100,115,24,17|monster|Skeleton|1043,3,100000ms,30000ms,Mob012-4::On1043
-012-4,90,137,17,22|monster|YellowSlime|1007,10,100000ms,30000ms,Mob012-4::On1007
-012-4,59,113,14,17|monster|LadySkeleton|1044,3,100000ms,30000ms,Mob012-4::On1044
-012-4,42,176,15,13|monster|Terranite|1062,3,100000ms,30000ms,Mob012-4::On1062
-012-4,120,177,24,17|monster|LadySkeleton|1044,3,100000ms,30000ms,Mob012-4::On1044
-012-4,287,180,24,17|monster|LadySkeleton|1044,3,100000ms,30000ms,Mob012-4::On1044
-012-4,340,175,24,17|monster|Skeleton|1043,3,100000ms,30000ms,Mob012-4::On1043
-012-4,390,156,69,54|monster|Spider|1012,40,100000ms,30000ms,Mob012-4::On1012
-012-4,358,37,20,22|monster|Terranite|1062,3,100000ms,30000ms,Mob012-4::On1062
-012-4,481,110,19,24|monster|Terranite|1062,3,100000ms,30000ms,Mob012-4::On1062
-012-4,435,114,24,17|monster|Skeleton|1043,3,100000ms,30000ms,Mob012-4::On1043
-012-4,477,82,24,17|monster|LadySkeleton|1044,3,100000ms,30000ms,Mob012-4::On1044
-012-4,354,106,19,46|monster|YellowSlime|1007,10,100000ms,30000ms,Mob012-4::On1007
-012-4,342,139,17,22|monster|RedSlime|1008,15,100000ms,30000ms,Mob012-4::On1008
-012-4,389,81,33,15|monster|RedSlime|1008,20,100000ms,30000ms,Mob012-4::On1008
-012-4,409,35,7,8|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,413,73,7,8|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,395,63,7,8|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,314,182,7,8|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,409,121,7,8|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,456,99,7,8|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,133,153,9,5|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,153,98,9,5|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,126,65,9,5|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,81,180,9,5|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,61,159,9,5|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,271,157,7,8|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,270,182,7,8|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,322,141,17,22|monster|RedSlime|1008,20,100000ms,30000ms,Mob012-4::On1008
-012-4,451,111,7,8|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,422,50,11,32|monster|Spider|1012,10,100000ms,30000ms,Mob012-4::On1012
-012-4,380,40,14,22|monster|Spider|1012,10,100000ms,30000ms,Mob012-4::On1012
-012-4,124,49,9,24|monster|Terranite|1062,1,100000ms,30000ms,Mob012-4::On1062
-012-4,80,110,9,5|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,42,142,20,11|monster|Skeleton|1043,3,100000ms,30000ms,Mob012-4::On1043
-012-4,41,159,11,20|monster|Spider|1012,20,100000ms,30000ms,Mob012-4::On1012
-012-4,95,180,9,5|monster|Bat|1017,5,100000ms,30000ms,Mob012-4::On1017
-012-4,91,180,23,10|monster|Spider|1012,20,100000ms,30000ms,Mob012-4::On1012
-
-
-012-4,0,0,0|script|Mob012-4|32767
-{
- end;
-
-On1007:
- set @mobID, 1007;
- callfunc "MobPoints";
- end;
-
-On1008:
- set @mobID, 1008;
- callfunc "MobPoints";
- end;
-
-On1012:
- set @mobID, 1012;
- callfunc "MobPoints";
- end;
-
-On1017:
- set @mobID, 1017;
- callfunc "MobPoints";
- end;
-
-On1043:
- set @mobID, 1043;
- callfunc "MobPoints";
- end;
-
-On1044:
- set @mobID, 1044;
- callfunc "MobPoints";
- end;
-
-On1061:
- set @mobID, 1061;
- callfunc "MobPoints";
- end;
-
-On1062:
- set @mobID, 1062;
- callfunc "MobPoints";
- end;
-}
+012-4,217,45,12,3|monster|Moggun|1061,3,100000ms,30000ms
+012-4,223,30,12,3|monster|Moggun|1061,3,100000ms,30000ms
+012-4,239,48,12,3|monster|Moggun|1061,3,100000ms,30000ms
+012-4,197,39,7,8|monster|Moggun|1061,3,100000ms,30000ms
+012-4,210,35,7,8|monster|Bat|1017,5,100000ms,30000ms
+012-4,241,38,7,8|monster|Bat|1017,5,100000ms,30000ms
+012-4,237,59,7,8|monster|Bat|1017,5,100000ms,30000ms
+012-4,226,73,7,8|monster|Bat|1017,5,100000ms,30000ms
+012-4,209,94,9,5|monster|Bat|1017,5,100000ms,30000ms
+012-4,263,29,7,8|monster|Bat|1017,5,100000ms,30000ms
+012-4,274,48,7,8|monster|Bat|1017,5,100000ms,30000ms
+012-4,267,70,7,8|monster|Bat|1017,5,100000ms,30000ms
+012-4,259,79,7,8|monster|Bat|1017,5,100000ms,30000ms
+012-4,274,79,7,8|monster|Bat|1017,5,100000ms,30000ms
+012-4,268,91,24,15|monster|Moggun|1061,10,100000ms,30000ms
+012-4,209,146,69,55|monster|Spider|1012,50,100000ms,30000ms
+012-4,254,163,19,46|monster|YellowSlime|1007,10,100000ms,30000ms
+012-4,167,175,17,22|monster|YellowSlime|1007,10,100000ms,30000ms
+012-4,148,176,17,22|monster|RedSlime|1008,20,100000ms,30000ms
+012-4,131,88,17,22|monster|RedSlime|1008,15,100000ms,30000ms
+012-4,140,131,17,22|monster|YellowSlime|1007,10,100000ms,30000ms
+012-4,42,128,17,9|monster|YellowSlime|1007,10,100000ms,30000ms
+012-4,64,62,25,30|monster|Spider|1012,20,100000ms,30000ms
+012-4,69,89,17,21|monster|YellowSlime|1007,10,100000ms,30000ms
+012-4,34,45,17,33|monster|Terranite|1062,3,100000ms,30000ms
+012-4,64,36,24,17|monster|Skeleton|1043,3,100000ms,30000ms
+012-4,100,115,24,17|monster|Skeleton|1043,3,100000ms,30000ms
+012-4,90,137,17,22|monster|YellowSlime|1007,10,100000ms,30000ms
+012-4,59,113,14,17|monster|LadySkeleton|1044,3,100000ms,30000ms
+012-4,42,176,15,13|monster|Terranite|1062,3,100000ms,30000ms
+012-4,120,177,24,17|monster|LadySkeleton|1044,3,100000ms,30000ms
+012-4,287,180,24,17|monster|LadySkeleton|1044,3,100000ms,30000ms
+012-4,340,175,24,17|monster|Skeleton|1043,3,100000ms,30000ms
+012-4,390,156,69,54|monster|Spider|1012,40,100000ms,30000ms
+012-4,358,37,20,22|monster|Terranite|1062,3,100000ms,30000ms
+012-4,481,110,19,24|monster|Terranite|1062,3,100000ms,30000ms
+012-4,435,114,24,17|monster|Skeleton|1043,3,100000ms,30000ms
+012-4,477,82,24,17|monster|LadySkeleton|1044,3,100000ms,30000ms
+012-4,354,106,19,46|monster|YellowSlime|1007,10,100000ms,30000ms
+012-4,342,139,17,22|monster|RedSlime|1008,15,100000ms,30000ms
+012-4,389,81,33,15|monster|RedSlime|1008,20,100000ms,30000ms
+012-4,409,35,7,8|monster|Bat|1017,5,100000ms,30000ms
+012-4,413,73,7,8|monster|Bat|1017,5,100000ms,30000ms
+012-4,395,63,7,8|monster|Bat|1017,5,100000ms,30000ms
+012-4,314,182,7,8|monster|Bat|1017,5,100000ms,30000ms
+012-4,409,121,7,8|monster|Bat|1017,5,100000ms,30000ms
+012-4,456,99,7,8|monster|Bat|1017,5,100000ms,30000ms
+012-4,133,153,9,5|monster|Bat|1017,5,100000ms,30000ms
+012-4,153,98,9,5|monster|Bat|1017,5,100000ms,30000ms
+012-4,126,65,9,5|monster|Bat|1017,5,100000ms,30000ms
+012-4,81,180,9,5|monster|Bat|1017,5,100000ms,30000ms
+012-4,61,159,9,5|monster|Bat|1017,5,100000ms,30000ms
+012-4,271,157,7,8|monster|Bat|1017,5,100000ms,30000ms
+012-4,270,182,7,8|monster|Bat|1017,5,100000ms,30000ms
+012-4,322,141,17,22|monster|RedSlime|1008,20,100000ms,30000ms
+012-4,451,111,7,8|monster|Bat|1017,5,100000ms,30000ms
+012-4,422,50,11,32|monster|Spider|1012,10,100000ms,30000ms
+012-4,380,40,14,22|monster|Spider|1012,10,100000ms,30000ms
+012-4,124,49,9,24|monster|Terranite|1062,1,100000ms,30000ms
+012-4,80,110,9,5|monster|Bat|1017,5,100000ms,30000ms
+012-4,42,142,20,11|monster|Skeleton|1043,3,100000ms,30000ms
+012-4,41,159,11,20|monster|Spider|1012,20,100000ms,30000ms
+012-4,95,180,9,5|monster|Bat|1017,5,100000ms,30000ms
+012-4,91,180,23,10|monster|Spider|1012,20,100000ms,30000ms
diff --git a/world/map/npc/012-4/_nodes.txt b/world/map/npc/012-4/_nodes.txt
new file mode 100644
index 00000000..2c9229b2
--- /dev/null
+++ b/world/map/npc/012-4/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Terranite Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/013-1/_import.txt b/world/map/npc/013-1/_import.txt
index 3a988151..5fca25f0 100644
--- a/world/map/npc/013-1/_import.txt
+++ b/world/map/npc/013-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 013-1
npc: npc/013-1/_mobs.txt
+npc: npc/013-1/_nodes.txt
npc: npc/013-1/_warps.txt
npc: npc/013-1/flowerpentagram.txt
npc: npc/013-1/mapflags.txt
diff --git a/world/map/npc/013-1/_mobs.txt b/world/map/npc/013-1/_mobs.txt
index 7d2efa88..ca0b2b68 100644
--- a/world/map/npc/013-1/_mobs.txt
+++ b/world/map/npc/013-1/_mobs.txt
@@ -1,79 +1,18 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Woodland Hills mobs
-013-1,0,0,0,0|monster|PinkFlower|1014,13,0ms,100ms,Mob013-1::On1014
-013-1,0,0,0,0|monster|SpikyMushroom|1019,12,0ms,100ms,Mob013-1::On1019
-013-1,0,0,0,0|monster|Mouboo|1028,5,0ms,100ms,Mob013-1::On1028
-013-1,0,0,0,0|monster|MauvePlant|1029,1,270ms,180ms,Mob013-1::On1029
-013-1,0,0,0,0|monster|MauvePlant|1029,4,2700000ms,1800000ms,Mob013-1::On1029
-013-1,0,0,0,0|monster|CobaltPlant|1030,1,270ms,180ms,Mob013-1::On1030
-013-1,0,0,0,0|monster|CobaltPlant|1030,2,2700000ms,1800000ms,Mob013-1::On1030
-013-1,0,0,0,0|monster|GambogePlant|1031,1,270ms,180ms,Mob013-1::On1031
-013-1,0,0,0,0|monster|GambogePlant|1031,2,2700000ms,1800000ms,Mob013-1::On1031
-013-1,0,0,0,0|monster|AlizarinPlant|1032,1,270ms,180ms,Mob013-1::On1032
-013-1,0,0,0,0|monster|AlizarinPlant|1032,2,2700000ms,1800000ms,Mob013-1::On1032
-013-1,0,0,0,0|monster|Silkworm|1035,4,60000ms,30000ms,Mob013-1::On1035
-013-1,0,0,0,0|monster|CloverPatch|1037,2,0ms,1000ms,Mob013-1::On1037
-013-1,0,0,0,0|monster|Squirrel|1038,25,30ms,20ms,Mob013-1::On1038
-013-1,0,0,0,0|monster|Butterfly|1055,10,30ms,20ms,Mob013-1::On1055
-
-
-013-1,0,0,0|script|Mob013-1|32767
-{
- end;
-
-On1014:
- set @mobID, 1014;
- callfunc "MobPoints";
- end;
-
-On1019:
- set @mobID, 1019;
- callfunc "MobPoints";
- end;
-
-On1028:
- set @mobID, 1028;
- callfunc "MobPoints";
- end;
-
-On1029:
- set @mobID, 1029;
- callfunc "MobPoints";
- end;
-
-On1030:
- set @mobID, 1030;
- callfunc "MobPoints";
- end;
-
-On1031:
- set @mobID, 1031;
- callfunc "MobPoints";
- end;
-
-On1032:
- set @mobID, 1032;
- callfunc "MobPoints";
- end;
-
-On1035:
- set @mobID, 1035;
- callfunc "MobPoints";
- end;
-
-On1037:
- set @mobID, 1037;
- callfunc "MobPoints";
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1055:
- set @mobID, 1055;
- callfunc "MobPoints";
- end;
-}
+013-1,0,0,0,0|monster|PinkFlower|1014,13,0ms,100ms
+013-1,0,0,0,0|monster|SpikyMushroom|1019,12,0ms,100ms
+013-1,0,0,0,0|monster|Mouboo|1028,5,0ms,100ms
+013-1,0,0,0,0|monster|MauvePlant|1029,1,270ms,180ms
+013-1,0,0,0,0|monster|MauvePlant|1029,4,2700000ms,1800000ms
+013-1,0,0,0,0|monster|CobaltPlant|1030,1,270ms,180ms
+013-1,0,0,0,0|monster|CobaltPlant|1030,2,2700000ms,1800000ms
+013-1,0,0,0,0|monster|GambogePlant|1031,1,270ms,180ms
+013-1,0,0,0,0|monster|GambogePlant|1031,2,2700000ms,1800000ms
+013-1,0,0,0,0|monster|AlizarinPlant|1032,1,270ms,180ms
+013-1,0,0,0,0|monster|AlizarinPlant|1032,2,2700000ms,1800000ms
+013-1,0,0,0,0|monster|Silkworm|1035,4,60000ms,30000ms
+013-1,0,0,0,0|monster|CloverPatch|1037,2,0ms,1000ms
+013-1,0,0,0,0|monster|Squirrel|1038,25,30ms,20ms
+013-1,0,0,0,0|monster|Butterfly|1055,10,30ms,20ms
diff --git a/world/map/npc/013-1/_nodes.txt b/world/map/npc/013-1/_nodes.txt
new file mode 100644
index 00000000..13ee4f92
--- /dev/null
+++ b/world/map/npc/013-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Woodland Hills nodes
+
+// (no nodes)
diff --git a/world/map/npc/013-1/sagatha.txt b/world/map/npc/013-1/sagatha.txt
index 558e9b70..e113d35a 100644
--- a/world/map/npc/013-1/sagatha.txt
+++ b/world/map/npc/013-1/sagatha.txt
@@ -267,7 +267,7 @@ L_teach_N14:
mes "\"Some forest creatures sometimes overgrow their fur or hide. That makes them uncomfortable.\"";
next;
mes "[Sagatha the Witch]";
- mes "\"You can help them with shearing magic. Press your hands together and say '" + getspellinvocation("shear") + "'. Then touch them with your hands, and brush off any excess.\"";
+ mes "\"You can help them with shearing magic. Press your hands together and say '" + get(.invocation$, "shear") + "'. Then touch them with your hands, and brush off any excess.\"";
next;
mes "[Sagatha the Witch]";
mes "\"The spell is strong, so you only need to do this once. Be careful not to cut them. Some things they shed are useful. Often they will leave them to you as a thank-you.\"";
@@ -280,7 +280,7 @@ L_teach_N10:
mes "\"Next, a nature spell. Take a cocoon shell. Hold it in your hand. Feel its lightness.\"";
next;
mes "[Sagatha the Witch]";
- mes "\"Now whisper '" + getspellinvocation("flying-backpack") + "', and if your backpack was pressing on you you should no longer feel it now.\"";
+ mes "\"Now whisper '" + get(.invocation$, "flying-backpack") + "', and if your backpack was pressing on you you should no longer feel it now.\"";
goto L_practice;
L_teach_A10:
@@ -290,14 +290,14 @@ L_teach_A10:
mes "\"To protect against others' magic, take a small mushroom from a shady place. Mushrooms draw things out of the earth. Rub your mushroom into pieces between your hands.\"";
next;
mes "[Sagatha the Witch]";
- mes "\"Then say '" + getspellinvocation("barrier") + "' and let the mushroom's power take over.\"";
+ mes "\"Then say '" + get(.invocation$, "magic barrier") + "' and let the mushroom's power take over.\"";
goto L_practice;
L_teach_A11:
if (@mexp < 200)
goto L_teach_noexp;
mes "[Sagatha the Witch]";
- mes "\"If you must fight, call allies. You can call spiky mushrooms out of the ground with a mushroom spike and a root. Hold up the spike and call out to them: '" + getspellinvocation("summon-spiky-mushrooms") + "'. Then press the root to the ground.\"";
+ mes "\"If you must fight, call allies. You can call spiky mushrooms out of the ground with a mushroom spike and a root. Hold up the spike and call out to them: '" + get(.invocation$, "smsmushrooms") + "'. Then press the root to the ground.\"";
next;
mes "[Sagatha the Witch]";
mes "\"Spiky mushrooms often grow too many spikes, so you can shear the spikes off of some.\"";
@@ -308,17 +308,17 @@ L_teach_A12:
if (@mexp < 220)
goto L_teach_noexp;
mes "[Sagatha the Witch]";
- mes "\"You can call fluffies, too. But for them you must call out '" + getspellinvocation("summon-fluffies") + "' instead, with white fluffy fur instead of a spike. And don't forget the root.\"";
+ mes "\"You can call fluffies, too. But for them you must call out '" + get(.invocation$, "smfluffies") + "' instead, with white fluffy fur instead of a spike. And don't forget the root.\"";
goto L_practice;
L_teach_N11:
if (@mexp < 250)
goto L_teach_noexp;
mes "[Sagatha the Witch]";
- mes "\"You can harden your skin with a hard spike. Hold it in your hands and speak '" + getspellinvocation("protect") + "', then draw its hardness into your skin.\"";
+ mes "\"You can harden your skin with a hard spike. Hold it in your hands and speak '" + get(.invocation$, "protect") + "', then draw its hardness into your skin.\"";
next;
mes "[Sagatha the Witch]";
- mes "\"Or call it into someone else's skin, by saying that someone's name right after the '" + getspellinvocation("protect") + "'.\"";
+ mes "\"Or call it into someone else's skin, by saying that someone's name right after the '" + get(.invocation$, "protect") + "'.\"";
goto L_practice;
L_teach_noexp:
diff --git a/world/map/npc/013-2/_import.txt b/world/map/npc/013-2/_import.txt
index 105a75a7..6dc243ad 100644
--- a/world/map/npc/013-2/_import.txt
+++ b/world/map/npc/013-2/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 013-2
npc: npc/013-2/_mobs.txt
+npc: npc/013-2/_nodes.txt
npc: npc/013-2/_warps.txt
npc: npc/013-2/apprentice.txt
npc: npc/013-2/mapflags.txt
diff --git a/world/map/npc/013-2/_mobs.txt b/world/map/npc/013-2/_mobs.txt
index 82f242a0..b092afcc 100644
--- a/world/map/npc/013-2/_mobs.txt
+++ b/world/map/npc/013-2/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Magic House mobs
-
-
-013-2,0,0,0|script|Mob013-2|32767
-{
- end;
-}
diff --git a/world/map/npc/013-2/_nodes.txt b/world/map/npc/013-2/_nodes.txt
new file mode 100644
index 00000000..80a032bc
--- /dev/null
+++ b/world/map/npc/013-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Magic House nodes
+
+// (no nodes)
diff --git a/world/map/npc/013-2/wizard.txt b/world/map/npc/013-2/wizard.txt
index ced2865b..32a2a623 100644
--- a/world/map/npc/013-2/wizard.txt
+++ b/world/map/npc/013-2/wizard.txt
@@ -75,7 +75,7 @@ L_TeachSpell:
mes "\"This one may not seem too powerful, but it can be quite handy; it's the 'hide' spell. It will shield you from some forms of detection magic.\"";
next;
mes "[Old Wizard]";
- mes "\"Put a piece of cotton cloth on your head, and speak out '" + getspellinvocation("hide") + "', loudly and clearly. The protection lasts quite long, but you may have to renew it on occasion.\"";
+ mes "\"Put a piece of cotton cloth on your head, and speak out '" + get(.invocation$, "spell-hide") + "', loudly and clearly. The protection lasts quite long, but you may have to renew it on occasion.\"";
next;
mes "[Old Wizard]";
mes "\"You can also cast it on others, of course. Just speak their name after you pronounce the invocation.\"";
diff --git a/world/map/npc/013-3/_import.txt b/world/map/npc/013-3/_import.txt
index b4ca98df..4a6fd517 100644
--- a/world/map/npc/013-3/_import.txt
+++ b/world/map/npc/013-3/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 013-3
npc: npc/013-3/_mobs.txt
+npc: npc/013-3/_nodes.txt
npc: npc/013-3/_warps.txt
npc: npc/013-3/barrier.txt
npc: npc/013-3/mapflags.txt
diff --git a/world/map/npc/013-3/_mobs.txt b/world/map/npc/013-3/_mobs.txt
index 088e2c72..b1456bc5 100644
--- a/world/map/npc/013-3/_mobs.txt
+++ b/world/map/npc/013-3/_mobs.txt
@@ -1,82 +1,31 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Woodland Hills Cave mobs
-013-3,28,89,16,52|monster|CaveSnake|1021,10,120000ms,60000ms,Mob013-3::On1021
-013-3,61,22,2,2|monster|FireSkull|1023,1,120000ms,60000ms,Mob013-3::On1023
-013-3,81,22,2,2|monster|PoisonSkull|1024,1,120000ms,60000ms,Mob013-3::On1024
-013-3,109,31,6,22|monster|BlackScorpion|1009,20,50000ms,25000ms,Mob013-3::On1009
-013-3,119,84,27,38|monster|Spider|1012,20,120000ms,40000ms,Mob013-3::On1012
-013-3,176,23,5,6|monster|Spider|1012,10,100000ms,40000ms,Mob013-3::On1012
-013-3,82,75,2,2|monster|FireSkull|1023,1,180000ms,60000ms,Mob013-3::On1023
-013-3,142,37,2,2|monster|PoisonSkull|1024,1,180000ms,60000ms,Mob013-3::On1024
-013-3,79,134,21,16|monster|BlackScorpion|1009,5,80000ms,40000ms,Mob013-3::On1009
-013-3,71,169,38,17|monster|BlackScorpion|1009,5,80000ms,40000ms,Mob013-3::On1009
-013-3,64,85,9,21|monster|BlackScorpion|1009,10,80000ms,40000ms,Mob013-3::On1009
-013-3,81,92,3,20|monster|BlackScorpion|1009,10,80000ms,40000ms,Mob013-3::On1009
-013-3,163,84,33,37|monster|Snake|1010,30,120000ms,50000ms,Mob013-3::On1010
-013-3,162,85,33,37|monster|Spider|1012,30,120000ms,50000ms,Mob013-3::On1012
-013-3,172,77,18,25|monster|BlackScorpion|1009,15,120000ms,50000ms,Mob013-3::On1009
-013-3,145,36,20,15|monster|RedSlime|1008,25,80000ms,40000ms,Mob013-3::On1008
-013-3,167,37,23,11|monster|Snake|1010,20,120000ms,40000ms,Mob013-3::On1010
-013-3,165,25,16,11|monster|BlackScorpion|1009,15,120000ms,40000ms,Mob013-3::On1009
-013-3,71,39,2,3|monster|Snake|1010,2,40000ms,20000ms,Mob013-3::On1010
-013-3,159,102,3,5|monster|YellowSlime|1007,2,80000ms,40000ms,Mob013-3::On1007
-013-3,67,22,2,2|monster|Maggot|1002,2,40000ms,20000ms,Mob013-3::On1002
-013-3,75,22,2,2|monster|Maggot|1002,2,40000ms,20000ms,Mob013-3::On1002
-013-3,76,39,7,4|monster|BlackScorpion|1009,8,40000ms,20000ms,Mob013-3::On1009
-013-3,65,39,7,4|monster|RedSlime|1008,8,40000ms,20000ms,Mob013-3::On1008
-013-3,62,33,2,1|monster|PoisonSkull|1024,1,120000ms,60000ms,Mob013-3::On1024
-013-3,80,33,2,1|monster|FireSkull|1023,1,120000ms,60000ms,Mob013-3::On1023
-013-3,75,46,2,1|monster|PoisonSkull|1024,1,120000ms,60000ms,Mob013-3::On1024
-013-3,67,46,2,1|monster|FireSkull|1023,1,120000ms,60000ms,Mob013-3::On1023
-
-
-013-3,0,0,0|script|Mob013-3|32767
-{
- end;
-
-On1002:
- set @mobID, 1002;
- callfunc "MobPoints";
- end;
-
-On1007:
- set @mobID, 1007;
- callfunc "MobPoints";
- end;
-
-On1008:
- set @mobID, 1008;
- callfunc "MobPoints";
- end;
-
-On1009:
- set @mobID, 1009;
- callfunc "MobPoints";
- end;
-
-On1010:
- set @mobID, 1010;
- callfunc "MobPoints";
- end;
-
-On1012:
- set @mobID, 1012;
- callfunc "MobPoints";
- end;
-
-On1021:
- set @mobID, 1021;
- callfunc "MobPoints";
- end;
-
-On1023:
- set @mobID, 1023;
- callfunc "MobPoints";
- end;
-
-On1024:
- set @mobID, 1024;
- callfunc "MobPoints";
- end;
-}
+013-3,28,89,16,52|monster|CaveSnake|1021,10,120000ms,60000ms
+013-3,61,22,2,2|monster|FireSkull|1023,1,120000ms,60000ms
+013-3,81,22,2,2|monster|PoisonSkull|1024,1,120000ms,60000ms
+013-3,109,31,6,22|monster|BlackScorpion|1009,20,50000ms,25000ms
+013-3,119,84,27,38|monster|Spider|1012,20,120000ms,40000ms
+013-3,176,23,5,6|monster|Spider|1012,10,100000ms,40000ms
+013-3,82,75,2,2|monster|FireSkull|1023,1,180000ms,60000ms
+013-3,142,37,2,2|monster|PoisonSkull|1024,1,180000ms,60000ms
+013-3,79,134,21,16|monster|BlackScorpion|1009,5,80000ms,40000ms
+013-3,71,169,38,17|monster|BlackScorpion|1009,5,80000ms,40000ms
+013-3,64,85,9,21|monster|BlackScorpion|1009,10,80000ms,40000ms
+013-3,81,92,3,20|monster|BlackScorpion|1009,10,80000ms,40000ms
+013-3,163,84,33,37|monster|Snake|1010,30,120000ms,50000ms
+013-3,162,85,33,37|monster|Spider|1012,30,120000ms,50000ms
+013-3,172,77,18,25|monster|BlackScorpion|1009,15,120000ms,50000ms
+013-3,145,36,20,15|monster|RedSlime|1008,25,80000ms,40000ms
+013-3,167,37,23,11|monster|Snake|1010,20,120000ms,40000ms
+013-3,165,25,16,11|monster|BlackScorpion|1009,15,120000ms,40000ms
+013-3,71,39,2,3|monster|Snake|1010,2,40000ms,20000ms
+013-3,159,102,3,5|monster|YellowSlime|1007,2,80000ms,40000ms
+013-3,67,22,2,2|monster|Maggot|1002,2,40000ms,20000ms
+013-3,75,22,2,2|monster|Maggot|1002,2,40000ms,20000ms
+013-3,76,39,7,4|monster|BlackScorpion|1009,8,40000ms,20000ms
+013-3,65,39,7,4|monster|RedSlime|1008,8,40000ms,20000ms
+013-3,62,33,2,1|monster|PoisonSkull|1024,1,120000ms,60000ms
+013-3,80,33,2,1|monster|FireSkull|1023,1,120000ms,60000ms
+013-3,75,46,2,1|monster|PoisonSkull|1024,1,120000ms,60000ms
+013-3,67,46,2,1|monster|FireSkull|1023,1,120000ms,60000ms
diff --git a/world/map/npc/013-3/_nodes.txt b/world/map/npc/013-3/_nodes.txt
new file mode 100644
index 00000000..689be5d9
--- /dev/null
+++ b/world/map/npc/013-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Woodland Hills Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/014-1/_import.txt b/world/map/npc/014-1/_import.txt
index 9990bdf0..cde43724 100644
--- a/world/map/npc/014-1/_import.txt
+++ b/world/map/npc/014-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 014-1
npc: npc/014-1/_mobs.txt
+npc: npc/014-1/_nodes.txt
npc: npc/014-1/_warps.txt
npc: npc/014-1/mapflags.txt
npc: npc/014-1/wedding-officiator.txt
diff --git a/world/map/npc/014-1/_mobs.txt b/world/map/npc/014-1/_mobs.txt
index 862d1c19..8abab0ea 100644
--- a/world/map/npc/014-1/_mobs.txt
+++ b/world/map/npc/014-1/_mobs.txt
@@ -1,85 +1,19 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Woodland mobs
-014-1,0,0,0,0|monster|EvilMushroom|1013,20,0ms,0ms,Mob014-1::On1013
-014-1,0,0,0,0|monster|PinkFlower|1014,25,0ms,0ms,Mob014-1::On1014
-014-1,0,0,0,0|monster|SpikyMushroom|1019,15,0ms,0ms,Mob014-1::On1019
-014-1,0,0,0,0|monster|Mouboo|1028,5,0ms,10ms,Mob014-1::On1028
-014-1,0,0,0,0|monster|MauvePlant|1029,1,270ms,180ms,Mob014-1::On1029
-014-1,0,0,0,0|monster|MauvePlant|1029,5,2700000ms,1800000ms,Mob014-1::On1029
-014-1,0,0,0,0|monster|CobaltPlant|1030,1,270ms,180ms,Mob014-1::On1030
-014-1,0,0,0,0|monster|CobaltPlant|1030,2,2700000ms,1800000ms,Mob014-1::On1030
-014-1,0,0,0,0|monster|GambogePlant|1031,1,270ms,180ms,Mob014-1::On1031
-014-1,0,0,0,0|monster|GambogePlant|1031,2,2700000ms,1800000ms,Mob014-1::On1031
-014-1,0,0,0,0|monster|AlizarinPlant|1032,1,270ms,180ms,Mob014-1::On1032
-014-1,0,0,0,0|monster|AlizarinPlant|1032,2,2700000ms,1800000ms,Mob014-1::On1032
-014-1,0,0,0,0|monster|Silkworm|1035,4,6000ms,3000ms,Mob014-1::On1035
-014-1,0,0,0,0|monster|CloverPatch|1037,2,0ms,1000ms,Mob014-1::On1037
-014-1,0,0,0,0|monster|Squirrel|1038,25,30ms,20ms,Mob014-1::On1038
-014-1,0,0,0,0|monster|Butterfly|1055,10,30ms,20ms,Mob014-1::On1055
-
-
-014-1,0,0,0|script|Mob014-1|32767
-{
- end;
-
-On1013:
- set @mobID, 1013;
- callfunc "MobPoints";
- end;
-
-On1014:
- set @mobID, 1014;
- callfunc "MobPoints";
- end;
-
-On1019:
- set @mobID, 1019;
- callfunc "MobPoints";
- end;
-
-On1028:
- set @mobID, 1028;
- callfunc "MobPoints";
- end;
-
-On1029:
- set @mobID, 1029;
- callfunc "MobPoints";
- end;
-
-On1030:
- set @mobID, 1030;
- callfunc "MobPoints";
- end;
-
-On1031:
- set @mobID, 1031;
- callfunc "MobPoints";
- end;
-
-On1032:
- set @mobID, 1032;
- callfunc "MobPoints";
- end;
-
-On1035:
- set @mobID, 1035;
- callfunc "MobPoints";
- end;
-
-On1037:
- set @mobID, 1037;
- callfunc "MobPoints";
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1055:
- set @mobID, 1055;
- callfunc "MobPoints";
- end;
-}
+014-1,0,0,0,0|monster|EvilMushroom|1013,20,0ms,0ms
+014-1,0,0,0,0|monster|PinkFlower|1014,25,0ms,0ms
+014-1,0,0,0,0|monster|SpikyMushroom|1019,15,0ms,0ms
+014-1,0,0,0,0|monster|Mouboo|1028,5,0ms,10ms
+014-1,0,0,0,0|monster|MauvePlant|1029,1,270ms,180ms
+014-1,0,0,0,0|monster|MauvePlant|1029,5,2700000ms,1800000ms
+014-1,0,0,0,0|monster|CobaltPlant|1030,1,270ms,180ms
+014-1,0,0,0,0|monster|CobaltPlant|1030,2,2700000ms,1800000ms
+014-1,0,0,0,0|monster|GambogePlant|1031,1,270ms,180ms
+014-1,0,0,0,0|monster|GambogePlant|1031,2,2700000ms,1800000ms
+014-1,0,0,0,0|monster|AlizarinPlant|1032,1,270ms,180ms
+014-1,0,0,0,0|monster|AlizarinPlant|1032,2,2700000ms,1800000ms
+014-1,0,0,0,0|monster|Silkworm|1035,4,6000ms,3000ms
+014-1,0,0,0,0|monster|CloverPatch|1037,2,0ms,1000ms
+014-1,0,0,0,0|monster|Squirrel|1038,25,30ms,20ms
+014-1,0,0,0,0|monster|Butterfly|1055,10,30ms,20ms
diff --git a/world/map/npc/014-1/_nodes.txt b/world/map/npc/014-1/_nodes.txt
new file mode 100644
index 00000000..12c08221
--- /dev/null
+++ b/world/map/npc/014-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Woodland nodes
+
+// (no nodes)
diff --git a/world/map/npc/014-1/wedding-officiator.txt b/world/map/npc/014-1/wedding-officiator.txt
index fc237082..dfdab00b 100644
--- a/world/map/npc/014-1/wedding-officiator.txt
+++ b/world/map/npc/014-1/wedding-officiator.txt
@@ -9,7 +9,7 @@
goto L_main;
L_main:
- if (getpartnerid2())
+ if (PARTNER)
goto L_main_married;
menu
@@ -35,10 +35,10 @@ L_explain_marriage:
mes "\"Both you and your partner must be at least " + WEDDING_MIN_LEVEL + " levels of age, though; the law is very firm on that. But if all of that works out, I will give you two wedding rings for the ceremony.\"";
next;
mes "[Wedding Officiator]";
- mes "\"To complete the marriage, each of you has to put on one of these rings, and you have to stand next to each other in the southern part of this park. Then one of you says `marry' and then the other person's name.\"";
+ mes "\"To complete the marriage, each of you has to put on one of these rings, and you have to stand next to each other in the southern part of this park. Then one of you says `#marry' and then the other person's name.\"";
next;
mes "[Wedding Officiator]";
- mes "\"So if you would want to marry me, for example, you would say `marry Wendy'. Just like that. Your partner then has to decide whether he or she wants that. And if you both agree, then you're married!\"";
+ mes "\"So if you would want to marry me, for example, you would say `#marry Wendy'. Just like that. Your partner then has to decide whether he or she wants that. And if you both agree, then you're married!\"";
mes "She again smiles that broad smile of hers.";
next;
goto L_main;
@@ -135,7 +135,7 @@ L_too_poor:
L_main_married:
mes "[Wedding Officiator]";
- mes "\"I hope that you and your partner are doing well?\"";
+ mes "\"I hope that you and "+ strcharinfo(0, get(BL_ID, PARTNER)) +" are doing well?\"";
next;
menu
"We are very happy, thanks for asking!", L_farewell,
@@ -219,8 +219,8 @@ L_divorce_nomoney:
L_do_divorce:
if (Zeny < @divorce_cost)
goto L_divorce_nomoney;
- if (divorce())
- goto L_DidDivorce;
+ set PARTNER, 0, PARTNER; // divorce the partner first, which will also divorce the rid if succesful
+ if (PARTNER < 1) goto L_DidDivorce;
mes "[Wedding Officiator]";
mes "The officiator searches through her records for your partner.";
diff --git a/world/map/npc/014-3/_import.txt b/world/map/npc/014-3/_import.txt
index 25c551bd..8aedea2e 100644
--- a/world/map/npc/014-3/_import.txt
+++ b/world/map/npc/014-3/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 014-3
npc: npc/014-3/_mobs.txt
+npc: npc/014-3/_nodes.txt
npc: npc/014-3/_warps.txt
npc: npc/014-3/mapflags.txt
diff --git a/world/map/npc/014-3/_mobs.txt b/world/map/npc/014-3/_mobs.txt
index ebadbf58..90d835c2 100644
--- a/world/map/npc/014-3/_mobs.txt
+++ b/world/map/npc/014-3/_mobs.txt
@@ -1,15 +1,4 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Woodland Cave mobs
-014-3,0,0,0,0|monster|Bat|1017,50,0ms,0ms,Mob014-3::On1017
-
-
-014-3,0,0,0|script|Mob014-3|32767
-{
- end;
-
-On1017:
- set @mobID, 1017;
- callfunc "MobPoints";
- end;
-}
+014-3,0,0,0,0|monster|Bat|1017,50,0ms,0ms
diff --git a/world/map/npc/014-3/_nodes.txt b/world/map/npc/014-3/_nodes.txt
new file mode 100644
index 00000000..2ebc3af1
--- /dev/null
+++ b/world/map/npc/014-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Woodland Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/015-1/_import.txt b/world/map/npc/015-1/_import.txt
index 6085f2a3..a376d93a 100644
--- a/world/map/npc/015-1/_import.txt
+++ b/world/map/npc/015-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 015-1
npc: npc/015-1/_mobs.txt
+npc: npc/015-1/_nodes.txt
npc: npc/015-1/_warps.txt
npc: npc/015-1/alice.txt
npc: npc/015-1/barrier.txt
diff --git a/world/map/npc/015-1/_mobs.txt b/world/map/npc/015-1/_mobs.txt
index cad191f2..e012a95c 100644
--- a/world/map/npc/015-1/_mobs.txt
+++ b/world/map/npc/015-1/_mobs.txt
@@ -1,69 +1,13 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Woodland mobs
-015-1,0,0,0,0|monster|CloverPatch|1037,2,100000ms,1000ms,Mob015-1::On1037
-015-1,0,0,0,0|monster|Butterfly|1055,10,30ms,20ms,Mob015-1::On1055
-015-1,0,0,0,0|monster|Squirrel|1038,30,20ms,10ms,Mob015-1::On1038
-015-1,0,0,0,0|monster|LogHead|1025,40,0ms,0ms,Mob015-1::On1025
-015-1,0,0,0,0|monster|SpikyMushroom|1019,20,0ms,0ms,Mob015-1::On1019
-015-1,0,0,0,0|monster|PinkFlower|1014,20,0ms,0ms,Mob015-1::On1014
-015-1,0,0,0,0|monster|GambogePlant|1031,5,0ms,0ms,Mob015-1::On1031
-015-1,0,0,0,0|monster|AlizarinPlant|1032,5,0ms,0ms,Mob015-1::On1032
-015-1,0,0,0,0|monster|Silkworm|1035,7,15000ms,7000ms,Mob015-1::On1035
-015-1,0,0,0,0|monster|MauvePlant|1029,4,270000ms,180000ms,Mob015-1::On1029
-
-
-015-1,0,0,0|script|Mob015-1|32767
-{
- end;
-
-On1014:
- set @mobID, 1014;
- callfunc "MobPoints";
- end;
-
-On1019:
- set @mobID, 1019;
- callfunc "MobPoints";
- end;
-
-On1025:
- set @mobID, 1025;
- callfunc "MobPoints";
- end;
-
-On1029:
- set @mobID, 1029;
- callfunc "MobPoints";
- end;
-
-On1031:
- set @mobID, 1031;
- callfunc "MobPoints";
- end;
-
-On1032:
- set @mobID, 1032;
- callfunc "MobPoints";
- end;
-
-On1035:
- set @mobID, 1035;
- callfunc "MobPoints";
- end;
-
-On1037:
- set @mobID, 1037;
- callfunc "MobPoints";
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1055:
- set @mobID, 1055;
- callfunc "MobPoints";
- end;
-}
+015-1,0,0,0,0|monster|CloverPatch|1037,2,100000ms,1000ms
+015-1,0,0,0,0|monster|Butterfly|1055,10,30ms,20ms
+015-1,0,0,0,0|monster|Squirrel|1038,30,20ms,10ms
+015-1,0,0,0,0|monster|LogHead|1025,40,0ms,0ms
+015-1,0,0,0,0|monster|SpikyMushroom|1019,20,0ms,0ms
+015-1,0,0,0,0|monster|PinkFlower|1014,20,0ms,0ms
+015-1,0,0,0,0|monster|GambogePlant|1031,5,0ms,0ms
+015-1,0,0,0,0|monster|AlizarinPlant|1032,5,0ms,0ms
+015-1,0,0,0,0|monster|Silkworm|1035,7,15000ms,7000ms
+015-1,0,0,0,0|monster|MauvePlant|1029,4,270000ms,180000ms
diff --git a/world/map/npc/015-1/_nodes.txt b/world/map/npc/015-1/_nodes.txt
new file mode 100644
index 00000000..12c08221
--- /dev/null
+++ b/world/map/npc/015-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Woodland nodes
+
+// (no nodes)
diff --git a/world/map/npc/015-1/sword.txt b/world/map/npc/015-1/sword.txt
index 239de752..be23e23a 100644
--- a/world/map/npc/015-1/sword.txt
+++ b/world/map/npc/015-1/sword.txt
@@ -109,7 +109,7 @@ L_Initial_ok:
mes "\"Oh, my apologies – that was a little overly dramatic. But I do not get to talk to thy kin anymore all that often.\"";
next;
mes "[Mystic Sword]";
- mes "\"For the flare dart spell throw a handful of sulphur powder up into the air, and say, '" + getspellinvocation("flare-dart") + "'.\"";
+ mes "\"For the flare dart spell throw a handful of sulphur powder up into the air, and say, '" + get(.invocation$, "flare-dart") + "'.\"";
set @Q_status, @STATUS_LEARNED_FLAREDART;
callsub S_update_var;
next;
@@ -257,7 +257,7 @@ L_Next3:
callsub S_update_var;
next;
mes "[Mystic Sword]";
- mes "\"Speak '" + getspellinvocation("magic-knuckles") + "' and take a glass of beer and drink it, without ever taking it off thy lips. This will harden and enchant thy fists, turning them into powerful weapons.\"";
+ mes "\"Speak '" + get(.invocation$, "magic-knuckles") + "' and take a glass of beer and drink it, without ever taking it off thy lips. This will harden and enchant thy fists, turning them into powerful weapons.\"";
close;
L_L2_almost_done:
@@ -297,7 +297,7 @@ L_Next4:
callsub S_update_var;
next;
mes "[Mystic Sword]";
- mes "\"This powder thou shalst need to cast the lightning spell. Throw it up into the air and shout '" + getspellinvocation("lightning-strike") + "', and smite thine enemies with lightning.\"";
+ mes "\"This powder thou shalst need to cast the lightning spell. Throw it up into the air and shout '" + get(.invocation$, "lightning-strike") + "', and smite thine enemies with lightning.\"";
next;
goto L_Farewell;
diff --git a/world/map/npc/015-3/_import.txt b/world/map/npc/015-3/_import.txt
index c0f4fc4f..d1b95191 100644
--- a/world/map/npc/015-3/_import.txt
+++ b/world/map/npc/015-3/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 015-3
npc: npc/015-3/_mobs.txt
+npc: npc/015-3/_nodes.txt
npc: npc/015-3/_warps.txt
npc: npc/015-3/barrier.txt
npc: npc/015-3/katze.txt
diff --git a/world/map/npc/015-3/_mobs.txt b/world/map/npc/015-3/_mobs.txt
index 1b205735..faab0b97 100644
--- a/world/map/npc/015-3/_mobs.txt
+++ b/world/map/npc/015-3/_mobs.txt
@@ -1,28 +1,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Cat's Cave mobs
-015-3,22,25,2,4|monster|Bat|1017,2,100000ms,30000ms,Mob015-3::On1017
-015-3,29,31,2,2|monster|Maggot|1002,2,100000ms,30000ms,Mob015-3::On1002
-015-3,23,19,1,1|monster|Maggot|1002,1,100000ms,30000ms,Mob015-3::On1002
-015-3,40,19,1,1|monster|Spider|1012,1,100000ms,30000ms,Mob015-3::On1012
-
-
-015-3,0,0,0|script|Mob015-3|32767
-{
- end;
-
-On1002:
- set @mobID, 1002;
- callfunc "MobPoints";
- end;
-
-On1012:
- set @mobID, 1012;
- callfunc "MobPoints";
- end;
-
-On1017:
- set @mobID, 1017;
- callfunc "MobPoints";
- end;
-}
+015-3,22,25,2,4|monster|Bat|1017,2,100000ms,30000ms
+015-3,29,31,2,2|monster|Maggot|1002,2,100000ms,30000ms
+015-3,23,19,1,1|monster|Maggot|1002,1,100000ms,30000ms
+015-3,40,19,1,1|monster|Spider|1012,1,100000ms,30000ms
diff --git a/world/map/npc/015-3/_nodes.txt b/world/map/npc/015-3/_nodes.txt
new file mode 100644
index 00000000..e37c6a3c
--- /dev/null
+++ b/world/map/npc/015-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Cat's Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/016-1/_import.txt b/world/map/npc/016-1/_import.txt
index e67bcb01..63751660 100644
--- a/world/map/npc/016-1/_import.txt
+++ b/world/map/npc/016-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 016-1
npc: npc/016-1/_mobs.txt
+npc: npc/016-1/_nodes.txt
npc: npc/016-1/_warps.txt
npc: npc/016-1/gwendolyn.txt
npc: npc/016-1/mapflags.txt
diff --git a/world/map/npc/016-1/_mobs.txt b/world/map/npc/016-1/_mobs.txt
index 58b33a9d..91c4d96c 100644
--- a/world/map/npc/016-1/_mobs.txt
+++ b/world/map/npc/016-1/_mobs.txt
@@ -1,59 +1,13 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Woodland mobs
-016-1,0,0,0,0|monster|CloverPatch|1037,2,100000ms,30000ms,Mob016-1::On1037
-016-1,0,0,0,0|monster|Butterfly|1055,10,30ms,20ms,Mob016-1::On1055
-016-1,0,0,0,0|monster|Squirrel|1038,30,20ms,10ms,Mob016-1::On1038
-016-1,0,0,0,0|monster|Mouboo|1028,5,0ms,0ms,Mob016-1::On1028
-016-1,0,0,0,0|monster|Scorpion|1003,15,0ms,0ms,Mob016-1::On1003
-016-1,0,0,0,0|monster|MauvePlant|1029,3,0ms,0ms,Mob016-1::On1029
-016-1,0,0,0,0|monster|MauvePlant|1029,4,270000ms,180000ms,Mob016-1::On1029
-016-1,0,0,0,0|monster|CobaltPlant|1030,3,0ms,0ms,Mob016-1::On1030
-016-1,0,0,0,0|monster|MauvePlant|1029,4,270000ms,180000ms,Mob016-1::On1029
-016-1,0,0,0,0|monster|Silkworm|1035,7,150000ms,7000ms,Mob016-1::On1035
-
-
-016-1,0,0,0|script|Mob016-1|32767
-{
- end;
-
-On1003:
- set @mobID, 1003;
- callfunc "MobPoints";
- end;
-
-On1028:
- set @mobID, 1028;
- callfunc "MobPoints";
- end;
-
-On1029:
- set @mobID, 1029;
- callfunc "MobPoints";
- end;
-
-On1030:
- set @mobID, 1030;
- callfunc "MobPoints";
- end;
-
-On1035:
- set @mobID, 1035;
- callfunc "MobPoints";
- end;
-
-On1037:
- set @mobID, 1037;
- callfunc "MobPoints";
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1055:
- set @mobID, 1055;
- callfunc "MobPoints";
- end;
-}
+016-1,0,0,0,0|monster|CloverPatch|1037,2,100000ms,30000ms
+016-1,0,0,0,0|monster|Butterfly|1055,10,30ms,20ms
+016-1,0,0,0,0|monster|Squirrel|1038,30,20ms,10ms
+016-1,0,0,0,0|monster|Mouboo|1028,5,0ms,0ms
+016-1,0,0,0,0|monster|Scorpion|1003,15,0ms,0ms
+016-1,0,0,0,0|monster|MauvePlant|1029,3,0ms,0ms
+016-1,0,0,0,0|monster|MauvePlant|1029,4,270000ms,180000ms
+016-1,0,0,0,0|monster|CobaltPlant|1030,3,0ms,0ms
+016-1,0,0,0,0|monster|MauvePlant|1029,4,270000ms,180000ms
+016-1,0,0,0,0|monster|Silkworm|1035,7,150000ms,7000ms
diff --git a/world/map/npc/016-1/_nodes.txt b/world/map/npc/016-1/_nodes.txt
new file mode 100644
index 00000000..12c08221
--- /dev/null
+++ b/world/map/npc/016-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Woodland nodes
+
+// (no nodes)
diff --git a/world/map/npc/016-2/_import.txt b/world/map/npc/016-2/_import.txt
new file mode 100644
index 00000000..14046995
--- /dev/null
+++ b/world/map/npc/016-2/_import.txt
@@ -0,0 +1,6 @@
+// Map 016-2: Gwendolyn's
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+map: 016-2
+npc: npc/016-2/_mobs.txt
+npc: npc/016-2/_nodes.txt
+npc: npc/016-2/_warps.txt
diff --git a/world/map/npc/016-2/_mobs.txt b/world/map/npc/016-2/_mobs.txt
new file mode 100644
index 00000000..069b9d46
--- /dev/null
+++ b/world/map/npc/016-2/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Gwendolyn's mobs
+
diff --git a/world/map/npc/016-2/_nodes.txt b/world/map/npc/016-2/_nodes.txt
new file mode 100644
index 00000000..71dc557d
--- /dev/null
+++ b/world/map/npc/016-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Gwendolyn's nodes
+
+// (no nodes)
diff --git a/world/map/npc/016-2/_warps.txt b/world/map/npc/016-2/_warps.txt
new file mode 100644
index 00000000..f72f8b85
--- /dev/null
+++ b/world/map/npc/016-2/_warps.txt
@@ -0,0 +1,5 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Gwendolyn's warps
+
+016-2,28,32|warp|-1,-1,016-1,84,54
+016-2,26,22|warp|-1,-1,016-1,84,49
diff --git a/world/map/npc/017-1/_import.txt b/world/map/npc/017-1/_import.txt
index ecf2c383..a8bc80c9 100644
--- a/world/map/npc/017-1/_import.txt
+++ b/world/map/npc/017-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 017-1
npc: npc/017-1/_mobs.txt
+npc: npc/017-1/_nodes.txt
npc: npc/017-1/_warps.txt
npc: npc/017-1/flowerpentagram1.txt
npc: npc/017-1/flowerpentagram5.txt
diff --git a/world/map/npc/017-1/_mobs.txt b/world/map/npc/017-1/_mobs.txt
index fe1c40b4..d4e5955a 100644
--- a/world/map/npc/017-1/_mobs.txt
+++ b/world/map/npc/017-1/_mobs.txt
@@ -1,102 +1,21 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Woodland Hills mobs
-017-1,0,0,0,0|monster|CloverPatch|1037,2,0ms,1000ms,Mob017-1::On1037
-017-1,99,30,2,1|monster|CloverPatch|1037,1,150000ms,50000ms,Mob017-1::On1037
-017-1,29,29,19,12|monster|GambogePlant|1031,1,0ms,25000ms,Mob017-1::On1031
-017-1,91,25,76,8|monster|LogHead|1025,3,5000ms,60000ms,Mob017-1::On1025
-017-1,31,48,19,12|monster|LogHead|1025,3,5000ms,60000ms,Mob017-1::On1025
-017-1,0,0,0,0|monster|Butterfly|1055,10,30ms,20ms,Mob017-1::On1055
-017-1,0,0,0,0|monster|Bat|1017,5,0ms,0ms,Mob017-1::On1017
-017-1,0,0,0,0|monster|FireGoblin|1011,5,0ms,0ms,Mob017-1::On1011
-017-1,0,0,0,0|monster|Mouboo|1028,5,0ms,0ms,Mob017-1::On1028
-017-1,0,0,0,0|monster|PinkFlower|1014,5,0ms,0ms,Mob017-1::On1014
-017-1,0,0,0,0|monster|SpikyMushroom|1019,5,0ms,0ms,Mob017-1::On1019
-017-1,0,0,0,0|monster|EvilMushroom|1013,10,0ms,0ms,Mob017-1::On1013
-017-1,0,0,0,0|monster|AlizarinPlant|1032,3,0ms,0ms,Mob017-1::On1032
-017-1,0,0,0,0|monster|GambogePlant|1031,3,0ms,0ms,Mob017-1::On1031
-017-1,0,0,0,0|monster|CobaltPlant|1030,3,0ms,0ms,Mob017-1::On1030
-017-1,0,0,0,0|monster|MauvePlant|1029,5,0ms,0ms,Mob017-1::On1029
-017-1,0,0,0,0|monster|Silkworm|1035,10,0ms,0ms,Mob017-1::On1035
-017-1,0,0,0,0|monster|Squirrel|1038,30,20ms,10ms,Mob017-1::On1038
-
-
-017-1,0,0,0|script|Mob017-1|32767
-{
- end;
-
-On1011:
- set @mobID, 1011;
- callfunc "MobPoints";
- end;
-
-On1013:
- set @mobID, 1013;
- callfunc "MobPoints";
- end;
-
-On1014:
- set @mobID, 1014;
- callfunc "MobPoints";
- end;
-
-On1017:
- set @mobID, 1017;
- callfunc "MobPoints";
- end;
-
-On1019:
- set @mobID, 1019;
- callfunc "MobPoints";
- end;
-
-On1025:
- set @mobID, 1025;
- callfunc "MobPoints";
- end;
-
-On1028:
- set @mobID, 1028;
- callfunc "MobPoints";
- end;
-
-On1029:
- set @mobID, 1029;
- callfunc "MobPoints";
- end;
-
-On1030:
- set @mobID, 1030;
- callfunc "MobPoints";
- end;
-
-On1031:
- set @mobID, 1031;
- callfunc "MobPoints";
- end;
-
-On1032:
- set @mobID, 1032;
- callfunc "MobPoints";
- end;
-
-On1035:
- set @mobID, 1035;
- callfunc "MobPoints";
- end;
-
-On1037:
- set @mobID, 1037;
- callfunc "MobPoints";
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1055:
- set @mobID, 1055;
- callfunc "MobPoints";
- end;
-}
+017-1,0,0,0,0|monster|CloverPatch|1037,2,0ms,1000ms
+017-1,99,30,2,1|monster|CloverPatch|1037,1,150000ms,50000ms
+017-1,29,29,19,12|monster|GambogePlant|1031,1,0ms,25000ms
+017-1,91,25,76,8|monster|LogHead|1025,3,5000ms,60000ms
+017-1,31,48,19,12|monster|LogHead|1025,3,5000ms,60000ms
+017-1,0,0,0,0|monster|Butterfly|1055,10,30ms,20ms
+017-1,0,0,0,0|monster|Bat|1017,5,0ms,0ms
+017-1,0,0,0,0|monster|FireGoblin|1011,5,0ms,0ms
+017-1,0,0,0,0|monster|Mouboo|1028,5,0ms,0ms
+017-1,0,0,0,0|monster|PinkFlower|1014,5,0ms,0ms
+017-1,0,0,0,0|monster|SpikyMushroom|1019,5,0ms,0ms
+017-1,0,0,0,0|monster|EvilMushroom|1013,10,0ms,0ms
+017-1,0,0,0,0|monster|AlizarinPlant|1032,3,0ms,0ms
+017-1,0,0,0,0|monster|GambogePlant|1031,3,0ms,0ms
+017-1,0,0,0,0|monster|CobaltPlant|1030,3,0ms,0ms
+017-1,0,0,0,0|monster|MauvePlant|1029,5,0ms,0ms
+017-1,0,0,0,0|monster|Silkworm|1035,10,0ms,0ms
+017-1,0,0,0,0|monster|Squirrel|1038,30,20ms,10ms
diff --git a/world/map/npc/017-1/_nodes.txt b/world/map/npc/017-1/_nodes.txt
new file mode 100644
index 00000000..13ee4f92
--- /dev/null
+++ b/world/map/npc/017-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Woodland Hills nodes
+
+// (no nodes)
diff --git a/world/map/npc/017-2/_import.txt b/world/map/npc/017-2/_import.txt
index 8f13a370..84618771 100644
--- a/world/map/npc/017-2/_import.txt
+++ b/world/map/npc/017-2/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 017-2
npc: npc/017-2/_mobs.txt
+npc: npc/017-2/_nodes.txt
npc: npc/017-2/_warps.txt
npc: npc/017-2/mapflags.txt
diff --git a/world/map/npc/017-2/_mobs.txt b/world/map/npc/017-2/_mobs.txt
index 7fbf694f..57e93531 100644
--- a/world/map/npc/017-2/_mobs.txt
+++ b/world/map/npc/017-2/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Theater mobs
-
-
-017-2,0,0,0|script|Mob017-2|32767
-{
- end;
-}
diff --git a/world/map/npc/017-2/_nodes.txt b/world/map/npc/017-2/_nodes.txt
new file mode 100644
index 00000000..0e37f1ef
--- /dev/null
+++ b/world/map/npc/017-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Theater nodes
+
+// (no nodes)
diff --git a/world/map/npc/017-3/_import.txt b/world/map/npc/017-3/_import.txt
index c2f9b84d..ec5b651f 100644
--- a/world/map/npc/017-3/_import.txt
+++ b/world/map/npc/017-3/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 017-3
npc: npc/017-3/_mobs.txt
+npc: npc/017-3/_nodes.txt
npc: npc/017-3/_warps.txt
npc: npc/017-3/mapflags.txt
diff --git a/world/map/npc/017-3/_mobs.txt b/world/map/npc/017-3/_mobs.txt
index c498697b..ee92826e 100644
--- a/world/map/npc/017-3/_mobs.txt
+++ b/world/map/npc/017-3/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Woodland Cave mobs
-
-
-017-3,0,0,0|script|Mob017-3|32767
-{
- end;
-}
diff --git a/world/map/npc/017-3/_nodes.txt b/world/map/npc/017-3/_nodes.txt
new file mode 100644
index 00000000..2ebc3af1
--- /dev/null
+++ b/world/map/npc/017-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Woodland Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/017-4/_import.txt b/world/map/npc/017-4/_import.txt
index fcd79a8e..33a00b9b 100644
--- a/world/map/npc/017-4/_import.txt
+++ b/world/map/npc/017-4/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 017-4
npc: npc/017-4/_mobs.txt
+npc: npc/017-4/_nodes.txt
npc: npc/017-4/_warps.txt
npc: npc/017-4/guardingspirit.txt
npc: npc/017-4/mapflags.txt
diff --git a/world/map/npc/017-4/_mobs.txt b/world/map/npc/017-4/_mobs.txt
index 920a1db5..5270e787 100644
--- a/world/map/npc/017-4/_mobs.txt
+++ b/world/map/npc/017-4/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Hideout mobs
-
-
-017-4,0,0,0|script|Mob017-4|32767
-{
- end;
-}
diff --git a/world/map/npc/017-4/_nodes.txt b/world/map/npc/017-4/_nodes.txt
new file mode 100644
index 00000000..357bf9fd
--- /dev/null
+++ b/world/map/npc/017-4/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Hideout nodes
+
+// (no nodes)
diff --git a/world/map/npc/017-4/waric.txt b/world/map/npc/017-4/waric.txt
index f98cb0d0..a0f826e9 100644
--- a/world/map/npc/017-4/waric.txt
+++ b/world/map/npc/017-4/waric.txt
@@ -234,7 +234,7 @@ L_Mushroom:
mes "\"Now that you are a student of mine, I will teach you some spells.\"";
next;
mes "\"We will start with an easy one. I will teach you how to summon a wicked mushroom.\"";
- mes "\"The spell consumes a Small Mushroom and a Dark Crystal. Shove the Dark Crystal into the Small Mushroom and yell " + getspellinvocation("summon-wickedmushroom") +".\"";
+ mes "\"The spell consumes a Small Mushroom and a Dark Crystal. Shove the Dark Crystal into the Small Mushroom and yell " + get(.invocation$, "smwmushroom") +".\"";
next;
mes "\"A wicked mushroom will appear to fight for you.\"";
set OrumQuest, 37;
@@ -254,7 +254,7 @@ L_Next4:
next;
mes "\"You have to use two roots for this spell. First you have to take one root and break off all the root hair. Shape it into a stick, if you will. Then put it on top of the other root and form an arrow-like structure.\"";
next;
- mes "\"Once this is done you have to throw it in the air and scream " + getspellinvocation("toxic-dart") + " and the two roots will turn into toxic darts, a projectile you can throw.\"";
+ mes "\"Once this is done you have to throw it in the air and scream " + get(.invocation$, "toxic-dart") + " and the two roots will turn into toxic darts, a projectile you can throw.\"";
next;
mes "\"If you want to learn more, come back later.\"";
set OrumQuest, 38;
@@ -312,7 +312,7 @@ L_SnakesSpell:
L_Next7:
mes "[Waric]";
- mes "\"I said " + getspellinvocation("summon-snakes") + ".\"";
+ mes "\"I said " + get(.invocation$, "summon-snakes") + ".\"";
mes "\"Have fun with those spells and use them to cause hate, anger and death.\"";
set OrumQuest, 41;
goto L_Close;
@@ -341,9 +341,9 @@ L_MoreMagic:
L_Next8:
mes "[Waric]";
mes "\"Yes, of course.\"";
- mes "\"To summon the snakes use " + getspellinvocation("summon-snakes") + ".\"";
- mes "\"Say " + getspellinvocation("toxic-dart") + " to make your roots into toxic darts.\"";
- mes "\"And the first spell, to summon wicked mushrooms, is " + getspellinvocation("summon-wickedmushroom") + ".\"";
+ mes "\"To summon the snakes use " + get(.invocation$, "summon-snakes") + ".\"";
+ mes "\"Say " + get(.invocation$, "toxic-dart") + " to make your roots into toxic darts.\"";
+ mes "\"And the first spell, to summon wicked mushrooms, is " + get(.invocation$, "summon-wickedmushroom") + ".\"";
next;
mes "\"Now leave. Spread chaos with the spells I have taught you!\"";
goto L_Close;
diff --git a/world/map/npc/017-9/_import.txt b/world/map/npc/017-9/_import.txt
index 55b1495e..06bab503 100644
--- a/world/map/npc/017-9/_import.txt
+++ b/world/map/npc/017-9/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 017-9
npc: npc/017-9/_mobs.txt
+npc: npc/017-9/_nodes.txt
npc: npc/017-9/_warps.txt
npc: npc/017-9/mapflags.txt
npc: npc/017-9/npcs.txt
diff --git a/world/map/npc/017-9/_mobs.txt b/world/map/npc/017-9/_mobs.txt
index 9f351648..d8d6de99 100644
--- a/world/map/npc/017-9/_mobs.txt
+++ b/world/map/npc/017-9/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// GM Lounge mobs
-
-
-017-9,0,0,0|script|Mob017-9|32767
-{
- end;
-}
diff --git a/world/map/npc/017-9/_nodes.txt b/world/map/npc/017-9/_nodes.txt
new file mode 100644
index 00000000..78aae663
--- /dev/null
+++ b/world/map/npc/017-9/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// GM Lounge nodes
+
+// (no nodes)
diff --git a/world/map/npc/017-9/npcs.txt b/world/map/npc/017-9/npcs.txt
index b14428c5..2db61d1f 100644
--- a/world/map/npc/017-9/npcs.txt
+++ b/world/map/npc/017-9/npcs.txt
@@ -1,6 +1,6 @@
009-1,42,43,0|script|#SecretDoor|32767,0,0
{
- if (getgmlevel() < 20 && !debug) end;
+ if (GM < MAP_LOUNGE && GM < G_SYSOP && !debug) end;
gmlog "@warp 017-9";
warp "017-9", 27, 23;
end;
@@ -8,7 +8,7 @@
020-1,60,76,0|script|#SecretDoor2|32767,0,0
{
- if (getgmlevel() < 20 && !debug) end;
+ if (GM < MAP_LOUNGE && GM < G_SYSOP && !debug) end;
gmlog "@warp 017-9";
warp "017-9", 29, 21;
end;
@@ -16,7 +16,7 @@
001-1,54,118,0|script|#SecretDoor3|32767,0,0
{
- if (getgmlevel() < 20 && !debug) end;
+ if (GM < MAP_LOUNGE && GM < G_SYSOP && !debug) end;
gmlog "@warp 017-9";
warp "017-9", 21, 21;
end;
@@ -24,7 +24,7 @@
027-2,118,111,0|script|#SecretDoor4|32767,0,0
{
- if (getgmlevel() < 20 && !debug) end;
+ if (GM < MAP_LOUNGE && GM < G_SYSOP && !debug) end;
gmlog "@warp 017-9";
warp "017-9", 31, 21;
end;
@@ -32,15 +32,8 @@
029-1,34,96,0|script|#SecretDoor5|32767,0,0
{
- if (getgmlevel() < 20 && !debug) end;
+ if (GM < MAP_LOUNGE && GM < G_SYSOP && !debug) end;
gmlog "@warp 017-9";
warp "017-9", 23, 21;
end;
}
-
-017-9,30,28,0|script|Numa|393
-{
- set @from_npc, 1;
- callfunc "SuperDebug";
- end;
-}
diff --git a/world/map/npc/018-1/_import.txt b/world/map/npc/018-1/_import.txt
index 087fe43e..bf00cad9 100644
--- a/world/map/npc/018-1/_import.txt
+++ b/world/map/npc/018-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 018-1
npc: npc/018-1/_mobs.txt
+npc: npc/018-1/_nodes.txt
npc: npc/018-1/_warps.txt
npc: npc/018-1/flowerpentagram3.txt
npc: npc/018-1/mapflags.txt
diff --git a/world/map/npc/018-1/_mobs.txt b/world/map/npc/018-1/_mobs.txt
index 942a6d09..ced34aa9 100644
--- a/world/map/npc/018-1/_mobs.txt
+++ b/world/map/npc/018-1/_mobs.txt
@@ -1,101 +1,30 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Woodland Mining Camp mobs
-018-1,136,79,9,41|monster|SeaSlime|1033,10,100000ms,30000ms,Mob018-1::On1033
-018-1,108,87,53,25|monster|ManaBug|1131,10,100000ms,30000ms,Mob018-1::On1131
-018-1,116,44,6,7|monster|SeaSlime|1033,3,100000ms,30000ms,Mob018-1::On1033
-018-1,119,56,13,6|monster|PinkFlower|1014,2,100000ms,30000ms,Mob018-1::On1014
-018-1,175,28,17,19|monster|JackO|1022,1,180000ms,120000ms,Mob018-1::On1022
-018-1,78,59,3,1|monster|YellowSlime|1007,1,100000ms,30000ms,Mob018-1::On1007
-018-1,57,63,14,7|monster|Silkworm|1035,2,100000ms,30000ms,Mob018-1::On1035
-018-1,43,63,31,28|monster|Bat|1017,10,100000ms,30000ms,Mob018-1::On1017
-018-1,134,39,18,10|monster|GrassSnake|1034,4,100000ms,50000ms,Mob018-1::On1034
-018-1,124,42,9,11|monster|GrassSnake|1034,2,100000ms,50000ms,Mob018-1::On1034
-018-1,124,19,22,9|monster|GrassSnake|1034,3,100000ms,50000ms,Mob018-1::On1034
-018-1,122,29,19,9|monster|GrassSnake|1034,2,100000ms,50000ms,Mob018-1::On1034
-018-1,149,45,10,8|monster|Bat|1017,5,100000ms,30000ms,Mob018-1::On1017
-018-1,169,47,20,10|monster|RedSlime|1008,4,120000ms,30000ms,Mob018-1::On1008
-018-1,136,49,13,8|monster|Bat|1017,4,100000ms,30000ms,Mob018-1::On1017
-018-1,166,49,13,9|monster|CloverPatch|1037,1,100000ms,30000ms,Mob018-1::On1037
-018-1,111,62,5,2|monster|Silkworm|1035,1,60000ms,30000ms,Mob018-1::On1035
-018-1,117,50,4,3|monster|SeaSlime|1033,1,120000ms,60000ms,Mob018-1::On1033
-018-1,96,47,18,11|monster|RedSlime|1008,3,100000ms,50000ms,Mob018-1::On1008
-018-1,106,52,15,6|monster|CobaltPlant|1030,1,240000ms,120000ms,Mob018-1::On1030
-018-1,78,55,37,6|monster|RedSlime|1008,7,100000ms,50000ms,Mob018-1::On1008
-018-1,145,24,10,9|monster|RedSlime|1008,3,100000ms,50000ms,Mob018-1::On1008
-018-1,68,89,14,17|monster|Bat|1017,3,100000ms,50000ms,Mob018-1::On1017
-018-1,160,31,11,18|monster|RedSlime|1008,5,100000ms,50000ms,Mob018-1::On1008
-018-1,0,0,0,0|monster|CloverPatch|1037,2,0ms,1000ms,Mob018-1::On1037
-018-1,0,0,0,0|monster|Butterfly|1055,20,30ms,20ms,Mob018-1::On1055
-018-1,134,80,14,39|monster|Maggot|1002,15,30ms,0ms,Mob018-1::On1002
-
-
-018-1,0,0,0|script|Mob018-1|32767
-{
- end;
-
-On1002:
- set @mobID, 1002;
- callfunc "MobPoints";
- end;
-
-On1007:
- set @mobID, 1007;
- callfunc "MobPoints";
- end;
-
-On1008:
- set @mobID, 1008;
- callfunc "MobPoints";
- end;
-
-On1014:
- set @mobID, 1014;
- callfunc "MobPoints";
- end;
-
-On1017:
- set @mobID, 1017;
- callfunc "MobPoints";
- end;
-
-On1022:
- set @mobID, 1022;
- callfunc "MobPoints";
- end;
-
-On1030:
- set @mobID, 1030;
- callfunc "MobPoints";
- end;
-
-On1033:
- set @mobID, 1033;
- callfunc "MobPoints";
- end;
-
-On1034:
- set @mobID, 1034;
- callfunc "MobPoints";
- end;
-
-On1035:
- set @mobID, 1035;
- callfunc "MobPoints";
- end;
-
-On1037:
- set @mobID, 1037;
- callfunc "MobPoints";
- end;
-
-On1055:
- set @mobID, 1055;
- callfunc "MobPoints";
- end;
-
-On1131:
- set @mobID, 1131;
- callfunc "MobPoints";
- end;
-}
+018-1,136,79,9,41|monster|SeaSlime|1033,10,100000ms,30000ms
+018-1,108,87,53,25|monster|ManaBug|1131,10,100000ms,30000ms
+018-1,116,44,6,7|monster|SeaSlime|1033,3,100000ms,30000ms
+018-1,119,56,13,6|monster|PinkFlower|1014,2,100000ms,30000ms
+018-1,175,28,17,19|monster|JackO|1022,1,180000ms,120000ms
+018-1,78,59,3,1|monster|YellowSlime|1007,1,100000ms,30000ms
+018-1,57,63,14,7|monster|Silkworm|1035,2,100000ms,30000ms
+018-1,43,63,31,28|monster|Bat|1017,10,100000ms,30000ms
+018-1,134,39,18,10|monster|GrassSnake|1034,4,100000ms,50000ms
+018-1,124,42,9,11|monster|GrassSnake|1034,2,100000ms,50000ms
+018-1,124,19,22,9|monster|GrassSnake|1034,3,100000ms,50000ms
+018-1,122,29,19,9|monster|GrassSnake|1034,2,100000ms,50000ms
+018-1,149,45,10,8|monster|Bat|1017,5,100000ms,30000ms
+018-1,169,47,20,10|monster|RedSlime|1008,4,120000ms,30000ms
+018-1,136,49,13,8|monster|Bat|1017,4,100000ms,30000ms
+018-1,166,49,13,9|monster|CloverPatch|1037,1,100000ms,30000ms
+018-1,111,62,5,2|monster|Silkworm|1035,1,60000ms,30000ms
+018-1,117,50,4,3|monster|SeaSlime|1033,1,120000ms,60000ms
+018-1,96,47,18,11|monster|RedSlime|1008,3,100000ms,50000ms
+018-1,106,52,15,6|monster|CobaltPlant|1030,1,240000ms,120000ms
+018-1,78,55,37,6|monster|RedSlime|1008,7,100000ms,50000ms
+018-1,145,24,10,9|monster|RedSlime|1008,3,100000ms,50000ms
+018-1,68,89,14,17|monster|Bat|1017,3,100000ms,50000ms
+018-1,160,31,11,18|monster|RedSlime|1008,5,100000ms,50000ms
+018-1,0,0,0,0|monster|CloverPatch|1037,2,0ms,1000ms
+018-1,0,0,0,0|monster|Butterfly|1055,20,30ms,20ms
+018-1,134,80,14,39|monster|Maggot|1002,15,30ms,0ms
diff --git a/world/map/npc/018-1/_nodes.txt b/world/map/npc/018-1/_nodes.txt
new file mode 100644
index 00000000..9ac98a33
--- /dev/null
+++ b/world/map/npc/018-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Woodland Mining Camp nodes
+
+// (no nodes)
diff --git a/world/map/npc/018-2/_import.txt b/world/map/npc/018-2/_import.txt
index 6c8fcb00..93025f9d 100644
--- a/world/map/npc/018-2/_import.txt
+++ b/world/map/npc/018-2/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 018-2
npc: npc/018-2/_mobs.txt
+npc: npc/018-2/_nodes.txt
npc: npc/018-2/_warps.txt
npc: npc/018-2/angus.txt
npc: npc/018-2/books.txt
diff --git a/world/map/npc/018-2/_mobs.txt b/world/map/npc/018-2/_mobs.txt
index fb451a92..13188ee7 100644
--- a/world/map/npc/018-2/_mobs.txt
+++ b/world/map/npc/018-2/_mobs.txt
@@ -1,15 +1,4 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Woodland Mining Camp Indoor mobs
-018-2,114,21,4,3|monster|YellowSlime|1007,1,100000ms,30000ms,Mob018-2::On1007
-
-
-018-2,0,0,0|script|Mob018-2|32767
-{
- end;
-
-On1007:
- set @mobID, 1007;
- callfunc "MobPoints";
- end;
-}
+018-2,114,21,4,3|monster|YellowSlime|1007,1,100000ms,30000ms
diff --git a/world/map/npc/018-2/_nodes.txt b/world/map/npc/018-2/_nodes.txt
new file mode 100644
index 00000000..93459a98
--- /dev/null
+++ b/world/map/npc/018-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Woodland Mining Camp Indoor nodes
+
+// (no nodes)
diff --git a/world/map/npc/018-3/_import.txt b/world/map/npc/018-3/_import.txt
index de5fbfb1..1845c3d1 100644
--- a/world/map/npc/018-3/_import.txt
+++ b/world/map/npc/018-3/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 018-3
npc: npc/018-3/_mobs.txt
+npc: npc/018-3/_nodes.txt
npc: npc/018-3/_warps.txt
npc: npc/018-3/bookcase.txt
npc: npc/018-3/evil-obelisk.txt
diff --git a/world/map/npc/018-3/_mobs.txt b/world/map/npc/018-3/_mobs.txt
index 46457878..57c48654 100644
--- a/world/map/npc/018-3/_mobs.txt
+++ b/world/map/npc/018-3/_mobs.txt
@@ -1,87 +1,26 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Northern Mines mobs
-018-3,48,29,57,19|monster|Bat|1017,10,100000ms,30000ms,Mob018-3::On1017
-018-3,35,144,31,48|monster|EvilMushroom|1013,10,120000ms,30000ms,Mob018-3::On1013
-018-3,35,65,28,22|monster|Spider|1012,20,100000ms,50000ms,Mob018-3::On1012
-018-3,28,157,3,2|monster|PinkFlower|1014,1,60000ms,30000ms,Mob018-3::On1014
-018-3,99,111,17,41|monster|YellowSlime|1007,10,90000ms,30000ms,Mob018-3::On1007
-018-3,134,140,12,8|monster|Maggot|1002,3,80000ms,40000ms,Mob018-3::On1002
-018-3,82,149,73,26|monster|Spider|1012,8,300000ms,120000ms,Mob018-3::On1012
-018-3,102,172,131,13|monster|BlackScorpion|1009,20,60000ms,10000ms,Mob018-3::On1009
-018-3,174,37,10,31|monster|YellowSlime|1007,5,180000ms,120000ms,Mob018-3::On1007
-018-3,148,148,13,24|monster|Bat|1017,3,180000ms,40000ms,Mob018-3::On1017
-018-3,136,87,21,7|monster|YellowSlime|1007,6,80000ms,40000ms,Mob018-3::On1007
-018-3,81,77,27,21|monster|RedSlime|1008,15,80000ms,40000ms,Mob018-3::On1008
-018-3,111,80,5,6|monster|BlackScorpion|1009,10,80000ms,40000ms,Mob018-3::On1009
-018-3,175,122,5,40|monster|Snake|1010,15,40000ms,20000ms,Mob018-3::On1010
-018-3,172,94,17,17|monster|RedSlime|1008,10,60000ms,30000ms,Mob018-3::On1008
-018-3,59,95,11,8|monster|Spider|1012,15,60000ms,30000ms,Mob018-3::On1012
-018-3,77,92,23,7|monster|BlackScorpion|1009,15,60000ms,30000ms,Mob018-3::On1009
-018-3,94,55,16,8|monster|Snake|1010,5,60000ms,30000ms,Mob018-3::On1010
-018-3,133,39,12,17|monster|Spider|1012,10,60000ms,30000ms,Mob018-3::On1012
-018-3,111,33,30,16|monster|Snake|1010,15,60000ms,30000ms,Mob018-3::On1010
-018-3,68,101,5,4|monster|CaveSnake|1021,4,60000ms,30000ms,Mob018-3::On1021
-018-3,153,96,18,17|monster|CaveMaggot|1056,4,100000ms,30000ms,Mob018-3::On1056
-018-3,99,99,17,17|monster|CaveMaggot|1056,4,100000ms,30000ms,Mob018-3::On1056
-
-
-018-3,0,0,0|script|Mob018-3|32767
-{
- end;
-
-On1002:
- set @mobID, 1002;
- callfunc "MobPoints";
- end;
-
-On1007:
- set @mobID, 1007;
- callfunc "MobPoints";
- end;
-
-On1008:
- set @mobID, 1008;
- callfunc "MobPoints";
- end;
-
-On1009:
- set @mobID, 1009;
- callfunc "MobPoints";
- end;
-
-On1010:
- set @mobID, 1010;
- callfunc "MobPoints";
- end;
-
-On1012:
- set @mobID, 1012;
- callfunc "MobPoints";
- end;
-
-On1013:
- set @mobID, 1013;
- callfunc "MobPoints";
- end;
-
-On1014:
- set @mobID, 1014;
- callfunc "MobPoints";
- end;
-
-On1017:
- set @mobID, 1017;
- callfunc "MobPoints";
- end;
-
-On1021:
- set @mobID, 1021;
- callfunc "MobPoints";
- end;
-
-On1056:
- set @mobID, 1056;
- callfunc "MobPoints";
- end;
-}
+018-3,48,29,57,19|monster|Bat|1017,10,100000ms,30000ms
+018-3,35,144,31,48|monster|EvilMushroom|1013,10,120000ms,30000ms
+018-3,35,65,28,22|monster|Spider|1012,20,100000ms,50000ms
+018-3,28,157,3,2|monster|PinkFlower|1014,1,60000ms,30000ms
+018-3,99,111,17,41|monster|YellowSlime|1007,10,90000ms,30000ms
+018-3,134,140,12,8|monster|Maggot|1002,3,80000ms,40000ms
+018-3,82,149,73,26|monster|Spider|1012,8,300000ms,120000ms
+018-3,102,172,131,13|monster|BlackScorpion|1009,20,60000ms,10000ms
+018-3,174,37,10,31|monster|YellowSlime|1007,5,180000ms,120000ms
+018-3,148,148,13,24|monster|Bat|1017,3,180000ms,40000ms
+018-3,136,87,21,7|monster|YellowSlime|1007,6,80000ms,40000ms
+018-3,81,77,27,21|monster|RedSlime|1008,15,80000ms,40000ms
+018-3,111,80,5,6|monster|BlackScorpion|1009,10,80000ms,40000ms
+018-3,175,122,5,40|monster|Snake|1010,15,40000ms,20000ms
+018-3,172,94,17,17|monster|RedSlime|1008,10,60000ms,30000ms
+018-3,59,95,11,8|monster|Spider|1012,15,60000ms,30000ms
+018-3,77,92,23,7|monster|BlackScorpion|1009,15,60000ms,30000ms
+018-3,94,55,16,8|monster|Snake|1010,5,60000ms,30000ms
+018-3,133,39,12,17|monster|Spider|1012,10,60000ms,30000ms
+018-3,111,33,30,16|monster|Snake|1010,15,60000ms,30000ms
+018-3,68,101,5,4|monster|CaveSnake|1021,4,60000ms,30000ms
+018-3,153,96,18,17|monster|CaveMaggot|1056,4,100000ms,30000ms
+018-3,99,99,17,17|monster|CaveMaggot|1056,4,100000ms,30000ms
diff --git a/world/map/npc/018-3/_nodes.txt b/world/map/npc/018-3/_nodes.txt
new file mode 100644
index 00000000..833941e7
--- /dev/null
+++ b/world/map/npc/018-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Northern Mines nodes
+
+// (no nodes)
diff --git a/world/map/npc/019-1/_import.txt b/world/map/npc/019-1/_import.txt
index e462165a..9eeea2c7 100644
--- a/world/map/npc/019-1/_import.txt
+++ b/world/map/npc/019-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 019-1
npc: npc/019-1/_mobs.txt
+npc: npc/019-1/_nodes.txt
npc: npc/019-1/_warps.txt
npc: npc/019-1/mapflags.txt
npc: npc/019-1/santa_helper.txt
diff --git a/world/map/npc/019-1/_mobs.txt b/world/map/npc/019-1/_mobs.txt
index 505d18df..28f76d9a 100644
--- a/world/map/npc/019-1/_mobs.txt
+++ b/world/map/npc/019-1/_mobs.txt
@@ -1,33 +1,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// snow Field mobs
-019-1,0,0,0,0|monster|Fluffy|1020,50,100000ms,30000ms,Mob019-1::On1020
-019-1,0,0,0,0|monster|Reinboo|1094,4,100000ms,30000ms,Mob019-1::On1094
-019-1,0,0,0,0|monster|WhiteBell|1095,5,100000ms,30000ms,Mob019-1::On1095
-019-1,0,0,0,0|monster|Santaboo|1112,4,100000ms,30000ms,Mob019-1::On1112
-
-
-019-1,0,0,0|script|Mob019-1|32767
-{
- end;
-
-On1020:
- set @mobID, 1020;
- callfunc "MobPoints";
- end;
-
-On1094:
- set @mobID, 1094;
- callfunc "MobPoints";
- end;
-
-On1095:
- set @mobID, 1095;
- callfunc "MobPoints";
- end;
-
-On1112:
- set @mobID, 1112;
- callfunc "MobPoints";
- end;
-}
+019-1,0,0,0,0|monster|Fluffy|1020,50,100000ms,30000ms
+019-1,0,0,0,0|monster|Reinboo|1094,4,100000ms,30000ms
+019-1,0,0,0,0|monster|WhiteBell|1095,5,100000ms,30000ms
+019-1,0,0,0,0|monster|Santaboo|1112,4,100000ms,30000ms
diff --git a/world/map/npc/019-1/_nodes.txt b/world/map/npc/019-1/_nodes.txt
new file mode 100644
index 00000000..091beb4e
--- /dev/null
+++ b/world/map/npc/019-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// snow Field nodes
+
+// (no nodes)
diff --git a/world/map/npc/019-3/_import.txt b/world/map/npc/019-3/_import.txt
index eca5ede9..d7547724 100644
--- a/world/map/npc/019-3/_import.txt
+++ b/world/map/npc/019-3/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 019-3
npc: npc/019-3/_mobs.txt
+npc: npc/019-3/_nodes.txt
npc: npc/019-3/_warps.txt
npc: npc/019-3/mapflags.txt
diff --git a/world/map/npc/019-3/_mobs.txt b/world/map/npc/019-3/_mobs.txt
index 26a7771a..3ba50e42 100644
--- a/world/map/npc/019-3/_mobs.txt
+++ b/world/map/npc/019-3/_mobs.txt
@@ -1,21 +1,5 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Snow Cave mobs
-019-3,0,4,0,0|monster|Moggun|1061,10,100000ms,30000ms,Mob019-3::On1061
-019-3,0,4,0,0|monster|Bat|1017,50,100000ms,30000ms,Mob019-3::On1017
-
-
-019-3,0,0,0|script|Mob019-3|32767
-{
- end;
-
-On1017:
- set @mobID, 1017;
- callfunc "MobPoints";
- end;
-
-On1061:
- set @mobID, 1061;
- callfunc "MobPoints";
- end;
-}
+019-3,0,4,0,0|monster|Moggun|1061,10,100000ms,30000ms
+019-3,0,4,0,0|monster|Bat|1017,50,100000ms,30000ms
diff --git a/world/map/npc/019-3/_nodes.txt b/world/map/npc/019-3/_nodes.txt
new file mode 100644
index 00000000..97eefd57
--- /dev/null
+++ b/world/map/npc/019-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Snow Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/019-4/_import.txt b/world/map/npc/019-4/_import.txt
index 0d16081c..f9b94579 100644
--- a/world/map/npc/019-4/_import.txt
+++ b/world/map/npc/019-4/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 019-4
npc: npc/019-4/_mobs.txt
+npc: npc/019-4/_nodes.txt
npc: npc/019-4/_warps.txt
npc: npc/019-4/mapflags.txt
diff --git a/world/map/npc/019-4/_mobs.txt b/world/map/npc/019-4/_mobs.txt
index 43717e0d..6a23a017 100644
--- a/world/map/npc/019-4/_mobs.txt
+++ b/world/map/npc/019-4/_mobs.txt
@@ -1,33 +1,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Snow Cave mobs
-019-4,0,0,0,0|monster|Moggun|1061,12,45000ms,30000ms,Mob019-4::On1061
-019-4,47,67,15,9|monster|WhiteSlime|1093,5,45000ms,45000ms,Mob019-4::On1093
-019-4,0,0,0,0|monster|Bat|1017,15,45000ms,25000ms,Mob019-4::On1017
-019-4,0,0,0,0|monster|BlueSlime|1091,7,45000ms,30000ms,Mob019-4::On1091
-
-
-019-4,0,0,0|script|Mob019-4|32767
-{
- end;
-
-On1017:
- set @mobID, 1017;
- callfunc "MobPoints";
- end;
-
-On1061:
- set @mobID, 1061;
- callfunc "MobPoints";
- end;
-
-On1091:
- set @mobID, 1091;
- callfunc "MobPoints";
- end;
-
-On1093:
- set @mobID, 1093;
- callfunc "MobPoints";
- end;
-}
+019-4,0,0,0,0|monster|Moggun|1061,12,45000ms,30000ms
+019-4,47,67,15,9|monster|WhiteSlime|1093,5,45000ms,45000ms
+019-4,0,0,0,0|monster|Bat|1017,15,45000ms,25000ms
+019-4,0,0,0,0|monster|BlueSlime|1091,7,45000ms,30000ms
diff --git a/world/map/npc/019-4/_nodes.txt b/world/map/npc/019-4/_nodes.txt
new file mode 100644
index 00000000..97eefd57
--- /dev/null
+++ b/world/map/npc/019-4/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Snow Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/020-1/_import.txt b/world/map/npc/020-1/_import.txt
index b85bd34f..a48fad5d 100644
--- a/world/map/npc/020-1/_import.txt
+++ b/world/map/npc/020-1/_import.txt
@@ -3,6 +3,7 @@
map: 020-1
npc: npc/020-1/KrickKrackKrock.txt
npc: npc/020-1/_mobs.txt
+npc: npc/020-1/_nodes.txt
npc: npc/020-1/_warps.txt
npc: npc/020-1/dock.txt
npc: npc/020-1/mapflags.txt
diff --git a/world/map/npc/020-1/_mobs.txt b/world/map/npc/020-1/_mobs.txt
index da1ffd27..7890d424 100644
--- a/world/map/npc/020-1/_mobs.txt
+++ b/world/map/npc/020-1/_mobs.txt
@@ -1,15 +1,4 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Nivalis mobs
-020-1,0,0,0,0|monster|WhiteBell|1095,3,100000ms,30000ms,Mob020-1::On1095
-
-
-020-1,0,0,0|script|Mob020-1|32767
-{
- end;
-
-On1095:
- set @mobID, 1095;
- callfunc "MobPoints";
- end;
-}
+020-1,0,0,0,0|monster|WhiteBell|1095,3,100000ms,30000ms
diff --git a/world/map/npc/020-1/_nodes.txt b/world/map/npc/020-1/_nodes.txt
new file mode 100644
index 00000000..07b204f3
--- /dev/null
+++ b/world/map/npc/020-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Nivalis nodes
+
+// (no nodes)
diff --git a/world/map/npc/020-2/_import.txt b/world/map/npc/020-2/_import.txt
index 5ed442f3..e8d75c4c 100644
--- a/world/map/npc/020-2/_import.txt
+++ b/world/map/npc/020-2/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 020-2
npc: npc/020-2/_mobs.txt
+npc: npc/020-2/_nodes.txt
npc: npc/020-2/_warps.txt
npc: npc/020-2/baktar.txt
npc: npc/020-2/banker.txt
diff --git a/world/map/npc/020-2/_mobs.txt b/world/map/npc/020-2/_mobs.txt
index 62e1f438..70eb4f73 100644
--- a/world/map/npc/020-2/_mobs.txt
+++ b/world/map/npc/020-2/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Nivalis Indoor mobs
-
-
-020-2,0,0,0|script|Mob020-2|32767
-{
- end;
-}
diff --git a/world/map/npc/020-2/_nodes.txt b/world/map/npc/020-2/_nodes.txt
new file mode 100644
index 00000000..29018595
--- /dev/null
+++ b/world/map/npc/020-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Nivalis Indoor nodes
+
+// (no nodes)
diff --git a/world/map/npc/020-3/_import.txt b/world/map/npc/020-3/_import.txt
index 8560e23d..b1624874 100644
--- a/world/map/npc/020-3/_import.txt
+++ b/world/map/npc/020-3/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 020-3
npc: npc/020-3/_mobs.txt
+npc: npc/020-3/_nodes.txt
npc: npc/020-3/_warps.txt
npc: npc/020-3/mapflags.txt
diff --git a/world/map/npc/020-3/_mobs.txt b/world/map/npc/020-3/_mobs.txt
index edb95973..2e7ed4a0 100644
--- a/world/map/npc/020-3/_mobs.txt
+++ b/world/map/npc/020-3/_mobs.txt
@@ -1,23 +1,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Ice cave mobs
-020-3,40,36,29,4|monster|Bat|1017,1,100000ms,30000ms,Mob020-3::On1017
-020-3,40,49,34,7|monster|Pinkie|1018,1,100000ms,30000ms,Mob020-3::On1018
-020-3,0,0,0,0|monster|Bat|1017,20,0ms,0ms,Mob020-3::On1017
-020-3,0,0,0,0|monster|Pinkie|1018,10,0ms,0ms,Mob020-3::On1018
-
-
-020-3,0,0,0|script|Mob020-3|32767
-{
- end;
-
-On1017:
- set @mobID, 1017;
- callfunc "MobPoints";
- end;
-
-On1018:
- set @mobID, 1018;
- callfunc "MobPoints";
- end;
-}
+020-3,40,36,29,4|monster|Bat|1017,1,100000ms,30000ms
+020-3,40,49,34,7|monster|Pinkie|1018,1,100000ms,30000ms
+020-3,0,0,0,0|monster|Bat|1017,20,0ms,0ms
+020-3,0,0,0,0|monster|Pinkie|1018,10,0ms,0ms
diff --git a/world/map/npc/020-3/_nodes.txt b/world/map/npc/020-3/_nodes.txt
new file mode 100644
index 00000000..361b2f86
--- /dev/null
+++ b/world/map/npc/020-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Ice cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/021-3/_import.txt b/world/map/npc/021-3/_import.txt
index c83d6433..33b9119e 100644
--- a/world/map/npc/021-3/_import.txt
+++ b/world/map/npc/021-3/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 021-3
npc: npc/021-3/_mobs.txt
+npc: npc/021-3/_nodes.txt
npc: npc/021-3/_warps.txt
npc: npc/021-3/mapflags.txt
diff --git a/world/map/npc/021-3/_mobs.txt b/world/map/npc/021-3/_mobs.txt
index 8d6c2591..75449889 100644
--- a/world/map/npc/021-3/_mobs.txt
+++ b/world/map/npc/021-3/_mobs.txt
@@ -1,44 +1,13 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Central Tulimshar Sewers mobs
-021-3,120,38,11,8|monster|CaveMaggot|1056,5,100000ms,30000ms,Mob021-3::On1056
-021-3,103,58,8,3|monster|CaveMaggot|1056,5,100000ms,30000ms,Mob021-3::On1056
-021-3,80,98,34,31|monster|CaveMaggot|1056,5,100000ms,30000ms,Mob021-3::On1056
-021-3,129,82,8,3|monster|CaveMaggot|1056,5,100000ms,30000ms,Mob021-3::On1056
-021-3,140,38,16,8|monster|AngryFireGoblin|1108,3,100000ms,30000ms,Mob021-3::On1108
-021-3,79,98,33,31|monster|BlackScorpion|1009,4,100000ms,1800000ms,Mob021-3::On1009
-021-3,52,53,2,17|monster|GreenSlime|1005,4,40000ms,50000ms,Mob021-3::On1005
-021-3,93,31,28,22|monster|SeaSlime|1033,6,100000ms,30000ms,Mob021-3::On1033
-021-3,121,128,8,3|monster|CaveMaggot|1056,5,100000ms,30000ms,Mob021-3::On1056
-021-3,47,139,8,3|monster|CaveMaggot|1056,5,100000ms,30000ms,Mob021-3::On1056
-
-
-021-3,0,0,0|script|Mob021-3|32767
-{
- end;
-
-On1005:
- set @mobID, 1005;
- callfunc "MobPoints";
- end;
-
-On1009:
- set @mobID, 1009;
- callfunc "MobPoints";
- end;
-
-On1033:
- set @mobID, 1033;
- callfunc "MobPoints";
- end;
-
-On1056:
- set @mobID, 1056;
- callfunc "MobPoints";
- end;
-
-On1108:
- set @mobID, 1108;
- callfunc "MobPoints";
- end;
-}
+021-3,120,38,11,8|monster|CaveMaggot|1056,5,100000ms,30000ms
+021-3,103,58,8,3|monster|CaveMaggot|1056,5,100000ms,30000ms
+021-3,80,98,34,31|monster|CaveMaggot|1056,5,100000ms,30000ms
+021-3,129,82,8,3|monster|CaveMaggot|1056,5,100000ms,30000ms
+021-3,140,38,16,8|monster|AngryFireGoblin|1108,3,100000ms,30000ms
+021-3,79,98,33,31|monster|BlackScorpion|1009,4,100000ms,1800000ms
+021-3,52,53,2,17|monster|GreenSlime|1005,4,40000ms,50000ms
+021-3,93,31,28,22|monster|SeaSlime|1033,6,100000ms,30000ms
+021-3,121,128,8,3|monster|CaveMaggot|1056,5,100000ms,30000ms
+021-3,47,139,8,3|monster|CaveMaggot|1056,5,100000ms,30000ms
diff --git a/world/map/npc/021-3/_nodes.txt b/world/map/npc/021-3/_nodes.txt
new file mode 100644
index 00000000..f55e37ec
--- /dev/null
+++ b/world/map/npc/021-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Central Tulimshar Sewers nodes
+
+// (no nodes)
diff --git a/world/map/npc/025-1/_import.txt b/world/map/npc/025-1/_import.txt
index a5530f31..9c4af1aa 100644
--- a/world/map/npc/025-1/_import.txt
+++ b/world/map/npc/025-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 025-1
npc: npc/025-1/_mobs.txt
+npc: npc/025-1/_nodes.txt
npc: npc/025-1/_warps.txt
npc: npc/025-1/barrier.txt
npc: npc/025-1/mapflags.txt
diff --git a/world/map/npc/025-1/_mobs.txt b/world/map/npc/025-1/_mobs.txt
index 2a2d27ac..259f0568 100644
--- a/world/map/npc/025-1/_mobs.txt
+++ b/world/map/npc/025-1/_mobs.txt
@@ -1,64 +1,13 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Woodland Swamp mobs
-025-1,100,60,56,79|monster|CloverPatch|1037,3,30000ms,10000ms,Mob025-1::On1037
-025-1,56,96,13,5|monster|CloverPatch|1037,1,1200000ms,10000ms,Mob025-1::On1037
-025-1,56,35,77,33|monster|AlizarinPlant|1032,2,240000ms,12000ms,Mob025-1::On1032
-025-1,55,62,24,13|monster|Snail|1041,7,30000ms,12000ms,Mob025-1::On1041
-025-1,38,84,37,31|monster|Silkworm|1035,18,40000ms,300ms,Mob025-1::On1035
-025-1,96,47,63,55|monster|LogHead|1025,14,18000ms,3000ms,Mob025-1::On1025
-025-1,0,0,0,0|monster|PinkFlower|1014,34,20000ms,5000ms,Mob025-1::On1014
-025-1,0,0,0,0|monster|SpikyMushroom|1019,40,90000ms,500ms,Mob025-1::On1019
-025-1,101,53,55,65|monster|Squirrel|1038,18,60000ms,9000ms,Mob025-1::On1038
-025-1,26,61,15,85|monster|Scorpion|1003,12,100000ms,50000ms,Mob025-1::On1003
-
-
-025-1,0,0,0|script|Mob025-1|32767
-{
- end;
-
-On1003:
- set @mobID, 1003;
- callfunc "MobPoints";
- end;
-
-On1014:
- set @mobID, 1014;
- callfunc "MobPoints";
- end;
-
-On1019:
- set @mobID, 1019;
- callfunc "MobPoints";
- end;
-
-On1025:
- set @mobID, 1025;
- callfunc "MobPoints";
- end;
-
-On1032:
- set @mobID, 1032;
- callfunc "MobPoints";
- end;
-
-On1035:
- set @mobID, 1035;
- callfunc "MobPoints";
- end;
-
-On1037:
- set @mobID, 1037;
- callfunc "MobPoints";
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1041:
- set @mobID, 1041;
- callfunc "MobPoints";
- end;
-}
+025-1,100,60,56,79|monster|CloverPatch|1037,3,30000ms,10000ms
+025-1,56,96,13,5|monster|CloverPatch|1037,1,1200000ms,10000ms
+025-1,56,35,77,33|monster|AlizarinPlant|1032,2,240000ms,12000ms
+025-1,55,62,24,13|monster|Snail|1041,7,30000ms,12000ms
+025-1,38,84,37,31|monster|Silkworm|1035,18,40000ms,300ms
+025-1,96,47,63,55|monster|LogHead|1025,14,18000ms,3000ms
+025-1,0,0,0,0|monster|PinkFlower|1014,34,20000ms,5000ms
+025-1,0,0,0,0|monster|SpikyMushroom|1019,40,90000ms,500ms
+025-1,101,53,55,65|monster|Squirrel|1038,18,60000ms,9000ms
+025-1,26,61,15,85|monster|Scorpion|1003,12,100000ms,50000ms
diff --git a/world/map/npc/025-1/_nodes.txt b/world/map/npc/025-1/_nodes.txt
new file mode 100644
index 00000000..805bf118
--- /dev/null
+++ b/world/map/npc/025-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Woodland Swamp nodes
+
+// (no nodes)
diff --git a/world/map/npc/025-3/_import.txt b/world/map/npc/025-3/_import.txt
index 63ace6ac..83e14f2c 100644
--- a/world/map/npc/025-3/_import.txt
+++ b/world/map/npc/025-3/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 025-3
npc: npc/025-3/_mobs.txt
+npc: npc/025-3/_nodes.txt
npc: npc/025-3/_warps.txt
npc: npc/025-3/barriers.txt
npc: npc/025-3/mapflags.txt
diff --git a/world/map/npc/025-3/_mobs.txt b/world/map/npc/025-3/_mobs.txt
index 5ccfdfc0..70e432d9 100644
--- a/world/map/npc/025-3/_mobs.txt
+++ b/world/map/npc/025-3/_mobs.txt
@@ -1,33 +1,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Rossy Main Hall mobs
-025-3,0,0,0,0|monster|CaveMaggot|1056,100,0ms,100ms,Mob025-3::On1056
-025-3,0,0,0,0|monster|Archant|1060,20,0ms,100ms,Mob025-3::On1060
-025-3,0,0,0,0|monster|AngryScorpion|1057,25,0ms,100ms,Mob025-3::On1057
-025-3,69,153,13,1|monster|Skeleton|1043,1,0ms,30000ms,Mob025-3::On1043
-
-
-025-3,0,0,0|script|Mob025-3|32767
-{
- end;
-
-On1043:
- set @mobID, 1043;
- callfunc "MobPoints";
- end;
-
-On1056:
- set @mobID, 1056;
- callfunc "MobPoints";
- end;
-
-On1057:
- set @mobID, 1057;
- callfunc "MobPoints";
- end;
-
-On1060:
- set @mobID, 1060;
- callfunc "MobPoints";
- end;
-}
+025-3,0,0,0,0|monster|CaveMaggot|1056,100,0ms,100ms
+025-3,0,0,0,0|monster|Archant|1060,20,0ms,100ms
+025-3,0,0,0,0|monster|AngryScorpion|1057,25,0ms,100ms
+025-3,69,153,13,1|monster|Skeleton|1043,1,0ms,30000ms
diff --git a/world/map/npc/025-3/_nodes.txt b/world/map/npc/025-3/_nodes.txt
new file mode 100644
index 00000000..28957b28
--- /dev/null
+++ b/world/map/npc/025-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Rossy Main Hall nodes
+
+// (no nodes)
diff --git a/world/map/npc/025-4/_import.txt b/world/map/npc/025-4/_import.txt
index cb9fb0e9..9f7c59cf 100644
--- a/world/map/npc/025-4/_import.txt
+++ b/world/map/npc/025-4/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 025-4
npc: npc/025-4/_mobs.txt
+npc: npc/025-4/_nodes.txt
npc: npc/025-4/_warps.txt
npc: npc/025-4/battlecaves.txt
npc: npc/025-4/clauquer.txt
diff --git a/world/map/npc/025-4/_mobs.txt b/world/map/npc/025-4/_mobs.txt
index 3ad731de..d8664774 100644
--- a/world/map/npc/025-4/_mobs.txt
+++ b/world/map/npc/025-4/_mobs.txt
@@ -1,16 +1,5 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Rossy Battle Caves mobs
-025-4,29,31,20,14|monster|CaveMaggot|1056,3,0ms,100ms,Mob025-4::On1056
-025-4,94,24,20,21|monster|CaveMaggot|1056,5,0ms,100ms,Mob025-4::On1056
-
-
-025-4,0,0,0|script|Mob025-4|32767
-{
- end;
-
-On1056:
- set @mobID, 1056;
- callfunc "MobPoints";
- end;
-}
+025-4,29,31,20,14|monster|CaveMaggot|1056,3,0ms,100ms
+025-4,94,24,20,21|monster|CaveMaggot|1056,5,0ms,100ms
diff --git a/world/map/npc/025-4/_nodes.txt b/world/map/npc/025-4/_nodes.txt
new file mode 100644
index 00000000..bd29621b
--- /dev/null
+++ b/world/map/npc/025-4/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Rossy Battle Caves nodes
+
+// (no nodes)
diff --git a/world/map/npc/026-1/_import.txt b/world/map/npc/026-1/_import.txt
index ddd3a0cd..72d1a275 100644
--- a/world/map/npc/026-1/_import.txt
+++ b/world/map/npc/026-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 026-1
npc: npc/026-1/_mobs.txt
+npc: npc/026-1/_nodes.txt
npc: npc/026-1/_warps.txt
npc: npc/026-1/mapflags.txt
npc: npc/026-1/sign.txt
diff --git a/world/map/npc/026-1/_mobs.txt b/world/map/npc/026-1/_mobs.txt
index a99c4bab..9f4d8325 100644
--- a/world/map/npc/026-1/_mobs.txt
+++ b/world/map/npc/026-1/_mobs.txt
@@ -1,55 +1,14 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Swamp mobs
-026-1,0,0,0,0|monster|Wisp|1040,34,120000ms,40000ms,Mob026-1::On1040
-026-1,0,0,0,0|monster|Spectre|1042,34,120000ms,40000ms,Mob026-1::On1042
-026-1,0,0,0,0|monster|Poltergeist|1047,34,120000ms,40000ms,Mob026-1::On1047
-026-1,0,0,0,0|monster|Silkworm|1035,10,300000ms,60000ms,Mob026-1::On1035
-026-1,0,0,0,0|monster|Scorpion|1003,15,300000ms,30000ms,Mob026-1::On1003
-026-1,0,0,0,0|monster|LogHead|1025,8,300000ms,40000ms,Mob026-1::On1025
-026-1,46,74,35,26|monster|GrassSnake|1034,2,100000ms,50000ms,Mob026-1::On1034
-026-1,88,36,35,26|monster|GrassSnake|1034,2,100000ms,50000ms,Mob026-1::On1034
-026-1,35,36,18,16|monster|GrassSnake|1034,2,100000ms,50000ms,Mob026-1::On1034
-026-1,66,33,73,17|monster|GrassSnake|1034,4,100000ms,50000ms,Mob026-1::On1034
-026-1,60,76,61,31|monster|GrassSnake|1034,4,100000ms,50000ms,Mob026-1::On1034
-
-
-026-1,0,0,0|script|Mob026-1|32767
-{
- end;
-
-On1003:
- set @mobID, 1003;
- callfunc "MobPoints";
- end;
-
-On1025:
- set @mobID, 1025;
- callfunc "MobPoints";
- end;
-
-On1034:
- set @mobID, 1034;
- callfunc "MobPoints";
- end;
-
-On1035:
- set @mobID, 1035;
- callfunc "MobPoints";
- end;
-
-On1040:
- set @mobID, 1040;
- callfunc "MobPoints";
- end;
-
-On1042:
- set @mobID, 1042;
- callfunc "MobPoints";
- end;
-
-On1047:
- set @mobID, 1047;
- callfunc "MobPoints";
- end;
-}
+026-1,0,0,0,0|monster|Wisp|1040,34,120000ms,40000ms
+026-1,0,0,0,0|monster|Spectre|1042,34,120000ms,40000ms
+026-1,0,0,0,0|monster|Poltergeist|1047,34,120000ms,40000ms
+026-1,0,0,0,0|monster|Silkworm|1035,10,300000ms,60000ms
+026-1,0,0,0,0|monster|Scorpion|1003,15,300000ms,30000ms
+026-1,0,0,0,0|monster|LogHead|1025,8,300000ms,40000ms
+026-1,46,74,35,26|monster|GrassSnake|1034,2,100000ms,50000ms
+026-1,88,36,35,26|monster|GrassSnake|1034,2,100000ms,50000ms
+026-1,35,36,18,16|monster|GrassSnake|1034,2,100000ms,50000ms
+026-1,66,33,73,17|monster|GrassSnake|1034,4,100000ms,50000ms
+026-1,60,76,61,31|monster|GrassSnake|1034,4,100000ms,50000ms
diff --git a/world/map/npc/026-1/_nodes.txt b/world/map/npc/026-1/_nodes.txt
new file mode 100644
index 00000000..47e3199f
--- /dev/null
+++ b/world/map/npc/026-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Swamp nodes
+
+// (no nodes)
diff --git a/world/map/npc/027-1/_import.txt b/world/map/npc/027-1/_import.txt
index 103ca8fd..66d24392 100644
--- a/world/map/npc/027-1/_import.txt
+++ b/world/map/npc/027-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 027-1
npc: npc/027-1/_mobs.txt
+npc: npc/027-1/_nodes.txt
npc: npc/027-1/_warps.txt
npc: npc/027-1/crypt.txt
npc: npc/027-1/golbenez.txt
diff --git a/world/map/npc/027-1/_mobs.txt b/world/map/npc/027-1/_mobs.txt
index de1a4b6f..51ce6174 100644
--- a/world/map/npc/027-1/_mobs.txt
+++ b/world/map/npc/027-1/_mobs.txt
@@ -1,61 +1,20 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Graveyard mobs
-027-1,81,91,95,27|monster|Poltergeist|1047,4,900000ms,60000ms,Mob027-1::On1047
-027-1,81,91,97,25|monster|Spectre|1042,4,900000ms,60000ms,Mob027-1::On1042
-027-1,81,91,99,23|monster|Wisp|1040,4,900000ms,60000ms,Mob027-1::On1040
-027-1,37,64,32,20|monster|Skeleton|1043,2,60000ms,8000ms,Mob027-1::On1043
-027-1,37,64,32,20|monster|LadySkeleton|1044,2,60000ms,8000ms,Mob027-1::On1044
-027-1,71,41,31,22|monster|Skeleton|1043,1,175000ms,20000ms,Mob027-1::On1043
-027-1,71,41,31,22|monster|LadySkeleton|1044,1,175000ms,20000ms,Mob027-1::On1044
-027-1,37,41,33,22|monster|Skeleton|1043,4,180000ms,20000ms,Mob027-1::On1043
-027-1,37,41,33,22|monster|LadySkeleton|1044,4,180000ms,20000ms,Mob027-1::On1044
-027-1,105,40,32,21|monster|Skeleton|1043,2,35000ms,20000ms,Mob027-1::On1043
-027-1,105,40,32,21|monster|LadySkeleton|1044,3,33000ms,25000ms,Mob027-1::On1044
-027-1,70,64,31,20|monster|Skeleton|1043,1,60000ms,8000ms,Mob027-1::On1043
-027-1,70,64,31,21|monster|LadySkeleton|1044,1,60000ms,8000ms,Mob027-1::On1044
-027-1,104,64,31,20|monster|Skeleton|1043,2,60000ms,8000ms,Mob027-1::On1043
-027-1,104,64,31,21|monster|LadySkeleton|1044,2,60000ms,8000ms,Mob027-1::On1044
-027-1,70,40,100,20|monster|VampireBat|1066,15,100000ms,30000ms,Mob027-1::On1066
-027-1,99,90,34,16|monster|GrassSnake|1034,3,100000ms,50000ms,Mob027-1::On1034
-
-
-027-1,0,0,0|script|Mob027-1|32767
-{
- end;
-
-On1034:
- set @mobID, 1034;
- callfunc "MobPoints";
- end;
-
-On1040:
- set @mobID, 1040;
- callfunc "MobPoints";
- end;
-
-On1042:
- set @mobID, 1042;
- callfunc "MobPoints";
- end;
-
-On1043:
- set @mobID, 1043;
- callfunc "MobPoints";
- end;
-
-On1044:
- set @mobID, 1044;
- callfunc "MobPoints";
- end;
-
-On1047:
- set @mobID, 1047;
- callfunc "MobPoints";
- end;
-
-On1066:
- set @mobID, 1066;
- callfunc "MobPoints";
- end;
-}
+027-1,81,91,95,27|monster|Poltergeist|1047,4,900000ms,60000ms
+027-1,81,91,97,25|monster|Spectre|1042,4,900000ms,60000ms
+027-1,81,91,99,23|monster|Wisp|1040,4,900000ms,60000ms
+027-1,37,64,32,20|monster|Skeleton|1043,2,60000ms,8000ms
+027-1,37,64,32,20|monster|LadySkeleton|1044,2,60000ms,8000ms
+027-1,71,41,31,22|monster|Skeleton|1043,1,175000ms,20000ms
+027-1,71,41,31,22|monster|LadySkeleton|1044,1,175000ms,20000ms
+027-1,37,41,33,22|monster|Skeleton|1043,4,180000ms,20000ms
+027-1,37,41,33,22|monster|LadySkeleton|1044,4,180000ms,20000ms
+027-1,105,40,32,21|monster|Skeleton|1043,2,35000ms,20000ms
+027-1,105,40,32,21|monster|LadySkeleton|1044,3,33000ms,25000ms
+027-1,70,64,31,20|monster|Skeleton|1043,1,60000ms,8000ms
+027-1,70,64,31,21|monster|LadySkeleton|1044,1,60000ms,8000ms
+027-1,104,64,31,20|monster|Skeleton|1043,2,60000ms,8000ms
+027-1,104,64,31,21|monster|LadySkeleton|1044,2,60000ms,8000ms
+027-1,70,40,100,20|monster|VampireBat|1066,15,100000ms,30000ms
+027-1,99,90,34,16|monster|GrassSnake|1034,3,100000ms,50000ms
diff --git a/world/map/npc/027-1/_nodes.txt b/world/map/npc/027-1/_nodes.txt
new file mode 100644
index 00000000..46a78ab8
--- /dev/null
+++ b/world/map/npc/027-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Graveyard nodes
+
+// (no nodes)
diff --git a/world/map/npc/027-2/_import.txt b/world/map/npc/027-2/_import.txt
index f9e207b3..4cacd2c1 100644
--- a/world/map/npc/027-2/_import.txt
+++ b/world/map/npc/027-2/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 027-2
npc: npc/027-2/_mobs.txt
+npc: npc/027-2/_nodes.txt
npc: npc/027-2/_warps.txt
npc: npc/027-2/alacrius.txt
npc: npc/027-2/barman.txt
diff --git a/world/map/npc/027-2/_mobs.txt b/world/map/npc/027-2/_mobs.txt
index ab76e3b0..1c5a6d51 100644
--- a/world/map/npc/027-2/_mobs.txt
+++ b/world/map/npc/027-2/_mobs.txt
@@ -1,39 +1,13 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Graveyard Indoor mobs
-027-2,81,41,11,9|monster|DrunkenSkeleton|1077,1,100000ms,30000ms,Mob027-2::On1077
-027-2,102,99,9,19|monster|TipsySkeleton|1078,1,100000ms,30000ms,Mob027-2::On1078
-027-2,110,26,11,11|monster|TipsySkeleton|1078,1,100000ms,30000ms,Mob027-2::On1078
-027-2,104,28,11,9|monster|DrunkenSkeleton|1077,1,100000ms,30000ms,Mob027-2::On1077
-027-2,89,34,11,9|monster|DrunkenLadySkeleton|1079,1,100000ms,30000ms,Mob027-2::On1079
-027-2,116,26,11,9|monster|DrunkenLadySkeleton|1079,1,100000ms,30000ms,Mob027-2::On1079
-027-2,112,88,28,39|monster|VampireBat|1066,15,100000ms,30000ms,Mob027-2::On1066
-027-2,102,99,9,19|monster|DrunkenSkeleton|1077,1,100000ms,30000ms,Mob027-2::On1077
-027-2,102,99,9,19|monster|TipsySkeleton|1078,1,100000ms,30000ms,Mob027-2::On1078
-027-2,89,34,11,9|monster|TipsySkeleton|1078,1,100000ms,30000ms,Mob027-2::On1078
-
-
-027-2,0,0,0|script|Mob027-2|32767
-{
- end;
-
-On1066:
- set @mobID, 1066;
- callfunc "MobPoints";
- end;
-
-On1077:
- set @mobID, 1077;
- callfunc "MobPoints";
- end;
-
-On1078:
- set @mobID, 1078;
- callfunc "MobPoints";
- end;
-
-On1079:
- set @mobID, 1079;
- callfunc "MobPoints";
- end;
-}
+027-2,81,41,11,9|monster|DrunkenSkeleton|1077,1,100000ms,30000ms
+027-2,102,99,9,19|monster|TipsySkeleton|1078,1,100000ms,30000ms
+027-2,110,26,11,11|monster|TipsySkeleton|1078,1,100000ms,30000ms
+027-2,104,28,11,9|monster|DrunkenSkeleton|1077,1,100000ms,30000ms
+027-2,89,34,11,9|monster|DrunkenLadySkeleton|1079,1,100000ms,30000ms
+027-2,116,26,11,9|monster|DrunkenLadySkeleton|1079,1,100000ms,30000ms
+027-2,112,88,28,39|monster|VampireBat|1066,15,100000ms,30000ms
+027-2,102,99,9,19|monster|DrunkenSkeleton|1077,1,100000ms,30000ms
+027-2,102,99,9,19|monster|TipsySkeleton|1078,1,100000ms,30000ms
+027-2,89,34,11,9|monster|TipsySkeleton|1078,1,100000ms,30000ms
diff --git a/world/map/npc/027-2/_nodes.txt b/world/map/npc/027-2/_nodes.txt
new file mode 100644
index 00000000..78bbb5b6
--- /dev/null
+++ b/world/map/npc/027-2/_nodes.txt
@@ -0,0 +1,16 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Graveyard Indoor nodes
+
+027-2,0,0,0|script|Node027-2|32767
+{
+ end;
+OnInit:
+ setarray .m$, "_N-Alchemy", "027-2";
+ setarray .x1, "_N-Alchemy", 51;
+ setarray .y1, "_N-Alchemy", 100;
+ setarray .x2, "_N-Alchemy", 0;
+ setarray .y2, "_N-Alchemy", 0;
+ setarray .id, "_N-Alchemy", 0;
+ donpcevent "_N-Alchemy::OnMaybeStart";
+ destroy;
+}
diff --git a/world/map/npc/027-3/_import.txt b/world/map/npc/027-3/_import.txt
index af72eb2f..78754482 100644
--- a/world/map/npc/027-3/_import.txt
+++ b/world/map/npc/027-3/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 027-3
npc: npc/027-3/_mobs.txt
+npc: npc/027-3/_nodes.txt
npc: npc/027-3/_warps.txt
npc: npc/027-3/casket_traps.txt
npc: npc/027-3/general_krukan_door.txt
diff --git a/world/map/npc/027-3/_mobs.txt b/world/map/npc/027-3/_mobs.txt
index 4c7c8ff6..a1926191 100644
--- a/world/map/npc/027-3/_mobs.txt
+++ b/world/map/npc/027-3/_mobs.txt
@@ -1,42 +1,11 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Crypt Basement mobs
-027-3,34,63,29,69|monster|Skeleton|1043,6,60000ms,8000ms,Mob027-3::On1043
-027-3,97,43,59,30|monster|Skeleton|1043,6,60000ms,8000ms,Mob027-3::On1043
-027-3,34,63,29,69|monster|LadySkeleton|1044,4,60000ms,8000ms,Mob027-3::On1044
-027-3,113,78,28,26|monster|LadySkeleton|1044,4,60000ms,8000ms,Mob027-3::On1044
-027-3,113,78,27,27|monster|Skeleton|1043,4,60000ms,8000ms,Mob027-3::On1043
-027-3,81,87,29,22|monster|VampireBat|1066,15,100000ms,30000ms,Mob027-3::On1066
-027-3,74,45,106,33|monster|PoisonSkull|1024,1,60000ms,20000ms,Mob027-3::On1024
-027-3,98,84,60,14|monster|FireSkull|1023,2,60000ms,20000ms,Mob027-3::On1023
-
-
-027-3,0,0,0|script|Mob027-3|32767
-{
- end;
-
-On1023:
- set @mobID, 1023;
- callfunc "MobPoints";
- end;
-
-On1024:
- set @mobID, 1024;
- callfunc "MobPoints";
- end;
-
-On1043:
- set @mobID, 1043;
- callfunc "MobPoints";
- end;
-
-On1044:
- set @mobID, 1044;
- callfunc "MobPoints";
- end;
-
-On1066:
- set @mobID, 1066;
- callfunc "MobPoints";
- end;
-}
+027-3,34,63,29,69|monster|Skeleton|1043,6,60000ms,8000ms
+027-3,97,43,59,30|monster|Skeleton|1043,6,60000ms,8000ms
+027-3,34,63,29,69|monster|LadySkeleton|1044,4,60000ms,8000ms
+027-3,113,78,28,26|monster|LadySkeleton|1044,4,60000ms,8000ms
+027-3,113,78,27,27|monster|Skeleton|1043,4,60000ms,8000ms
+027-3,81,87,29,22|monster|VampireBat|1066,15,100000ms,30000ms
+027-3,74,45,106,33|monster|PoisonSkull|1024,1,60000ms,20000ms
+027-3,98,84,60,14|monster|FireSkull|1023,2,60000ms,20000ms
diff --git a/world/map/npc/027-3/_nodes.txt b/world/map/npc/027-3/_nodes.txt
new file mode 100644
index 00000000..ab655dd1
--- /dev/null
+++ b/world/map/npc/027-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Crypt Basement nodes
+
+// (no nodes)
diff --git a/world/map/npc/027-4/_import.txt b/world/map/npc/027-4/_import.txt
index 033877af..7bcfbc68 100644
--- a/world/map/npc/027-4/_import.txt
+++ b/world/map/npc/027-4/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 027-4
npc: npc/027-4/_mobs.txt
+npc: npc/027-4/_nodes.txt
npc: npc/027-4/_warps.txt
npc: npc/027-4/casket_traps.txt
npc: npc/027-4/general_razha_door.txt
diff --git a/world/map/npc/027-4/_mobs.txt b/world/map/npc/027-4/_mobs.txt
index cb65135e..dde5781e 100644
--- a/world/map/npc/027-4/_mobs.txt
+++ b/world/map/npc/027-4/_mobs.txt
@@ -1,24 +1,8 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Crypt Sub-Basement One mobs
-027-4,39,84,38,22|monster|Skeleton|1043,2,60000ms,8000ms,Mob027-4::On1043
-027-4,27,57,15,22|monster|LadySkeleton|1044,2,60000ms,8000ms,Mob027-4::On1044
-027-4,108,77,39,14|monster|Skeleton|1043,2,60000ms,8000ms,Mob027-4::On1043
-027-4,61,37,38,30|monster|LadySkeleton|1044,2,60000ms,8000ms,Mob027-4::On1044
-027-4,101,36,38,30|monster|LadySkeleton|1044,2,60000ms,8000ms,Mob027-4::On1044
-
-
-027-4,0,0,0|script|Mob027-4|32767
-{
- end;
-
-On1043:
- set @mobID, 1043;
- callfunc "MobPoints";
- end;
-
-On1044:
- set @mobID, 1044;
- callfunc "MobPoints";
- end;
-}
+027-4,39,84,38,22|monster|Skeleton|1043,2,60000ms,8000ms
+027-4,27,57,15,22|monster|LadySkeleton|1044,2,60000ms,8000ms
+027-4,108,77,39,14|monster|Skeleton|1043,2,60000ms,8000ms
+027-4,61,37,38,30|monster|LadySkeleton|1044,2,60000ms,8000ms
+027-4,101,36,38,30|monster|LadySkeleton|1044,2,60000ms,8000ms
diff --git a/world/map/npc/027-4/_nodes.txt b/world/map/npc/027-4/_nodes.txt
new file mode 100644
index 00000000..ee3b5dcf
--- /dev/null
+++ b/world/map/npc/027-4/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Crypt Sub-Basement One nodes
+
+// (no nodes)
diff --git a/world/map/npc/027-5/_import.txt b/world/map/npc/027-5/_import.txt
index 183dbf49..a0d686c6 100644
--- a/world/map/npc/027-5/_import.txt
+++ b/world/map/npc/027-5/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 027-5
npc: npc/027-5/_mobs.txt
+npc: npc/027-5/_nodes.txt
npc: npc/027-5/_warps.txt
npc: npc/027-5/casket_traps.txt
npc: npc/027-5/general_terogan_door.txt
diff --git a/world/map/npc/027-5/_mobs.txt b/world/map/npc/027-5/_mobs.txt
index e6958ba9..750163ad 100644
--- a/world/map/npc/027-5/_mobs.txt
+++ b/world/map/npc/027-5/_mobs.txt
@@ -1,41 +1,10 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Crypt Sub-Basement Two mobs
-027-5,69,42,97,41|monster|Wight|1124,6,60000ms,8000ms,Mob027-5::On1124
-027-5,69,56,97,69|monster|VampireBat|1066,30,100000ms,30000ms,Mob027-5::On1066
-027-5,69,42,98,40|monster|Skeleton|1043,8,60000ms,8000ms,Mob027-5::On1043
-027-5,69,41,98,39|monster|LadySkeleton|1044,8,60000ms,8000ms,Mob027-5::On1044
-027-5,68,42,97,40|monster|RedBone|1074,6,60000ms,8000ms,Mob027-5::On1074
-027-5,70,80,98,34|monster|Skeleton|1043,8,60000ms,8000ms,Mob027-5::On1043
-027-5,69,80,99,36|monster|LadySkeleton|1044,8,60000ms,8000ms,Mob027-5::On1044
-
-
-027-5,0,0,0|script|Mob027-5|32767
-{
- end;
-
-On1043:
- set @mobID, 1043;
- callfunc "MobPoints";
- end;
-
-On1044:
- set @mobID, 1044;
- callfunc "MobPoints";
- end;
-
-On1066:
- set @mobID, 1066;
- callfunc "MobPoints";
- end;
-
-On1074:
- set @mobID, 1074;
- callfunc "MobPoints";
- end;
-
-On1124:
- set @mobID, 1124;
- callfunc "MobPoints";
- end;
-}
+027-5,69,42,97,41|monster|Wight|1124,6,60000ms,8000ms
+027-5,69,56,97,69|monster|VampireBat|1066,30,100000ms,30000ms
+027-5,69,42,98,40|monster|Skeleton|1043,8,60000ms,8000ms
+027-5,69,41,98,39|monster|LadySkeleton|1044,8,60000ms,8000ms
+027-5,68,42,97,40|monster|RedBone|1074,6,60000ms,8000ms
+027-5,70,80,98,34|monster|Skeleton|1043,8,60000ms,8000ms
+027-5,69,80,99,36|monster|LadySkeleton|1044,8,60000ms,8000ms
diff --git a/world/map/npc/027-5/_nodes.txt b/world/map/npc/027-5/_nodes.txt
new file mode 100644
index 00000000..4e14e522
--- /dev/null
+++ b/world/map/npc/027-5/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Crypt Sub-Basement Two nodes
+
+// (no nodes)
diff --git a/world/map/npc/027-6/_import.txt b/world/map/npc/027-6/_import.txt
index 5c19c47b..48dbcf11 100644
--- a/world/map/npc/027-6/_import.txt
+++ b/world/map/npc/027-6/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 027-6
npc: npc/027-6/_mobs.txt
+npc: npc/027-6/_nodes.txt
npc: npc/027-6/_warps.txt
npc: npc/027-6/casket_traps.txt
npc: npc/027-6/general_krukan.txt
diff --git a/world/map/npc/027-6/_mobs.txt b/world/map/npc/027-6/_mobs.txt
index 407a697e..a6d6a471 100644
--- a/world/map/npc/027-6/_mobs.txt
+++ b/world/map/npc/027-6/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Crypt Sub-Basement Two mobs
-
-
-027-6,0,0,0|script|Mob027-6|32767
-{
- end;
-}
diff --git a/world/map/npc/027-6/_nodes.txt b/world/map/npc/027-6/_nodes.txt
new file mode 100644
index 00000000..4e14e522
--- /dev/null
+++ b/world/map/npc/027-6/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Crypt Sub-Basement Two nodes
+
+// (no nodes)
diff --git a/world/map/npc/027-6/general_krukan.txt b/world/map/npc/027-6/general_krukan.txt
index 6b086cee..1c2ff95f 100644
--- a/world/map/npc/027-6/general_krukan.txt
+++ b/world/map/npc/027-6/general_krukan.txt
@@ -86,7 +86,7 @@ OnTimer5000:
L_Return_1:
set $@CRYPT_FIGHT1_PLAYER_COUNT, 0;
- areatimer "027-6", 0, 0, 79, 84, 10, "General Krukan::OnTick";
+ areatimer 0, "027-6", 0, 0, 79, 84, 10, "General Krukan::OnTick";
end;
L_CryptLogic:
@@ -182,7 +182,7 @@ L_CleanUpLosers:
end;
L_CleanUp:
- areatimer "027-6", 0, 0, 79, 84, 10, "General Krukan::OnReward";
+ areatimer 0, "027-6", 0, 0, 79, 84, 10, "General Krukan::OnReward";
set $@CRYPT_FIGHT1, 0;
set $@CRYPT_FIGHT1_PLAYER_COUNT, 0;
set $@CRYPT_FIGHT1_WAVE, 0;
diff --git a/world/map/npc/027-7/_import.txt b/world/map/npc/027-7/_import.txt
index 8990d426..e4baf4aa 100644
--- a/world/map/npc/027-7/_import.txt
+++ b/world/map/npc/027-7/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 027-7
npc: npc/027-7/_mobs.txt
+npc: npc/027-7/_nodes.txt
npc: npc/027-7/_warps.txt
npc: npc/027-7/general_razha.txt
npc: npc/027-7/general_razha_exitdoor.txt
diff --git a/world/map/npc/027-7/_mobs.txt b/world/map/npc/027-7/_mobs.txt
index 43867927..a6d6a471 100644
--- a/world/map/npc/027-7/_mobs.txt
+++ b/world/map/npc/027-7/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Crypt Sub-Basement Two mobs
-
-
-027-7,0,0,0|script|Mob027-7|32767
-{
- end;
-}
diff --git a/world/map/npc/027-7/_nodes.txt b/world/map/npc/027-7/_nodes.txt
new file mode 100644
index 00000000..4e14e522
--- /dev/null
+++ b/world/map/npc/027-7/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Crypt Sub-Basement Two nodes
+
+// (no nodes)
diff --git a/world/map/npc/027-7/general_razha.txt b/world/map/npc/027-7/general_razha.txt
index e22f6392..f331d95c 100644
--- a/world/map/npc/027-7/general_razha.txt
+++ b/world/map/npc/027-7/general_razha.txt
@@ -86,7 +86,7 @@ OnTimer5000:
L_Return_1:
set $@CRYPT_FIGHT2_PLAYER_COUNT, 0;
- areatimer "027-7", 0, 0, 79, 84, 10, "General Razha::OnTick";
+ areatimer 0, "027-7", 0, 0, 79, 84, 10, "General Razha::OnTick";
end;
L_CryptLogic:
@@ -186,7 +186,7 @@ L_CleanUpLosers:
L_CleanUp:
mapannounce "027-7", "General Razha : How in all hells could that happen? I am lost forever.", 0;
mapannounce "027-4", "General Razha is defeated.", 0;
- areatimer "027-7", 0, 0, 79, 84, 10, "General Razha::OnReward";
+ areatimer 0, "027-7", 0, 0, 79, 84, 10, "General Razha::OnReward";
set $@CRYPT_FIGHT2, 0;
set $@CRYPT_FIGHT2_PLAYER_COUNT, 0;
set $@CRYPT_FIGHT2_WAVE, 0;
diff --git a/world/map/npc/027-8/_import.txt b/world/map/npc/027-8/_import.txt
index b103d346..dc9e06da 100644
--- a/world/map/npc/027-8/_import.txt
+++ b/world/map/npc/027-8/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 027-8
npc: npc/027-8/_mobs.txt
+npc: npc/027-8/_nodes.txt
npc: npc/027-8/_warps.txt
npc: npc/027-8/general_terogan.txt
npc: npc/027-8/general_terogan_exitdoor.txt
diff --git a/world/map/npc/027-8/_mobs.txt b/world/map/npc/027-8/_mobs.txt
index d38bf647..a6d6a471 100644
--- a/world/map/npc/027-8/_mobs.txt
+++ b/world/map/npc/027-8/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Crypt Sub-Basement Two mobs
-
-
-027-8,0,0,0|script|Mob027-8|32767
-{
- end;
-}
diff --git a/world/map/npc/027-8/_nodes.txt b/world/map/npc/027-8/_nodes.txt
new file mode 100644
index 00000000..4e14e522
--- /dev/null
+++ b/world/map/npc/027-8/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Crypt Sub-Basement Two nodes
+
+// (no nodes)
diff --git a/world/map/npc/027-8/general_terogan.txt b/world/map/npc/027-8/general_terogan.txt
index ca8691f0..522b1eaa 100644
--- a/world/map/npc/027-8/general_terogan.txt
+++ b/world/map/npc/027-8/general_terogan.txt
@@ -141,7 +141,7 @@ OnTimer5000:
L_Return_1:
set $@CRYPT_FIGHT3_PLAYER_COUNT, 0;
- areatimer "027-8", 0, 0, 79, 84, 10, "General Terogan#Main::OnTick";
+ areatimer 0, "027-8", 0, 0, 79, 84, 10, "General Terogan#Main::OnTick";
end;
L_CryptLogic:
@@ -249,7 +249,7 @@ L_CleanUpLosers:
L_CleanUp:
mapannounce "027-8", "General Terogan : You might have won this battle, but you will never defeat me!", 0;
- areatimer "027-8", 0, 0, 79, 84, 10, "General Terogan#Main::OnReward";
+ areatimer 0, "027-8", 0, 0, 79, 84, 10, "General Terogan#Main::OnReward";
set $@CRYPT_FIGHT3, 0;
set $@CRYPT_FIGHT3_PLAYER_COUNT, 0;
set $@CRYPT_FIGHT3_WAVE, 0;
diff --git a/world/map/npc/028-1/_import.txt b/world/map/npc/028-1/_import.txt
index 7b323a88..b7221baf 100644
--- a/world/map/npc/028-1/_import.txt
+++ b/world/map/npc/028-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 028-1
npc: npc/028-1/_mobs.txt
+npc: npc/028-1/_nodes.txt
npc: npc/028-1/_warps.txt
npc: npc/028-1/mapflags.txt
npc: npc/028-1/portal.txt
diff --git a/world/map/npc/028-1/_mobs.txt b/world/map/npc/028-1/_mobs.txt
index b0ae65fe..e5e3e7e5 100644
--- a/world/map/npc/028-1/_mobs.txt
+++ b/world/map/npc/028-1/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// GM Island mobs
-
-
-028-1,0,0,0|script|Mob028-1|32767
-{
- end;
-}
diff --git a/world/map/npc/028-1/_nodes.txt b/world/map/npc/028-1/_nodes.txt
new file mode 100644
index 00000000..c4fb65dc
--- /dev/null
+++ b/world/map/npc/028-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// GM Island nodes
+
+// (no nodes)
diff --git a/world/map/npc/028-3/_import.txt b/world/map/npc/028-3/_import.txt
index 12684d4b..8f0036c0 100644
--- a/world/map/npc/028-3/_import.txt
+++ b/world/map/npc/028-3/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 028-3
npc: npc/028-3/_mobs.txt
+npc: npc/028-3/_nodes.txt
npc: npc/028-3/_warps.txt
npc: npc/028-3/mapflags.txt
diff --git a/world/map/npc/028-3/_mobs.txt b/world/map/npc/028-3/_mobs.txt
index 1290a483..c3c38c44 100644
--- a/world/map/npc/028-3/_mobs.txt
+++ b/world/map/npc/028-3/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// GM Island Cave mobs
-
-
-028-3,0,0,0|script|Mob028-3|32767
-{
- end;
-}
diff --git a/world/map/npc/028-3/_nodes.txt b/world/map/npc/028-3/_nodes.txt
new file mode 100644
index 00000000..25112bd6
--- /dev/null
+++ b/world/map/npc/028-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// GM Island Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/029-1/_import.txt b/world/map/npc/029-1/_import.txt
index c2a6d2ed..b9e64749 100644
--- a/world/map/npc/029-1/_import.txt
+++ b/world/map/npc/029-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 029-1
npc: npc/029-1/_mobs.txt
+npc: npc/029-1/_nodes.txt
npc: npc/029-1/_warps.txt
npc: npc/029-1/aahna.txt
npc: npc/029-1/barrier.txt
diff --git a/world/map/npc/029-1/_mobs.txt b/world/map/npc/029-1/_mobs.txt
index bad7d55a..4fb1734b 100644
--- a/world/map/npc/029-1/_mobs.txt
+++ b/world/map/npc/029-1/_mobs.txt
@@ -1,40 +1,9 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Candor Island mobs
-029-1,46,48,4,1|monster|CloverPatch|1037,1,10000ms,120000ms,Mob029-1::On1037
-029-1,73,93,14,13|monster|Maggot|1002,8,100000ms,30000ms,Mob029-1::On1002
-029-1,90,35,15,11|monster|TameScorpion|1046,16,100000ms,30000ms,Mob029-1::On1046
-029-1,93,100,21,18|monster|TameScorpion|1046,8,100000ms,30000ms,Mob029-1::On1046
-029-1,43,43,31,23|monster|Scorpion|1003,2,100000ms,30000ms,Mob029-1::On1003
-029-1,76,42,52,25|monster|ManaBug|1131,3,30ms,0ms,Mob029-1::On1131
-
-
-029-1,0,0,0|script|Mob029-1|32767
-{
- end;
-
-On1002:
- set @mobID, 1002;
- callfunc "MobPoints";
- end;
-
-On1003:
- set @mobID, 1003;
- callfunc "MobPoints";
- end;
-
-On1037:
- set @mobID, 1037;
- callfunc "MobPoints";
- end;
-
-On1046:
- set @mobID, 1046;
- callfunc "MobPoints";
- end;
-
-On1131:
- set @mobID, 1131;
- callfunc "MobPoints";
- end;
-}
+029-1,46,48,4,1|monster|CloverPatch|1037,1,10000ms,120000ms
+029-1,73,93,14,13|monster|Maggot|1002,8,100000ms,30000ms
+029-1,90,35,15,11|monster|TameScorpion|1046,16,100000ms,30000ms
+029-1,93,100,21,18|monster|TameScorpion|1046,8,100000ms,30000ms
+029-1,43,43,31,23|monster|Scorpion|1003,2,100000ms,30000ms
+029-1,76,42,52,25|monster|ManaBug|1131,3,30ms,0ms
diff --git a/world/map/npc/029-1/_nodes.txt b/world/map/npc/029-1/_nodes.txt
new file mode 100644
index 00000000..cde06d82
--- /dev/null
+++ b/world/map/npc/029-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Candor Island nodes
+
+// (no nodes)
diff --git a/world/map/npc/029-1/barrier.txt b/world/map/npc/029-1/barrier.txt
index e6c580ad..7414f78b 100644
--- a/world/map/npc/029-1/barrier.txt
+++ b/world/map/npc/029-1/barrier.txt
@@ -18,6 +18,6 @@ OnTalk:
end;
OnCommandTalk:
- areatimer "029-1", 61, 61, 69, 73, 0, "#CandorAnnouncer::OnTalk";
+ areatimer 0, "029-1", 61, 61, 69, 73, 0, "#CandorAnnouncer::OnTalk";
end;
}
diff --git a/world/map/npc/029-2/_import.txt b/world/map/npc/029-2/_import.txt
index 29e2607a..b87b6dc1 100644
--- a/world/map/npc/029-2/_import.txt
+++ b/world/map/npc/029-2/_import.txt
@@ -2,7 +2,9 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 029-2
npc: npc/029-2/_mobs.txt
+npc: npc/029-2/_nodes.txt
npc: npc/029-2/_warps.txt
+npc: npc/029-2/alchemy.txt
npc: npc/029-2/bankroom.txt
npc: npc/029-2/barrels.txt
npc: npc/029-2/barrels_config.txt
diff --git a/world/map/npc/029-2/_mobs.txt b/world/map/npc/029-2/_mobs.txt
index 02d3fbd9..a63fae65 100644
--- a/world/map/npc/029-2/_mobs.txt
+++ b/world/map/npc/029-2/_mobs.txt
@@ -1,15 +1,4 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Candor Island Indoor mobs
-029-2,33,57,24,7|monster|HouseMaggot|1050,7,100000ms,30000ms,Mob029-2::On1050
-
-
-029-2,0,0,0|script|Mob029-2|32767
-{
- end;
-
-On1050:
- set @mobID, 1050;
- callfunc "MobPoints";
- end;
-}
+029-2,33,57,24,7|monster|HouseMaggot|1050,7,100000ms,30000ms
diff --git a/world/map/npc/029-2/_nodes.txt b/world/map/npc/029-2/_nodes.txt
new file mode 100644
index 00000000..9e38e0e1
--- /dev/null
+++ b/world/map/npc/029-2/_nodes.txt
@@ -0,0 +1,16 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Candor Island Indoor nodes
+
+029-2,0,0,0|script|Node029-2|32767
+{
+ end;
+OnInit:
+ setarray .m$, "_N-Alchemy", "029-2";
+ setarray .x1, "_N-Alchemy", 113;
+ setarray .y1, "_N-Alchemy", 57;
+ setarray .x2, "_N-Alchemy", 0;
+ setarray .y2, "_N-Alchemy", 0;
+ setarray .id, "_N-Alchemy", 0;
+ donpcevent "_N-Alchemy::OnMaybeStart";
+ destroy;
+}
diff --git a/world/map/npc/029-2/alchemy.txt b/world/map/npc/029-2/alchemy.txt
new file mode 100644
index 00000000..b5e4732c
--- /dev/null
+++ b/world/map/npc/029-2/alchemy.txt
@@ -0,0 +1,99 @@
+-|script|_N-Alchemy|32767
+{
+ set @npc_distance, 1;
+ callfunc "PCtoNPCRange";
+ if (@npc_check) end;
+
+ title "Alchemy Lab";
+ mes "This is an alchemy lab.";
+ mes "With it, you can combine reagents together to create powerful potions.";
+ next;
+ clear;
+ mes "##BDrag & drop 2 items from your inventory. All items used will be lost.##b";
+ cleararray @alchlab_items$[0], "", 2; // since we're not using a scoped (.@) array, we need to clean it
+ requestitem @alchlab_items$[0], 2; // TODO: add a craft builtin (npc action 12)
+ clear;
+ if (@alchlab_items$[0] == "" || @alchlab_items$[1] == "")
+ goto L_NoItems;
+
+ mes "You are about to combine the following:";
+ mes " ["+ getitemlink(@alchlab_items$[0]) +"]";
+ mes " ["+ getitemlink(@alchlab_items$[1]) +"]";
+ mes;
+ mes "##BWarning! This will permanently destroy the selected items.##b";
+ // can not use a scope variable to store item names because menu is a script terminator (destroys the scope)
+ menu
+ "Abort Mission.", L_Abort,
+ "Proceed.", L_Proceed;
+
+L_Proceed:
+ // XXX: here we could make it wait a little, while the potion is boiling (and show an animation/particles/sound)
+ if (countitem(@alchlab_items$[0]) < 1 || countitem(@alchlab_items$[1]) < 1) // this shouldn't happen, but just to be safe..
+ goto L_NoItems;
+ delitem @alchlab_items$[0], 1;
+ delitem @alchlab_items$[1], 1;
+ if (@alchlab_items$[0] == "BottleOfWater" || @alchlab_items$[1] == "BottleOfWater") // give back used bottles
+ getitem "EmptyBottle", if_then_else(@alchlab_items$[0] == "BottleOfWater" && @alchlab_items$[1] == "BottleOfWater",2,1);
+
+ set .@n, -3;
+ goto L_CheckRecipes;
+
+L_CheckRecipes:
+ set .@n, .@n+3;
+ if (.@n == get(.rsize, "_N-Alchemy"))
+ goto L_Failed;
+ if (!(get(.recipes$[.@n], "_N-Alchemy") == @alchlab_items$[0] && get(.recipes$[.@n+1], "_N-Alchemy") == @alchlab_items$[1]) &&
+ !(get(.recipes$[.@n], "_N-Alchemy") == @alchlab_items$[1] && get(.recipes$[.@n+1], "_N-Alchemy") == @alchlab_items$[0]))
+ goto L_CheckRecipes;
+
+ getitem get(.recipes$[.@n+2], "_N-Alchemy"), 1; // XXX: here we could also make it fail sometimes depending on your expertise
+
+ // XXX: here we could make it give profession/crafting exp
+ clear;
+ mes "You combined the following:";
+ mes " ["+ getitemlink(@alchlab_items$[0]) +"]";
+ mes " ["+ getitemlink(@alchlab_items$[1]) +"]";
+ mes;
+ mes "You obtained:";
+ mes " ["+ getitemlink(get(.recipes$[.@n+2], "_N-Alchemy")) +"]";
+ close;
+
+L_NoItems:
+ mes "You must put exactly 2 items.";
+ close;
+
+L_Failed:
+ mes "The potion bubbles violently and evaporates."; // XXX: here we could have random failure messages
+ close;
+
+L_Abort:
+ close;
+
+S_Spawn:
+ set .@s, getarraysize(.x1);
+ if (.spawned >= .@s)
+ goto S_Return;
+ set .@n$, "#_Al-lab"+chr(3)+.spawned;
+ void puppet(.m$[.spawned], .x1[.spawned], .y1[.spawned], .@n$, 400); // TODO: make a npc like npc 400 but with hoverCursor="action" => looks better for things like crafting
+ set .spawned, .spawned + 1;
+ if (.spawned < .@s)
+ goto S_Spawn;
+ return;
+
+S_Return:
+ return;
+
+OnMaybeStart:
+ callsub S_Spawn;
+ if (.started == 0)
+ goto L_InitVars;
+ end;
+
+L_InitVars:
+ setarray .recipes$[0], 0,
+ "DilutedConcentrationPot", "DarkConcentrationPotion", "ConcentrationPotion",
+ "CactusDrink", "CactusDrink", "CactusPotion",
+ "PinkPetal", "BottleOfWater", "ConcentrationPotion";
+ set .rsize, getarraysize(.recipes$);
+ end;
+}
diff --git a/world/map/npc/029-2/morgan.txt b/world/map/npc/029-2/morgan.txt
index 1f8f19f4..d5604f93 100644
--- a/world/map/npc/029-2/morgan.txt
+++ b/world/map/npc/029-2/morgan.txt
@@ -78,7 +78,7 @@ L_Start:
mes "\"Various wands and staffs are found throughout the land with many different strengths and weaknesses.\"";
mes "\"To use the wand you need to have it equipped and speak the incantation to let it tap into your mana.\"";
mes "\"As the power of your magic grows so will the spells you can cast.\"";
- mes "\"Lets start with a basic wand attack. " + getspellinvocation("wand") + "\"";
+ mes "\"Lets start with a basic wand attack. " + get(.invocation$, "spell-wand") + "\"";
mes "\"Equip the wand and lets try out that spell.\"";
mes "\"To cast a spell open the chat window, type the invocation and press enter.\"";
mes "\"Speak to me again once you've cast the spell.\"";
@@ -86,7 +86,7 @@ L_Start:
L_Started:
mes "[Morgan]";
- mes "\"Lets start with a basic wand attack. " + getspellinvocation("wand") + "\"";
+ mes "\"Lets start with a basic wand attack. " + get(.invocation$, "spell-wand") + "\"";
mes "\"Equip the wand and lets try out that spell.\"";
mes "\"To cast a spell open the chat window, type the invocation and press enter.\"";
mes "\"Speak to me again once you've cast the spell.\"";
@@ -95,7 +95,7 @@ L_Started:
L_CastOnce:
mes "[Morgan]";
mes "\"Ok, good job! Looks like you have good mana flow.\"";
- mes "\"Onto the next lesson. Now that you have " + getspellinvocation("wand") + " cast,\"";
+ mes "\"Onto the next lesson. Now that you have " + get(.invocation$, "spell-wand") + " cast,\"";
mes "\"Each time you attack the wand will convert a bit of you mana into a magic bolt.\"";
mes "\"After so many attacks, you will need to recast the invocation to stay attuned to the wand.\"";
mes "\"(Logging out will also cancel any spell effects currently active in-game.).\"";
@@ -106,7 +106,7 @@ L_CastOnce:
L_LearningDone:
mes "[Morgan]";
- mes "\"" + getspellinvocation("wand") + " is a basic wand attack.\"";
+ mes "\"" + get(.invocation$, "spell-wand") + " is a basic wand attack.\"";
mes "\"A Wand must be equipped to use the spell.\"";
mes "\"To cast a spell open the chat window, type the invocation and press enter.\"";
mes "\"I've taught you all I can for now. You should visit the Mana Seed north west of Hurnscald.\"";
diff --git a/world/map/npc/029-2/sorfina.txt b/world/map/npc/029-2/sorfina.txt
index 9d2d4bb3..7c6a589f 100644
--- a/world/map/npc/029-2/sorfina.txt
+++ b/world/map/npc/029-2/sorfina.txt
@@ -86,10 +86,10 @@ L_Carpet:
mes "[Sorfina]";
mes "\"Try to take a few steps and walk to that carpet over there.";
next;
- npcaction 2, "#Carpet";
+ camera "#Carpet";
mapmask getmask() | 4;
next;
- npcaction 3;
+ camera;
mes "Press [###keyMoveUp;] to move up, press [###keyMoveDown;] to move down, ";
mes "press [###keyMoveLeft;] to move left, press [###keyMoveRight;] to move right ";
mes " or click on the place you want to go to.\"";
@@ -100,12 +100,12 @@ L_Dresser:
mes "[Sorfina]";
mes "\"You should get dressed now.\"";
next;
- npcaction 2, "Dresser#tutorial";
+ camera "Dresser#tutorial";
mapmask getmask() | 32;
mes "\"In that dresser there are some clothes you can wear.\"";
mes "\"To interact with things in your environment or talk to NPCs you can either click on it or press [###keyTargetNPC;] to focus and [###keyTalk;] to talk/activate.\"";
next;
- npcaction 3;
+ camera;
mes "\"Now get the clothes out of the dresser.\"";
goto L_Close;
@@ -169,6 +169,7 @@ L_Explain:
"... the inventory and items?",L_Items,
"... shortcuts?",L_Shortcut,
"... what to do in Candor?",L_Aidan,
+ "... change my appearence?",L_Barber,
"... nevermind.",L_Close;
L_Walk:
@@ -241,6 +242,15 @@ L_Aidan:
mes "Talk to everybody. You can never tell when they might know something useful.\"";
goto L_Close;
+L_Barber:
+ mes "[Sorfina]";
+ mes "\"Jessie downstairs can change your appearance.\"";
+ mes "\"They will allow you to change your hair color or style as well as gender.\"";
+ next;
+ mes "\"There are a number of people across the continent that can change this for you.\"";
+ mes "\"There is no cost or limit to the number of times it can be changed.\"";
+ goto L_Close;
+
L_Hasan:
mes "[Sorfina]";
mes "\"Make yourself at home! Do you have any questions?\"";
@@ -303,12 +313,12 @@ OnTouch:
mes "[Sorfina]";
mes "\"You should get dressed now.\"";
next;
- npcaction 2, "Dresser#tutorial";
+ camera "Dresser#tutorial";
mapmask getmask() | 16;
mes "\"In that dresser there are some clothes you can wear.\"";
mes "\"To interact with things in your environment or talk to NPCs you can either click on it or press N to focus and T to talk/activate.\"";
next;
- npcaction 3;
+ camera;
mes "\"Now get the clothes out of the dresser.\"";
set QL_BEGIN, 2;
close;
@@ -389,27 +399,21 @@ L_Block:
{
if (TUT_var == 0)
goto L_KnockBack;
- goto L_Close;
+ end;
L_KnockBack:
message strcharinfo(0), "Server : ##BPlease Accept the Game rules";
warp "029-2", 22, 24;
- goto L_Close;
-
-L_Close:
- close;
+ end;
}
029-2,24,24,0|script|#GameRules4|32767,0,1
{
if (TUT_var == 0)
goto L_KnockBack;
- goto L_Close;
+ end;
L_KnockBack:
message strcharinfo(0), "Server : ##BPlease Accept the Game rules";
warp "029-2", 22, 24;
- goto L_Close;
-
-L_Close:
- close;
+ end;
}
diff --git a/world/map/npc/029-2/tanisha.txt b/world/map/npc/029-2/tanisha.txt
index 7142721e..025cc499 100644
--- a/world/map/npc/029-2/tanisha.txt
+++ b/world/map/npc/029-2/tanisha.txt
@@ -221,7 +221,7 @@ OnTimer1000:
if (getareausers("029-2", 98, 84, 106, 89) == 0)
goto L_CleanUp;
// This is needed because multiple players can be in the area at once
- areatimer "029-2", 98, 84, 106, 89, 0, "Tanisha::OnTick";
+ areatimer 0, "029-2", 98, 84, 106, 89, 0, "Tanisha::OnTick";
end;
L_CleanUp:
diff --git a/world/map/npc/029-3/_import.txt b/world/map/npc/029-3/_import.txt
index f879a861..2fe4f885 100644
--- a/world/map/npc/029-3/_import.txt
+++ b/world/map/npc/029-3/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 029-3
npc: npc/029-3/_mobs.txt
+npc: npc/029-3/_nodes.txt
npc: npc/029-3/_warps.txt
npc: npc/029-3/barrier.txt
npc: npc/029-3/mapflags.txt
diff --git a/world/map/npc/029-3/_mobs.txt b/world/map/npc/029-3/_mobs.txt
index 9a83bf7f..83f4ee2f 100644
--- a/world/map/npc/029-3/_mobs.txt
+++ b/world/map/npc/029-3/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Candor Cave mobs
-
-
-029-3,0,0,0|script|Mob029-3|32767
-{
- end;
-}
diff --git a/world/map/npc/029-3/_nodes.txt b/world/map/npc/029-3/_nodes.txt
new file mode 100644
index 00000000..127723aa
--- /dev/null
+++ b/world/map/npc/029-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Candor Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/029-3/parua.txt b/world/map/npc/029-3/parua.txt
index 5ebcc4d7..ef630413 100644
--- a/world/map/npc/029-3/parua.txt
+++ b/world/map/npc/029-3/parua.txt
@@ -187,7 +187,7 @@ OnTimer5000:
L_Return_1:
set $@FIGHT_CAVE_PLAYER_COUNT, 0;
- areatimer "029-3", 20, 20, 70, 60, 10, "Parua::OnTick";
+ areatimer 0, "029-3", 20, 20, 70, 60, 10, "Parua::OnTick";
end;
L_CaveLogic:
@@ -215,7 +215,7 @@ L_NextRound:
goto L_CleanUp;
set $@FIGHT_CAVE_POINTS, $@FIGHT_CAVE_LEVEL;
- areatimer "029-3", 20, 20, 70, 60, 10, "Parua::OnNewRound";
+ areatimer 0, "029-3", 20, 20, 70, 60, 10, "Parua::OnNewRound";
set $@candor_npctalk$, "The next round (level " + $@FIGHT_CAVE_LEVEL + ") is starting with " + $@FIGHT_CAVE_PLAYER_COUNT + " player(s) left alive.";
donpcevent "#CandorAnnouncer::OnCommandTalk";
@@ -360,7 +360,7 @@ L_CleanUp:
npctalk strnpcinfo(0), "Game Over";
set $@candor_npctalk$, "The dungeon is now ready for its next victims.";
donpcevent "#CandorAnnouncer::OnCommandTalk";
- areatimer "029-3", 20, 20, 70, 60, 10, "Parua::OnReward";
+ areatimer 0, "029-3", 20, 20, 70, 60, 10, "Parua::OnReward";
set $@FIGHT_CAVE_STATUS, 0;
set $@ANNOUNCE_TIME, 0;
set $@FIGHT_CAVE_PAID, 0;
diff --git a/world/map/npc/030-2/_import.txt b/world/map/npc/030-2/_import.txt
index 2588ec56..938c74e8 100644
--- a/world/map/npc/030-2/_import.txt
+++ b/world/map/npc/030-2/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 030-2
npc: npc/030-2/_mobs.txt
+npc: npc/030-2/_nodes.txt
npc: npc/030-2/_warps.txt
npc: npc/030-2/avalia.txt
npc: npc/030-2/basic_npcs.txt
diff --git a/world/map/npc/030-2/_mobs.txt b/world/map/npc/030-2/_mobs.txt
index 664e8111..7664126e 100644
--- a/world/map/npc/030-2/_mobs.txt
+++ b/world/map/npc/030-2/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Christmas Inn mobs
-
-
-030-2,0,0,0|script|Mob030-2|32767
-{
- end;
-}
diff --git a/world/map/npc/030-2/_nodes.txt b/world/map/npc/030-2/_nodes.txt
new file mode 100644
index 00000000..8fea3767
--- /dev/null
+++ b/world/map/npc/030-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Christmas Inn nodes
+
+// (no nodes)
diff --git a/world/map/npc/030-3/_import.txt b/world/map/npc/030-3/_import.txt
index bbce8cb4..252027e4 100644
--- a/world/map/npc/030-3/_import.txt
+++ b/world/map/npc/030-3/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 030-3
npc: npc/030-3/_mobs.txt
+npc: npc/030-3/_nodes.txt
npc: npc/030-3/_warps.txt
npc: npc/030-3/mapflags.txt
npc: npc/030-3/orum_homunculus.txt
diff --git a/world/map/npc/030-3/_mobs.txt b/world/map/npc/030-3/_mobs.txt
index 9d4b3b43..d1a3f5e8 100644
--- a/world/map/npc/030-3/_mobs.txt
+++ b/world/map/npc/030-3/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// The Frozen Lake mobs
-
-
-030-3,0,0,0|script|Mob030-3|32767
-{
- end;
-}
diff --git a/world/map/npc/030-3/_nodes.txt b/world/map/npc/030-3/_nodes.txt
new file mode 100644
index 00000000..e78786b3
--- /dev/null
+++ b/world/map/npc/030-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// The Frozen Lake nodes
+
+// (no nodes)
diff --git a/world/map/npc/030-4/_import.txt b/world/map/npc/030-4/_import.txt
index b4b8153a..26492173 100644
--- a/world/map/npc/030-4/_import.txt
+++ b/world/map/npc/030-4/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 030-4
npc: npc/030-4/_mobs.txt
+npc: npc/030-4/_nodes.txt
npc: npc/030-4/_warps.txt
npc: npc/030-4/mana_battery.txt
npc: npc/030-4/mapflags.txt
diff --git a/world/map/npc/030-4/_mobs.txt b/world/map/npc/030-4/_mobs.txt
index 97ff93a8..e53861b5 100644
--- a/world/map/npc/030-4/_mobs.txt
+++ b/world/map/npc/030-4/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Christmas Inn Warehouse mobs
-
-
-030-4,0,0,0|script|Mob030-4|32767
-{
- end;
-}
diff --git a/world/map/npc/030-4/_nodes.txt b/world/map/npc/030-4/_nodes.txt
new file mode 100644
index 00000000..14284ca5
--- /dev/null
+++ b/world/map/npc/030-4/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Christmas Inn Warehouse nodes
+
+// (no nodes)
diff --git a/world/map/npc/030-4/mana_battery.txt b/world/map/npc/030-4/mana_battery.txt
index aea601c5..15ff40c3 100644
--- a/world/map/npc/030-4/mana_battery.txt
+++ b/world/map/npc/030-4/mana_battery.txt
@@ -197,7 +197,7 @@ OnTimer5000:
L_Return_1:
set $@XmasBossPlayerCount, 0;
- areatimer "030-4", 0, 0, 60, 60, 10, "AniManOMat::OnTick";
+ areatimer 0, "030-4", 0, 0, 60, 60, 10, "AniManOMat::OnTick";
end;
L_CaveLogic:
@@ -294,7 +294,7 @@ L_Finished:
goto L_CleanUp;
L_CleanUp:
- areatimer "030-4", 0, 0, 50, 50, 10, "AniManOMat::OnReward";
+ areatimer 0, "030-4", 0, 0, 50, 50, 10, "AniManOMat::OnReward";
set $@XmasBossPlayerCount, 0;
set $@XmasBossRound, 0;
set $@BombTimer, 0;
@@ -338,7 +338,7 @@ L_EndNice:
end;
OnCommandChamberReset:
- areatimer "030-4", 0, 0, 50, 50, 10, "AniManOMat::OnReward";
+ areatimer 0, "030-4", 0, 0, 50, 50, 10, "AniManOMat::OnReward";
set $@XmasBattleStatus, 0;
set $@XmasBossPlayerCount, 0;
set $@XmasBossRound, 0;
diff --git a/world/map/npc/031-1/_import.txt b/world/map/npc/031-1/_import.txt
index 827a60e8..fe66c2d2 100644
--- a/world/map/npc/031-1/_import.txt
+++ b/world/map/npc/031-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 031-1
npc: npc/031-1/_mobs.txt
+npc: npc/031-1/_nodes.txt
npc: npc/031-1/_warps.txt
npc: npc/031-1/angelaOutside.txt
npc: npc/031-1/dock.txt
diff --git a/world/map/npc/031-1/_mobs.txt b/world/map/npc/031-1/_mobs.txt
index d5a747fb..c8d85539 100644
--- a/world/map/npc/031-1/_mobs.txt
+++ b/world/map/npc/031-1/_mobs.txt
@@ -1,33 +1,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Nivalis Port mobs
-031-1,0,0,0,0|monster|Fluffy|1020,10,100000ms,30000ms,Mob031-1::On1020
-031-1,0,0,0,0|monster|Pollett|1113,14,100000ms,30000ms,Mob031-1::On1113
-031-1,76,26,10,5|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-1::On1093
-031-1,0,0,0,0|monster|WhiteBell|1095,4,100000ms,30000ms,Mob031-1::On1095
-
-
-031-1,0,0,0|script|Mob031-1|32767
-{
- end;
-
-On1020:
- set @mobID, 1020;
- callfunc "MobPoints";
- end;
-
-On1093:
- set @mobID, 1093;
- callfunc "MobPoints";
- end;
-
-On1095:
- set @mobID, 1095;
- callfunc "MobPoints";
- end;
-
-On1113:
- set @mobID, 1113;
- callfunc "MobPoints";
- end;
-}
+031-1,0,0,0,0|monster|Fluffy|1020,10,100000ms,30000ms
+031-1,0,0,0,0|monster|Pollett|1113,14,100000ms,30000ms
+031-1,76,26,10,5|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-1,0,0,0,0|monster|WhiteBell|1095,4,100000ms,30000ms
diff --git a/world/map/npc/031-1/_nodes.txt b/world/map/npc/031-1/_nodes.txt
new file mode 100644
index 00000000..c369eff4
--- /dev/null
+++ b/world/map/npc/031-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Nivalis Port nodes
+
+// (no nodes)
diff --git a/world/map/npc/031-2/_import.txt b/world/map/npc/031-2/_import.txt
index 2e3f4e77..cfb6eb4a 100644
--- a/world/map/npc/031-2/_import.txt
+++ b/world/map/npc/031-2/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 031-2
npc: npc/031-2/_mobs.txt
+npc: npc/031-2/_nodes.txt
npc: npc/031-2/_warps.txt
npc: npc/031-2/angelaHouse.txt
npc: npc/031-2/cindyHouse.txt
diff --git a/world/map/npc/031-2/_mobs.txt b/world/map/npc/031-2/_mobs.txt
index ab4d5c66..b21a6a20 100644
--- a/world/map/npc/031-2/_mobs.txt
+++ b/world/map/npc/031-2/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Angela's House mobs
-
-
-031-2,0,0,0|script|Mob031-2|32767
-{
- end;
-}
diff --git a/world/map/npc/031-2/_nodes.txt b/world/map/npc/031-2/_nodes.txt
new file mode 100644
index 00000000..f62ab315
--- /dev/null
+++ b/world/map/npc/031-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Angela's House nodes
+
+// (no nodes)
diff --git a/world/map/npc/031-3/_import.txt b/world/map/npc/031-3/_import.txt
index 0094b579..bd4af770 100644
--- a/world/map/npc/031-3/_import.txt
+++ b/world/map/npc/031-3/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 031-3
npc: npc/031-3/_mobs.txt
+npc: npc/031-3/_nodes.txt
npc: npc/031-3/_warps.txt
npc: npc/031-3/labyrinth.txt
npc: npc/031-3/mapflags.txt
diff --git a/world/map/npc/031-3/_mobs.txt b/world/map/npc/031-3/_mobs.txt
index ccfb1199..2004a2f2 100644
--- a/world/map/npc/031-3/_mobs.txt
+++ b/world/map/npc/031-3/_mobs.txt
@@ -1,138 +1,92 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Ice Labyrinth mobs
-031-3,230,279,25,26|monster|IceGoblin|1058,5,100000ms,30000ms,Mob031-3::On1058
-031-3,195,277,25,26|monster|IceGoblin|1058,3,100000ms,30000ms,Mob031-3::On1058
-031-3,213,282,66,43|monster|Bat|1017,5,100000ms,30000ms,Mob031-3::On1017
-031-3,37,213,27,23|monster|Yeti|1072,2,100000ms,30000ms,Mob031-3::On1072
-031-3,35,212,27,23|monster|Bat|1017,11,100000ms,30000ms,Mob031-3::On1017
-031-3,38,147,44,68|monster|Moggun|1061,19,100000ms,30000ms,Mob031-3::On1061
-031-3,97,261,42,22|monster|Moggun|1061,5,100000ms,30000ms,Mob031-3::On1061
-031-3,97,291,42,22|monster|Moggun|1061,5,100000ms,30000ms,Mob031-3::On1061
-031-3,36,148,64,43|monster|Bat|1017,11,100000ms,30000ms,Mob031-3::On1017
-031-3,97,277,22,42|monster|Bat|1017,11,100000ms,30000ms,Mob031-3::On1017
-031-3,148,282,22,42|monster|Bat|1017,11,100000ms,30000ms,Mob031-3::On1017
-031-3,145,293,25,26|monster|IceGoblin|1058,6,100000ms,30000ms,Mob031-3::On1058
-031-3,98,214,39,44|monster|IceElement|1071,2,100000ms,30000ms,Mob031-3::On1071
-031-3,99,214,25,26|monster|IceGoblin|1058,3,100000ms,30000ms,Mob031-3::On1058
-031-3,198,144,29,53|monster|IceGoblin|1058,4,100000ms,30000ms,Mob031-3::On1058
-031-3,97,291,42,22|monster|Moggun|1061,5,100000ms,30000ms,Mob031-3::On1061
-031-3,278,282,33,14|monster|IceGoblin|1058,5,100000ms,30000ms,Mob031-3::On1058
-031-3,98,214,39,44|monster|IceElement|1071,2,100000ms,30000ms,Mob031-3::On1071
-031-3,285,218,8,75|monster|IceElement|1071,2,100000ms,30000ms,Mob031-3::On1071
-031-3,283,217,41,64|monster|Bat|1017,15,100000ms,30000ms,Mob031-3::On1017
-031-3,282,237,63,20|monster|Moggun|1061,3,100000ms,30000ms,Mob031-3::On1061
-031-3,282,196,62,16|monster|Moggun|1061,3,100000ms,30000ms,Mob031-3::On1061
-031-3,229,226,27,34|monster|Yeti|1072,3,100000ms,30000ms,Mob031-3::On1072
-031-3,230,227,12,42|monster|IceGoblin|1058,5,100000ms,30000ms,Mob031-3::On1058
-031-3,209,199,12,17|monster|Yeti|1072,2,100000ms,30000ms,Mob031-3::On1072
-031-3,193,216,12,17|monster|Yeti|1072,1,100000ms,30000ms,Mob031-3::On1072
-031-3,213,282,66,43|monster|Bat|1017,5,100000ms,30000ms,Mob031-3::On1017
-031-3,213,282,66,43|monster|Pollett|1113,5,100000ms,30000ms,Mob031-3::On1113
-031-3,199,200,45,14|monster|Bat|1017,13,100000ms,30000ms,Mob031-3::On1017
-031-3,209,199,12,17|monster|Yeti|1072,2,100000ms,30000ms,Mob031-3::On1072
-031-3,234,141,18,19|monster|Yeti|1072,2,100000ms,30000ms,Mob031-3::On1072
-031-3,282,196,62,16|monster|Moggun|1061,3,100000ms,30000ms,Mob031-3::On1061
-031-3,212,159,62,16|monster|Moggun|1061,7,100000ms,30000ms,Mob031-3::On1061
-031-3,212,159,62,16|monster|Moggun|1061,7,100000ms,30000ms,Mob031-3::On1061
-031-3,212,130,62,16|monster|Moggun|1061,7,100000ms,30000ms,Mob031-3::On1061
-031-3,284,143,40,48|monster|Moggun|1061,7,100000ms,30000ms,Mob031-3::On1061
-031-3,283,84,36,31|monster|Bat|1017,15,100000ms,30000ms,Mob031-3::On1017
-031-3,283,84,36,31|monster|Bat|1017,15,100000ms,30000ms,Mob031-3::On1017
-031-3,274,81,15,32|monster|Yeti|1072,2,100000ms,30000ms,Mob031-3::On1072
-031-3,40,53,44,68|monster|Moggun|1061,10,100000ms,30000ms,Mob031-3::On1061
-031-3,120,160,85,30|monster|Yeti|1072,4,100000ms,30000ms,Mob031-3::On1072
-031-3,121,131,82,24|monster|Yeti|1072,8,100000ms,30000ms,Mob031-3::On1072
-031-3,107,130,25,26|monster|IceGoblin|1058,6,100000ms,30000ms,Mob031-3::On1058
-031-3,145,160,25,24|monster|IceGoblin|1058,6,100000ms,30000ms,Mob031-3::On1058
-031-3,94,167,25,24|monster|IceGoblin|1058,6,100000ms,30000ms,Mob031-3::On1058
-031-3,282,37,31,28|monster|IceElement|1071,5,100000ms,30000ms,Mob031-3::On1071
-031-3,213,36,64,32|monster|IceElement|1071,5,100000ms,30000ms,Mob031-3::On1071
-031-3,228,83,31,28|monster|IceElement|1071,3,100000ms,30000ms,Mob031-3::On1071
-031-3,283,138,15,13|monster|IceElement|1071,1,100000ms,30000ms,Mob031-3::On1071
-031-3,198,83,31,28|monster|IceElement|1071,3,100000ms,30000ms,Mob031-3::On1071
-031-3,214,75,25,26|monster|IceGoblin|1058,3,100000ms,30000ms,Mob031-3::On1058
-031-3,217,37,66,43|monster|Bat|1017,10,100000ms,30000ms,Mob031-3::On1017
-031-3,39,52,64,56|monster|Bat|1017,5,100000ms,30000ms,Mob031-3::On1017
-031-3,39,274,64,56|monster|Bat|1017,10,100000ms,30000ms,Mob031-3::On1017
-031-3,119,51,39,64|monster|Bat|1017,10,100000ms,30000ms,Mob031-3::On1017
-031-3,119,50,57,51|monster|IceElement|1071,5,100000ms,30000ms,Mob031-3::On1071
-031-3,120,79,20,17|monster|Yeti|1072,2,100000ms,30000ms,Mob031-3::On1072
-031-3,37,284,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,28,255,14,9|monster|BlueSlime|1091,2,100000ms,30000ms,Mob031-3::On1091
-031-3,212,277,14,9|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,289,295,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,292,288,14,9|monster|BlueSlime|1091,2,100000ms,30000ms,Mob031-3::On1091
-031-3,296,233,7,6|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,271,222,7,6|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,281,215,55,21|monster|BlueSlime|1091,5,100000ms,30000ms,Mob031-3::On1091
-031-3,126,35,6,5|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,143,124,34,22|monster|BlueSlime|1091,2,100000ms,30000ms,Mob031-3::On1091
-031-3,48,65,14,9|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,37,113,5,13|monster|BlueSlime|1091,1,100000ms,30000ms,Mob031-3::On1091
-031-3,136,227,14,9|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,152,218,13,17|monster|BlueSlime|1091,4,100000ms,30000ms,Mob031-3::On1091
-031-3,135,206,9,6|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,154,202,7,7|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,136,216,6,4|monster|BlueSlime|1091,2,100000ms,30000ms,Mob031-3::On1091
-031-3,112,276,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,143,294,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,149,268,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,136,264,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,157,283,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,139,264,25,19|monster|BlueSlime|1091,4,100000ms,30000ms,Mob031-3::On1091
-031-3,24,265,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,52,280,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,37,254,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,24,290,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,48,298,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,53,260,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob031-3::On1093
-031-3,23,275,14,9|monster|BlueSlime|1091,2,100000ms,30000ms,Mob031-3::On1091
-031-3,37,272,14,9|monster|BlueSlime|1091,2,100000ms,30000ms,Mob031-3::On1091
-031-3,52,285,14,9|monster|BlueSlime|1091,2,100000ms,30000ms,Mob031-3::On1091
-
-
-031-3,0,0,0|script|Mob031-3|32767
-{
- end;
-
-On1017:
- set @mobID, 1017;
- callfunc "MobPoints";
- end;
-
-On1058:
- set @mobID, 1058;
- callfunc "MobPoints";
- end;
-
-On1061:
- set @mobID, 1061;
- callfunc "MobPoints";
- end;
-
-On1071:
- set @mobID, 1071;
- callfunc "MobPoints";
- end;
-
-On1072:
- set @mobID, 1072;
- callfunc "MobPoints";
- end;
-
-On1091:
- set @mobID, 1091;
- callfunc "MobPoints";
- end;
-
-On1093:
- set @mobID, 1093;
- callfunc "MobPoints";
- end;
-
-On1113:
- set @mobID, 1113;
- callfunc "MobPoints";
- end;
-}
+031-3,230,279,25,26|monster|IceGoblin|1058,5,100000ms,30000ms
+031-3,195,277,25,26|monster|IceGoblin|1058,3,100000ms,30000ms
+031-3,213,282,66,43|monster|Bat|1017,5,100000ms,30000ms
+031-3,37,213,27,23|monster|Yeti|1072,2,100000ms,30000ms
+031-3,35,212,27,23|monster|Bat|1017,11,100000ms,30000ms
+031-3,38,147,44,68|monster|Moggun|1061,19,100000ms,30000ms
+031-3,97,261,42,22|monster|Moggun|1061,5,100000ms,30000ms
+031-3,97,291,42,22|monster|Moggun|1061,5,100000ms,30000ms
+031-3,36,148,64,43|monster|Bat|1017,11,100000ms,30000ms
+031-3,97,277,22,42|monster|Bat|1017,11,100000ms,30000ms
+031-3,148,282,22,42|monster|Bat|1017,11,100000ms,30000ms
+031-3,145,293,25,26|monster|IceGoblin|1058,6,100000ms,30000ms
+031-3,98,214,39,44|monster|IceElement|1071,2,100000ms,30000ms
+031-3,99,214,25,26|monster|IceGoblin|1058,3,100000ms,30000ms
+031-3,198,144,29,53|monster|IceGoblin|1058,4,100000ms,30000ms
+031-3,97,291,42,22|monster|Moggun|1061,5,100000ms,30000ms
+031-3,278,282,33,14|monster|IceGoblin|1058,5,100000ms,30000ms
+031-3,98,214,39,44|monster|IceElement|1071,2,100000ms,30000ms
+031-3,285,218,8,75|monster|IceElement|1071,2,100000ms,30000ms
+031-3,283,217,41,64|monster|Bat|1017,15,100000ms,30000ms
+031-3,282,237,63,20|monster|Moggun|1061,3,100000ms,30000ms
+031-3,282,196,62,16|monster|Moggun|1061,3,100000ms,30000ms
+031-3,229,226,27,34|monster|Yeti|1072,3,100000ms,30000ms
+031-3,230,227,12,42|monster|IceGoblin|1058,5,100000ms,30000ms
+031-3,209,199,12,17|monster|Yeti|1072,2,100000ms,30000ms
+031-3,193,216,12,17|monster|Yeti|1072,1,100000ms,30000ms
+031-3,213,282,66,43|monster|Bat|1017,5,100000ms,30000ms
+031-3,213,282,66,43|monster|Pollett|1113,5,100000ms,30000ms
+031-3,199,200,45,14|monster|Bat|1017,13,100000ms,30000ms
+031-3,209,199,12,17|monster|Yeti|1072,2,100000ms,30000ms
+031-3,234,141,18,19|monster|Yeti|1072,2,100000ms,30000ms
+031-3,282,196,62,16|monster|Moggun|1061,3,100000ms,30000ms
+031-3,212,159,62,16|monster|Moggun|1061,7,100000ms,30000ms
+031-3,212,159,62,16|monster|Moggun|1061,7,100000ms,30000ms
+031-3,212,130,62,16|monster|Moggun|1061,7,100000ms,30000ms
+031-3,284,143,40,48|monster|Moggun|1061,7,100000ms,30000ms
+031-3,283,84,36,31|monster|Bat|1017,15,100000ms,30000ms
+031-3,283,84,36,31|monster|Bat|1017,15,100000ms,30000ms
+031-3,274,81,15,32|monster|Yeti|1072,2,100000ms,30000ms
+031-3,40,53,44,68|monster|Moggun|1061,10,100000ms,30000ms
+031-3,120,160,85,30|monster|Yeti|1072,4,100000ms,30000ms
+031-3,121,131,82,24|monster|Yeti|1072,8,100000ms,30000ms
+031-3,107,130,25,26|monster|IceGoblin|1058,6,100000ms,30000ms
+031-3,145,160,25,24|monster|IceGoblin|1058,6,100000ms,30000ms
+031-3,94,167,25,24|monster|IceGoblin|1058,6,100000ms,30000ms
+031-3,282,37,31,28|monster|IceElement|1071,5,100000ms,30000ms
+031-3,213,36,64,32|monster|IceElement|1071,5,100000ms,30000ms
+031-3,228,83,31,28|monster|IceElement|1071,3,100000ms,30000ms
+031-3,283,138,15,13|monster|IceElement|1071,1,100000ms,30000ms
+031-3,198,83,31,28|monster|IceElement|1071,3,100000ms,30000ms
+031-3,214,75,25,26|monster|IceGoblin|1058,3,100000ms,30000ms
+031-3,217,37,66,43|monster|Bat|1017,10,100000ms,30000ms
+031-3,39,52,64,56|monster|Bat|1017,5,100000ms,30000ms
+031-3,39,274,64,56|monster|Bat|1017,10,100000ms,30000ms
+031-3,119,51,39,64|monster|Bat|1017,10,100000ms,30000ms
+031-3,119,50,57,51|monster|IceElement|1071,5,100000ms,30000ms
+031-3,120,79,20,17|monster|Yeti|1072,2,100000ms,30000ms
+031-3,37,284,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,28,255,14,9|monster|BlueSlime|1091,2,100000ms,30000ms
+031-3,212,277,14,9|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,289,295,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,292,288,14,9|monster|BlueSlime|1091,2,100000ms,30000ms
+031-3,296,233,7,6|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,271,222,7,6|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,281,215,55,21|monster|BlueSlime|1091,5,100000ms,30000ms
+031-3,126,35,6,5|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,143,124,34,22|monster|BlueSlime|1091,2,100000ms,30000ms
+031-3,48,65,14,9|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,37,113,5,13|monster|BlueSlime|1091,1,100000ms,30000ms
+031-3,136,227,14,9|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,152,218,13,17|monster|BlueSlime|1091,4,100000ms,30000ms
+031-3,135,206,9,6|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,154,202,7,7|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,136,216,6,4|monster|BlueSlime|1091,2,100000ms,30000ms
+031-3,112,276,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,143,294,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,149,268,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,136,264,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,157,283,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,139,264,25,19|monster|BlueSlime|1091,4,100000ms,30000ms
+031-3,24,265,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,52,280,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,37,254,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,24,290,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,48,298,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,53,260,6,4|monster|WhiteSlime|1093,7,100000ms,30000ms
+031-3,23,275,14,9|monster|BlueSlime|1091,2,100000ms,30000ms
+031-3,37,272,14,9|monster|BlueSlime|1091,2,100000ms,30000ms
+031-3,52,285,14,9|monster|BlueSlime|1091,2,100000ms,30000ms
diff --git a/world/map/npc/031-3/_nodes.txt b/world/map/npc/031-3/_nodes.txt
new file mode 100644
index 00000000..38ed7558
--- /dev/null
+++ b/world/map/npc/031-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Ice Labyrinth nodes
+
+// (no nodes)
diff --git a/world/map/npc/031-4/_import.txt b/world/map/npc/031-4/_import.txt
index 02089d01..250e5b20 100644
--- a/world/map/npc/031-4/_import.txt
+++ b/world/map/npc/031-4/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 031-4
npc: npc/031-4/_mobs.txt
+npc: npc/031-4/_nodes.txt
npc: npc/031-4/_warps.txt
npc: npc/031-4/barrier.txt
npc: npc/031-4/cindyCave.txt
diff --git a/world/map/npc/031-4/_mobs.txt b/world/map/npc/031-4/_mobs.txt
index cc2f2d21..891a5cd7 100644
--- a/world/map/npc/031-4/_mobs.txt
+++ b/world/map/npc/031-4/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Cindy Cave mobs
-
-
-031-4,0,0,0|script|Mob031-4|32767
-{
- end;
-}
diff --git a/world/map/npc/031-4/_nodes.txt b/world/map/npc/031-4/_nodes.txt
new file mode 100644
index 00000000..11486912
--- /dev/null
+++ b/world/map/npc/031-4/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Cindy Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/031-4/cindyCave.txt b/world/map/npc/031-4/cindyCave.txt
index 33c3a16f..c97b166d 100644
--- a/world/map/npc/031-4/cindyCave.txt
+++ b/world/map/npc/031-4/cindyCave.txt
@@ -131,7 +131,7 @@ OnTimer5000:
L_Return_1:
set $@FIGHT_YETI_PLAYER_COUNT, 0;
- areatimer "031-4", 0, 0, 95, 91, 10, "Cindy::OnTick";
+ areatimer 0, "031-4", 0, 0, 95, 91, 10, "Cindy::OnTick";
end;
L_CaveLogic:
@@ -184,7 +184,7 @@ OnPetDeath:
end;
L_CleanUp:
- areatimer "031-4", 0, 0, 95, 91, 10, "Cindy::OnReward";
+ areatimer 0, "031-4", 0, 0, 95, 91, 10, "Cindy::OnReward";
set $@FIGHT_YETI_STATUS, 0;
set $@FIGHT_YETI_PLAYER_COUNT, 0;
set $@FIGHT_YETI_WAVE, 0;
diff --git a/world/map/npc/032-3/_import.txt b/world/map/npc/032-3/_import.txt
index 66d368cd..09f9448c 100644
--- a/world/map/npc/032-3/_import.txt
+++ b/world/map/npc/032-3/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 032-3
npc: npc/032-3/_mobs.txt
+npc: npc/032-3/_nodes.txt
npc: npc/032-3/_warps.txt
npc: npc/032-3/mapflags.txt
diff --git a/world/map/npc/032-3/_mobs.txt b/world/map/npc/032-3/_mobs.txt
index 2e336d50..b84e45f3 100644
--- a/world/map/npc/032-3/_mobs.txt
+++ b/world/map/npc/032-3/_mobs.txt
@@ -1,64 +1,13 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Outback Cave mobs
-032-3,90,44,9,10|monster|Skeleton|1043,3,30000ms,100000ms,Mob032-3::On1043
-032-3,44,23,29,22|monster|MountainSnake|1026,7,30000ms,100000ms,Mob032-3::On1026
-032-3,125,46,35,75|monster|Snake|1010,13,30000ms,100000ms,Mob032-3::On1010
-032-3,80,44,9,10|monster|BlackScorpion|1009,5,30000ms,100000ms,Mob032-3::On1009
-032-3,85,33,9,10|monster|Spider|1012,5,30000ms,100000ms,Mob032-3::On1012
-032-3,83,18,37,9|monster|Archant|1060,8,30000ms,100000ms,Mob032-3::On1060
-032-3,78,76,24,21|monster|Archant|1060,8,30000ms,100000ms,Mob032-3::On1060
-032-3,25,76,24,21|monster|YellowSlime|1007,11,300000ms,1000000ms,Mob032-3::On1007
-032-3,46,51,34,18|monster|CaveMaggot|1056,11,30000ms,100000ms,Mob032-3::On1056
-032-3,0,0,0,0|monster|Bat|1017,25,30000ms,100000ms,Mob032-3::On1017
-
-
-032-3,0,0,0|script|Mob032-3|32767
-{
- end;
-
-On1007:
- set @mobID, 1007;
- callfunc "MobPoints";
- end;
-
-On1009:
- set @mobID, 1009;
- callfunc "MobPoints";
- end;
-
-On1010:
- set @mobID, 1010;
- callfunc "MobPoints";
- end;
-
-On1012:
- set @mobID, 1012;
- callfunc "MobPoints";
- end;
-
-On1017:
- set @mobID, 1017;
- callfunc "MobPoints";
- end;
-
-On1026:
- set @mobID, 1026;
- callfunc "MobPoints";
- end;
-
-On1043:
- set @mobID, 1043;
- callfunc "MobPoints";
- end;
-
-On1056:
- set @mobID, 1056;
- callfunc "MobPoints";
- end;
-
-On1060:
- set @mobID, 1060;
- callfunc "MobPoints";
- end;
-}
+032-3,90,44,9,10|monster|Skeleton|1043,3,30000ms,100000ms
+032-3,44,23,29,22|monster|MountainSnake|1026,7,30000ms,100000ms
+032-3,125,46,35,75|monster|Snake|1010,13,30000ms,100000ms
+032-3,80,44,9,10|monster|BlackScorpion|1009,5,30000ms,100000ms
+032-3,85,33,9,10|monster|Spider|1012,5,30000ms,100000ms
+032-3,83,18,37,9|monster|Archant|1060,8,30000ms,100000ms
+032-3,78,76,24,21|monster|Archant|1060,8,30000ms,100000ms
+032-3,25,76,24,21|monster|YellowSlime|1007,11,300000ms,1000000ms
+032-3,46,51,34,18|monster|CaveMaggot|1056,11,30000ms,100000ms
+032-3,0,0,0,0|monster|Bat|1017,25,30000ms,100000ms
diff --git a/world/map/npc/032-3/_nodes.txt b/world/map/npc/032-3/_nodes.txt
new file mode 100644
index 00000000..87034821
--- /dev/null
+++ b/world/map/npc/032-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Outback Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/033-1/_import.txt b/world/map/npc/033-1/_import.txt
index 6205545e..60a3096a 100644
--- a/world/map/npc/033-1/_import.txt
+++ b/world/map/npc/033-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 033-1
npc: npc/033-1/_mobs.txt
+npc: npc/033-1/_nodes.txt
npc: npc/033-1/_warps.txt
npc: npc/033-1/backDoor.txt
npc: npc/033-1/barbarianinit.txt
diff --git a/world/map/npc/033-1/_mobs.txt b/world/map/npc/033-1/_mobs.txt
index afbd35ed..2eb36796 100644
--- a/world/map/npc/033-1/_mobs.txt
+++ b/world/map/npc/033-1/_mobs.txt
@@ -1,33 +1,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// snow Path mobs
-033-1,73,49,10,18|monster|Wolvern|1090,2,100000ms,30000ms,Mob033-1::On1090
-033-1,33,38,15,49|monster|Reinboo|1094,3,100000ms,30000ms,Mob033-1::On1094
-033-1,56,87,50,42|monster|Squirrel|1038,15,100000ms,30000ms,Mob033-1::On1038
-033-1,0,0,0,0|monster|WhiteBell|1095,3,100000ms,30000ms,Mob033-1::On1095
-
-
-033-1,0,0,0|script|Mob033-1|32767
-{
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1090:
- set @mobID, 1090;
- callfunc "MobPoints";
- end;
-
-On1094:
- set @mobID, 1094;
- callfunc "MobPoints";
- end;
-
-On1095:
- set @mobID, 1095;
- callfunc "MobPoints";
- end;
-}
+033-1,73,49,10,18|monster|Wolvern|1090,2,100000ms,30000ms
+033-1,33,38,15,49|monster|Reinboo|1094,3,100000ms,30000ms
+033-1,56,87,50,42|monster|Squirrel|1038,15,100000ms,30000ms
+033-1,0,0,0,0|monster|WhiteBell|1095,3,100000ms,30000ms
diff --git a/world/map/npc/033-1/_nodes.txt b/world/map/npc/033-1/_nodes.txt
new file mode 100644
index 00000000..3842473e
--- /dev/null
+++ b/world/map/npc/033-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// snow Path nodes
+
+// (no nodes)
diff --git a/world/map/npc/033-1/kimarr.txt b/world/map/npc/033-1/kimarr.txt
index 6650198f..cbe2b289 100644
--- a/world/map/npc/033-1/kimarr.txt
+++ b/world/map/npc/033-1/kimarr.txt
@@ -196,7 +196,7 @@ L_Action:
goto L_Died;
// Checking if there is more than 1 player in the fight area
if (getareausers("033-1", 79, 28, 88, 42) > 1)
- areatimer "033-1", 79, 28, 88, 42, 10, "Kimarr::OnTooMany";
+ areatimer 0, "033-1", 79, 28, 88, 42, 10, "Kimarr::OnTooMany";
if ($@Fluffy_Time == 180)
npctalk strnpcinfo(0), strcharinfo(0) + ", you have 3 minutes.";
diff --git a/world/map/npc/034-1/_import.txt b/world/map/npc/034-1/_import.txt
index ae229c8c..fab02ab2 100644
--- a/world/map/npc/034-1/_import.txt
+++ b/world/map/npc/034-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 034-1
npc: npc/034-1/_mobs.txt
+npc: npc/034-1/_nodes.txt
npc: npc/034-1/_warps.txt
npc: npc/034-1/ambushs.txt
npc: npc/034-1/mapflags.txt
diff --git a/world/map/npc/034-1/_mobs.txt b/world/map/npc/034-1/_mobs.txt
index e02e496b..575d0220 100644
--- a/world/map/npc/034-1/_mobs.txt
+++ b/world/map/npc/034-1/_mobs.txt
@@ -1,45 +1,9 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Snow Forest mobs
-034-1,0,0,0,0|monster|Reinboo|1094,4,100000ms,30000ms,Mob034-1::On1094
-034-1,0,0,0,0|monster|Fluffy|1020,25,100000ms,30000ms,Mob034-1::On1020
-034-1,0,0,0,0|monster|WhiteBell|1095,5,100000ms,30000ms,Mob034-1::On1095
-034-1,0,0,0,0|monster|Squirrel|1038,25,100000ms,30000ms,Mob034-1::On1038
-034-1,0,0,0,0|monster|Santaboo|1112,4,100000ms,30000ms,Mob034-1::On1112
-034-1,1,1,0,0|monster|IceGoblin|1058,25,100000ms,30000ms,Mob034-1::On1058
-
-
-034-1,0,0,0|script|Mob034-1|32767
-{
- end;
-
-On1020:
- set @mobID, 1020;
- callfunc "MobPoints";
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1058:
- set @mobID, 1058;
- callfunc "MobPoints";
- end;
-
-On1094:
- set @mobID, 1094;
- callfunc "MobPoints";
- end;
-
-On1095:
- set @mobID, 1095;
- callfunc "MobPoints";
- end;
-
-On1112:
- set @mobID, 1112;
- callfunc "MobPoints";
- end;
-}
+034-1,0,0,0,0|monster|Reinboo|1094,4,100000ms,30000ms
+034-1,0,0,0,0|monster|Fluffy|1020,25,100000ms,30000ms
+034-1,0,0,0,0|monster|WhiteBell|1095,5,100000ms,30000ms
+034-1,0,0,0,0|monster|Squirrel|1038,25,100000ms,30000ms
+034-1,0,0,0,0|monster|Santaboo|1112,4,100000ms,30000ms
+034-1,1,1,0,0|monster|IceGoblin|1058,25,100000ms,30000ms
diff --git a/world/map/npc/034-1/_nodes.txt b/world/map/npc/034-1/_nodes.txt
new file mode 100644
index 00000000..99c4688b
--- /dev/null
+++ b/world/map/npc/034-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Snow Forest nodes
+
+// (no nodes)
diff --git a/world/map/npc/034-2/_import.txt b/world/map/npc/034-2/_import.txt
index 29e7a602..47130e2d 100644
--- a/world/map/npc/034-2/_import.txt
+++ b/world/map/npc/034-2/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 034-2
npc: npc/034-2/_mobs.txt
+npc: npc/034-2/_nodes.txt
npc: npc/034-2/_warps.txt
npc: npc/034-2/mapflags.txt
diff --git a/world/map/npc/034-2/_mobs.txt b/world/map/npc/034-2/_mobs.txt
index 709fcb08..9045b1c4 100644
--- a/world/map/npc/034-2/_mobs.txt
+++ b/world/map/npc/034-2/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Trappers Huts mobs
-
-
-034-2,0,0,0|script|Mob034-2|32767
-{
- end;
-}
diff --git a/world/map/npc/034-2/_nodes.txt b/world/map/npc/034-2/_nodes.txt
new file mode 100644
index 00000000..c92382fc
--- /dev/null
+++ b/world/map/npc/034-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Trappers Huts nodes
+
+// (no nodes)
diff --git a/world/map/npc/035-2/_import.txt b/world/map/npc/035-2/_import.txt
index a46f42b1..78b7188c 100644
--- a/world/map/npc/035-2/_import.txt
+++ b/world/map/npc/035-2/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 035-2
npc: npc/035-2/_mobs.txt
+npc: npc/035-2/_nodes.txt
npc: npc/035-2/_warps.txt
npc: npc/035-2/casino.txt
npc: npc/035-2/emblems.txt
diff --git a/world/map/npc/035-2/_mobs.txt b/world/map/npc/035-2/_mobs.txt
index 899a8d04..bb3f2eca 100644
--- a/world/map/npc/035-2/_mobs.txt
+++ b/world/map/npc/035-2/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Koga - Main mobs
-
-
-035-2,0,0,0|script|Mob035-2|32767
-{
- end;
-}
diff --git a/world/map/npc/035-2/_nodes.txt b/world/map/npc/035-2/_nodes.txt
new file mode 100644
index 00000000..7002a966
--- /dev/null
+++ b/world/map/npc/035-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Koga - Main nodes
+
+// (no nodes)
diff --git a/world/map/npc/036-2/_import.txt b/world/map/npc/036-2/_import.txt
index dd908e52..79ee898b 100644
--- a/world/map/npc/036-2/_import.txt
+++ b/world/map/npc/036-2/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 036-2
npc: npc/036-2/_mobs.txt
+npc: npc/036-2/_nodes.txt
npc: npc/036-2/_warps.txt
npc: npc/036-2/casino.txt
npc: npc/036-2/emblems.txt
diff --git a/world/map/npc/036-2/_mobs.txt b/world/map/npc/036-2/_mobs.txt
index 0cebfbc8..483d68b1 100644
--- a/world/map/npc/036-2/_mobs.txt
+++ b/world/map/npc/036-2/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Koga - Candor mobs
-
-
-036-2,0,0,0|script|Mob036-2|32767
-{
- end;
-}
diff --git a/world/map/npc/036-2/_nodes.txt b/world/map/npc/036-2/_nodes.txt
new file mode 100644
index 00000000..20ea08f2
--- /dev/null
+++ b/world/map/npc/036-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Koga - Candor nodes
+
+// (no nodes)
diff --git a/world/map/npc/043-3/_import.txt b/world/map/npc/043-3/_import.txt
index d915e2d0..b4b99268 100644
--- a/world/map/npc/043-3/_import.txt
+++ b/world/map/npc/043-3/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 043-3
npc: npc/043-3/_mobs.txt
+npc: npc/043-3/_nodes.txt
npc: npc/043-3/_warps.txt
npc: npc/043-3/mapflags.txt
diff --git a/world/map/npc/043-3/_mobs.txt b/world/map/npc/043-3/_mobs.txt
index 085615a4..772c8921 100644
--- a/world/map/npc/043-3/_mobs.txt
+++ b/world/map/npc/043-3/_mobs.txt
@@ -1,43 +1,12 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Sandy Dungeon Level 1 mobs
-043-3,39,45,24,17|monster|CaveMaggot|1056,6,20000ms,20000ms,Mob043-3::On1056
-043-3,44,60,24,17|monster|CaveMaggot|1056,6,20000ms,20000ms,Mob043-3::On1056
-043-3,41,96,34,26|monster|CaveMaggot|1056,10,20000ms,20000ms,Mob043-3::On1056
-043-3,52,91,6,7|monster|AngryScorpion|1057,5,30000ms,30000ms,Mob043-3::On1057
-043-3,102,116,26,19|monster|AngryFireGoblin|1108,10,30000ms,30000ms,Mob043-3::On1108
-043-3,33,99,6,7|monster|AngryScorpion|1057,5,30000ms,30000ms,Mob043-3::On1057
-043-3,116,78,25,19|monster|AngryFireGoblin|1108,8,30000ms,30000ms,Mob043-3::On1108
-043-3,113,47,30,22|monster|RedSlime|1008,15,45000ms,35000ms,Mob043-3::On1008
-043-3,94,44,40,18|monster|GreenSlime|1005,5,30000ms,15000ms,Mob043-3::On1005
-
-
-043-3,0,0,0|script|Mob043-3|32767
-{
- end;
-
-On1005:
- set @mobID, 1005;
- callfunc "MobPoints";
- end;
-
-On1008:
- set @mobID, 1008;
- callfunc "MobPoints";
- end;
-
-On1056:
- set @mobID, 1056;
- callfunc "MobPoints";
- end;
-
-On1057:
- set @mobID, 1057;
- callfunc "MobPoints";
- end;
-
-On1108:
- set @mobID, 1108;
- callfunc "MobPoints";
- end;
-}
+043-3,39,45,24,17|monster|CaveMaggot|1056,6,20000ms,20000ms
+043-3,44,60,24,17|monster|CaveMaggot|1056,6,20000ms,20000ms
+043-3,41,96,34,26|monster|CaveMaggot|1056,10,20000ms,20000ms
+043-3,52,91,6,7|monster|AngryScorpion|1057,5,30000ms,30000ms
+043-3,102,116,26,19|monster|AngryFireGoblin|1108,10,30000ms,30000ms
+043-3,33,99,6,7|monster|AngryScorpion|1057,5,30000ms,30000ms
+043-3,116,78,25,19|monster|AngryFireGoblin|1108,8,30000ms,30000ms
+043-3,113,47,30,22|monster|RedSlime|1008,15,45000ms,35000ms
+043-3,94,44,40,18|monster|GreenSlime|1005,5,30000ms,15000ms
diff --git a/world/map/npc/043-3/_nodes.txt b/world/map/npc/043-3/_nodes.txt
new file mode 100644
index 00000000..9b7b7c4e
--- /dev/null
+++ b/world/map/npc/043-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Sandy Dungeon Level 1 nodes
+
+// (no nodes)
diff --git a/world/map/npc/043-3/_warps.txt b/world/map/npc/043-3/_warps.txt
index bb55583c..da8eed49 100644
--- a/world/map/npc/043-3/_warps.txt
+++ b/world/map/npc/043-3/_warps.txt
@@ -4,4 +4,4 @@
043-3,31,26|warp|-1,-1,002-3,22,86
043-3,77,30|warp|-1,-1,043-4,47,67
043-3,116,36|warp|-1,-1,005-3,78,87
-043-3,32,37|warp|0,-1,005-3,33,83
+043-3,32,37|warp|0,-1,005-3,33,85
diff --git a/world/map/npc/043-4/_import.txt b/world/map/npc/043-4/_import.txt
index a7200a7e..4f3ccd45 100644
--- a/world/map/npc/043-4/_import.txt
+++ b/world/map/npc/043-4/_import.txt
@@ -1,6 +1,7 @@
-// Map 043-4: Sandy Dungeon Level 2
+// Map 043-4: Troll Cave
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 043-4
npc: npc/043-4/_mobs.txt
+npc: npc/043-4/_nodes.txt
npc: npc/043-4/_warps.txt
npc: npc/043-4/mapflags.txt
diff --git a/world/map/npc/043-4/_mobs.txt b/world/map/npc/043-4/_mobs.txt
index a06642d0..2d410126 100644
--- a/world/map/npc/043-4/_mobs.txt
+++ b/world/map/npc/043-4/_mobs.txt
@@ -1,61 +1,25 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
-// Sandy Dungeon Level 2 mobs
-
-043-4,139,163,7,6|monster|Terranite|1062,2,240000ms,120000ms,Mob043-4::On1062
-043-4,133,45,14,16|monster|UndeadTroll|1117,4,100000ms,50000ms,Mob043-4::On1117
-043-4,91,139,11,10|monster|UndeadTroll|1117,2,100000ms,50000ms,Mob043-4::On1117
-043-4,35,120,10,11|monster|UndeadTroll|1117,2,100000ms,50000ms,Mob043-4::On1117
-043-4,43,143,12,11|monster|UndeadWitch|1116,2,120000ms,60000ms,Mob043-4::On1116
-043-4,102,153,9,9|monster|UndeadWitch|1116,2,120000ms,60000ms,Mob043-4::On1116
-043-4,142,159,14,12|monster|UndeadWitch|1116,2,120000ms,60000ms,Mob043-4::On1116
-043-4,150,33,16,15|monster|UndeadWitch|1116,1,120000ms,60000ms,Mob043-4::On1116
-043-4,103,54,8,23|monster|UndeadTroll|1117,3,100000ms,50000ms,Mob043-4::On1117
-043-4,47,38,20,10|monster|Troll|1054,7,100000ms,50000ms,Mob043-4::On1054
-043-4,98,85,8,15|monster|Snake|1010,5,100000ms,50000ms,Mob043-4::On1010
-043-4,104,57,15,27|monster|Troll|1054,7,100000ms,50000ms,Mob043-4::On1054
-043-4,89,64,9,11|monster|BlackScorpion|1009,5,100000ms,50000ms,Mob043-4::On1009
-043-4,143,46,32,28|monster|Troll|1054,7,100000ms,50000ms,Mob043-4::On1054
-043-4,154,106,26,29|monster|BlackScorpion|1009,8,100000ms,50000ms,Mob043-4::On1009
-043-4,162,77,15,23|monster|Snake|1010,6,100000ms,50000ms,Mob043-4::On1010
-043-4,152,143,11,10|monster|BlackScorpion|1009,6,100000ms,50000ms,Mob043-4::On1009
-043-4,159,161,10,8|monster|Snake|1010,6,100000ms,50000ms,Mob043-4::On1010
-043-4,98,138,21,21|monster|Troll|1054,5,100000ms,50000ms,Mob043-4::On1054
-043-4,45,106,18,25|monster|Troll|1054,5,100000ms,50000ms,Mob043-4::On1054
-043-4,39,138,19,17|monster|BlackScorpion|1009,5,100000ms,50000ms,Mob043-4::On1009
-043-4,133,123,30,23|monster|Troll|1054,3,100000ms,50000ms,Mob043-4::On1054
-
-
-043-4,0,0,0|script|Mob043-4|32767
-{
- end;
-
-On1009:
- set @mobID, 1009;
- callfunc "MobPoints";
- end;
-
-On1010:
- set @mobID, 1010;
- callfunc "MobPoints";
- end;
-
-On1054:
- set @mobID, 1054;
- callfunc "MobPoints";
- end;
-
-On1062:
- set @mobID, 1062;
- callfunc "MobPoints";
- end;
-
-On1116:
- set @mobID, 1116;
- callfunc "MobPoints";
- end;
-
-On1117:
- set @mobID, 1117;
- callfunc "MobPoints";
- end;
-}
+// Troll Cave mobs
+
+043-4,139,163,7,6|monster|Terranite|1062,2,240000ms,120000ms
+043-4,133,45,14,16|monster|UndeadTroll|1117,4,100000ms,50000ms
+043-4,91,139,11,10|monster|UndeadTroll|1117,2,100000ms,50000ms
+043-4,35,120,10,11|monster|UndeadTroll|1117,2,100000ms,50000ms
+043-4,43,143,12,11|monster|UndeadWitch|1116,2,120000ms,60000ms
+043-4,102,153,9,9|monster|UndeadWitch|1116,2,120000ms,60000ms
+043-4,142,159,14,12|monster|UndeadWitch|1116,2,120000ms,60000ms
+043-4,150,33,16,15|monster|UndeadWitch|1116,1,120000ms,60000ms
+043-4,103,54,8,23|monster|UndeadTroll|1117,3,100000ms,50000ms
+043-4,47,38,20,10|monster|Troll|1054,7,100000ms,50000ms
+043-4,98,85,8,15|monster|Snake|1010,5,100000ms,50000ms
+043-4,104,57,15,27|monster|Troll|1054,7,100000ms,50000ms
+043-4,89,64,9,11|monster|BlackScorpion|1009,5,100000ms,50000ms
+043-4,143,46,32,28|monster|Troll|1054,7,100000ms,50000ms
+043-4,154,106,26,29|monster|BlackScorpion|1009,8,100000ms,50000ms
+043-4,162,77,15,23|monster|Snake|1010,6,100000ms,50000ms
+043-4,152,143,11,10|monster|BlackScorpion|1009,6,100000ms,50000ms
+043-4,159,161,10,8|monster|Snake|1010,6,100000ms,50000ms
+043-4,98,138,21,21|monster|Troll|1054,5,100000ms,50000ms
+043-4,45,106,18,25|monster|Troll|1054,5,100000ms,50000ms
+043-4,39,138,19,17|monster|BlackScorpion|1009,5,100000ms,50000ms
+043-4,133,123,30,23|monster|Troll|1054,3,100000ms,50000ms
diff --git a/world/map/npc/043-4/_nodes.txt b/world/map/npc/043-4/_nodes.txt
new file mode 100644
index 00000000..2e89bc1e
--- /dev/null
+++ b/world/map/npc/043-4/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Troll Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/043-4/_warps.txt b/world/map/npc/043-4/_warps.txt
index e10f3bfb..27f75e1c 100644
--- a/world/map/npc/043-4/_warps.txt
+++ b/world/map/npc/043-4/_warps.txt
@@ -1,6 +1,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
-// Sandy Dungeon Level 2 warps
+// Troll Cave warps
043-4,47,68|warp|-1,-1,043-3,77,31
043-4,153,27|warp|-1,-1,043-4,193,32
043-4,193,33|warp|-1,-1,043-4,153,28
+043-4,194,24|warp|-1,-1,043-5,30,107
diff --git a/world/map/npc/045-1/_import.txt b/world/map/npc/045-1/_import.txt
index a9101910..591b3e37 100644
--- a/world/map/npc/045-1/_import.txt
+++ b/world/map/npc/045-1/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 045-1
npc: npc/045-1/_mobs.txt
+npc: npc/045-1/_nodes.txt
npc: npc/045-1/_warps.txt
npc: npc/045-1/mapflags.txt
diff --git a/world/map/npc/045-1/_mobs.txt b/world/map/npc/045-1/_mobs.txt
index 37357556..f8a3433c 100644
--- a/world/map/npc/045-1/_mobs.txt
+++ b/world/map/npc/045-1/_mobs.txt
@@ -1,54 +1,18 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Deep Snow Forest mobs
-045-1,102,122,23,22|monster|Wolvern|1090,10,100000ms,30000ms,Mob045-1::On1090
-045-1,98,77,23,22|monster|Wolvern|1090,5,100000ms,30000ms,Mob045-1::On1090
-045-1,147,63,23,22|monster|Wolvern|1090,5,100000ms,30000ms,Mob045-1::On1090
-045-1,60,97,23,22|monster|Wolvern|1090,5,100000ms,30000ms,Mob045-1::On1090
-045-1,106,44,23,22|monster|Wolvern|1090,5,100000ms,30000ms,Mob045-1::On1090
-045-1,133,93,23,22|monster|Wolvern|1090,5,100000ms,30000ms,Mob045-1::On1090
-045-1,38,76,18,15|monster|Wolvern|1090,5,100000ms,30000ms,Mob045-1::On1090
-045-1,60,59,18,15|monster|Wolvern|1090,5,100000ms,30000ms,Mob045-1::On1090
-045-1,0,0,0,0|monster|Squirrel|1038,40,100000ms,30000ms,Mob045-1::On1038
-045-1,0,0,0,0|monster|Reinboo|1094,30,100000ms,30000ms,Mob045-1::On1094
-045-1,0,0,0,0|monster|Fluffy|1020,40,100000ms,30000ms,Mob045-1::On1020
-045-1,0,0,0,0|monster|WhiteBell|1095,5,100000ms,30000ms,Mob045-1::On1095
-045-1,47,145,25,25|monster|IceGoblin|1058,4,100000ms,30000ms,Mob045-1::On1058
-045-1,150,126,25,24|monster|IceGoblin|1058,4,100000ms,30000ms,Mob045-1::On1058
-045-1,104,149,79,10|monster|IceGoblin|1058,4,100000ms,30000ms,Mob045-1::On1058
-
-
-045-1,0,0,0|script|Mob045-1|32767
-{
- end;
-
-On1020:
- set @mobID, 1020;
- callfunc "MobPoints";
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1058:
- set @mobID, 1058;
- callfunc "MobPoints";
- end;
-
-On1090:
- set @mobID, 1090;
- callfunc "MobPoints";
- end;
-
-On1094:
- set @mobID, 1094;
- callfunc "MobPoints";
- end;
-
-On1095:
- set @mobID, 1095;
- callfunc "MobPoints";
- end;
-}
+045-1,102,122,23,22|monster|Wolvern|1090,10,100000ms,30000ms
+045-1,98,77,23,22|monster|Wolvern|1090,5,100000ms,30000ms
+045-1,147,63,23,22|monster|Wolvern|1090,5,100000ms,30000ms
+045-1,60,97,23,22|monster|Wolvern|1090,5,100000ms,30000ms
+045-1,106,44,23,22|monster|Wolvern|1090,5,100000ms,30000ms
+045-1,133,93,23,22|monster|Wolvern|1090,5,100000ms,30000ms
+045-1,38,76,18,15|monster|Wolvern|1090,5,100000ms,30000ms
+045-1,60,59,18,15|monster|Wolvern|1090,5,100000ms,30000ms
+045-1,0,0,0,0|monster|Squirrel|1038,40,100000ms,30000ms
+045-1,0,0,0,0|monster|Reinboo|1094,30,100000ms,30000ms
+045-1,0,0,0,0|monster|Fluffy|1020,40,100000ms,30000ms
+045-1,0,0,0,0|monster|WhiteBell|1095,5,100000ms,30000ms
+045-1,47,145,25,25|monster|IceGoblin|1058,4,100000ms,30000ms
+045-1,150,126,25,24|monster|IceGoblin|1058,4,100000ms,30000ms
+045-1,104,149,79,10|monster|IceGoblin|1058,4,100000ms,30000ms
diff --git a/world/map/npc/045-1/_nodes.txt b/world/map/npc/045-1/_nodes.txt
new file mode 100644
index 00000000..9ef28c87
--- /dev/null
+++ b/world/map/npc/045-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Deep Snow Forest nodes
+
+// (no nodes)
diff --git a/world/map/npc/046-1/_import.txt b/world/map/npc/046-1/_import.txt
index 9c11acb7..2700ea85 100644
--- a/world/map/npc/046-1/_import.txt
+++ b/world/map/npc/046-1/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 046-1
npc: npc/046-1/_mobs.txt
+npc: npc/046-1/_nodes.txt
npc: npc/046-1/_warps.txt
npc: npc/046-1/mapflags.txt
diff --git a/world/map/npc/046-1/_mobs.txt b/world/map/npc/046-1/_mobs.txt
index d5551ecd..919cca57 100644
--- a/world/map/npc/046-1/_mobs.txt
+++ b/world/map/npc/046-1/_mobs.txt
@@ -1,55 +1,14 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Rock Plateau mobs
-046-1,0,7,0,0|monster|Reinboo|1094,40,100000ms,30000ms,Mob046-1::On1094
-046-1,0,7,0,0|monster|Fluffy|1020,50,100000ms,30000ms,Mob046-1::On1020
-046-1,0,7,0,0|monster|Squirrel|1038,50,100000ms,30000ms,Mob046-1::On1038
-046-1,44,35,52,20|monster|Moggun|1061,12,100000ms,30000ms,Mob046-1::On1061
-046-1,0,7,0,0|monster|Yeti|1072,2,100000ms,30000ms,Mob046-1::On1072
-046-1,87,101,23,13|monster|Wolvern|1090,5,100000ms,30000ms,Mob046-1::On1090
-046-1,0,7,0,0|monster|WhiteBell|1095,9,100000ms,30000ms,Mob046-1::On1095
-046-1,72,59,15,12|monster|Wolvern|1090,2,100000ms,30000ms,Mob046-1::On1090
-046-1,36,112,10,9|monster|Wolvern|1090,2,100000ms,30000ms,Mob046-1::On1090
-046-1,115,40,45,33|monster|Wolvern|1090,7,100000ms,30000ms,Mob046-1::On1090
-046-1,145,67,10,9|monster|Wolvern|1090,2,100000ms,30000ms,Mob046-1::On1090
-
-
-046-1,0,0,0|script|Mob046-1|32767
-{
- end;
-
-On1020:
- set @mobID, 1020;
- callfunc "MobPoints";
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1061:
- set @mobID, 1061;
- callfunc "MobPoints";
- end;
-
-On1072:
- set @mobID, 1072;
- callfunc "MobPoints";
- end;
-
-On1090:
- set @mobID, 1090;
- callfunc "MobPoints";
- end;
-
-On1094:
- set @mobID, 1094;
- callfunc "MobPoints";
- end;
-
-On1095:
- set @mobID, 1095;
- callfunc "MobPoints";
- end;
-}
+046-1,0,7,0,0|monster|Reinboo|1094,40,100000ms,30000ms
+046-1,0,7,0,0|monster|Fluffy|1020,50,100000ms,30000ms
+046-1,0,7,0,0|monster|Squirrel|1038,50,100000ms,30000ms
+046-1,44,35,52,20|monster|Moggun|1061,12,100000ms,30000ms
+046-1,0,7,0,0|monster|Yeti|1072,2,100000ms,30000ms
+046-1,87,101,23,13|monster|Wolvern|1090,5,100000ms,30000ms
+046-1,0,7,0,0|monster|WhiteBell|1095,9,100000ms,30000ms
+046-1,72,59,15,12|monster|Wolvern|1090,2,100000ms,30000ms
+046-1,36,112,10,9|monster|Wolvern|1090,2,100000ms,30000ms
+046-1,115,40,45,33|monster|Wolvern|1090,7,100000ms,30000ms
+046-1,145,67,10,9|monster|Wolvern|1090,2,100000ms,30000ms
diff --git a/world/map/npc/046-1/_nodes.txt b/world/map/npc/046-1/_nodes.txt
new file mode 100644
index 00000000..9075a159
--- /dev/null
+++ b/world/map/npc/046-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Rock Plateau nodes
+
+// (no nodes)
diff --git a/world/map/npc/046-3/_import.txt b/world/map/npc/046-3/_import.txt
index 24769cc4..d06b31c5 100644
--- a/world/map/npc/046-3/_import.txt
+++ b/world/map/npc/046-3/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 046-3
npc: npc/046-3/_mobs.txt
+npc: npc/046-3/_nodes.txt
npc: npc/046-3/_warps.txt
npc: npc/046-3/mapflags.txt
diff --git a/world/map/npc/046-3/_mobs.txt b/world/map/npc/046-3/_mobs.txt
index 95c498ed..d75b5f5a 100644
--- a/world/map/npc/046-3/_mobs.txt
+++ b/world/map/npc/046-3/_mobs.txt
@@ -1,54 +1,18 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Frosty Underground mobs
-046-3,68,101,12,8|monster|Yeti|1072,2,100000ms,30000ms,Mob046-3::On1072
-046-3,0,0,0,0|monster|IceGoblin|1058,20,100000ms,30000ms,Mob046-3::On1058
-046-3,55,61,25,26|monster|Moggun|1061,14,100000ms,30000ms,Mob046-3::On1061
-046-3,119,104,5,4|monster|IceElement|1071,1,100000ms,30000ms,Mob046-3::On1071
-046-3,132,71,9,7|monster|WhiteSlime|1093,4,100000ms,30000ms,Mob046-3::On1093
-046-3,107,85,14,9|monster|BlueSlime|1091,2,100000ms,30000ms,Mob046-3::On1091
-046-3,98,77,6,4|monster|WhiteSlime|1093,4,100000ms,30000ms,Mob046-3::On1093
-046-3,70,82,6,4|monster|WhiteSlime|1093,6,100000ms,30000ms,Mob046-3::On1093
-046-3,106,34,6,4|monster|WhiteSlime|1093,4,100000ms,30000ms,Mob046-3::On1093
-046-3,33,37,6,4|monster|WhiteSlime|1093,4,100000ms,30000ms,Mob046-3::On1093
-046-3,144,105,14,9|monster|BlueSlime|1091,2,100000ms,30000ms,Mob046-3::On1091
-046-3,152,55,14,9|monster|BlueSlime|1091,2,100000ms,30000ms,Mob046-3::On1091
-046-3,84,53,14,9|monster|BlueSlime|1091,2,100000ms,30000ms,Mob046-3::On1091
-046-3,47,23,15,10|monster|IceElement|1071,2,100000ms,30000ms,Mob046-3::On1071
-046-3,113,48,12,8|monster|Yeti|1072,2,100000ms,30000ms,Mob046-3::On1072
-
-
-046-3,0,0,0|script|Mob046-3|32767
-{
- end;
-
-On1058:
- set @mobID, 1058;
- callfunc "MobPoints";
- end;
-
-On1061:
- set @mobID, 1061;
- callfunc "MobPoints";
- end;
-
-On1071:
- set @mobID, 1071;
- callfunc "MobPoints";
- end;
-
-On1072:
- set @mobID, 1072;
- callfunc "MobPoints";
- end;
-
-On1091:
- set @mobID, 1091;
- callfunc "MobPoints";
- end;
-
-On1093:
- set @mobID, 1093;
- callfunc "MobPoints";
- end;
-}
+046-3,68,101,12,8|monster|Yeti|1072,2,100000ms,30000ms
+046-3,0,0,0,0|monster|IceGoblin|1058,20,100000ms,30000ms
+046-3,55,61,25,26|monster|Moggun|1061,14,100000ms,30000ms
+046-3,119,104,5,4|monster|IceElement|1071,1,100000ms,30000ms
+046-3,132,71,9,7|monster|WhiteSlime|1093,4,100000ms,30000ms
+046-3,107,85,14,9|monster|BlueSlime|1091,2,100000ms,30000ms
+046-3,98,77,6,4|monster|WhiteSlime|1093,4,100000ms,30000ms
+046-3,70,82,6,4|monster|WhiteSlime|1093,6,100000ms,30000ms
+046-3,106,34,6,4|monster|WhiteSlime|1093,4,100000ms,30000ms
+046-3,33,37,6,4|monster|WhiteSlime|1093,4,100000ms,30000ms
+046-3,144,105,14,9|monster|BlueSlime|1091,2,100000ms,30000ms
+046-3,152,55,14,9|monster|BlueSlime|1091,2,100000ms,30000ms
+046-3,84,53,14,9|monster|BlueSlime|1091,2,100000ms,30000ms
+046-3,47,23,15,10|monster|IceElement|1071,2,100000ms,30000ms
+046-3,113,48,12,8|monster|Yeti|1072,2,100000ms,30000ms
diff --git a/world/map/npc/046-3/_nodes.txt b/world/map/npc/046-3/_nodes.txt
new file mode 100644
index 00000000..42beb88a
--- /dev/null
+++ b/world/map/npc/046-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Frosty Underground nodes
+
+// (no nodes)
diff --git a/world/map/npc/047-1/_import.txt b/world/map/npc/047-1/_import.txt
index 7dbebdc4..d99b52f5 100644
--- a/world/map/npc/047-1/_import.txt
+++ b/world/map/npc/047-1/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 047-1
npc: npc/047-1/_mobs.txt
+npc: npc/047-1/_nodes.txt
npc: npc/047-1/_warps.txt
npc: npc/047-1/mapflags.txt
diff --git a/world/map/npc/047-1/_mobs.txt b/world/map/npc/047-1/_mobs.txt
index a502dcdf..8c709dff 100644
--- a/world/map/npc/047-1/_mobs.txt
+++ b/world/map/npc/047-1/_mobs.txt
@@ -1,76 +1,25 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// snow Hills mobs
-047-1,37,175,3,2|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob047-1::On1093
-047-1,45,75,2,2|monster|BlueSlime|1091,1,100000ms,30000ms,Mob047-1::On1091
-047-1,0,0,0,0|monster|Reinboo|1094,50,100000ms,30000ms,Mob047-1::On1094
-047-1,0,0,0,0|monster|Fluffy|1020,60,100000ms,30000ms,Mob047-1::On1020
-047-1,0,0,0,0|monster|Squirrel|1038,60,100000ms,30000ms,Mob047-1::On1038
-047-1,81,125,103,56|monster|Moggun|1061,25,100000ms,30000ms,Mob047-1::On1061
-047-1,189,123,25,36|monster|Wolvern|1090,6,100000ms,30000ms,Mob047-1::On1090
-047-1,160,115,25,20|monster|Wolvern|1090,6,100000ms,30000ms,Mob047-1::On1090
-047-1,169,163,48,31|monster|Wolvern|1090,6,100000ms,30000ms,Mob047-1::On1090
-047-1,58,71,48,31|monster|Wolvern|1090,6,100000ms,30000ms,Mob047-1::On1090
-047-1,122,116,20,24|monster|Wolvern|1090,6,100000ms,30000ms,Mob047-1::On1090
-047-1,110,173,25,20|monster|Wolvern|1090,6,100000ms,30000ms,Mob047-1::On1090
-047-1,108,168,3,2|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob047-1::On1093
-047-1,108,158,3,2|monster|BlueSlime|1091,1,100000ms,30000ms,Mob047-1::On1091
-047-1,0,0,0,0|monster|WhiteBell|1095,10,100000ms,30000ms,Mob047-1::On1095
-047-1,87,119,36,35|monster|Yeti|1072,2,100000ms,30000ms,Mob047-1::On1072
-047-1,138,22,2,2|monster|WhiteSlime|1093,4,100000ms,30000ms,Mob047-1::On1093
-047-1,157,66,2,2|monster|WhiteSlime|1093,4,100000ms,30000ms,Mob047-1::On1093
-047-1,174,46,4,5|monster|BlueSlime|1091,2,100000ms,30000ms,Mob047-1::On1091
-047-1,143,43,4,5|monster|BlueSlime|1091,2,100000ms,30000ms,Mob047-1::On1091
-047-1,122,61,2,2|monster|WhiteSlime|1093,4,100000ms,30000ms,Mob047-1::On1093
-047-1,132,70,4,5|monster|BlueSlime|1091,2,100000ms,30000ms,Mob047-1::On1091
-
-
-047-1,0,0,0|script|Mob047-1|32767
-{
- end;
-
-On1020:
- set @mobID, 1020;
- callfunc "MobPoints";
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1061:
- set @mobID, 1061;
- callfunc "MobPoints";
- end;
-
-On1072:
- set @mobID, 1072;
- callfunc "MobPoints";
- end;
-
-On1090:
- set @mobID, 1090;
- callfunc "MobPoints";
- end;
-
-On1091:
- set @mobID, 1091;
- callfunc "MobPoints";
- end;
-
-On1093:
- set @mobID, 1093;
- callfunc "MobPoints";
- end;
-
-On1094:
- set @mobID, 1094;
- callfunc "MobPoints";
- end;
-
-On1095:
- set @mobID, 1095;
- callfunc "MobPoints";
- end;
-}
+047-1,37,175,3,2|monster|WhiteSlime|1093,7,100000ms,30000ms
+047-1,45,75,2,2|monster|BlueSlime|1091,1,100000ms,30000ms
+047-1,0,0,0,0|monster|Reinboo|1094,50,100000ms,30000ms
+047-1,0,0,0,0|monster|Fluffy|1020,60,100000ms,30000ms
+047-1,0,0,0,0|monster|Squirrel|1038,60,100000ms,30000ms
+047-1,81,125,103,56|monster|Moggun|1061,25,100000ms,30000ms
+047-1,189,123,25,36|monster|Wolvern|1090,6,100000ms,30000ms
+047-1,160,115,25,20|monster|Wolvern|1090,6,100000ms,30000ms
+047-1,169,163,48,31|monster|Wolvern|1090,6,100000ms,30000ms
+047-1,58,71,48,31|monster|Wolvern|1090,6,100000ms,30000ms
+047-1,122,116,20,24|monster|Wolvern|1090,6,100000ms,30000ms
+047-1,110,173,25,20|monster|Wolvern|1090,6,100000ms,30000ms
+047-1,108,168,3,2|monster|WhiteSlime|1093,7,100000ms,30000ms
+047-1,108,158,3,2|monster|BlueSlime|1091,1,100000ms,30000ms
+047-1,0,0,0,0|monster|WhiteBell|1095,10,100000ms,30000ms
+047-1,87,119,36,35|monster|Yeti|1072,2,100000ms,30000ms
+047-1,138,22,2,2|monster|WhiteSlime|1093,4,100000ms,30000ms
+047-1,157,66,2,2|monster|WhiteSlime|1093,4,100000ms,30000ms
+047-1,174,46,4,5|monster|BlueSlime|1091,2,100000ms,30000ms
+047-1,143,43,4,5|monster|BlueSlime|1091,2,100000ms,30000ms
+047-1,122,61,2,2|monster|WhiteSlime|1093,4,100000ms,30000ms
+047-1,132,70,4,5|monster|BlueSlime|1091,2,100000ms,30000ms
diff --git a/world/map/npc/047-1/_nodes.txt b/world/map/npc/047-1/_nodes.txt
new file mode 100644
index 00000000..d910c062
--- /dev/null
+++ b/world/map/npc/047-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// snow Hills nodes
+
+// (no nodes)
diff --git a/world/map/npc/047-3/_import.txt b/world/map/npc/047-3/_import.txt
index 4f711642..5250ad76 100644
--- a/world/map/npc/047-3/_import.txt
+++ b/world/map/npc/047-3/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 047-3
npc: npc/047-3/_mobs.txt
+npc: npc/047-3/_nodes.txt
npc: npc/047-3/_warps.txt
npc: npc/047-3/mapflags.txt
diff --git a/world/map/npc/047-3/_mobs.txt b/world/map/npc/047-3/_mobs.txt
index adf84729..2b0f3338 100644
--- a/world/map/npc/047-3/_mobs.txt
+++ b/world/map/npc/047-3/_mobs.txt
@@ -1,60 +1,24 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Snow Hills Cave mobs
-047-3,56,135,9,8|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob047-3::On1093
-047-3,35,153,6,6|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob047-3::On1093
-047-3,39,104,9,8|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob047-3::On1093
-047-3,73,153,9,8|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob047-3::On1093
-047-3,64,104,3,3|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob047-3::On1093
-047-3,24,168,6,4|monster|BlueSlime|1091,2,100000ms,30000ms,Mob047-3::On1091
-047-3,87,134,5,3|monster|BlueSlime|1091,2,100000ms,30000ms,Mob047-3::On1091
-047-3,55,122,5,3|monster|BlueSlime|1091,2,100000ms,30000ms,Mob047-3::On1091
-047-3,35,128,5,3|monster|BlueSlime|1091,2,100000ms,30000ms,Mob047-3::On1091
-047-3,53,84,5,3|monster|BlueSlime|1091,2,100000ms,30000ms,Mob047-3::On1091
-047-3,75,136,21,26|monster|Moggun|1061,5,100000ms,30000ms,Mob047-3::On1061
-047-3,39,31,42,21|monster|Moggun|1061,12,100000ms,30000ms,Mob047-3::On1061
-047-3,40,31,5,3|monster|IceSkull|1085,2,100000ms,30000ms,Mob047-3::On1085
-047-3,122,157,21,16|monster|Yeti|1072,2,100000ms,30000ms,Mob047-3::On1072
-047-3,102,166,15,13|monster|IceSkull|1085,5,100000ms,30000ms,Mob047-3::On1085
-047-3,109,81,15,13|monster|IceElement|1071,1,100000ms,30000ms,Mob047-3::On1071
-047-3,123,90,5,3|monster|BlueSlime|1091,2,100000ms,30000ms,Mob047-3::On1091
-047-3,109,97,9,8|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob047-3::On1093
-047-3,119,41,42,21|monster|Moggun|1061,8,100000ms,30000ms,Mob047-3::On1061
-047-3,51,94,39,14|monster|IceSkull|1085,5,100000ms,30000ms,Mob047-3::On1085
-047-3,121,172,9,8|monster|WhiteSlime|1093,7,100000ms,30000ms,Mob047-3::On1093
-
-
-047-3,0,0,0|script|Mob047-3|32767
-{
- end;
-
-On1061:
- set @mobID, 1061;
- callfunc "MobPoints";
- end;
-
-On1071:
- set @mobID, 1071;
- callfunc "MobPoints";
- end;
-
-On1072:
- set @mobID, 1072;
- callfunc "MobPoints";
- end;
-
-On1085:
- set @mobID, 1085;
- callfunc "MobPoints";
- end;
-
-On1091:
- set @mobID, 1091;
- callfunc "MobPoints";
- end;
-
-On1093:
- set @mobID, 1093;
- callfunc "MobPoints";
- end;
-}
+047-3,56,135,9,8|monster|WhiteSlime|1093,7,100000ms,30000ms
+047-3,35,153,6,6|monster|WhiteSlime|1093,7,100000ms,30000ms
+047-3,39,104,9,8|monster|WhiteSlime|1093,7,100000ms,30000ms
+047-3,73,153,9,8|monster|WhiteSlime|1093,7,100000ms,30000ms
+047-3,64,104,3,3|monster|WhiteSlime|1093,7,100000ms,30000ms
+047-3,24,168,6,4|monster|BlueSlime|1091,2,100000ms,30000ms
+047-3,87,134,5,3|monster|BlueSlime|1091,2,100000ms,30000ms
+047-3,55,122,5,3|monster|BlueSlime|1091,2,100000ms,30000ms
+047-3,35,128,5,3|monster|BlueSlime|1091,2,100000ms,30000ms
+047-3,53,84,5,3|monster|BlueSlime|1091,2,100000ms,30000ms
+047-3,75,136,21,26|monster|Moggun|1061,5,100000ms,30000ms
+047-3,39,31,42,21|monster|Moggun|1061,12,100000ms,30000ms
+047-3,40,31,5,3|monster|IceSkull|1085,2,100000ms,30000ms
+047-3,122,157,21,16|monster|Yeti|1072,2,100000ms,30000ms
+047-3,102,166,15,13|monster|IceSkull|1085,5,100000ms,30000ms
+047-3,109,81,15,13|monster|IceElement|1071,1,100000ms,30000ms
+047-3,123,90,5,3|monster|BlueSlime|1091,2,100000ms,30000ms
+047-3,109,97,9,8|monster|WhiteSlime|1093,7,100000ms,30000ms
+047-3,119,41,42,21|monster|Moggun|1061,8,100000ms,30000ms
+047-3,51,94,39,14|monster|IceSkull|1085,5,100000ms,30000ms
+047-3,121,172,9,8|monster|WhiteSlime|1093,7,100000ms,30000ms
diff --git a/world/map/npc/047-3/_nodes.txt b/world/map/npc/047-3/_nodes.txt
new file mode 100644
index 00000000..06534770
--- /dev/null
+++ b/world/map/npc/047-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Snow Hills Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/048-2/_import.txt b/world/map/npc/048-2/_import.txt
index 8178036c..a820b2d4 100644
--- a/world/map/npc/048-2/_import.txt
+++ b/world/map/npc/048-2/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 048-2
npc: npc/048-2/_mobs.txt
+npc: npc/048-2/_nodes.txt
npc: npc/048-2/_warps.txt
npc: npc/048-2/bluesageConfig.txt
npc: npc/048-2/helperAccused.txt
diff --git a/world/map/npc/048-2/_mobs.txt b/world/map/npc/048-2/_mobs.txt
index 87b5b1d4..c9f81014 100644
--- a/world/map/npc/048-2/_mobs.txt
+++ b/world/map/npc/048-2/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Blue Sages' Mansion mobs
-
-
-048-2,0,0,0|script|Mob048-2|32767
-{
- end;
-}
diff --git a/world/map/npc/048-2/_nodes.txt b/world/map/npc/048-2/_nodes.txt
new file mode 100644
index 00000000..f5923fb2
--- /dev/null
+++ b/world/map/npc/048-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Blue Sages' Mansion nodes
+
+// (no nodes)
diff --git a/world/map/npc/051-1/_import.txt b/world/map/npc/051-1/_import.txt
index 9f93f8ef..2e99eba9 100644
--- a/world/map/npc/051-1/_import.txt
+++ b/world/map/npc/051-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 051-1
npc: npc/051-1/_mobs.txt
+npc: npc/051-1/_nodes.txt
npc: npc/051-1/_warps.txt
npc: npc/051-1/desert.txt
npc: npc/051-1/desertmonsters.txt
diff --git a/world/map/npc/051-1/_mobs.txt b/world/map/npc/051-1/_mobs.txt
index 752c527c..7569cce6 100644
--- a/world/map/npc/051-1/_mobs.txt
+++ b/world/map/npc/051-1/_mobs.txt
@@ -1,21 +1,5 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Illia outskirts mobs
-051-1,42,35,42,24|monster|LogHead|1025,30,100000ms,30000ms,Mob051-1::On1025
-051-1,42,35,41,22|monster|SpikyMushroom|1019,10,100000ms,30000ms,Mob051-1::On1019
-
-
-051-1,0,0,0|script|Mob051-1|32767
-{
- end;
-
-On1019:
- set @mobID, 1019;
- callfunc "MobPoints";
- end;
-
-On1025:
- set @mobID, 1025;
- callfunc "MobPoints";
- end;
-}
+051-1,42,35,42,24|monster|LogHead|1025,30,100000ms,30000ms
+051-1,42,35,41,22|monster|SpikyMushroom|1019,10,100000ms,30000ms
diff --git a/world/map/npc/051-1/_nodes.txt b/world/map/npc/051-1/_nodes.txt
new file mode 100644
index 00000000..86674b68
--- /dev/null
+++ b/world/map/npc/051-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Illia outskirts nodes
+
+// (no nodes)
diff --git a/world/map/npc/051-3/_import.txt b/world/map/npc/051-3/_import.txt
index f74d6cb4..f4cae902 100644
--- a/world/map/npc/051-3/_import.txt
+++ b/world/map/npc/051-3/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 051-3
npc: npc/051-3/_mobs.txt
+npc: npc/051-3/_nodes.txt
npc: npc/051-3/_warps.txt
npc: npc/051-3/ambush.txt
npc: npc/051-3/jailslimes.txt
diff --git a/world/map/npc/051-3/_mobs.txt b/world/map/npc/051-3/_mobs.txt
index 711bf39c..3b10016f 100644
--- a/world/map/npc/051-3/_mobs.txt
+++ b/world/map/npc/051-3/_mobs.txt
@@ -1,65 +1,19 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Illia Bandit Cave mobs
-051-3,31,52,21,13|monster|RedSlime|1008,8,100000ms,30000ms,Mob051-3::On1008
-051-3,31,52,19,14|monster|CaveMaggot|1056,3,100000ms,30000ms,Mob051-3::On1056
-051-3,56,102,3,2|monster|Spider|1012,1,100000ms,250000ms,Mob051-3::On1012
-051-3,61,102,2,2|monster|Spider|1012,1,100000ms,250000ms,Mob051-3::On1012
-051-3,65,102,2,2|monster|Spider|1012,1,100000ms,250000ms,Mob051-3::On1012
-051-3,71,109,4,2|monster|BlackScorpion|1009,1,100000ms,250000ms,Mob051-3::On1009
-051-3,59,56,12,36|monster|Bandit|1064,47,100000ms,10000ms,Mob051-3::On1064
-051-3,59,44,13,13|monster|BanditLord|1065,4,100000ms,20000ms,Mob051-3::On1065
-051-3,60,69,18,9|monster|BanditLord|1065,4,100000ms,20000ms,Mob051-3::On1065
-051-3,63,94,0,0|monster|SleepingBandit|1099,1,100000ms,60000ms,Mob051-3::On1099
-051-3,53,93,0,0|monster|SleepingBandit|1099,1,100000ms,60000ms,Mob051-3::On1099
-051-3,48,71,0,0|monster|SleepingBandit|1099,1,100000ms,60000ms,Mob051-3::On1099
-051-3,38,30,17,12|monster|Bandit|1064,12,100000ms,10000ms,Mob051-3::On1064
-051-3,39,33,11,8|monster|BanditLord|1065,2,100000ms,20000ms,Mob051-3::On1065
-051-3,80,101,10,12|monster|CopperSlime|1098,7,100000ms,60000ms,Mob051-3::On1098
-051-3,60,94,18,5|monster|CopperSlime|1098,7,100000ms,60000ms,Mob051-3::On1098
-
-
-051-3,0,0,0|script|Mob051-3|32767
-{
- end;
-
-On1008:
- set @mobID, 1008;
- callfunc "MobPoints";
- end;
-
-On1009:
- set @mobID, 1009;
- callfunc "MobPoints";
- end;
-
-On1012:
- set @mobID, 1012;
- callfunc "MobPoints";
- end;
-
-On1056:
- set @mobID, 1056;
- callfunc "MobPoints";
- end;
-
-On1064:
- set @mobID, 1064;
- callfunc "MobPoints";
- end;
-
-On1065:
- set @mobID, 1065;
- callfunc "MobPoints";
- end;
-
-On1098:
- set @mobID, 1098;
- callfunc "MobPoints";
- end;
-
-On1099:
- set @mobID, 1099;
- callfunc "MobPoints";
- end;
-}
+051-3,31,52,21,13|monster|RedSlime|1008,8,100000ms,30000ms
+051-3,31,52,19,14|monster|CaveMaggot|1056,3,100000ms,30000ms
+051-3,56,102,3,2|monster|Spider|1012,1,100000ms,250000ms
+051-3,61,102,2,2|monster|Spider|1012,1,100000ms,250000ms
+051-3,65,102,2,2|monster|Spider|1012,1,100000ms,250000ms
+051-3,71,109,4,2|monster|BlackScorpion|1009,1,100000ms,250000ms
+051-3,59,56,12,36|monster|Bandit|1064,47,100000ms,10000ms
+051-3,59,44,13,13|monster|BanditLord|1065,4,100000ms,20000ms
+051-3,60,69,18,9|monster|BanditLord|1065,4,100000ms,20000ms
+051-3,63,94,0,0|monster|SleepingBandit|1099,1,100000ms,60000ms
+051-3,53,93,0,0|monster|SleepingBandit|1099,1,100000ms,60000ms
+051-3,48,71,0,0|monster|SleepingBandit|1099,1,100000ms,60000ms
+051-3,38,30,17,12|monster|Bandit|1064,12,100000ms,10000ms
+051-3,39,33,11,8|monster|BanditLord|1065,2,100000ms,20000ms
+051-3,80,101,10,12|monster|CopperSlime|1098,7,100000ms,60000ms
+051-3,60,94,18,5|monster|CopperSlime|1098,7,100000ms,60000ms
diff --git a/world/map/npc/051-3/_nodes.txt b/world/map/npc/051-3/_nodes.txt
new file mode 100644
index 00000000..75194dbf
--- /dev/null
+++ b/world/map/npc/051-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Illia Bandit Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/051-3/ambush.txt b/world/map/npc/051-3/ambush.txt
index da12b306..7d659710 100644
--- a/world/map/npc/051-3/ambush.txt
+++ b/world/map/npc/051-3/ambush.txt
@@ -72,8 +72,8 @@ OnTimer9000:
end;
OnTimer11000:
- areatimer "051-3", 22, 12, 102, 97, 500, "#BndtTl::OnOuch";
- areatimer "051-3", 22, 12, 102, 97, 3000, "#BndtTl::OnA";
+ areatimer 0, "051-3", 22, 12, 102, 97, 500, "#BndtTl::OnOuch";
+ areatimer 0, "051-3", 22, 12, 102, 97, 3000, "#BndtTl::OnA";
stopnpctimer;
setnpctimer 0;
end;
diff --git a/world/map/npc/051-3/reinforcements.txt b/world/map/npc/051-3/reinforcements.txt
index 73236dec..5870671c 100644
--- a/world/map/npc/051-3/reinforcements.txt
+++ b/world/map/npc/051-3/reinforcements.txt
@@ -49,7 +49,7 @@ OnRnfrcmts:
areamonster "051-3", 29, 25, 48, 39, "", 1065, 3, "Door::OnB";
initnpctimer;
mapannounce "051-3", "Bandit Lords : Do not let them escape!!" , 0;
- areatimer "051-3", 25, 20, 80, 85, 10, "Door::OnDRnfrcmts";
+ areatimer 0, "051-3", 25, 20, 80, 85, 10, "Door::OnDRnfrcmts";
end;
OnB:
@@ -72,7 +72,7 @@ L_OpenDoor:
set $@illia_progress, 3;
callfunc "UpdateIlliaProgress";
set $@illia_max_time, $@illia_max_time + 300;
- areatimer "051-3", 25, 20, 80, 85, 10, "Door::OnKeyFound";
+ areatimer 0, "051-3", 25, 20, 80, 85, 10, "Door::OnKeyFound";
stopnpctimer;
setnpctimer 0;
end;
diff --git a/world/map/npc/052-1/_import.txt b/world/map/npc/052-1/_import.txt
index c4c9d1e3..05e7e8e9 100644
--- a/world/map/npc/052-1/_import.txt
+++ b/world/map/npc/052-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 052-1
npc: npc/052-1/_mobs.txt
+npc: npc/052-1/_nodes.txt
npc: npc/052-1/_warps.txt
npc: npc/052-1/channelling.txt
npc: npc/052-1/janitor.txt
diff --git a/world/map/npc/052-1/_mobs.txt b/world/map/npc/052-1/_mobs.txt
index c386d5d1..96b998eb 100644
--- a/world/map/npc/052-1/_mobs.txt
+++ b/world/map/npc/052-1/_mobs.txt
@@ -1,15 +1,4 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Illia archipelago mobs
-052-1,55,29,43,39|monster|AzulSlime|1100,18,100000ms,20000ms,Mob052-1::On1100
-
-
-052-1,0,0,0|script|Mob052-1|32767
-{
- end;
-
-On1100:
- set @mobID, 1100;
- callfunc "MobPoints";
- end;
-}
+052-1,55,29,43,39|monster|AzulSlime|1100,18,100000ms,20000ms
diff --git a/world/map/npc/052-1/_nodes.txt b/world/map/npc/052-1/_nodes.txt
new file mode 100644
index 00000000..35ee39e3
--- /dev/null
+++ b/world/map/npc/052-1/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Illia archipelago nodes
+
+// (no nodes)
diff --git a/world/map/npc/052-1/channelling.txt b/world/map/npc/052-1/channelling.txt
index 565f96fd..5eb3dfbf 100644
--- a/world/map/npc/052-1/channelling.txt
+++ b/world/map/npc/052-1/channelling.txt
@@ -141,6 +141,10 @@ L_Return:
goto L_Hint;
end;
+OnCast:
+ callfunc "StartChannelling";
+ end;
+
OnCommandSt:
initnpctimer;
end;
@@ -259,7 +263,7 @@ S_CheckChannelling:
set $@illia_channelling_status_msg$, $@illia_char_channelling$ + ": Damn! It faded a little.";
if ($@illia_channelling_status_msg$ != "")
- areatimer "052-1", 1, 1, 100, 80, 0, "#Power Circle::OnMPSC";
+ areatimer 0, "052-1", 1, 1, 100, 80, 0, "#Power Circle::OnMPSC";
return;
@@ -328,4 +332,8 @@ L_ChannellingFail:
L_ShouldNotBeHere:
heal -Hp, 0;
end;
+
+OnInit:
+ registercmd "#catalazuli", strnpcinfo(0)+"::OnCast";
+ end;
}
diff --git a/world/map/npc/052-2/_import.txt b/world/map/npc/052-2/_import.txt
index 0a8b5847..aa01af40 100644
--- a/world/map/npc/052-2/_import.txt
+++ b/world/map/npc/052-2/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 052-2
npc: npc/052-2/_mobs.txt
+npc: npc/052-2/_nodes.txt
npc: npc/052-2/_warps.txt
npc: npc/052-2/chest.txt
npc: npc/052-2/janitor.txt
diff --git a/world/map/npc/052-2/_mobs.txt b/world/map/npc/052-2/_mobs.txt
index 1fb96829..1d91c286 100644
--- a/world/map/npc/052-2/_mobs.txt
+++ b/world/map/npc/052-2/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Illia forsaken inn mobs
-
-
-052-2,0,0,0|script|Mob052-2|32767
-{
- end;
-}
diff --git a/world/map/npc/052-2/_nodes.txt b/world/map/npc/052-2/_nodes.txt
new file mode 100644
index 00000000..38010d03
--- /dev/null
+++ b/world/map/npc/052-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Illia forsaken inn nodes
+
+// (no nodes)
diff --git a/world/map/npc/052-2/lobby.txt b/world/map/npc/052-2/lobby.txt
index efc0a20a..1b36d929 100644
--- a/world/map/npc/052-2/lobby.txt
+++ b/world/map/npc/052-2/lobby.txt
@@ -337,7 +337,7 @@ L_ChaseLuvia:
set $@illia_progress, 6;
callfunc "UpdateIlliaProgress";
set $@illia_max_time, $@illia_max_time + 360;
- areatimer "052-2", 19, 18, 48, 43, 2000, "#LuviaShadow::OnNN";
+ areatimer 0, "052-2", 19, 18, 48, 43, 2000, "#LuviaShadow::OnNN";
end;
S_GetHeroRect:
diff --git a/world/map/npc/052-2/partyroom.txt b/world/map/npc/052-2/partyroom.txt
index 02d7a7ac..ec6d2a64 100644
--- a/world/map/npc/052-2/partyroom.txt
+++ b/world/map/npc/052-2/partyroom.txt
@@ -182,7 +182,7 @@ S_SpawnWitchGuard:
misceffect FX_GROUND_SPAWN;
monster "052-2", getx(), gety(), "", 1103, 1, "#LuviaDaemon::OnWGD";
detachrid;
- areatimer "052-2", 73, 11, 115, 49, 0, "#LuviaDaemon::OnWGS";
+ areatimer 0, "052-2", 73, 11, 115, 49, 0, "#LuviaDaemon::OnWGS";
return;
OnTimer30000:
@@ -198,7 +198,7 @@ OnTimer30000:
L_TriggerTrance:
set $@illia_level_7_progress, 3;
set $@illia_luvia_trance_delay, 0;
- areatimer "052-2", 73, 11, 115, 49, 0, "#LuviaDaemon::OnTT";
+ areatimer 0, "052-2", 73, 11, 115, 49, 0, "#LuviaDaemon::OnTT";
setnpctimer 0;
end;
@@ -217,9 +217,9 @@ OnDeath:
mapannounce "052-2", "Luvia : How? By mere humans! But we will see again! Enjoy your victory while it lasts, " + $@ILLIA_HERO$ + "!!", 0;
set $@illia_bp, $Illia_Luvia_Harvest * 16 / 10 + 120;
- areatimer "052-2", 73, 11, 115, 49, 0, "#LuviaDaemon::OnBP";
+ areatimer 0, "052-2", 73, 11, 115, 49, 0, "#LuviaDaemon::OnBP";
- areatimer "052-2", 73, 11, 115, 49, 2000, "#LuviaDaemon::OnW00t";
+ areatimer 0, "052-2", 73, 11, 115, 49, 2000, "#LuviaDaemon::OnW00t";
set $@illia_progress, 8;
callfunc "UpdateIlliaProgress";
diff --git a/world/map/npc/052-2/storage.txt b/world/map/npc/052-2/storage.txt
index 8abbb732..a8582408 100644
--- a/world/map/npc/052-2/storage.txt
+++ b/world/map/npc/052-2/storage.txt
@@ -42,7 +42,7 @@ OnCommandStart:
set $@illia_storage_max_items, 20;
set $@illia_storage_deviation, (8 + ($Illia_Luvia_Harvest*70)/100)*3;
initnpctimer;
- areatimer "052-2", 19, 60, 35, 78, 10, "#ItemsInvoker::OnStart";
+ areatimer 0, "052-2", 19, 60, 35, 78, 10, "#ItemsInvoker::OnStart";
end;
OnStart:
@@ -64,7 +64,7 @@ OnTimer1000:
OnTimer1500:
// See the note above.
enablenpc "#ItemsInvoker";
- areatimer "052-2", 19, 60, 35, 78, 10, "#ItemsInvoker::OnItem";
+ areatimer 0, "052-2", 19, 60, 35, 78, 10, "#ItemsInvoker::OnItem";
misceffect FX_GROUND_SPAWN;
end;
@@ -109,7 +109,7 @@ L_ItemSpawn:
L_MakeSpecialMonster:
monster "052-2", $@item_invoke_x, $@item_invoke_y, "", 1103, 1, "#ItemsInvoker::OnDeath";
- areatimer "052-2", 19, 60, 35, 78, 10, "#ItemsInvoker::OnWtf";
+ areatimer 0, "052-2", 19, 60, 35, 78, 10, "#ItemsInvoker::OnWtf";
set $@illia_storage_max_items, $@illia_storage_max_items - 1;
end;
@@ -121,7 +121,7 @@ L_MakeMonster:
L_MakeSpecialItem:
makeitem $@illia_storage_special_items[rand(getarraysize($@illia_storage_special_items))], rand(2, 4), "052-2", $@item_invoke_x, $@item_invoke_y;
- areatimer "052-2", 19, 60, 35, 78, 10, "#ItemsInvoker::OnWow";
+ areatimer 0, "052-2", 19, 60, 35, 78, 10, "#ItemsInvoker::OnWow";
set $@illia_storage_max_items, $@illia_storage_max_items - 1;
set @r, 0;
end;
@@ -152,7 +152,7 @@ L_Stop:
set $@illia_progress, 7;
callfunc "UpdateIlliaProgress";
set $@illia_max_time, $@illia_max_time + 900;
- areatimer "052-2", 19, 60, 35, 78, 10, "#ItemsInvoker::OnStop";
+ areatimer 0, "052-2", 19, 60, 35, 78, 10, "#ItemsInvoker::OnStop";
end;
OnDeath:
diff --git a/world/map/npc/055-1/_import.txt b/world/map/npc/055-1/_import.txt
index 10c3c13c..8760f125 100644
--- a/world/map/npc/055-1/_import.txt
+++ b/world/map/npc/055-1/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 055-1
npc: npc/055-1/_mobs.txt
+npc: npc/055-1/_nodes.txt
npc: npc/055-1/_warps.txt
npc: npc/055-1/flowerpentagram4.txt
npc: npc/055-1/mapflags.txt
diff --git a/world/map/npc/055-1/_mobs.txt b/world/map/npc/055-1/_mobs.txt
index 35741d32..23eba0b0 100644
--- a/world/map/npc/055-1/_mobs.txt
+++ b/world/map/npc/055-1/_mobs.txt
@@ -1,86 +1,20 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Woodland Hills mobs
-055-1,68,72,22,19|monster|Butterfly|1055,16,10000ms,85000ms,Mob055-1::On1055
-055-1,87,29,55,14|monster|Silkworm|1035,15,10000ms,85000ms,Mob055-1::On1035
-055-1,79,30,84,17|monster|Squirrel|1038,10,10000ms,45000ms,Mob055-1::On1038
-055-1,0,0,0,0|monster|Mouboo|1028,15,10000ms,85000ms,Mob055-1::On1028
-055-1,91,49,6,4|monster|CloverPatch|1037,1,10000ms,180000ms,Mob055-1::On1037
-055-1,103,54,5,3|monster|CloverPatch|1037,1,10000ms,180000ms,Mob055-1::On1037
-055-1,64,75,27,16|monster|CloverPatch|1037,1,10000ms,120000ms,Mob055-1::On1037
-055-1,80,34,82,25|monster|Snail|1041,3,10000ms,85000ms,Mob055-1::On1041
-055-1,70,72,17,24|monster|AlizarinPlant|1032,2,10000ms,60000ms,Mob055-1::On1032
-055-1,81,32,81,22|monster|AlizarinPlant|1032,2,10000ms,60000ms,Mob055-1::On1032
-055-1,0,0,0,0|monster|MauvePlant|1029,7,10000ms,55000ms,Mob055-1::On1029
-055-1,0,0,0,0|monster|CobaltPlant|1030,3,10000ms,60000ms,Mob055-1::On1030
-055-1,0,0,0,0|monster|GambogePlant|1031,2,10000ms,60000ms,Mob055-1::On1031
-055-1,116,60,4,2|monster|PinkFlower|1014,1,10000ms,45000ms,Mob055-1::On1014
-055-1,97,60,4,2|monster|PinkFlower|1014,1,10000ms,45000ms,Mob055-1::On1014
-055-1,64,73,23,17|monster|PinkFlower|1014,1,10000ms,45000ms,Mob055-1::On1014
-055-1,0,0,0,0|monster|SpikyMushroom|1019,7,10000ms,60000ms,Mob055-1::On1019
-
-
-055-1,0,0,0|script|Mob055-1|32767
-{
- end;
-
-On1014:
- set @mobID, 1014;
- callfunc "MobPoints";
- end;
-
-On1019:
- set @mobID, 1019;
- callfunc "MobPoints";
- end;
-
-On1028:
- set @mobID, 1028;
- callfunc "MobPoints";
- end;
-
-On1029:
- set @mobID, 1029;
- callfunc "MobPoints";
- end;
-
-On1030:
- set @mobID, 1030;
- callfunc "MobPoints";
- end;
-
-On1031:
- set @mobID, 1031;
- callfunc "MobPoints";
- end;
-
-On1032:
- set @mobID, 1032;
- callfunc "MobPoints";
- end;
-
-On1035:
- set @mobID, 1035;
- callfunc "MobPoints";
- end;
-
-On1037:
- set @mobID, 1037;
- callfunc "MobPoints";
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1041:
- set @mobID, 1041;
- callfunc "MobPoints";
- end;
-
-On1055:
- set @mobID, 1055;
- callfunc "MobPoints";
- end;
-}
+055-1,68,72,22,19|monster|Butterfly|1055,16,10000ms,85000ms
+055-1,87,29,55,14|monster|Silkworm|1035,15,10000ms,85000ms
+055-1,79,30,84,17|monster|Squirrel|1038,10,10000ms,45000ms
+055-1,0,0,0,0|monster|Mouboo|1028,15,10000ms,85000ms
+055-1,91,49,6,4|monster|CloverPatch|1037,1,10000ms,180000ms
+055-1,103,54,5,3|monster|CloverPatch|1037,1,10000ms,180000ms
+055-1,64,75,27,16|monster|CloverPatch|1037,1,10000ms,120000ms
+055-1,80,34,82,25|monster|Snail|1041,3,10000ms,85000ms
+055-1,70,72,17,24|monster|AlizarinPlant|1032,2,10000ms,60000ms
+055-1,81,32,81,22|monster|AlizarinPlant|1032,2,10000ms,60000ms
+055-1,0,0,0,0|monster|MauvePlant|1029,7,10000ms,55000ms
+055-1,0,0,0,0|monster|CobaltPlant|1030,3,10000ms,60000ms
+055-1,0,0,0,0|monster|GambogePlant|1031,2,10000ms,60000ms
+055-1,116,60,4,2|monster|PinkFlower|1014,1,10000ms,45000ms
+055-1,97,60,4,2|monster|PinkFlower|1014,1,10000ms,45000ms
+055-1,64,73,23,17|monster|PinkFlower|1014,1,10000ms,45000ms
+055-1,0,0,0,0|monster|SpikyMushroom|1019,7,10000ms,60000ms
diff --git a/world/map/npc/055-1/_nodes.txt b/world/map/npc/055-1/_nodes.txt
new file mode 100644
index 00000000..4abefb02
--- /dev/null
+++ b/world/map/npc/055-1/_nodes.txt
@@ -0,0 +1,16 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Woodland Hills nodes
+
+055-1,0,0,0|script|Node055-1|32767
+{
+ end;
+OnInit:
+ setarray .m$, "_N-Pumpkin", "055-1", "055-1", "055-1";
+ setarray .x1, "_N-Pumpkin", 129, 41, 133;
+ setarray .y1, "_N-Pumpkin", 23, 22, 27;
+ setarray .x2, "_N-Pumpkin", 135, 47, 139;
+ setarray .y2, "_N-Pumpkin", 26, 30, 33;
+ setarray .id, "_N-Pumpkin", 0, 0, 0;
+ donpcevent "_N-Pumpkin::OnMaybeStart";
+ destroy;
+}
diff --git a/world/map/npc/055-1/pumpkins.txt b/world/map/npc/055-1/pumpkins.txt
index 96931e04..1c2535f7 100644
--- a/world/map/npc/055-1/pumpkins.txt
+++ b/world/map/npc/055-1/pumpkins.txt
@@ -1,18 +1,18 @@
-// Pumpkin mobs for the seasonal halloween event with Oscar
-055-1,48,25,16,8|monster|Pumpkin|1063,12,10000ms,5000ms,PumpkinMob055-1::On1063
-055-1,139,29,5,7|monster|Pumpkin|1063,7,10000ms,5000ms,PumpkinMob055-1::On1063
-055-1,132,24,6,4|monster|Pumpkin|1063,4,10000ms,5000ms,PumpkinMob055-1::On1063
+055-1,0,0,0|script|_N-Pumpkin|32767
+{
+//////////////////////////////////
+// puppet logic below
-055-1,0,0,0|script|PumpkinMob055-1|32767
-{
- end;
+ set @distance_handler, 1; // silent
+ set @npc_distance, (1-2); // -1 means attack range
+ callfunc "PCtoNPCRange";
+ if (@npc_check) end;
-On1063:
if (Quest_Halloween != 1 || !(gettime(6) == 11 && (gettime(5) >= 4 && gettime(5) <= 30)))
goto L_HeavyPoison;
if (@discover_poisonous_pumpkin == 0)
- message strcharinfo(0), "Yuke, this pumpkin released some ugly poison gas!";
+ message strcharinfo(0), "Pumpkin : Yuke, this pumpkin released some ugly poison gas!";
set @discover_poisonous_pumpkin, 1;
misceffect FX_PUMPKIN_EXPLOSION, strcharinfo(0);
heal -15, 0;
@@ -25,44 +25,130 @@ On1063:
set @mobID, 1063;
callfunc "MobPoints";
- end;
+ goto L_Destroy;
L_EnoughSeeds:
- message strcharinfo(0), $@halloween_num_seeds + " should be enough seeds for Oscar. And this pumpkin gas gets too bad to stand it any longer...";
+ message strcharinfo(0), "Pumpkin : " + $@halloween_num_seeds + " should be enough seeds for Oscar. And this pumpkin gas gets too bad to stand it any longer...";
set Quest_Halloween, 2;
// Reset this to get the message for the "heavy" poison
set @discover_poisonous_pumpkin, 0;
- end;
+ goto L_Destroy;
L_HeavyPoison:
if (@discover_poisonous_pumpkin == 0)
goto L_HeavyPoison0;
if (@discover_poisonous_pumpkin == 1)
goto L_HeavyPoison1;
- if (@discover_poisonous_pumpkin > 1)
- goto L_HeavyPoison2;
- end;
+ goto L_HeavyPoison2;
L_HeavyPoison0:
set @discover_poisonous_pumpkin, @discover_poisonous_pumpkin + 1;
- message strcharinfo(0), "Ouch, this pumpkin is totally poisonous! Let's get away from them!";
+ message strcharinfo(0), "Pumpkin : Ouch, this pumpkin is totally poisonous! Let's get away from them!";
misceffect FX_PUMPKIN_EXPLOSION, strcharinfo(0);
heal -150,0;
sc_start sc_poison, 1, 60;
- end;
+ goto L_Destroy;
L_HeavyPoison1:
set @discover_poisonous_pumpkin, @discover_poisonous_pumpkin + 1;
- message strcharinfo(0), "This is really awful! I should not touch them!";
+ message strcharinfo(0), "Pumpkin : This is really awful! I should not touch them!";
misceffect FX_PUMPKIN_EXPLOSION, strcharinfo(0);
heal -350,0;
sc_start sc_poison, 1, 120;
- end;
+ goto L_Destroy;
L_HeavyPoison2:
set @discover_poisonous_pumpkin, @discover_poisonous_pumpkin + 1;
misceffect FX_PUMPKIN_EXPLOSION, strcharinfo(0);
heal -Hp, 0;
+ goto L_Destroy;
+
+OnAppear:
+ fakenpcname strnpcinfo(0), strnpcinfo(0), 1063; // set the sprite (implies enablenpc)
+ end;
+
+L_Destroy:
+ disablenpc strnpcinfo(0); // makes the npc invisible, unclickable
+ addnpctimer .death_t, strnpcinfo(0) + "::OnReallyDestroy"; // schedule a respawn
end;
+OnReallyDestroy:
+ set .nodes[.i], get(.nodes[.i], "_N-Pumpkin") - 1, "_N-Pumpkin"; // tell the puppeteer we lost an egg
+ destroy;
+
+
+//////////////////////////////////
+// puppeteer logic below
+
+S_MakeNode:
+ set .nID, .nID + 1; // give the node an id
+ set .@name$, "#_Pkin" + chr(3) + .nID;
+ goto S_FindXY;
+
+S_FindXY:
+ set .@x, rand(.x1[.i], .x2[.i]);
+ set .@y, rand(.y1[.i], .y2[.i]);
+ if (iscollision(.m$[.i], .@x, .@y) == 1)
+ goto S_FindXY;
+ goto S_ReallySpawn;
+
+S_ReallySpawn:
+ set .@p, puppet(.m$[.i], .@x, .@y, .@name$, 32767); // spawn the node (but not on map, because 32767)
+ disablenpc .@name$; // make sure it can't be clicked by guessing the being id
+ set .i, .i, .@p; // tell the puppet what object contains it
+ set .death_t, rand(.death_t/2, .death_t), .@p; // tell the puppet when to die
+ set .@timer, if_then_else(.done_initial[.i], rand(.appear_t/2, .appear_t), 0); // timer depends on if first spawn or if respawned after death
+ addnpctimer .@timer, .@name$+"::OnAppear"; // we spawn the node instantly but it only appears after the timer
+ if (.nID == 2147483647)
+ set .nID, 0; // start over if id = 0x7FFFFFFF
+ return;
+
+S_IterateObjects:
+ if (.min_nodes[.i] == 0)
+ set .min_nodes[.i], (.min * min(1, ((.x2[.i] - .x1[.i]) * (.y2[.i] - .y1[.i])) / .divisor));
+ if (.max_nodes[.i] == 0)
+ set .max_nodes[.i], (.max * max(1, ((.x2[.i] - .x1[.i]) * (.y2[.i] - .y1[.i])) / .divisor));
+
+ if (.nodes[.i] >= .max_nodes[.i])
+ goto S_NextObject;
+
+ set .nodes[.i], .nodes[.i] + 1;
+ callsub S_MakeNode;
+ if (.nodes[.i] < if_then_else(.done_initial[.i], .min_nodes[.i], .max_nodes[.i]))
+ goto S_IterateObjects;
+ goto S_NextObject;
+
+S_NextObject:
+ set .done_initial[.i], 1;
+ if (.i >= (.count - 1))
+ goto S_Return;
+ set .i, .i + 1; // object iterator++
+ goto S_IterateObjects;
+
+S_Return:
+ return;
+
+OnHeartbeat:
+ set .i, 0; // object iterator
+ freeloop 1;
+ callsub S_IterateObjects;
+ freeloop 0;
+ addnpctimer .spawn_t, strnpcinfo(0) + "::OnHeartbeat"; // heartbeat
+ end;
+
+OnMaybeStart:
+ if (.x1[1] == 0)
+ end;
+ set .min, 0; // relative min number of nodes per object => (min * (((x2 - x1) * (y2 - y1)) / divisor))
+ set .max, 5; // relative max number of nodes per object => (max * (((x2 - x1) * (y2 - y1)) / divisor))
+ set .divisor, 32; // see .min & .max ^
+ set .count, getarraysize(.x1); // number of nodes objects in TSX
+ set .spawn_t, 18000; // heartbeat rate
+ set .death_t, 1000; // rand(timer/2, timer) before a node triggers respawn after death
+ set .appear_t, 40000; // rand(timer/2, timer) before a node becomes visible after spawn
+ if (.started)
+ end;
+ set .started, 1;
+ addnpctimer 10000, strnpcinfo(0)+"::OnHeartbeat"; // first heartbeat
+ end;
}
diff --git a/world/map/npc/055-3/_import.txt b/world/map/npc/055-3/_import.txt
index b1073d34..82962c3f 100644
--- a/world/map/npc/055-3/_import.txt
+++ b/world/map/npc/055-3/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 055-3
npc: npc/055-3/_mobs.txt
+npc: npc/055-3/_nodes.txt
npc: npc/055-3/_warps.txt
npc: npc/055-3/mapflags.txt
diff --git a/world/map/npc/055-3/_mobs.txt b/world/map/npc/055-3/_mobs.txt
index bc14b844..686b2172 100644
--- a/world/map/npc/055-3/_mobs.txt
+++ b/world/map/npc/055-3/_mobs.txt
@@ -1,47 +1,11 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Cave mobs
-055-3,45,44,20,14|monster|RedSlime|1008,10,10000ms,60000ms,Mob055-3::On1008
-055-3,0,0,1,1|monster|Bat|1017,20,10000ms,45000ms,Mob055-3::On1017
-055-3,53,75,28,40|monster|YellowSlime|1007,10,10000ms,60000ms,Mob055-3::On1007
-055-3,0,0,1,1|monster|BlackScorpion|1009,8,10000ms,35000ms,Mob055-3::On1009
-055-3,0,0,1,1|monster|Spider|1012,8,10000ms,35000ms,Mob055-3::On1012
-055-3,0,0,1,1|monster|Snake|1010,3,10000ms,20000ms,Mob055-3::On1010
-055-3,46,44,14,18|monster|Spider|1012,3,50000ms,100000ms,Mob055-3::On1012
-055-3,52,78,36,23|monster|BlackScorpion|1009,3,50000ms,100000ms,Mob055-3::On1009
-
-
-055-3,0,0,0|script|Mob055-3|32767
-{
- end;
-
-On1007:
- set @mobID, 1007;
- callfunc "MobPoints";
- end;
-
-On1008:
- set @mobID, 1008;
- callfunc "MobPoints";
- end;
-
-On1009:
- set @mobID, 1009;
- callfunc "MobPoints";
- end;
-
-On1010:
- set @mobID, 1010;
- callfunc "MobPoints";
- end;
-
-On1012:
- set @mobID, 1012;
- callfunc "MobPoints";
- end;
-
-On1017:
- set @mobID, 1017;
- callfunc "MobPoints";
- end;
-}
+055-3,45,44,20,14|monster|RedSlime|1008,10,10000ms,60000ms
+055-3,0,0,1,1|monster|Bat|1017,20,10000ms,45000ms
+055-3,53,75,28,40|monster|YellowSlime|1007,10,10000ms,60000ms
+055-3,0,0,1,1|monster|BlackScorpion|1009,8,10000ms,35000ms
+055-3,0,0,1,1|monster|Spider|1012,8,10000ms,35000ms
+055-3,0,0,1,1|monster|Snake|1010,3,10000ms,20000ms
+055-3,46,44,14,18|monster|Spider|1012,3,50000ms,100000ms
+055-3,52,78,36,23|monster|BlackScorpion|1009,3,50000ms,100000ms
diff --git a/world/map/npc/055-3/_nodes.txt b/world/map/npc/055-3/_nodes.txt
new file mode 100644
index 00000000..ed02d5dc
--- /dev/null
+++ b/world/map/npc/055-3/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Cave nodes
+
+// (no nodes)
diff --git a/world/map/npc/056-2/_import.txt b/world/map/npc/056-2/_import.txt
index 4a48c0f5..79dda260 100644
--- a/world/map/npc/056-2/_import.txt
+++ b/world/map/npc/056-2/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 056-2
npc: npc/056-2/_mobs.txt
+npc: npc/056-2/_nodes.txt
npc: npc/056-2/_warps.txt
npc: npc/056-2/barrier.txt
npc: npc/056-2/mapflags.txt
diff --git a/world/map/npc/056-2/_mobs.txt b/world/map/npc/056-2/_mobs.txt
index 267e0d8a..487fdc8d 100644
--- a/world/map/npc/056-2/_mobs.txt
+++ b/world/map/npc/056-2/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Mirak's House mobs
-
-
-056-2,0,0,0|script|Mob056-2|32767
-{
- end;
-}
diff --git a/world/map/npc/056-2/_nodes.txt b/world/map/npc/056-2/_nodes.txt
new file mode 100644
index 00000000..597f2336
--- /dev/null
+++ b/world/map/npc/056-2/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Mirak's House nodes
+
+// (no nodes)
diff --git a/world/map/npc/057-1/_import.txt b/world/map/npc/057-1/_import.txt
index 5ccd6889..2a668bd7 100644
--- a/world/map/npc/057-1/_import.txt
+++ b/world/map/npc/057-1/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: 057-1
npc: npc/057-1/_mobs.txt
+npc: npc/057-1/_nodes.txt
npc: npc/057-1/_warps.txt
npc: npc/057-1/mapflags.txt
diff --git a/world/map/npc/057-1/_mobs.txt b/world/map/npc/057-1/_mobs.txt
index 5988ce83..865607ee 100644
--- a/world/map/npc/057-1/_mobs.txt
+++ b/world/map/npc/057-1/_mobs.txt
@@ -1,82 +1,21 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Woodland mobs
-057-1,0,0,0,0|monster|MauvePlant|1029,5,45000ms,45000ms,Mob057-1::On1029
-057-1,0,0,0,0|monster|CobaltPlant|1030,3,10000ms,65000ms,Mob057-1::On1030
-057-1,0,0,0,0|monster|GambogePlant|1031,5,10000ms,45000ms,Mob057-1::On1031
-057-1,0,0,0,0|monster|AlizarinPlant|1032,7,10000ms,70000ms,Mob057-1::On1032
-057-1,0,0,0,0|monster|Mouboo|1028,14,10000ms,45000ms,Mob057-1::On1028
-057-1,95,42,29,9|monster|Butterfly|1055,3,10000ms,40000ms,Mob057-1::On1055
-057-1,25,48,11,46|monster|Silkworm|1035,7,10000ms,15000ms,Mob057-1::On1035
-057-1,99,40,22,16|monster|PinkFlower|1014,2,10000ms,45000ms,Mob057-1::On1014
-057-1,100,30,19,11|monster|Butterfly|1055,2,10000ms,40000ms,Mob057-1::On1055
-057-1,83,64,12,12|monster|Butterfly|1055,2,10000ms,40000ms,Mob057-1::On1055
-057-1,59,34,8,11|monster|Butterfly|1055,2,10000ms,40000ms,Mob057-1::On1055
-057-1,32,45,8,11|monster|Butterfly|1055,2,10000ms,40000ms,Mob057-1::On1055
-057-1,144,35,12,12|monster|Butterfly|1055,2,10000ms,40000ms,Mob057-1::On1055
-057-1,104,67,12,11|monster|PinkFlower|1014,2,10000ms,45000ms,Mob057-1::On1014
-057-1,135,53,12,11|monster|PinkFlower|1014,2,10000ms,45000ms,Mob057-1::On1014
-057-1,0,0,0,0|monster|SpikyMushroom|1019,10,10000ms,45000ms,Mob057-1::On1019
-057-1,0,0,0,0|monster|CloverPatch|1037,3,10000ms,180000ms,Mob057-1::On1037
-057-1,27,46,14,52|monster|Squirrel|1038,6,10000ms,50000ms,Mob057-1::On1038
-
-
-057-1,0,0,0|script|Mob057-1|32767
-{
- end;
-
-On1014:
- set @mobID, 1014;
- callfunc "MobPoints";
- end;
-
-On1019:
- set @mobID, 1019;
- callfunc "MobPoints";
- end;
-
-On1028:
- set @mobID, 1028;
- callfunc "MobPoints";
- end;
-
-On1029:
- set @mobID, 1029;
- callfunc "MobPoints";
- end;
-
-On1030:
- set @mobID, 1030;
- callfunc "MobPoints";
- end;
-
-On1031:
- set @mobID, 1031;
- callfunc "MobPoints";
- end;
-
-On1032:
- set @mobID, 1032;
- callfunc "MobPoints";
- end;
-
-On1035:
- set @mobID, 1035;
- callfunc "MobPoints";
- end;
-
-On1037:
- set @mobID, 1037;
- callfunc "MobPoints";
- end;
-
-On1038:
- set @mobID, 1038;
- callfunc "MobPoints";
- end;
-
-On1055:
- set @mobID, 1055;
- callfunc "MobPoints";
- end;
-}
+057-1,0,0,0,0|monster|MauvePlant|1029,5,45000ms,45000ms
+057-1,0,0,0,0|monster|CobaltPlant|1030,3,10000ms,65000ms
+057-1,0,0,0,0|monster|GambogePlant|1031,5,10000ms,45000ms
+057-1,0,0,0,0|monster|AlizarinPlant|1032,7,10000ms,70000ms
+057-1,0,0,0,0|monster|Mouboo|1028,14,10000ms,45000ms
+057-1,95,42,29,9|monster|Butterfly|1055,3,10000ms,40000ms
+057-1,25,48,11,46|monster|Silkworm|1035,7,10000ms,15000ms
+057-1,99,40,22,16|monster|PinkFlower|1014,2,10000ms,45000ms
+057-1,100,30,19,11|monster|Butterfly|1055,2,10000ms,40000ms
+057-1,83,64,12,12|monster|Butterfly|1055,2,10000ms,40000ms
+057-1,59,34,8,11|monster|Butterfly|1055,2,10000ms,40000ms
+057-1,32,45,8,11|monster|Butterfly|1055,2,10000ms,40000ms
+057-1,144,35,12,12|monster|Butterfly|1055,2,10000ms,40000ms
+057-1,104,67,12,11|monster|PinkFlower|1014,2,10000ms,45000ms
+057-1,135,53,12,11|monster|PinkFlower|1014,2,10000ms,45000ms
+057-1,0,0,0,0|monster|SpikyMushroom|1019,10,10000ms,45000ms
+057-1,0,0,0,0|monster|CloverPatch|1037,3,10000ms,180000ms
+057-1,27,46,14,52|monster|Squirrel|1038,6,10000ms,50000ms
diff --git a/world/map/npc/057-1/_nodes.txt b/world/map/npc/057-1/_nodes.txt
new file mode 100644
index 00000000..3bc0c2e9
--- /dev/null
+++ b/world/map/npc/057-1/_nodes.txt
@@ -0,0 +1,16 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Woodland nodes
+
+057-1,0,0,0|script|Node057-1|32767
+{
+ end;
+OnInit:
+ setarray .m$, "_N-Pumpkin", "057-1";
+ setarray .x1, "_N-Pumpkin", 25;
+ setarray .y1, "_N-Pumpkin", 25;
+ setarray .x2, "_N-Pumpkin", 35;
+ setarray .y2, "_N-Pumpkin", 37;
+ setarray .id, "_N-Pumpkin", 0;
+ donpcevent "_N-Pumpkin::OnMaybeStart";
+ destroy;
+}
diff --git a/world/map/npc/_import.txt b/world/map/npc/_import.txt
index a0c07173..3d4c89e2 100644
--- a/world/map/npc/_import.txt
+++ b/world/map/npc/_import.txt
@@ -25,6 +25,7 @@ import: npc/009-4/_import.txt
import: npc/009-5/_import.txt
import: npc/009-6/_import.txt
import: npc/009-7/_import.txt
+import: npc/009-8/_import.txt
import: npc/010-1/_import.txt
import: npc/010-2/_import.txt
import: npc/011-1/_import.txt
@@ -42,6 +43,7 @@ import: npc/014-3/_import.txt
import: npc/015-1/_import.txt
import: npc/015-3/_import.txt
import: npc/016-1/_import.txt
+import: npc/016-2/_import.txt
import: npc/017-1/_import.txt
import: npc/017-2/_import.txt
import: npc/017-3/_import.txt
diff --git a/world/map/npc/annuals/fathertime.txt b/world/map/npc/annuals/fathertime.txt
index 6d61f446..29406f63 100644
--- a/world/map/npc/annuals/fathertime.txt
+++ b/world/map/npc/annuals/fathertime.txt
@@ -6,17 +6,13 @@
OnInit:
if (debug >= 2) end;
- goto L_StartTimer;
-
-L_StartTimer:
- setnpctimer 0;
- initnpctimer;
+ donpcevent strnpcinfo(0) + "::OnTimer20000";
end;
OnTimer20000:
- setnpctimer 0;
donpcevent "#XmasConfig::OnCommandRestartQuest";
donpcevent "#HalloweenConfig::OnCommandRestartQuest";
+ donpcevent "Easter Eggs::OnCheckEaster";
initnpctimer;
end;
}
diff --git a/world/map/npc/annuals/halloween/debug.txt b/world/map/npc/annuals/halloween/debug.txt
index cbc918e2..8f3d066e 100644
--- a/world/map/npc/annuals/halloween/debug.txt
+++ b/world/map/npc/annuals/halloween/debug.txt
@@ -42,7 +42,6 @@ L_LastReset:
goto L_Debug;
L_HalloweenTimeKey:
- if (getgmlevel() < 20) goto L_Close;
mes "Halloween Time Key Change.";
mes "Start Month?";
input @halloween_time_key_smonth;
diff --git a/world/map/npc/annuals/xmas/debug.txt b/world/map/npc/annuals/xmas/debug.txt
index f0170a0d..6c513ff1 100644
--- a/world/map/npc/annuals/xmas/debug.txt
+++ b/world/map/npc/annuals/xmas/debug.txt
@@ -96,7 +96,6 @@ L_Reset:
goto L_Close;
L_XmasTimeKey:
- if (getgmlevel() < 20) goto L_Close;
mes "Xmas Time Key Change.";
mes "Start Month?";
input @xmas_time_key_smonth;
diff --git a/world/map/npc/botcheck/_import.txt b/world/map/npc/botcheck/_import.txt
index c54696ac..85374e51 100644
--- a/world/map/npc/botcheck/_import.txt
+++ b/world/map/npc/botcheck/_import.txt
@@ -2,5 +2,6 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
map: botcheck
npc: npc/botcheck/_mobs.txt
+npc: npc/botcheck/_nodes.txt
npc: npc/botcheck/_warps.txt
npc: npc/botcheck/mapflags.txt
diff --git a/world/map/npc/botcheck/_mobs.txt b/world/map/npc/botcheck/_mobs.txt
index 91d023cd..66a9726f 100644
--- a/world/map/npc/botcheck/_mobs.txt
+++ b/world/map/npc/botcheck/_mobs.txt
@@ -1,9 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Botcheck Area mobs
-
-
-botcheck,0,0,0|script|Mobbotcheck|32767
-{
- end;
-}
diff --git a/world/map/npc/botcheck/_nodes.txt b/world/map/npc/botcheck/_nodes.txt
new file mode 100644
index 00000000..e72a6332
--- /dev/null
+++ b/world/map/npc/botcheck/_nodes.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Botcheck Area nodes
+
+// (no nodes)
diff --git a/world/map/npc/commands/_import.txt b/world/map/npc/commands/_import.txt
new file mode 100644
index 00000000..3cabe0b7
--- /dev/null
+++ b/world/map/npc/commands/_import.txt
@@ -0,0 +1,10 @@
+npc: npc/commands/_procedures.txt
+npc: npc/commands/zeny.txt
+npc: npc/commands/marry.txt
+npc: npc/commands/debug.txt
+npc: npc/commands/changesex.txt
+npc: npc/commands/class.txt
+npc: npc/commands/pullrabbit.txt
+npc: npc/commands/numa.txt
+npc: npc/commands/destroynpc.txt
+npc: npc/commands/remotecmd.txt
diff --git a/world/map/npc/commands/_procedures.txt b/world/map/npc/commands/_procedures.txt
new file mode 100644
index 00000000..732b496f
--- /dev/null
+++ b/world/map/npc/commands/_procedures.txt
@@ -0,0 +1,53 @@
+// ARGV Splitter
+// takes @args$ and splits it properly so that '@cmd "foo bar" baz' is ['foo bar','baz'] instead of ['"foo','bar"','baz']
+// input: @args$ (string)
+// output: @argv$ (array) and @argv (array)
+function|script|argv_splitter
+{
+ explode .@fragments$, @args$, " ";
+ set .@e, 0;
+ set .@total, getarraysize(.@fragments$);
+ set .@NULL$, chr(3); // HACK: we use .@NULL$ as a workaround because we can't do "\0"
+ goto L_Check;
+
+L_Check:
+ setarray .@check$[0], "", .@NULL$, .@NULL$;
+ explode .@check$, .@fragments$[.@e], "\""; // check if the fragment contains a quote
+ if (.@check$[0] == "" && .@check$[1] != .@NULL$ && .@check$[1] != "" && .@check$[2] == .@NULL$)
+ set .@string$, .@check$[1]; // begin substring
+ elif (.@check$[0] != "" && .@check$[1] == "" && .@check$[2] == .@NULL$)
+ goto L_EndSubString; // end substring
+ elif (.@string$ != "" && .@check$[0] != "" && .@check$[1] == .@NULL$ && .@check$[2] == .@NULL$)
+ set .@string$, .@string$ +" "+ .@check$[0]; // part of the substring
+ elif (.@check$[2] != .@NULL$) goto L_Set2; // the the argument is quoted but there is no space
+ else goto L_Set;
+ goto L_CheckAfter;
+
+L_Set:
+ setarray @argv$[.@t], .@check$[0]; // not in a substring so push right away
+ setarray @argv[.@t], .@check$[0]; // not in a substring so push right away
+ set .@t, .@t + 1;
+ goto L_CheckAfter;
+
+L_Set2:
+ setarray @argv$[.@t], .@check$[1]; // not in a substring so push right away
+ setarray @argv[.@t], .@check$[1]; // not in a substring so push right away
+ set .@t, .@t + 1;
+ goto L_CheckAfter;
+
+L_EndSubString:
+ set .@string$, .@string$ + " " + .@check$[0];
+ setarray @argv$[.@t], .@string$; // push in the array
+ setarray @argv[.@t], .@string$; // push in the array
+ set .@t, .@t + 1;
+ set .@string$, ""; // clean
+ goto L_CheckAfter;
+
+L_CheckAfter:
+ set .@e, .@e + 1;
+ if (.@e > .@total) goto L_Done; // the @argv$ array is built
+ goto L_Check; // not done yet
+
+L_Done:
+ return;
+}
diff --git a/world/map/npc/commands/changesex.txt b/world/map/npc/commands/changesex.txt
new file mode 100644
index 00000000..fca27645
--- /dev/null
+++ b/world/map/npc/commands/changesex.txt
@@ -0,0 +1,32 @@
+-|script|@changesex|32767
+{
+ callfunc "argv_splitter";
+ set .@n$, if_then_else(@argv$[1] != "", "char", "") + "changesex";
+ if (GM < CMD_CHANGESEX && GM < G_SYSOP) goto L_GM; // check if you can use it on self
+ set .@target_id, BL_ID;
+ if (@argv$[1] != "") set .@target_id, getcharid(3, @argv$[1]);
+ if (@argv$[1] != "" && !(isloggedin(.@target_id))) goto L_Failed; // do NOT fallback to self
+ if (@argv$[1] != "" && GM < CMD_CHARCHANGESEX && GM < G_SYSOP) goto L_GM; // when target is not self, use charchangesex permission
+
+ set .@s, 3; // default to non-binary
+ if (@argv$[0] == "M" || @argv$[0] == "m") set .@s, 1;
+ if (@argv$[0] == "F" || @argv$[0] == "f") set .@s, 0;
+ set Sex, .@s, .@target_id;
+ gmlog "@"+.@n$+" " + @args$;
+ message strcharinfo(0), .@n$+" : The operation succeeded.";
+ end;
+
+L_Failed:
+ // XXX: should we allow GMs to change sex of users that are not logged in?
+ message strcharinfo(0), .@n$+" : Impossible to attach to the target player. Did you try putting the name in \"quotation marks\"?";
+ end;
+
+L_GM:
+ message strcharinfo(0), .@n$+" : GM command is level "+ if_then_else(@argv$[1] != "", CMD_CHARCHANGESEX, CMD_CHANGESEX) +", but you are level " + GM;
+ end;
+
+OnInit:
+ registercmd chr(ATCMD_SYMBOL) + "changesex", strnpcinfo(0);
+ registercmd chr(ATCMD_SYMBOL) + "charchangesex", strnpcinfo(0);
+ end;
+}
diff --git a/world/map/npc/commands/class.txt b/world/map/npc/commands/class.txt
new file mode 100644
index 00000000..9143e08a
--- /dev/null
+++ b/world/map/npc/commands/class.txt
@@ -0,0 +1,31 @@
+-|script|@class|32767
+{
+ callfunc "argv_splitter";
+ set .@n$, if_then_else(@argv$[1] != "", "char", "") + "class";
+ if (GM < CMD_CLASS && GM < G_SYSOP) goto L_GM; // check if you can use it on self
+ set .@target_id, BL_ID;
+ if (@argv$[1] != "") set .@target_id, getcharid(3, @argv$[1]);
+ if (@argv$[1] != "" && !(isloggedin(.@target_id))) goto L_Failed; // do NOT fallback to self
+ if (@argv$[1] != "" && GM < CMD_CHARCLASS && GM < G_SYSOP) goto L_GM; // when target is not self, use charclass permission
+
+ set .@c, 1; // default to human
+ if (@argv[0] >= 1 || @argv[0] <= 32767) set .@c, @argv[0];
+ set Class, .@c, .@target_id;
+ gmlog "@"+.@n$+" " + @args$;
+ message strcharinfo(0), .@n$+" : The operation succeeded.";
+ end;
+
+L_Failed:
+ // XXX: should we allow GMs to change class of users that are not logged in?
+ message strcharinfo(0), .@n$+" : Impossible to attach to the target player. Did you try putting the name in \"quotation marks\"?";
+ end;
+
+L_GM:
+ message strcharinfo(0), .@n$+" : GM command is level "+ if_then_else(@argv$[1] != "", CMD_CHARCLASS, CMD_CLASS) +", but you are level " + GM;
+ end;
+
+OnInit:
+ registercmd chr(ATCMD_SYMBOL) + "class", strnpcinfo(0);
+ registercmd chr(ATCMD_SYMBOL) + "charclass", strnpcinfo(0);
+ end;
+}
diff --git a/world/map/npc/functions/debug.txt b/world/map/npc/commands/debug.txt
index 44af4d40..19ac4114 100755..100644
--- a/world/map/npc/functions/debug.txt
+++ b/world/map/npc/commands/debug.txt
@@ -3,9 +3,9 @@
function|script|Debug
{
if(!@debug_npc) goto L_Begin;
- mes "The debug NPCs have been deprecated. Please use this magic spell instead:";
+ mes "The debug NPCs have been deprecated. Please use this command instead:";
mes "";
- mes "%%E ##a"+ getspellinvocation("debug0") +"##0";
+ mes "%%E ##a@debug##0";
set @debug_npc, 0;
goto L_Close;
@@ -831,13 +831,13 @@ S_Update_Mask:
return;
L_GetAllMagic:
- setskill SKILL_MAGIC, 2;
- setskill SKILL_MAGIC_LIFE, 2;
- setskill SKILL_MAGIC_WAR, 2;
- setskill SKILL_MAGIC_TRANSMUTE, 2;
- setskill SKILL_MAGIC_NATURE, 2;
- setskill SKILL_MAGIC_ASTRAL, 2;
- setskill SKILL_MAGIC_DARK, 2;
+ setskill SKILL_MAGIC, 5;
+ setskill SKILL_MAGIC_LIFE, 5;
+ setskill SKILL_MAGIC_WAR, 5;
+ setskill SKILL_MAGIC_TRANSMUTE, 5;
+ setskill SKILL_MAGIC_NATURE, 5;
+ setskill SKILL_MAGIC_ASTRAL, 5;
+ setskill SKILL_MAGIC_DARK, 5;
set @mexp, 8000;
callsub S_Update_Mask;
mes "Magic skills added.";
@@ -869,13 +869,13 @@ L_AddAll:
setskill SKILL_RESIST_POISON, 9;
setskill SKILL_ASTRAL_SOUL, 9;
setskill SKILL_RAGING, 9;
- setskill SKILL_MAGIC, 2;
- setskill SKILL_MAGIC_LIFE, 2;
- setskill SKILL_MAGIC_WAR, 2;
- setskill SKILL_MAGIC_TRANSMUTE, 2;
- setskill SKILL_MAGIC_NATURE, 2;
- setskill SKILL_MAGIC_ASTRAL, 2;
- setskill SKILL_MAGIC_DARK, 2;
+ setskill SKILL_MAGIC, 5;
+ setskill SKILL_MAGIC_LIFE, 5;
+ setskill SKILL_MAGIC_WAR, 5;
+ setskill SKILL_MAGIC_TRANSMUTE, 5;
+ setskill SKILL_MAGIC_NATURE, 5;
+ setskill SKILL_MAGIC_ASTRAL, 5;
+ setskill SKILL_MAGIC_DARK, 5;
set @mexp, 8000;
resetstatus;
set BaseLevel, 99;
@@ -922,6 +922,20 @@ L_Close:
}
+-|script|Debug Spell|32767
+{
+ if(!debug && getgmlevel() < CMD_DEBUG) end;
+ callfunc "Debug";
+ end;
+OnDeprecated:
+ message strcharinfo(0), "Debug : ##3The #debug spell has been superseded by the ##B@debug##b command.";
+ end;
+OnInit:
+ registercmd "@debug", "Debug Spell";
+ registercmd "#debug", "Debug Spell::OnDeprecated";
+ end;
+}
+
029-2,30,26,0|script|Debug#0|154
{
set @debug_npc, 1;
diff --git a/world/map/npc/commands/destroynpc.txt b/world/map/npc/commands/destroynpc.txt
new file mode 100644
index 00000000..1ebede9e
--- /dev/null
+++ b/world/map/npc/commands/destroynpc.txt
@@ -0,0 +1,35 @@
+-|script|@destroynpc|32767
+{
+ callfunc "argv_splitter";
+ if (GM < CMD_DESTROYNPC && GM < G_SYSOP)
+ goto L_GM;
+
+ set .@id, getnpcid(@argv$[0]);
+ if (@argv$[0] == "" || .@id < 1)
+ goto L_Failed;
+ if (gettimetick(2) - @destroynpc[0] > 300 || @destroynpc[1] != .@id)
+ goto L_Confirm;
+
+ gmlog "@destroynpc " + @args$;
+ message strcharinfo(0), "destroynpc : The operation succeeded.";
+ debugmes "!!! => npc destroyed: `"+@argv$[0]+"` ("+.@id+")";
+ if (1==1) destroy .@id; // FIXME: allow destroy to work as a non-terminator when arg0 is given (TMWA)
+ end;
+
+L_Confirm:
+ message strcharinfo(0), "destroynpc : ##BDANGER ZONE!##b This command permanently destroys a npc and its puppets (if any). Use the command again to confirm.";
+ setarray @destroynpc[0], gettimetick(2), .@id;
+ end;
+
+L_Failed:
+ message strcharinfo(0), "destroynpc : Impossible to find the target npc. Did you try putting the name in \"quotation marks\"? Some npcs also have an invisible postfix in their name, ie `#_M`.";
+ end;
+
+L_GM:
+ message strcharinfo(0), "destroynpc : GM command is level "+ CMD_DESTROYNPC +", but you are level " + GM;
+ end;
+
+OnInit:
+ registercmd chr(ATCMD_SYMBOL) + "destroynpc", strnpcinfo(0);
+ end;
+}
diff --git a/world/map/npc/commands/marry.txt b/world/map/npc/commands/marry.txt
new file mode 100644
index 00000000..39efe6b8
--- /dev/null
+++ b/world/map/npc/commands/marry.txt
@@ -0,0 +1,69 @@
+-|script|special-marry|32767
+{
+ set .@target_id, getcharid(3, @args$);
+ if (.@target_id < 1 || !(isloggedin(.@target_id)) || .@target_id == BL_ID) goto L_NotFound;
+ if (PARTNER || get(PARTNER, .@target_id)) goto L_AlreadyMarried;
+ if (isin("014-1",29,36,34,39) == 0 && isin("001-1",20,27,22,27) == 0) goto L_NotInArea;
+ if (distance(BL_ID, .@target_id) != 1) goto L_AwayFromPartner;
+ if (BaseLevel < WEDDING_MIN_LEVEL || get(BaseLevel, .@target_id) < WEDDING_MIN_LEVEL) goto L_TooYoung;
+ if (getequipid(equip_shield) != 702 || getequipid(equip_shield, @args$) != 702) goto L_NoRing;
+
+ if (get(@marriage[0], .@target_id) == BL_ID) goto L_Proceed;
+
+ setarray @marriage[0], .@target_id, gettimetick(2);
+ addtimer (.timeout * 1000), strnpcinfo(0) + "::OnTimeout";
+ announce strcharinfo(0) + " is asking " + strcharinfo(0, .@target_id) + " for marriage.", 2;
+ message strcharinfo(0, .@target_id), "Marriage : ##3##B" + strcharinfo(0) + " wishes to marry you. To accept, write `##1#marry "+strcharinfo(0)+"##3` within the next "+.timeout+" seconds.";
+ end;
+
+L_NotFound:
+ message strcharinfo(0), "Marriage : ##3##BThe target player is either not found or yourself.";
+ end;
+
+L_TooYoung:
+ message strcharinfo(0), "Marriage : ##3##BYou and your partner need to be at least level "+ WEDDING_MIN_LEVEL +".";
+ end;
+
+L_NoRing:
+ message strcharinfo(0), "Marriage : ##3##BYou and your partner need to have ["+ getitemlink("WeddingRing") +"] equipped.";
+ end;
+
+L_AwayFromPartner:
+ message strcharinfo(0), "Marriage : ##3##BYou and your partner need to be standing next to each other.";
+ end;
+
+L_NotInArea:
+ message strcharinfo(0), "Marriage : ##3##BYou are not standing in a designated marriage area.";
+ end;
+
+L_Proceed:
+ if ((gettimetick(2) - .timeout) > get(@marriage[1], .@target_id)) goto L_TooLate;
+ set PARTNER, CHAR_ID, .@target_id;
+ if (PARTNER == get(CHAR_ID, .@target_id)) goto L_Success;
+ set PARTNER, 0, .@target_id;
+ set PARTNER, 0;
+ end;
+
+L_Success:
+ announce strcharinfo(0) + " and " + strcharinfo(0, .@target_id) + " are now married.", 2;
+ end;
+
+OnTimeout:
+ goto L_TooLate;
+
+L_TooLate:
+ message strcharinfo(0), "Marriage : ##3##BThe proposal expired. Please try again.";
+ message strcharinfo(0, @marriage[0]), "Marriage : ##3##BThe proposal expired. Please try again.";
+ set @marriage[0], 0, @marriage[0];
+ set @marriage[0], 0;
+ end;
+
+L_AlreadyMarried:
+ message strcharinfo(0), "Marriage : ##3##BYou"+ if_then_else(PARTNER, " are", "r partner is") +" already married.";
+ end;
+
+OnInit:
+ set .timeout, 30; // timeout for proposal
+ registercmd "#marry", strnpcinfo(0); // we NEED to use a # before `marry` because otherwise manaplus does not strip colors
+ end;
+}
diff --git a/world/map/npc/commands/numa.txt b/world/map/npc/commands/numa.txt
new file mode 100644
index 00000000..e8e8cabd
--- /dev/null
+++ b/world/map/npc/commands/numa.txt
@@ -0,0 +1,132 @@
+// all-in-one debug
+// author: meko
+
+-|script|SuperDebug|32767
+{
+ if (GM < MAP_LOUNGE && GM < G_SYSOP && !debug) goto L_GM2; // make sure you can enter the gm lounge
+ if (target(BL_ID,getnpcid("Numa"),1)) goto L_Main;
+ npcaction 6, 12;
+ title "Numa";
+ goto L_Main;
+
+L_GM2:
+ message strcharinfo(0), "numa : GM command is level "+ MAP_LOUNGE +", but you are level " + GM;
+ end;
+
+L_Main:
+ mes "How may I help you?";
+ next;
+ menu
+ "Announcements", L_StoneBoard,
+ "MOTD", L_MOTD,
+ "Holiday debug", L_Holiday,
+ "Event debug", L_Event,
+ "Quest debug", L_Quest,
+ "Who are you?", L_WhoAmI,
+ "Close", L_Close;
+ // todo: generic npcs
+ // todo: map list
+
+L_WhoAmI:
+ mes "I am Numa, also known as `SuperDebug`.";
+ mes "My sole purpose is to assist TMW staff from behind-the-scene.";
+ mes "Using me, you can access several debug menus.";
+ mes "You can call me from anywhere using the ##B@numa##b spell, or you can come see me in person.";
+ next;
+ goto L_Main;
+
+L_Holiday:
+ if (GM < DBG_HOLIDAY && GM < G_SYSOP) goto L_GM;
+ mes "What holiday do you want to debug?";
+ next;
+ menu
+ "Xmas.", L_XmasDebug,
+ "Halloween.", L_HalloweenDebug,
+ "Easter.", L_EasterDebug;
+
+L_XmasDebug:
+ gmlog strcharinfo(0) + " accessed the Xmas debug.";
+ callfunc "XmasDebug";
+ goto L_Close;
+
+L_HalloweenDebug:
+ gmlog strcharinfo(0) + " accessed the Halloween debug.";
+ callfunc "HalloweenDebug";
+ goto L_Close;
+
+L_EasterDebug:
+ gmlog strcharinfo(0) + " accessed the Easter debug.";
+ callfunc "Easter Debug";
+ goto L_Close;
+
+L_Event:
+ if (GM < EVT_DEBUG && GM < G_EVENT) goto L_GM;
+ gmlog strcharinfo(0) + " accessed the GM event debug.";
+ callfunc "GmDebug";
+ goto L_Close;
+
+L_StoneBoard:
+ if (GM < DBG_SCHEDULED && GM < G_SYSOP) goto L_GM;
+ callfunc "SBConfig";
+ goto L_Close;
+
+L_MOTD:
+ if (GM < DBG_MOTD && GM < G_SYSOP) goto L_GM;
+ callfunc "MOTDConfig";
+ goto L_Close;
+
+L_GM:
+ mes "I'm awfully sorry.";
+ mes "You do not have the required GM level to perform this action.";
+ goto L_Close;
+
+L_Quest:
+ callfunc "QuestDebug";
+ goto L_Close;
+
+L_Close:
+ close;
+
+OnInit:
+ registercmd chr(ATCMD_SYMBOL) + "numa", strnpcinfo(0);
+ registercmd chr(ATCMD_SYMBOL) + "superdebug", strnpcinfo(0);
+ void puppet("017-9", 30, 28, "Numa", 393);
+ end;
+}
+
+function|script|QuestDebug
+{
+ goto L_ChooseContinent;
+
+L_ChooseContinent:
+ mes "Choose a continent.";
+ next;
+ menu
+ "Argeas", L_Argeas,
+ "Close", L_Return;
+
+L_Argeas:
+ mes "Choose an area.";
+ next;
+ menu
+ "Woodland", L_Woodland,
+ "Choose a continent", L_ChooseContinent,
+ "Close", L_Return;
+
+L_Woodland:
+ mes "Choose a quest.";
+ next;
+ menu
+ "Illia Sisters", L_Valia,
+ "Choose an area", L_Argeas,
+ "Close", L_Return;
+
+L_Return:
+ return;
+
+//////////////////////////////
+
+L_Valia:
+ callfunc "IlliaDebug";
+ goto L_Return;
+}
diff --git a/world/map/npc/items/magic_gm_top_hat.txt b/world/map/npc/commands/pullrabbit.txt
index 129aa5c0..022f3753 100644
--- a/world/map/npc/items/magic_gm_top_hat.txt
+++ b/world/map/npc/commands/pullrabbit.txt
@@ -1,21 +1,25 @@
-function|script|ActivateMagicGMTophat
+-|script|@pullrabbit|32767
{
- if (getgmlevel() < 60) goto L_Return;
+ if (GM < EVT_KILLTHEGM && GM < G_SYSOP) end;
+ if (getequipid(equip_head) != 888) end;
getinventorylist;
if ((checkweight("MurdererCrown", 1) == 0) || (@inventorylist_count == 100))
goto L_Inventory;
// Get the current reward of the event. This may be changed later
getitem "MurdererCrown", 1;
+ // Set HP and SP to max
+ heal MaxHp, MaxSp;
// Display an effect
misceffect FX_CHANNELLING_CAST, strcharinfo(0);
// Log the usage of this spell
gmlog strcharinfo(0)+" used the Magic GM Top Hat.";
- return;
+ end;
L_Inventory:
message strcharinfo(0), "You cannot create this item. You're too heavy or you don't have a free slot.";
- return;
+ end;
-L_Return:
- return;
+OnInit:
+ registercmd chr(ATCMD_SYMBOL) + "pullrabbit", strnpcinfo(0);
+ end;
}
diff --git a/world/map/npc/commands/remotecmd.txt b/world/map/npc/commands/remotecmd.txt
new file mode 100644
index 00000000..b8c47f35
--- /dev/null
+++ b/world/map/npc/commands/remotecmd.txt
@@ -0,0 +1,62 @@
+-|script|@remotecmd|32767
+{
+ callfunc "argv_splitter";
+ if (GM < CMD_REMOTECMD && GM < G_SYSOP) goto L_GM; // check if you can use it on self
+ set .@target_id, BL_ID;
+ set .@t$, @argv$[1];
+ setarray @remotecmd[0], 0, 1, 1; // nr, to_self, multi_target
+ if (.@t$ == "map") goto L_Map;
+ if (.@t$ == "map!") goto L_AllMap;
+ if (.@t$ == "area") goto L_Area;
+ if (.@t$ == "area!") goto L_AllArea;
+ if (.@t$ != "") set .@target_id, getcharid(3, @argv$[1]);
+ if (.@t$ != "" && !(isloggedin(.@target_id))) goto L_Failed; // do NOT fallback to self
+
+ set @target_id, .@target_id;
+ set @remotecmd[2], 0; // only one target
+ addtimer 0, strnpcinfo(0) + "::OnPC";
+ end;
+
+L_Map:
+ set @remotecmd[1], 0; // do not include self
+ goto L_AllMap;
+
+L_AllMap:
+ foreach 0, getmap(), 0, 0, 32767, 32767, strnpcinfo(0)+"::OnPC";
+ goto L_Success;
+
+L_Area:
+ set @remotecmd[1], 0; // do not include self
+ goto L_AllMap;
+
+L_AllArea:
+ foreach 0, getmap(), (POS_X - .range), (POS_Y - .range), (POS_X + .range), (POS_Y + .range), strnpcinfo(0)+"::OnPC";
+ goto L_Success;
+
+OnPC:
+ if (@target_id == BL_ID && @remotecmd[1] < 1)
+ end;
+ remotecmd @argv$[0], strcharinfo(0, @target_id);
+ set @remotecmd[0], @remotecmd[0] + 1;
+ if (@remotecmd[2] < 1)
+ goto L_Success;
+ end;
+
+L_Success:
+ gmlog "@remotecmd " + @args$;
+ message strcharinfo(0), "remotecmd : The operation succeeded. ["+ @remotecmd[0] + "]";
+ end;
+
+L_Failed:
+ message strcharinfo(0), "remotecmd : Impossible to attach to the target player. Did you try putting the name in \"quotation marks\"?";
+ end;
+
+L_GM:
+ message strcharinfo(0), "remotecmd : GM command is level "+ CMD_REMOTECMD +", but you are level " + GM;
+ end;
+
+OnInit:
+ set .range, 14; // visible range
+ registercmd chr(ATCMD_SYMBOL) + "remotecmd", strnpcinfo(0);
+ end;
+}
diff --git a/world/map/npc/commands/zeny.txt b/world/map/npc/commands/zeny.txt
new file mode 100644
index 00000000..513330b5
--- /dev/null
+++ b/world/map/npc/commands/zeny.txt
@@ -0,0 +1,79 @@
+-|script|@zeny|32767
+{
+ callfunc "argv_splitter";
+ set .@n$, if_then_else(@argv$[1] != "", "char", "") + "zeny";
+ if (GM < CMD_ZENY && GM < G_SYSOP) goto L_GM; // check if you can use it on self
+ set .@target_id, BL_ID;
+ if (@argv$[1] != "") set .@target_id, getcharid(3, @argv$[1]);
+ if (@argv$[1] != "" && !(isloggedin(.@target_id))) goto L_Failed; // do NOT fallback to self
+ if (@argv$[1] != "" && GM < CMD_CHARZENY && GM < G_SYSOP) goto L_GM; // when target is not self, use charzeny permission
+ if (@argv$[0] == "--") goto L_Remove;
+ if (@argv$[0] == "---") goto L_RemoveAll;
+ if (@argv$[0] == "++") goto L_Max;
+ if (@argv$[0] == "+++") goto L_MaxAll;
+ set .@delta, @argv[0]; // ± zeny
+ set .@zeny, get(Zeny, .@target_id); // get the number of zeny in char
+ set .@bank, get(#BankAccount, .@target_id); // get number of zeny in (world) account
+ set .@new_zeny, .@zeny + .@delta; // new balance in char
+ if (.@new_zeny < 0) goto L_MaybeRemoveBank; // zeny would be below 0 so check if we can take from bank
+ if (.@new_zeny > .max_zeny) goto L_MaybeAddBank; // zeny would be over the limit so check if we can store in bank
+ set Zeny, (.@zeny + .@delta), .@target_id;
+ goto L_Success;
+
+L_Remove:
+ set Zeny, 0, .@target_id;
+ goto L_Success;
+
+L_RemoveAll:
+ set Zeny, 0, .@target_id;
+ set #BankAccount, 0, .@target_id;
+ goto L_Success;
+
+L_Max:
+ set Zeny, .max_zeny, .@target_id;
+ goto L_Success;
+
+L_MaxAll:
+ set Zeny, .max_zeny, .@target_id;
+ set #BankAccount, .max_int, .@target_id;
+ goto L_Success;
+
+L_MaybeAddBank:
+ set .@new_bank, (.@bank + (.@new_zeny - .max_zeny));
+ if (.@new_bank > .max_int || .@new_bank < 0) goto L_OutOfBounds;
+ set Zeny, .max_zeny, .@target_id;
+ set #BankAccount, .@new_bank, .@target_id;
+ goto L_Success;
+
+L_MaybeRemoveBank:
+ if ((.@bank + .@new_zeny) < 0) goto L_OutOfBounds;
+ set Zeny, 0, .@target_id;
+ set #BankAccount, (.@bank + .@new_zeny), .@target_id;
+ goto L_Success;
+
+L_OutOfBounds:
+ // XXX: maybe we could also take from other chars from the same accout?
+ message strcharinfo(0), .@n$+" : Impossible to proceed! This would cause the player to have less than 0 zeny or more than " + .max_int + ".";
+ end;
+
+L_Failed:
+ // XXX: should we allow GMs to change zeny of users that are not logged in?
+ message strcharinfo(0), .@n$+" : Impossible to attach to the target player. Did you try putting the name in \"quotation marks\"?";
+ end;
+
+L_Success:
+ gmlog "@zeny " + @args$;
+ message strcharinfo(0), .@n$+" : The operation succeeded.";
+ end;
+
+L_GM:
+ message strcharinfo(0), .@n$+" : GM command is level "+ if_then_else(@argv$[1] != "", CMD_CHARZENY, CMD_ZENY) +", but you are level " + GM;
+ end;
+
+OnInit:
+ set .max_zeny, 1000000000; // hardcoded in tmwa
+ set .max_int, 2147483647; // max int32 value
+ registercmd chr(ATCMD_SYMBOL) + "zeny", strnpcinfo(0);
+ registercmd chr(ATCMD_SYMBOL) + "charzeny", strnpcinfo(0);
+ end;
+}
diff --git a/world/map/npc/functions/DyeConfig.txt b/world/map/npc/functions/DyeConfig.txt
index e2d9640e..999f6722 100644
--- a/world/map/npc/functions/DyeConfig.txt
+++ b/world/map/npc/functions/DyeConfig.txt
@@ -8,8 +8,8 @@ OnInit:
setarray $@DYE_color_names$, "Red", "Green", "Dark Blue", "Yellow", "Light blue", "Pink", "Black", "Orange", "Purple", "Dark Green";
setarray $@DYE_colors$, "Red", "Green", "DarkBlue", "Yellow", "LightBlue", "Pink", "Black", "Orange", "Purple", "DarkGreen";
- setarray $@DYE_items$, "CottonShirt", "CottonCloth", "VNeckSweater", "Turtleneck", "CottonShorts", "CottonTrousers", "CottonSkirt", "Miniskirt", "TankTop", "ShortTankTop", "SilkRobe", "CottonHeadband", "DesertHat", "CottonBoots", "CottonGloves", "RabbitEars", "WizardHat", "BowlerHat", "BowlerHatBrown", "FineDress", "Contributor", "SorcererRed", "SorcererGreen", "SorcererDBlue", "SorcererYellow", "SorcererLBlue", "SorcererPink", "SorcererBlack", "SorcererOrange", "SorcererPurple", "SorcererDGreen", "SorcererWhite";
- setarray $@DYE_item_names$, "Cotton Shirt", "Cotton Cloth", "V-Neck Sweater", "Turtleneck Sweater", "Cotton Shorts", "Cotton Trousers", "Cotton Skirt", "Miniskirt", "Tank Top", "Short Tank Top", "Silk Robe", "Cotton Headband", "Desert Hat", "Cotton Boots", "Cotton Gloves", "Rabbit Ears", "Wizard Hat", "Bowler Hat", "Bowler Hat (brown)", "Fine Dress", "Contributor Shirt", "Sorcerer Robe (Red)", "Sorcerer Robe (Green)", "Sorcerer Robe (Dark Blue)", "Sorcerer Robe (Yellow)", "Sorcerer Robe (Light Blue)", "Sorcerer Robe (Pink)", "Sorcerer Robe (Black)", "Sorcerer Robe (Orange)", "Sorcerer Robe (Purple)", "Sorcerer Robe (Dark Green)", "Sorcerer Robe (White)";
+ setarray $@DYE_items$, "Beret", "CottonShirt", "CottonCloth", "VNeckSweater", "Turtleneck", "CottonShorts", "CottonTrousers", "CottonSkirt", "Miniskirt", "TankTop", "ShortTankTop", "SilkRobe", "CottonHeadband", "DesertHat", "CottonBoots", "CottonGloves", "RabbitEars", "WizardHat", "BowlerHat", "BowlerHatBrown", "FineDress", "Contributor", "SorcererRed", "SorcererGreen", "SorcererDBlue", "SorcererYellow", "SorcererLBlue", "SorcererPink", "SorcererBlack", "SorcererOrange", "SorcererPurple", "SorcererDGreen", "SorcererWhite";
+ setarray $@DYE_item_names$, "Beret", "Cotton Shirt", "Cotton Cloth", "V-Neck Sweater", "Turtleneck Sweater", "Cotton Shorts", "Cotton Trousers", "Cotton Skirt", "Miniskirt", "Tank Top", "Short Tank Top", "Silk Robe", "Cotton Headband", "Desert Hat", "Cotton Boots", "Cotton Gloves", "Rabbit Ears", "Wizard Hat", "Bowler Hat", "Bowler Hat (brown)", "Fine Dress", "Contributor Shirt", "Sorcerer Robe (Red)", "Sorcerer Robe (Green)", "Sorcerer Robe (Dark Blue)", "Sorcerer Robe (Yellow)", "Sorcerer Robe (Light Blue)", "Sorcerer Robe (Pink)", "Sorcerer Robe (Black)", "Sorcerer Robe (Orange)", "Sorcerer Robe (Purple)", "Sorcerer Robe (Dark Green)", "Sorcerer Robe (White)";
/******************************
Config Ends Here
******************************/
diff --git a/world/map/npc/functions/clear_vars.txt b/world/map/npc/functions/clear_vars.txt
index ee09071e..aa3f700a 100644
--- a/world/map/npc/functions/clear_vars.txt
+++ b/world/map/npc/functions/clear_vars.txt
@@ -264,12 +264,13 @@ S_Remove_Skills:
return;
S_Misc:
- if(Death_Kill) set Death_Kill, 0;
+ set Death_Kill, 0;
set Scorp, 0; // Tulimshar and Mine Variables which aren't used anymore
set Bugleg, 0; // Tulimshar and Mine Variables which aren't used anymore
set KatzeBeenOutside, 0; // variable was moved to a temporary player variable
set LastHiss, 0; // variable was moved to Nibble 1 of the variable Katze
set CaveSnakeLamp, 0; // quest was turned into a Daily Quest, so the variable isn't needed anymore
+ set MAGIC_CAST_TICK, 0; // legacy stuff
return;
S_Tutorial:
diff --git a/world/map/npc/functions/default_npc_checks.txt b/world/map/npc/functions/default_npc_checks.txt
index da080e82..cc5c4086 100644
--- a/world/map/npc/functions/default_npc_checks.txt
+++ b/world/map/npc/functions/default_npc_checks.txt
@@ -9,6 +9,7 @@ function|script|PCtoNPCRange
set @npc_check, 0;
set @Nmap$, strnpcinfo(3);
if(!@npc_distance) set @npc_distance, 4; // <== default distance
+ if(@npc_distance == (1-2)) set @npc_distance, ATTACKRANGE;
cleararray @npc_loc, 0, 3;
setarray @npc_loc, getnpcx(), getnpcy(), @npc_distance;
set @Nx1, (@npc_loc[0] - @npc_loc[2]);
diff --git a/world/map/npc/functions/game_rules.txt b/world/map/npc/functions/game_rules.txt
index e2b9df81..316ee03f 100644
--- a/world/map/npc/functions/game_rules.txt
+++ b/world/map/npc/functions/game_rules.txt
@@ -2,7 +2,24 @@
function|script|GameRules
{
- mes "[Game Rules]";
+ mes "##BPlease click submit.";
+ requestlang .@cl$; // newer clients will automatically submit and skip ahead
+ clear;
+ title "Game Rules";
+ explode .@l$, .@cl$, "_";
+ if (.@l$[0] == "en") goto L_English;
+ if (.@l$[0] == "nl") goto L_Dutch;
+ if (.@l$[0] == "de") goto L_German;
+ if (.@l$[0] == "da") goto L_Danish;
+ if (.@l$[0] == "fr") goto L_French;
+ if (.@l$[0] == "es") goto L_Spanish;
+ if (.@l$[0] == "sv") goto L_Swedish;
+ if (.@l$[0] == "pt") goto L_Portuguese;
+ if (.@l$[0] == "pl") goto L_Polish;
+ if (.@l$[0] == "it") goto L_Italian;
+ if (.@l$[0] == "zh") goto L_zhHant;
+ if (.@l$[0] == "ru") goto L_Russian;
+
mes "Please select a language:";
menu
"English", L_English,
diff --git a/world/map/npc/functions/global_event_handler.txt b/world/map/npc/functions/global_event_handler.txt
index d5c20b06..ad1ba65c 100644
--- a/world/map/npc/functions/global_event_handler.txt
+++ b/world/map/npc/functions/global_event_handler.txt
@@ -13,6 +13,7 @@ OnPCLoginEvent:
callfunc "ClearVariables"; // removes / converts old variables
callfunc "DisplayMOTD"; // send the motd to the client, if enabled
callfunc "getBroadcast"; // get the scheduled broadcast, if any
+ addtimer 0, "Magic Timer::OnLogin"; // prevent cast rate abuse
// add more here
set @login_event, 2;
end;
@@ -21,13 +22,16 @@ OnPCKillEvent:
callfunc "elanore_decrease_exp"; // decrease heal exp for doing bad things
end;
-OnPCKilledEvent:
- callfunc "fightclub_event_killed"; // this is used by the 1v1 arena
+OnMobKillEvent:
+ callfunc "MobPoints";
end;
OnPCDieEvent:
callfunc "fightclub_GoBack"; // this used by the battle master
- callfunc "fightclub_event_die"; // this is used by the 1v1 arena
+ //callfunc "fightclub_event_die"; // this is used by the 1v1 arena
+ set @necromancer, 0;
+ addtimer 0, "Magic Timer::OnClear"; // reset magic block on death
+ set @killerrid, 0; // reset killer rid
end;
OnInit:
diff --git a/world/map/npc/functions/hug.txt b/world/map/npc/functions/hug.txt
new file mode 100644
index 00000000..f1bd2637
--- /dev/null
+++ b/world/map/npc/functions/hug.txt
@@ -0,0 +1,23 @@
+-|script|nonmagic-hug|32767
+{
+ explode .@name$[0], @args$, "*"; // strip the trailing *
+ set @target_id, if_then_else(.@name$[0] != "", getcharid(3, .@name$[0]), BL_ID);
+ if (@target_id < 1 || !(isloggedin(@target_id))) set @target_id, BL_ID; // fallback to self
+ if (.@name$[0] == "Tree" || .@name$[0] == "tree") set @target_id, .tree_id;
+ set .@range, if_then_else(@target_id == .tree_id, 3, 6);
+ if (distance(BL_ID, @target_id) >= .@range) end;
+ if (gettimetick(2) - @hugspell_time < 3) end;
+
+ set @hugspell_time, gettimetick(2);
+ misceffect FX_HUG, strcharinfo(0);
+ if (@target_id != BL_ID) misceffect FX_HUG, @target_id;
+
+ if (@target_id != .tree_id) end;
+ callfunc "QuestTreeTouch";
+ close;
+
+OnInit:
+ set .tree_id, getnpcid("#DruidTree0#_M");
+ registercmd "*hugs", strnpcinfo(0);
+ end;
+}
diff --git a/world/map/npc/functions/mob_points.txt b/world/map/npc/functions/mob_points.txt
index d60c68b6..72b5ac23 100644
--- a/world/map/npc/functions/mob_points.txt
+++ b/world/map/npc/functions/mob_points.txt
@@ -184,14 +184,21 @@ L_NatureKarma:
set @value, 3;
if (@value == 0)
- goto L_Return;
+ goto L_Celestia;
callfunc "QuestSagathaAnnoy";
- goto L_Return;
+ goto L_Celestia;
L_good:
set @value, 1;
callfunc "QuestSagathaHappy";
+ goto L_Celestia;
+
+L_Celestia:
+ if (QL_CELESTIA < 5 || QL_CELESTIA >= 205 || @mobID != 1072) goto L_Return;
+ set QL_CELESTIA, QL_CELESTIA + 1;
+ if (QL_CELESTIA == 205)
+ message strcharinfo(0), "Yeti : ##3This should be enough yetis killed to please Celestia.";
goto L_Return;
L_Return:
diff --git a/world/map/npc/functions/quiz.txt b/world/map/npc/functions/quiz.txt
index ea10a3c4..0f2f7c87 100644
--- a/world/map/npc/functions/quiz.txt
+++ b/world/map/npc/functions/quiz.txt
@@ -1,3 +1,8 @@
+// FIXME/TODO: some variables should be scoped, and some other variables
+// combined in an array, with a very specific name, to avoid
+// collisions. The script as a whole should be optimized to
+// take advangage of magic-v3
+
function|script|MultiQuiz
{
if((getarraysize(@quiz_answers$) != getarraysize(@quiz_questions$)) ||
diff --git a/world/map/npc/functions/strangerquiz.txt b/world/map/npc/functions/strangerquiz.txt
deleted file mode 100644
index 8da3f65a..00000000
--- a/world/map/npc/functions/strangerquiz.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-
-function|script|StrangerQuiz
-{
- // param @quizparam$$
- // return in @quizanswer$
- set @quizanswer$, getspellinvocation(@quizparam$);
- return;
-}
diff --git a/world/map/npc/functions/superdebug.txt b/world/map/npc/functions/superdebug.txt
deleted file mode 100644
index 5654dd4c..00000000
--- a/world/map/npc/functions/superdebug.txt
+++ /dev/null
@@ -1,65 +0,0 @@
-// all-in-one debug
-// author: meko
-
-function|script|SuperDebug
-{
- if(@from_npc) goto L_Main;
- npcaction 6, 12;
- title "Numa";
- goto L_Main;
-
-L_Main:
- set @from_npc, 0;
- mes "[Numa]";
- mes "How may I help you?";
- next;
- menu
- "Announcements", L_StoneBoard,
- "MOTD", L_MOTD,
- "Holiday debug", L_Holiday,
- "Event debug", L_Event;
- // todo: generic npcs (in a future PR)
- // todo: map list (in a future PR)
- // todo: quest log debug (in a future PR)
-
-L_Holiday:
- if(getgmlevel() < 40) goto L_GM;
- mes "[Numa]";
- mes "What holiday do you want to debug?";
- next;
- menu
- "Xmas.", L_XmasDebug,
- "Halloween.", L_HalloweenDebug;
-
-L_XmasDebug:
- gmlog strcharinfo(0) + " accessed the Xmas debug.";
- callfunc "XmasDebug";
- end;
-
-L_HalloweenDebug:
- gmlog strcharinfo(0) + " accessed the Halloween debug.";
- callfunc "HalloweenDebug";
- end;
-
-L_Event:
- if(getgmlevel() < 60) goto L_GM;
- gmlog strcharinfo(0) + " accessed the GM event debug.";
- callfunc "GmDebug";
- close;
-
-L_StoneBoard:
- if (getgmlevel() < 30) goto L_GM;
- callfunc "SBConfig";
- close;
-
-L_MOTD:
- if (getgmlevel() < 40) goto L_GM;
- callfunc "MOTDConfig";
- close;
-
-L_GM:
- mes "[Numa]";
- mes "I'm awfully sorry.";
- mes "You do not have the required GM level to perform this action.";
- close;
-}
diff --git a/world/map/npc/items/check_wand.txt b/world/map/npc/items/check_wand.txt
index 5a339049..93993c53 100644
--- a/world/map/npc/items/check_wand.txt
+++ b/world/map/npc/items/check_wand.txt
@@ -1,67 +1,2 @@
// Wands
// Author: Wushin
-function|script|WandMana
-{
- if(isin("009-7", $@fightclub_x1, $@fightclub_y1, $@fightclub_x2, $@fightclub_y2) && ((@Duel_Fighter != 1) || ($@Duel_NoMagic == 1)))
- goto L_Return;
- callfunc "CheckWand";
- set @WandCost, (@Wand * (BaseLevel / 15) + 2);
- set @WandAttack, 0;
- if (!(@Wand))
- goto L_NoWand;
- if (Sp >= @WandCost)
- goto L_Attack;
- goto L_LowSp;
-
-L_Attack:
- set Sp, (Sp - @WandCost);
- set @WandAttack, 1;
- goto L_Return;
-
-L_NoWand:
- message strcharinfo(0), "You need a wand Equipped!";
- set @WandAttack, 0;
- goto L_Return;
-
-L_LowSp:
- message strcharinfo(0), "Out of Mana";
- set @WandAttack, 0;
- goto L_Return;
-
-L_Return:
- return;
-}
-function|script|CheckWand
-{
- setarray $@Wands, 758, 1171;
- setarray $@WandsPwr, 2, 1;
- setarray $@WandsAnim, 35, 33;
- set @Wand, 0;
- set @wand_loop, 0;
- goto L_Loop;
-
-L_Loop:
- if ((getequipid(equip_hand1) == $@Wands[@wand_loop]) || (getequipid(equip_hand2) == $@Wands[@wand_loop]))
- goto L_SetWand;
- goto L_LoopAgain;
-
-L_SetWand:
- set @Wand, $@WandsPwr[@wand_loop];
- set @WandID, $@WandsAnim[@wand_loop];
- if (QL_MORGAN == 2)
- goto L_SetCastOnce;
- goto L_Return;
-
-L_LoopAgain:
- set @wand_loop, (@wand_loop + 1);
- if (@wand_loop >= getarraysize($@Wands))
- goto L_Return;
- goto L_Loop;
-
-L_SetCastOnce:
- set QL_MORGAN, 3;
- goto L_Return;
-
-L_Return:
- return;
-}
diff --git a/world/map/npc/magic/README.md b/world/map/npc/magic/README.md
new file mode 100644
index 00000000..57ab5131
--- /dev/null
+++ b/world/map/npc/magic/README.md
@@ -0,0 +1,54 @@
+- [ ] check the new builtins and make sure they work as intended
+ - [ ] `puppet`
+ - [ ] check what happens when making a puppet whose name already exist (maybe it replaces?)
+ - [ ] `destroy`
+ - [ ] `registercmd`
+ - [ ] check what happens when registering a command that was already registered
+ - [ ] `target`
+ - [ ] `get`
+ - [ ] the new `set`
+ - [ ] `min`
+ - [ ] `max`
+ - [ ] `pow`
+ - [ ] `sqrt`
+ - [ ] `cbrt`
+ - [ ] `elttype`
+ - [ ] `eltlvl`
+ - [ ] `injure`
+ - [ ] `elif`
+ - [ ] `else`
+ - [ ] `getnpcid`
+ - [ ] `overrideattack`
+ - [ ] `summon`
+ - [ ] `addnpctimer`
+ - [ ] `explode`
+ - [ ] `foreach`
+ - [ ] modified `areatimer`
+ - [ ] `aggravate`
+ - [ ] `getdir`
+ - [ ] `distance`
+ - [ ] `if_then_else`
+
+ - I do not like `void`, feels like an ugly workaround; we should make `puppet` and `call` work in both function context and statement context
+
+---
+- [ ] test the spells
+ - [ ] test with no target
+ - [ ] test with a npc target
+ - [ ] random npc not part of any quest
+ - [ ] injured mouboo
+ - [ ] also test on a **player** with the name `Mouboo` or `mouboo`
+ - [ ] druid tree
+ - [ ] test with a mob target
+ - [ ] mob with clear path (walkable)
+ - [ ] mob with no clear path (unwalkable, blocked by collision)
+ - [ ] mob out of attack range
+ - [ ] test with a player target
+ - [ ] both the caster and the target have pvp disabled
+ - [ ] both the caster and the target have pvp enabled
+ - [ ] the caster has pvp enabled and the target has pvp disabled
+ - [ ] the caster has pvp disabled and the target has pvp enabled
+ - [ ] test with the spouse as target
+
+---
+- [ ] Once everything is done, remove this file
diff --git a/world/map/npc/magic/_import.txt b/world/map/npc/magic/_import.txt
new file mode 100644
index 00000000..2ef595af
--- /dev/null
+++ b/world/map/npc/magic/_import.txt
@@ -0,0 +1,42 @@
+npc: npc/magic/_procedures.txt
+npc: npc/magic/level0-wand.txt
+npc: npc/magic/level1-aggravate.txt
+npc: npc/magic/level1-experience.txt
+npc: npc/magic/level1-lesser-heal.txt
+npc: npc/magic/level1-transmute-wood.txt
+npc: npc/magic/level1-make-sulphur.txt
+npc: npc/magic/level1-flare-dart.txt
+npc: npc/magic/level1-magic-blade.txt
+npc: npc/magic/level1-grow-mauve.txt
+npc: npc/magic/level1-grow-alizarin.txt
+npc: npc/magic/level1-grow-gamboge.txt
+npc: npc/magic/level1-grow-cobalt.txt
+npc: npc/magic/level1-summon-maggots.txt
+npc: npc/magic/level1-sense-spouse.txt
+npc: npc/magic/level1-detect-magic.txt
+npc: npc/magic/level2-arrow-hail.txt
+npc: npc/magic/level2-make-arrows.txt
+npc: npc/magic/level2-make-iron-powder.txt
+npc: npc/magic/level2-magic-knuckles.txt
+npc: npc/magic/level2-summon-snakes.txt
+npc: npc/magic/level2-summon-wickedmushroom.txt
+npc: npc/magic/level2-summon-spiky-mushroom.txt
+npc: npc/magic/level2-summon-fluffies.txt
+npc: npc/magic/level2-summon-mouboo.txt
+npc: npc/magic/level2-summon-pinkie.txt
+npc: npc/magic/level2-toxic-dart.txt
+npc: npc/magic/level2-enchant-lifestone.txt
+npc: npc/magic/level2-flying-backpack.txt
+npc: npc/magic/level2-protect.txt
+npc: npc/magic/level2-barrier.txt
+npc: npc/magic/level2-hide.txt
+npc: npc/magic/level2-happy-curse.txt
+npc: npc/magic/level2-detect-players.txt
+npc: npc/magic/level2-shear.txt
+npc: npc/magic/level2-lightning-strike.txt
+npc: npc/magic/level2-rain.txt
+npc: npc/magic/level2-lay-on-hands.txt
+npc: npc/magic/level2-make-short-tanktop.txt
+npc: npc/magic/level2-make-tanktop.txt
+npc: npc/magic/level2-make-shirt.txt
+npc: npc/magic/level3-necromancy.txt
diff --git a/world/map/npc/magic/_procedures.txt b/world/map/npc/magic/_procedures.txt
new file mode 100644
index 00000000..b53aaa7c
--- /dev/null
+++ b/world/map/npc/magic/_procedures.txt
@@ -0,0 +1,170 @@
+function|script|magic_register
+{
+ //debugmes ">> Register " + .invocation$ + " @ " + strnpcinfo(0);
+ set .@ext$, if_then_else(getarg(0,"") != "", "::"+getarg(0), "");
+ registercmd .invocation$, strnpcinfo(0) + .@ext$; // register the spell
+ set .index, $@magic_index;
+ set $@magic_index, $@magic_index + 1;
+ return;
+}
+
+// this can only be done with a npc so...
+-|script|Magic Timer|32767
+{
+ end;
+
+OnLogin:
+ set @_M_BLOCK, 1;
+ addtimer 10000, "Magic Timer::OnClear";
+ end;
+
+OnClear:
+ set @_M_BLOCK, 0;
+ end;
+}
+
+// this function is call()-only
+function|script|magic_checks
+{
+ set .@r, 0;
+ if(HIDDEN) set .@r, 1; // can not cast with @hide
+ if(@_M_BLOCK) set .@r, 2; // check if last debuff ended
+ if(Hp < 1) set .@r, 3; // can not cast when dead
+ if (.@r)
+ smsg SMSG_FAILURE, "Magic: Impossible to cast right now.";
+ return .@r;
+}
+
+function|script|elt_damage
+{
+ // args are damage, dmgplus(mutation), bonus_elt, malus_elt, effect
+ set .@dmg, getarg(0) + rand(getarg(1));
+ if(get(ELTTYPE, @target_id) == getarg(3)) // malus
+ set .@dmg, .@dmg / 3;
+ if(get(ELTTYPE, @target_id) == getarg(2)) // bonus
+ set .@dmg, ((get(ELTLVL, @target_id) + 4) * .@dmg) / 4;
+ set .@source, .caster;
+ if (!.@source) set .@source, getcharid(3);
+
+ injure .@source, @target_id, .@dmg;
+ misceffect getarg(4), @target_id;
+ return;
+}
+
+function|script|melee_damage
+{
+ // args are spell power, target id, dmg
+ if ((getarg(0) - rand(100)) < (get(BaseLevel, getarg(1)) + get(MDEF1, getarg(1))))
+ injure BL_ID, getarg(1), 0;
+ else injure BL_ID, getarg(1), getarg(2);
+ return;
+}
+
+function|script|magic_create_item
+{
+ // FIXME / XXX: IMO, using Luk for this is very bad and unfair
+ set .@exp, (MAGIC_EXPERIENCE & (BYTE_0_MASK | BYTE_1_MASK)) >> BYTE_0_SHIFT;
+ set .@score, (.@exp + rand(min(@spellpower, ((.@exp / 3) + 1))));
+ set @create_params[2], 1; // success flag
+ if (.@score >= @create_params[1]) goto L_Perfect;
+ set @create_params[2], 0; // success flag
+ set .@score, .@score + rand(Luk) + rand(Luk);
+ if (.@score < (@create_params[1] / 3)) goto L_Backfire;
+ if (.@score < ((@create_params[1] * 2) / 3)) goto L_Iten;
+ message strcharinfo(0), "Magic : ##3##BYour spell takes on a mind of its own!";
+ if (rand(3) == 1) getitem @create_items$[1], 1; // bad item
+ return;
+
+L_Iten:
+ if (rand(5) != 2) goto L_Escape;
+ message strcharinfo(0), "Magic : ##3##BYour spell solidifies into the shape of a mysterious object!";
+ getitem "Iten", 1;
+ return;
+
+L_Escape:
+ message strcharinfo(0), "Magic : ##3##BYour spell escapes!";
+ return;
+
+L_Backfire:
+ message strcharinfo(0), "Magic : ##3##BYour spell backfires!";
+ if (rand(110) < Luk) heal 0 - ((BaseLevel+1)*(BaseLevel+2)*(rand(28)+3)), 0;
+ else heal 0 - (BaseLevel + 1), 0;
+ return;
+
+L_Perfect:
+ getitem @create_items$[0], @create_params[0]; // good item
+ return;
+}
+
+function|script|magic_exp
+{
+ set @last_index, (MAGIC_EXPERIENCE & BYTE_2_MASK) >> BYTE_2_SHIFT;
+ set @last_exp, (MAGIC_EXPERIENCE & (BYTE_0_MASK | BYTE_1_MASK)) >> BYTE_0_SHIFT;
+
+ //debugmes "old spell index: " + @last_index;
+ //debugmes "new spell index: " + .index;
+
+ if(getskilllv(SKILL_MAGIC) < (.level + 3) && .index != @last_index)
+ goto L_Gain;
+ //debugmes "same as last spell => don't proceed";
+ goto L_Return;
+
+L_Gain:
+ if(.exp_gain < 1) goto L_Return; // only the spells that have exp register here. If you
+ // remove this line then players can cast a spell with
+ // no cost, then a spell with a reagents, then another
+ // spell with no costs and still get the exp
+ set @new_exp, @last_exp + .exp_gain;
+ if(@new_exp > (BYTE_0_MASK | BYTE_1_MASK)) set @new_exp, (BYTE_0_MASK | BYTE_1_MASK);
+ //debugmes "old magic exp: "+ @last_exp;
+ //debugmes "new magic exp: "+ @new_exp;
+ set MAGIC_EXPERIENCE, (MAGIC_EXPERIENCE &~ (BYTE_0_MASK | BYTE_1_MASK)) | (@new_exp << BYTE_0_SHIFT);
+ set MAGIC_EXPERIENCE, (MAGIC_EXPERIENCE &~ BYTE_2_MASK) | (.index << BYTE_2_SHIFT);
+ goto L_Return;
+
+L_Return:
+ return;
+}
+
+function|script|adjust_spellpower
+{
+ set @spellpower, MATK1 + getskilllv(SKILL_MAGIC) + getskilllv(.school) + 10;
+ if((.school != SKILL_MAGIC_NATURE) && (.school != SKILL_MAGIC_LIFE)) goto L_Return;
+ if(@args$ == "" || !@args$ || getpartnerid2() == 0) goto L_Return;
+ if(getcharid(3, @args$) < 1 || getpartnerid2() != getcharid(3, @args$) || !(isloggedin(getcharid(3, @args$))))
+ goto L_Return;
+ //debugmes "You targeted your spouse!";
+ // XXX: the spell power increases when the target is the spouse so one could
+ // just do #modrilax (spouse) right?
+ //
+ // ... let's just forget about spouse for now
+ goto L_Return;
+
+L_Return:
+ return;
+}
+
+function|script|gain_heal_xp
+{
+ set @last_heal_xp, ((SCRIPT_XP & SCRIPT_HEALSPELL_MASK) >> SCRIPT_HEALSPELL_SHIFT);
+ if ((@target_id != BL_ID) && ((.@heal_value / .heal_xp_value_divisor) > (((10 + @last_heal_xp) + rand(@last_heal_xp + 1)) + rand(@last_heal_xp + 1))))
+ goto L_Block;
+ goto L_Return;
+
+L_Block:
+ set @heal_xp, (@last_heal_xp + @mexp);
+ if (@heal_xp > SCRIPT_HEALSPELL_MASK)
+ set @heal_xp, SCRIPT_HEALSPELL_MASK;
+ set SCRIPT_XP, (SCRIPT_XP & ~(SCRIPT_HEALSPELL_MASK) | (@heal_xp << SCRIPT_HEALSPELL_SHIFT));
+ goto L_Gain_Xp;
+
+L_Gain_Xp:
+ set @heal_exp, .@heal_value;
+ if (.@heal_value > get(HEALXP, @target_id))
+ set @heal_exp, get(HEALXP, @target_id);
+ getexp (.base_exp_factor * @heal_exp), 0;
+ goto L_Return;
+
+L_Return:
+ return;
+}
diff --git a/world/map/npc/magic/level0-wand.txt b/world/map/npc/magic/level0-wand.txt
new file mode 100644
index 00000000..07fbb025
--- /dev/null
+++ b/world/map/npc/magic/level0-wand.txt
@@ -0,0 +1,76 @@
+-|script|spell-wand|32767
+{
+ if(call("magic_checks")) goto L_Failed;
+ callsub S_CheckWand;
+ if(@WandAttack != 1) goto L_Failed;
+
+ // here we install
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 500, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ misceffect FX_MAGIC_GENERIC, strcharinfo(0);
+ set .@delay, (((200 - Agi) * 1200) / 200);
+ overrideattack (@Wand + (@spellpower / 10)), .@delay, 3, ATTACK_ICON_GENERIC, @WandID, strnpcinfo(0)+"::OnAttack";
+ callfunc "magic_exp";
+ end;
+
+OnAttack:
+ callsub S_CheckWand;
+ if(@WandAttack != 1) goto L_Failed;
+ if(target(BL_ID, @target_id, 22) != 22) goto L_Failed; // 0x02 | 0x04 | 0x10
+ set Sp, (Sp - @WandCost);
+ set @damage, (@Wand * (@spellpower / 3));
+ void call("elt_damage", @damage,@damage,ELT_NEUTRAL,ELT_NEUTRAL,FX_MAGIC_RED);
+ end;
+
+S_CheckWand:
+ set @Wand, 0;
+ set @wand_loop, 0;
+ goto S_Loop;
+
+S_Loop:
+ if ((getequipid(equip_hand1) == .Wands[@wand_loop]) || (getequipid(equip_hand2) == .Wands[@wand_loop]))
+ goto S_SetWand;
+ set @wand_loop, (@wand_loop + 1);
+ if (@wand_loop >= getarraysize(.Wands))
+ goto S_NoWand;
+ goto S_Loop;
+
+S_SetWand:
+ set @Wand, .WandsPwr[@wand_loop];
+ set @WandID, .WandsAnim[@wand_loop];
+ if (QL_MORGAN == 2)
+ set QL_MORGAN, 3;
+ set @WandCost, (@Wand * (BaseLevel / 15) + 2);
+ set @WandAttack, 0;
+ if (Sp < @WandCost)
+ goto S_LowSp;
+ set @WandAttack, 1; // everything is fine
+ return;
+
+S_NoWand:
+ message strcharinfo(0), "Wand : ##3##BYou need a wand Equipped!";
+ set @WandAttack, 0;
+ return;
+
+S_LowSp:
+ message strcharinfo(0), "Wand : ##3##BOut of Mana";
+ set @WandAttack, 0;
+ return;
+
+L_Failed:
+ //misceffect FX_ELECTRICITY_RED, strcharinfo(0); // XXX: do we show an effect on fail?
+ //debugmes "cast or attack failed";
+ end;
+
+OnInit:
+ setarray .Wands[0], 0, 758, 1171;
+ setarray .WandsPwr[0], 0, 2, 1;
+ setarray .WandsAnim[0], 0, 35, 33;
+ set .school, SKILL_MAGIC;
+ set .invocation$, chr(MAGIC_SYMBOL) + "confringo"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 0;
+ set .exp_gain, 1;
+ end;
+}
diff --git a/world/map/npc/magic/level1-aggravate.txt b/world/map/npc/magic/level1-aggravate.txt
new file mode 100644
index 00000000..05474a2a
--- /dev/null
+++ b/world/map/npc/magic/level1-aggravate.txt
@@ -0,0 +1,23 @@
+-|script|spell-aggravate|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 3) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 1000, "Magic Timer::OnClear"; // set the new debuff
+ set @args$, ""; callfunc "adjust_spellpower"; // we reset @args$ because this spell should not have a target
+ set @distance, (2 + (@spellpower / 50));
+ set Sp, Sp - 3;
+ misceffect FX_MAGIC_GREEN, strcharinfo(0);
+ callfunc "magic_exp";
+ aggravate getmap(), (POS_X - @distance), (POS_Y - @distance), (POS_X + @distance), (POS_Y + @distance), SFX_DEFAULT;
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_NATURE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "itenplz"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 1;
+ set .exp_gain, 0;
+ end;
+}
diff --git a/world/map/npc/magic/level1-detect-magic.txt b/world/map/npc/magic/level1-detect-magic.txt
new file mode 100644
index 00000000..f0c01592
--- /dev/null
+++ b/world/map/npc/magic/level1-detect-magic.txt
@@ -0,0 +1,30 @@
+-|script|detect-magic|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 3) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 6000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 3;
+ misceffect FX_MAGIC_GENERIC, strcharinfo(0);
+ set .@range, (@spellpower/50)+1;
+ foreach 1, getmap(), POS_X - .@range, POS_Y - .@range, POS_X + .@range, POS_Y + .@range,
+ strnpcinfo(0) + "::OnNearbyNpc";
+ callfunc "magic_exp";
+ end;
+
+OnNearbyNpc:
+ set .@e$, strnpcinfo(2,@target_id);
+ if(.@e$ == "#_M" || .@e$ == "#MAGIC" || get(.IS_MAGIC, @target_id))
+ misceffect FX_MAGIC_DEFAULT, @target_id;
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC;
+ set .invocation$, chr(MAGIC_SYMBOL) + "miteyo"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 1;
+ set .exp_gain, 0;
+ end;
+}
diff --git a/world/map/npc/magic/level1-experience.txt b/world/map/npc/magic/level1-experience.txt
new file mode 100644
index 00000000..36ad8179
--- /dev/null
+++ b/world/map/npc/magic/level1-experience.txt
@@ -0,0 +1,41 @@
+-|script|spell-experience|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 1) end;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 1000, "Magic Timer::OnClear"; // set the new debuff
+ set @level, getskilllv(.school);
+ if (@level < .level) end;
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 1;
+ misceffect FX_MAGIC_GENERIC, strcharinfo(0);
+ callfunc "magic_exp";
+ set @ratio, ((@last_exp*10) - rand(.MAX_MAGIC_EXP[@level]/30))/.MAX_MAGIC_EXP[@level];
+
+ set @mes$, "You feel completely overwhelmed by your magic.";
+ if(@ratio == 1) set @mes$, "You feel quite overwhelmed by your magic, but are beginning to see patterns.";
+ if(@ratio == 2) set @mes$, "You feel that you have only the bare minimum of control over your magic.";
+ if(@ratio == 3) set @mes$, "Trying to control your magic is still rather troublesome.";
+ if(@ratio == 4) set @mes$, "You feel you still have a few difficulties in controlling your magic.";
+ if(@ratio == 5) set @mes$, "You feel somewhat in control of your magic.";
+ if(@ratio == 6) set @mes$, "You feel mostly in control of your magic.";
+ if(@ratio == 7) set @mes$, "You feel quite in control of your magic.";
+ if(@ratio == 8) set @mes$, "You feel that you have very good control of your magic.";
+ if(@ratio == 9) set @mes$, "You feel in almost perfect control of your magic.";
+ if(@ratio >= 10) set @mes$, "You feel in perfect control of your magic" + if_then_else(@level >= MAX_MAGIC_LEVEL, ".", ", and seem on the verge of something more... perhaps you should see the Mana Seed to ask for more magic?");
+ if(@ratio >= 20) set @mes$, "You have perfect control of what you understand now, but there is now a distinct sensation of something more, something indescribable. If only the Mana Seed would give more magic to you...";
+ if(@ratio >= 45) set @mes$, "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.";
+ if(@ratio >= 45 && @level < MAX_MAGIC_LEVEL) set @mes$, @mes$ + " Surely the Mana Seed will more than readily offer more magic for such a proficient user.";
+ if(@level >= 5) set @mes$, "You are as proficient at magic as you can possibly be."; // this is the maximum magic level
+ message strcharinfo(0), "Magic : ##3##B"+@mes$;
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC;
+ set .invocation$, chr(MAGIC_SYMBOL) + "abizit"; // used in npcs that refer to this spell
+ set .level, 1;
+ set .exp_gain, 0;
+ void call("magic_register");
+ setarray .MAX_MAGIC_EXP[0], 0, 0, 100, 1200, 8000, 40000, 65535;
+ end;
+}
diff --git a/world/map/npc/magic/level1-flare-dart.txt b/world/map/npc/magic/level1-flare-dart.txt
new file mode 100644
index 00000000..6c0ef303
--- /dev/null
+++ b/world/map/npc/magic/level1-flare-dart.txt
@@ -0,0 +1,45 @@
+-|script|flare-dart|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 10) end;
+ set @level, getskilllv(.school);
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (@level <= 2 && countitem("SulphurPowder") >= 1) delitem "SulphurPowder", 1;
+ elif (@level <= 2) end;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 500, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 10;
+ misceffect FX_MAGIC_BLACK, strcharinfo(0);
+ setarray @flarspell[0],
+ sqrt(@spellpower) * 5, //dmg
+ (BaseLevel/3) + 5, // dmg bonus
+ (@spellpower/50) + 3, // charges
+ (((200 - Agi) * 1200) / 200); // delay
+ callfunc "magic_exp";
+ goto L_FreeRecast;
+
+OnAttack:
+ if (target(BL_ID, @target_id, 50) != 50) goto L_FreeRecast; // 0x20 | 0x02 | 0x10
+ misceffect FX_MAGIC_BLACK, strcharinfo(0);
+ void call("elt_damage", @flarspell[0], @flarspell[1], ELT_WATER, ELT_FIRE, FX_MAGIC_BLACK);
+ set @flarspell[2], @flarspell[2] - 1;
+ goto L_FreeRecast;
+
+L_FreeRecast:
+ if (@flarspell[2] > 0)
+ addtimer 0, strnpcinfo(0) + "::OnSetRecast";
+ end;
+
+OnSetRecast:
+ overrideattack 1, @flarspell[3], 4, ATTACK_ICON_GENERIC, 34, strnpcinfo(0)+"::OnAttack";
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_WAR;
+ set .invocation$, chr(MAGIC_SYMBOL) + "flar"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 1;
+ set .exp_gain, 1;
+ end;
+}
diff --git a/world/map/npc/magic/level1-grow-alizarin.txt b/world/map/npc/magic/level1-grow-alizarin.txt
new file mode 100644
index 00000000..601f32c2
--- /dev/null
+++ b/world/map/npc/magic/level1-grow-alizarin.txt
@@ -0,0 +1,38 @@
+-|script|grow-alizarin|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 4) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (countitem("AlizarinHerb") < 1 || countitem("Root") < 1) end;
+ delitem "AlizarinHerb", 1;
+ delitem "Root", 1;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 2000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 4;
+ misceffect FX_MAGIC_GREEN, strcharinfo(0);
+ misceffect FX_PENTAGRAM_BUILDUP, strcharinfo(0);
+ setarray @summon[0], 0, (getskilllv(.school)/2)+1;
+ callfunc "magic_exp";
+ addtimer 4000-(@spellpower-9), strnpcinfo(0)+"::OnSummon";
+ end;
+
+OnSummon:
+ misceffect FX_PENTAGRAM_BURST, strcharinfo(0);
+ callsub S_SummonAll;
+ end;
+
+S_SummonAll:
+ summon getmap(), rand(POS_X-2,POS_X+2), rand(POS_Y-2,POS_Y+2), BL_ID, 1032, 1, (@spellpower*50)+10000;
+ set @summon[0], @summon[0] + 1;
+ if (@summon[0] < @summon[1]) goto S_SummonAll;
+ return;
+
+OnInit:
+ set .school, SKILL_MAGIC_NATURE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "modriphoo"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 1;
+ set .exp_gain, 1;
+ end;
+}
diff --git a/world/map/npc/magic/level1-grow-cobalt.txt b/world/map/npc/magic/level1-grow-cobalt.txt
new file mode 100644
index 00000000..78ab602a
--- /dev/null
+++ b/world/map/npc/magic/level1-grow-cobalt.txt
@@ -0,0 +1,38 @@
+-|script|grow-cobalt|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 4) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (countitem("CobaltHerb") < 1 || countitem("Root") < 1) end;
+ delitem "CobaltHerb", 1;
+ delitem "Root", 1;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 2000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 4;
+ misceffect FX_MAGIC_GREEN, strcharinfo(0);
+ misceffect FX_PENTAGRAM_BUILDUP, strcharinfo(0);
+ setarray @summon[0], 0, (getskilllv(.school)/2)+1;
+ callfunc "magic_exp";
+ addtimer 4000-(@spellpower-9), strnpcinfo(0)+"::OnSummon";
+ end;
+
+OnSummon:
+ misceffect FX_PENTAGRAM_BURST, strcharinfo(0);
+ callsub S_SummonAll;
+ end;
+
+S_SummonAll:
+ summon getmap(), rand(POS_X-2,POS_X+2), rand(POS_Y-2,POS_Y+2), BL_ID, 1030, 1, (@spellpower*50)+10000;
+ set @summon[0], @summon[0] + 1;
+ if (@summon[0] < @summon[1]) goto S_SummonAll;
+ return;
+
+OnInit:
+ set .school, SKILL_MAGIC_NATURE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "modrisump"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 1;
+ set .exp_gain, 1;
+ end;
+}
diff --git a/world/map/npc/magic/level1-grow-gamboge.txt b/world/map/npc/magic/level1-grow-gamboge.txt
new file mode 100644
index 00000000..eda23f70
--- /dev/null
+++ b/world/map/npc/magic/level1-grow-gamboge.txt
@@ -0,0 +1,38 @@
+-|script|grow-gamboge|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 4) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (countitem("GambogeHerb") < 1 || countitem("Root") < 1) end;
+ delitem "GambogeHerb", 1;
+ delitem "Root", 1;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 2000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 4;
+ misceffect FX_MAGIC_GREEN, strcharinfo(0);
+ misceffect FX_PENTAGRAM_BUILDUP, strcharinfo(0);
+ setarray @summon[0], 0, (getskilllv(.school)/2)+1;
+ callfunc "magic_exp";
+ addtimer 4000-(@spellpower-9), strnpcinfo(0)+"::OnSummon";
+ end;
+
+OnSummon:
+ misceffect FX_PENTAGRAM_BURST, strcharinfo(0);
+ callsub S_SummonAll;
+ end;
+
+S_SummonAll:
+ summon getmap(), rand(POS_X-2,POS_X+2), rand(POS_Y-2,POS_Y+2), BL_ID, 1031, 1, (@spellpower*50)+10000;
+ set @summon[0], @summon[0] + 1;
+ if (@summon[0] < @summon[1]) goto S_SummonAll;
+ return;
+
+OnInit:
+ set .school, SKILL_MAGIC_NATURE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "modriyikam"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 1;
+ set .exp_gain, 1;
+ end;
+}
diff --git a/world/map/npc/magic/level1-grow-mauve.txt b/world/map/npc/magic/level1-grow-mauve.txt
new file mode 100644
index 00000000..951b71f0
--- /dev/null
+++ b/world/map/npc/magic/level1-grow-mauve.txt
@@ -0,0 +1,38 @@
+-|script|grow-mauve|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 4) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (countitem("MauveHerb") < 1 || countitem("Root") < 1) end;
+ delitem "MauveHerb", 1;
+ delitem "Root", 1;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 2000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 4;
+ misceffect FX_MAGIC_GREEN, strcharinfo(0);
+ misceffect FX_PENTAGRAM_BUILDUP, strcharinfo(0);
+ setarray @summon[0], 0, (getskilllv(.school)/2)+1;
+ callfunc "magic_exp";
+ addtimer 4000-(@spellpower-9), strnpcinfo(0)+"::OnSummon";
+ end;
+
+OnSummon:
+ misceffect FX_PENTAGRAM_BURST, strcharinfo(0);
+ callsub S_SummonAll;
+ end;
+
+S_SummonAll:
+ summon getmap(), rand(POS_X-2,POS_X+2), rand(POS_Y-2,POS_Y+2), BL_ID, 1029, 1, (@spellpower*50)+10000;
+ set @summon[0], @summon[0] + 1;
+ if (@summon[0] < @summon[1]) goto S_SummonAll;
+ return;
+
+OnInit:
+ set .school, SKILL_MAGIC_NATURE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "modrilax"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 1;
+ set .exp_gain, 1;
+ end;
+}
diff --git a/world/map/npc/magic/level1-lesser-heal.txt b/world/map/npc/magic/level1-lesser-heal.txt
new file mode 100644
index 00000000..d03031d6
--- /dev/null
+++ b/world/map/npc/magic/level1-lesser-heal.txt
@@ -0,0 +1,52 @@
+-|script|lesser-heal|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 6) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ set @target_id, getcharid(3, @args$);
+ if (@target_id < 1 || !(isloggedin(@target_id)) || get(INVISIBLE, @target_id) == 1)
+ set @target_id, BL_ID; // fallback to self
+ if (@args$ == "Mouboo" || @args$ == "mouboo") set @target_id, getnpcid("Mouboo");
+ set .@range, (((MATK1 + getskilllv(SKILL_MAGIC) + getskilllv(.school) + 10) / 100) + 2);
+ if (distance(BL_ID, @target_id) >= .@range) end;
+ if (PVP_CHANNEL != get(PVP_CHANNEL, @target_id) && get(PVP_CHANNEL, @target_id) != 0) end;
+ if (countitem("Lifestone") < 1) end;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 500, "Magic Timer::OnClear"; // set the new debuff
+ delitem "Lifestone", 1;
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 6;
+ misceffect FX_MAGIC_WHITE, strcharinfo(0);
+ set .@heal_value, get(HEALXP, @target_id);
+ set @mexp, .exp_gain;
+ callfunc "magic_exp";
+ if (.@heal_value > 200)
+ set .@heal_value, 200;
+ if (@args$ == "Mouboo" || @args$ == "mouboo") goto L_Mouboo;
+ if (@target_id != BL_ID) goto L_NotMe;
+ goto L_Continue;
+
+L_NotMe:
+ misceffect FX_MAGIC_WHITE, @target_id;
+ callfunc "gain_heal_xp";
+ goto L_Continue;
+
+L_Continue:
+ if (getskilllv(SKILL_MAGIC_DARK) >= 1) sc_start SC_HALT_REGENERATE, 2000, 0;
+ if (attachrid(@target_id) != 1) end; // XXX: to avoid the ugly attachrid method we would need some kind of `run_as` builtin
+ if (!(isdead())) heal 200, 0, 1;
+ end;
+
+L_Mouboo:
+ mes "Mouboo : ##3##BYour spell seems to have no effect on the mouboo.";
+ close;
+
+OnInit:
+ set .school, SKILL_MAGIC_LIFE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "lum"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 1;
+ set .exp_gain, 1;
+ set .heal_xp_value_divisor, 2;
+ end;
+}
diff --git a/world/map/npc/magic/level1-magic-blade.txt b/world/map/npc/magic/level1-magic-blade.txt
new file mode 100644
index 00000000..ad39c244
--- /dev/null
+++ b/world/map/npc/magic/level1-magic-blade.txt
@@ -0,0 +1,48 @@
+-|script|magic-blade|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 9) end;
+ set .@level, getskilllv(.school);
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (.@level <= 2 && countitem("SharpKnife") >= 1) set .@component$, "SharpKnife";
+ elif (.@level <= 2 && countitem("Knife") >= 1) set .@component$, "Knife";
+ elif (.@level <= 2) end;
+ if (.@component$ != "") delitem .@component$, 1;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 500, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 9;
+ misceffect FX_MAGIC_BLACK, strcharinfo(0);
+ setarray @chizaspell[0],
+ if_then_else(.@component$ == "Knife", 40, 60), // dmg
+ Str, // do not allow to equip light armor, cast, and then switch to heavy armor to get bonus str
+ (@spellpower/15) + 10, // charges
+ (((200 - Agi) * 1200) / 200), // delay
+ @spellpower;
+
+ callfunc "magic_exp";
+ goto L_FreeRecast;
+
+OnAttack:
+ if (target(BL_ID, @target_id, 22) != 22) goto L_FreeRecast; // 0x10 | 0x02 | 0x04
+ void call("melee_damage", @chizaspell[4], @target_id, (@chizaspell[0] + rand(@chizaspell[1] + 5)));
+ set @chizaspell[2], @chizaspell[2] - 1;
+ goto L_FreeRecast;
+
+L_FreeRecast:
+ if (@chizaspell[2] > 0)
+ addtimer 0, strnpcinfo(0) + "::OnSetRecast";
+ end;
+
+OnSetRecast:
+ overrideattack 1, @chizaspell[3], 1, ATTACK_ICON_GENERIC, 30, strnpcinfo(0)+"::OnAttack";
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_WAR;
+ set .invocation$, chr(MAGIC_SYMBOL) + "chiza"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 1;
+ set .exp_gain, 1;
+ end;
+}
diff --git a/world/map/npc/magic/level1-make-sulphur.txt b/world/map/npc/magic/level1-make-sulphur.txt
new file mode 100644
index 00000000..4aab7e3b
--- /dev/null
+++ b/world/map/npc/magic/level1-make-sulphur.txt
@@ -0,0 +1,25 @@
+-|script|make-sulphur|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 4) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (countitem("PileOfAsh") >= 1) delitem "PileOfAsh", 1; else end;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 4000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 4;
+ misceffect FX_MAGIC_RED, strcharinfo(0);
+ setarray @create_params[0], (@spellpower/100)+1+(rand(max(1,(800-@spellpower)))/180), 50;
+ setarray @create_items$[0], "SulphurPowder", "PileOfAsh";
+ callfunc "magic_create_item";
+ callfunc "magic_exp";
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_TRANSMUTE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "gole"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 1;
+ set .exp_gain, 1;
+ end;
+}
diff --git a/world/map/npc/magic/level1-sense-spouse.txt b/world/map/npc/magic/level1-sense-spouse.txt
new file mode 100644
index 00000000..fe95c094
--- /dev/null
+++ b/world/map/npc/magic/level1-sense-spouse.txt
@@ -0,0 +1,25 @@
+-|script|sense-spouse|32767
+{
+ set .@m, getpartnerid2();
+ if (.@m < 1)
+ goto L_NotMarried;
+ if (isloggedin(.@m) < 1)
+ goto L_NotOnline;
+ if (sc_check(SC_HIDE, .@m) || getpvpflag(1, .@m) || get(INVISIBLE, .@m))
+ goto L_NotOnline;
+ message strcharinfo(0), "Spouse : Your spouse is... somewhere.";
+ end;
+
+L_NotOnline:
+ message strcharinfo(0), "Spouse : Your spouse is not online, or maybe just hiding from you.";
+ end;
+
+L_NotMarried:
+ message strcharinfo(0), "Spouse : You are not married, or no longer married (sorry for being the one telling you the bad news).";
+ end;
+
+OnInit:
+ set .invocation$, chr(MAGIC_SYMBOL) + "inzuwilt"; // used in npcs that refer to this spell
+ registercmd .invocation$, strnpcinfo(0);
+ end;
+}
diff --git a/world/map/npc/magic/level1-summon-maggots.txt b/world/map/npc/magic/level1-summon-maggots.txt
new file mode 100644
index 00000000..aa4e646f
--- /dev/null
+++ b/world/map/npc/magic/level1-summon-maggots.txt
@@ -0,0 +1,53 @@
+-|script|summon-maggots|32767
+{
+ end;
+
+OnCast:
+ if(call("magic_checks")) end;
+ if (Sp < 21) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (countitem("MaggotSlime") < 1 || countitem("Root") < 1) end;
+ delitem "MaggotSlime", 1;
+ delitem "Root", 1;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 20000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 21;
+ misceffect FX_MAGIC_BLUE, strcharinfo(0);
+ misceffect FX_PENTAGRAM_BUILDUP, strcharinfo(0);
+ callfunc "magic_exp";
+ set .@puppet$, "#"+strnpcinfo(0)+"#"+BL_ID;
+ set .@puppet, puppet(getmap(), POS_X, POS_Y, .@puppet$, 127);
+ set .count, ((sqrt(@spellpower)+(@spellpower/15))/5)+1, .@puppet;
+ set .master, BL_ID, .@puppet;
+ set .lifetime, (@spellpower*50)+10000, .@puppet;
+ addnpctimer 5000-(@spellpower*5), .@puppet$+"::OnSummon";
+ addnpctimer 6000, .@puppet$+"::OnDestroy";
+ end;
+
+OnSummon:
+ specialeffect FX_PENTAGRAM_BURST;
+ set .@i, 0;
+ set .@x, getnpcx();
+ set .@y, getnpcy();
+ set .@map$, strnpcinfo(3);
+ callsub S_SummonAll;
+ end;
+
+OnDestroy:
+ destroy;
+
+S_SummonAll:
+ summon .@map$, rand(.@x-2,.@x+2), rand(.@y-2,.@y+2), .master, 1002, 2, .lifetime;
+ set .@i, .@i + 1;
+ if (.@i < .count) goto S_SummonAll;
+ return;
+
+OnInit:
+ set .school, SKILL_MAGIC_ASTRAL;
+ set .invocation$, chr(MAGIC_SYMBOL) + "kalmurk"; // used in npcs that refer to this spell
+ void call("magic_register", "OnCast");
+ set .level, 1;
+ set .exp_gain, 1;
+ end;
+}
diff --git a/world/map/npc/magic/level1-transmute-wood.txt b/world/map/npc/magic/level1-transmute-wood.txt
new file mode 100644
index 00000000..a7c86ecc
--- /dev/null
+++ b/world/map/npc/magic/level1-transmute-wood.txt
@@ -0,0 +1,37 @@
+-|script|spell-transmute-wood|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 5) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (countitem("RawLog") >= 1) delitem "RawLog", 1; else end;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 4000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 5;
+ misceffect FX_MAGIC_RED, strcharinfo(0);
+ if (@args$ == "boo") goto L_Mouboo;
+ elif (@args$ == "lurk") goto L_Skytlurk;
+ else message strcharinfo(0), "Magic : ##3##BYou do not know how to transmute wood into this kind of animal."; // FIXME: write a better sentence
+ end;
+
+L_Mouboo:
+ setarray @create_params[0], 1, 40;
+ setarray @create_items$[0], "MoubooFigurine", "WarpedLog";
+ callfunc "magic_create_item";
+ callfunc "magic_exp";
+ end;
+
+L_Skytlurk:
+ if (rand(2) == 1) getitem "Iten", 1;
+ else getitem "WarpedLog", 1;
+ message strcharinfo(0), "Magic : ##3##BYou have no idea what a Skrytlurk looks like.";
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_TRANSMUTE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "parum"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 1;
+ set .exp_gain, 1;
+ end;
+}
diff --git a/world/map/npc/magic/level2-arrow-hail.txt b/world/map/npc/magic/level2-arrow-hail.txt
new file mode 100644
index 00000000..3be14f1a
--- /dev/null
+++ b/world/map/npc/magic/level2-arrow-hail.txt
@@ -0,0 +1,115 @@
+-|script|arrow-hail|32767
+{
+ // we can not start here because for the puppets this is OnClick
+ end;
+
+OnCast:
+ if(call("magic_checks")) end;
+ if (getskilllv(.school) < .level) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (Sp < 25) end;
+ explode .@map_ext[0], getmap(), "-";
+ if (.@map_ext[1] != 1) end; // XXX this is fugly, in the future let's use MF_OUTSIDE to detect if a map is "outside" or "inside"
+ if (getmapflag(getmap(), MF_TOWN)) end;
+ if (countitem("Arrow") >= 20 && countitem("SulphurPowder") >= 1) delitem "Arrow", 20;
+ elif (countitem("IronArrow") >= 20 && countitem("SulphurPowder") >= 1) delitem "IronArrow", 20;
+ else end;
+ delitem "SulphurPowder", 1;
+ set Sp, Sp - 25;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 5000, "Magic Timer::OnClear"; // set the new debuff
+
+ setarray @away[0], POS_X, POS_Y, getdir(), (.range + 1), 0;
+ callsub S_AwayFrom;
+
+ set @nearby, 0;
+ foreach 1, getmap(), @away[0] - 14, @away[1] - 14, @away[0] + 14, @away[1] + 14,
+ strnpcinfo(0) + "::OnNearbyNpc";
+ if (@nearby) goto L_Absorb;
+
+ callfunc "adjust_spellpower";
+ set @new_npc_name$, "#" + strnpcinfo(0) + "#" + getcharid(3); // make a unique puppet name for every player
+ callfunc "magic_exp";
+ misceffect FX_MAGIC_BLACK, strcharinfo(0);
+ set @spell_npc, puppet(getmap(), POS_X, POS_Y, @new_npc_name$, 127); // clone npc => get puppet id
+ set .max_hit, (@spellpower / 8), @spell_npc; // set .max_hit in the puppet
+ set .caster, getcharid(3), @spell_npc; // tell the puppet who controls it
+ set .damage, 125, @spell_npc;
+ set .damage_bonus, (@spellpower / 5), @spell_npc;
+ set .area_x, @away[0], @spell_npc; set .area_y, @away[1], @spell_npc;
+ donpcevent @new_npc_name$+"::OnLaunch"; // start the puppet timer and strike
+ initnpctimer @new_npc_name$; // start the destroy timer
+ end;
+
+S_AwayFrom:
+ if(@away[2] == 6 && !(iscollision(getmap(), (@away[0] + 1), @away[1]))) // right
+ set @away[0], @away[0] + 1;
+ if(@away[2] == 4 && !(iscollision(getmap(), @away[0], (@away[1] - 1)))) // up
+ set @away[1], @away[1] - 1;
+ if(@away[2] == 2 && !(iscollision(getmap(), (@away[0] - 1), @away[1]))) // left
+ set @away[0], @away[0] - 1;
+ if(@away[2] == 0 && !(iscollision(getmap(), @away[0], (@away[1] + 1)))) // down
+ set @away[1], @away[1] + 1;
+ set @away[4], @away[4] + 1;
+ if(@away[4] < @away[3]) goto S_AwayFrom;
+ return;
+
+L_Absorb:
+ message strcharinfo(0), "##3Arrow Hail : ##BA nearby arrow hail absorbs your magic!";
+ end;
+
+OnNearbyNpc:
+ explode .@nearby$[0], strnpcinfo(0,@target_id), "#";
+ if(.@nearby$[0] == "arrow-hail" || .@nearby$[1] == "arrow-hail")
+ set @nearby, @nearby + 1;
+ end;
+
+OnLaunch:
+ if(attachrid(.caster) != 1) destroy; // destroy if caster is missing
+ if(getmap() != strnpcinfo(3)) destroy; // destroy if caster left the map
+ set .hit, .hit + 1;
+ if(.hit > .max_hit) destroy;
+ set .launch, 0;
+ callsub S_Launch;
+ addnpctimer 250 + rand(50) + rand(50), strnpcinfo(0)+"::OnLaunch"; // loop until max
+ end;
+
+S_Launch:
+ npcareawarp .area_x - 6, .area_y - 6, .area_x + 6, .area_y + 6, 0, strnpcinfo(0);
+ misceffect FX_ARROW_HAIL;
+ set .done, 0;
+ foreach 2, strnpcinfo(3), getnpcx(), getnpcy(), getnpcx(), getnpcy(), strnpcinfo(0) + "::OnHit";
+ if (PVP_CHANNEL || getmapflag(getmap(), MF_PVP))
+ foreach 0, strnpcinfo(3), getnpcx(), getnpcy(), getnpcx(), getnpcy(), strnpcinfo(0) + "::OnHit";
+ if(!.done && getx() == getnpcx() && gety() == getnpcy())
+ heal 0 - (.damage + rand(.damage_bonus) + rand(.damage_bonus)), 0; // injure caster
+ set .launch, .launch + 1;
+ if(.launch < 3) goto S_Launch;
+ return;
+
+OnTimer30000:
+ debugmes "frillyar timeout! [this shouldn't happen]";
+ destroy;
+
+OnHit:
+ if(attachrid(.caster) != 1) destroy; // destroy if caster is missing
+ if(getmap() != strnpcinfo(3)) destroy; // destroy if caster left the map
+
+ if(target(.caster, @target_id, 16) != 16 && .caster != @target_id) end;
+ if((get(BL_TYPE, @target_id) & 1) == 0) end; // either mob or pc
+ set .@damage, .damage + rand(.damage_bonus) + rand(.damage_bonus);
+ if(.caster != @target_id)
+ set .@damage, (.@damage * (100 - get(MDEF1, @target_id))) / 100;
+ injure .caster, @target_id, .@damage;
+ set .done, 1;
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_WAR;
+ set .range, 7;
+ set .invocation$, chr(MAGIC_SYMBOL) + "frillyar"; // used in npcs that refer to this spell
+ void call("magic_register", "OnCast");
+ set .level, 2;
+ set .exp_gain, 2;
+ end;
+}
diff --git a/world/map/npc/magic/level2-barrier.txt b/world/map/npc/magic/level2-barrier.txt
new file mode 100644
index 00000000..9afd4f38
--- /dev/null
+++ b/world/map/npc/magic/level2-barrier.txt
@@ -0,0 +1,51 @@
+-|script|magic barrier|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 15) end;
+ set .@level, getskilllv(.school);
+ if (.@level < .level) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (.@level <= 3 && countitem("SmallMushroom") >= 1) delitem "SmallMushroom", 1;
+ elif (.@level <= 3) end;
+ set @target_id, getcharid(3, @args$);
+ if (@target_id < 1 || !(isloggedin(@target_id)) || get(INVISIBLE, @target_id) == 1)
+ set @target_id, BL_ID; // fallback to self
+
+ set @asorm_caster, BL_ID, @target_id;
+ if (attachrid(@target_id) != 1) end;
+ set @target_hat, getequipid(equip_head), @asorm_caster;
+ if (attachrid(@asorm_caster) != 1) end;
+ if (@target_hat == 888) end; // FIXME: this whole 5 line block could be done with only one line if we modify getequipid OR make equip_ into params
+
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 1000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 15;
+ misceffect FX_MAGIC_BLUE, strcharinfo(0);
+ callfunc "magic_exp";
+
+ if (distance(BL_ID, @target_id) >= (@spellpower/30)+2) set @target_id, BL_ID;
+ if (BL_ID == @target_id) set @args$, strcharinfo(0);
+ if (BL_ID != @target_id) misceffect FX_MAGIC_DEFAULT, @args$;
+ set .@time, (@spellpower*200)+2000;
+ set @asorm_time, .@time, @target_id;
+ sc_start SC_MBARRIER, .@time, max(30,(@spellpower/8))+20, @target_id;
+ message @args$, "Barrier : You are surrounded by a magical barrier.";
+ if (attachrid(@target_id) != 1) end;
+ addtimer @asorm_time, strnpcinfo(0)+"::OnEnd";
+ end;
+
+OnEnd:
+ if (sc_check(SC_MBARRIER) != 1) end;
+ message strcharinfo(0), "Barrier : Your magical barrier dissipates.";
+ misceffect FX_MAGIC_DEFAULT, strcharinfo(0);
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_ASTRAL;
+ set .invocation$, chr(MAGIC_SYMBOL) + "asorm"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 2;
+ set .exp_gain, 3;
+ end;
+}
diff --git a/world/map/npc/magic/level2-detect-players.txt b/world/map/npc/magic/level2-detect-players.txt
new file mode 100644
index 00000000..7335770c
--- /dev/null
+++ b/world/map/npc/magic/level2-detect-players.txt
@@ -0,0 +1,34 @@
+-|script|detect-players|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 7) end;
+ if (getskilllv(.school) < .level) end;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 300, "Magic Timer::OnClear";
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 7;
+ misceffect FX_MAGIC_GENERIC, strcharinfo(0);
+ callfunc "magic_exp";
+ set @inwilt$, "";
+ set .@d, @spellpower/2;
+ foreach 0, getmap(), POS_X - .@d, POS_Y - .@d, POS_X + .@d, POS_Y + .@d, strnpcinfo(0)+"::OnPC";
+ message strcharinfo(0), if_then_else(@inwilt$=="", "You sense no-one else nearby.", "You sense the following: "+@inwilt$);
+ end;
+
+OnPC:
+ if (@target_id == BL_ID) end; // do not count the caster
+ if (sc_check(SC_HIDE, @target_id)) end; // do not count players with anwiltyp
+ if (getpvpflag(1, @target_id)) end; // do not count hidden GMs
+ if (get(INVISIBLE, @target_id) == 1) end; // do not count invisible GMs
+ if (@inwilt$ != "") set @inwilt$, @inwilt$ + ", ";
+ set @inwilt$, @inwilt$ + strcharinfo(0, @target_id) + if_then_else(@spellpower > 99, "("+get(BaseLevel, @target_id)+")", "");
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC;
+ set .invocation$, chr(MAGIC_SYMBOL) + "inwilt"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 2;
+ set .exp_gain, 0;
+ end;
+}
diff --git a/world/map/npc/magic/level2-enchant-lifestone.txt b/world/map/npc/magic/level2-enchant-lifestone.txt
new file mode 100644
index 00000000..ba8536bf
--- /dev/null
+++ b/world/map/npc/magic/level2-enchant-lifestone.txt
@@ -0,0 +1,36 @@
+-|script|enchant-lifestone|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 15) end;
+ if (getskilllv(.school) < .level) end;
+ if (countitem("BugLeg") >= 1) delitem "BugLeg", 1;
+ elif (countitem("MaggotSlime") >= 1) delitem "MaggotSlime", 1;
+ elif (countitem("MauveHerb") >= 1 && countitem("AlizarinHerb") >= 1 && countitem("CobaltHerb") >= 1 && countitem("GambogeHerb") >= 1) goto L_Herbs;
+ else end;
+ goto L_Proceed;
+
+L_Herbs:
+ delitem "MauveHerb", 1;
+ delitem "AlizarinHerb", 1;
+ delitem "CobaltHerb", 1;
+ delitem "GambogeHerb", 1;
+ goto L_Proceed;
+
+L_Proceed:
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 4000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 15;
+ misceffect FX_MAGIC_GENERIC, strcharinfo(0);
+ getitem "Lifestone", 1;
+ callfunc "magic_exp";
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC;
+ set .invocation$, chr(MAGIC_SYMBOL) + "manpahil"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 2;
+ set .exp_gain, 1;
+ end;
+}
diff --git a/world/map/npc/magic/level2-flying-backpack.txt b/world/map/npc/magic/level2-flying-backpack.txt
new file mode 100644
index 00000000..5e19468e
--- /dev/null
+++ b/world/map/npc/magic/level2-flying-backpack.txt
@@ -0,0 +1,42 @@
+-|script|flying-backpack|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 12) end;
+ set .@level, getskilllv(.school);
+ if (.@level < .level) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (.@level <= 3 && countitem("SilkCocoon") >= 1) delitem "SilkCocoon", 1;
+ elif (.@level <= 3) end;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 1000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 12;
+ misceffect FX_MAGIC_GREEN, strcharinfo(0);
+ callfunc "magic_exp";
+ set @target_id, getcharid(3, @args$);
+ if (@target_id < 1 || !(isloggedin(@target_id)) || get(INVISIBLE, @target_id) == 1)
+ set @target_id, BL_ID; // fallback to self
+ if (distance(BL_ID, @target_id) >= (@spellpower/30)+2) set @target_id, BL_ID;
+ if (BL_ID != @target_id) misceffect FX_MAGIC_GENERIC, @args$;
+ if (BL_ID == @target_id) set @args$, strcharinfo(0);
+ set @plugh_time, (@spellpower*500)+5000, @target_id;
+ sc_start SC_FLYING_BACKPACK, @plugh_time, 0, @target_id;
+ message @args$, "Backpack : Your backpack is lifted by a mystical force; you no longer feel it pressing on your back.";
+ if (attachrid(@target_id) != 1) end;
+ addtimer @plugh_time, strnpcinfo(0)+"::OnEnd";
+ end;
+
+OnEnd:
+ if (sc_check(SC_FLYING_BACKPACK) != 1) end;
+ message strcharinfo(0), "Backpack : Your backpack is no longer levitating.";
+ misceffect FX_MAGIC_GENERIC, strcharinfo(0);
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_NATURE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "plugh"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 2;
+ set .exp_gain, 1;
+ end;
+}
diff --git a/world/map/npc/magic/level2-happy-curse.txt b/world/map/npc/magic/level2-happy-curse.txt
new file mode 100644
index 00000000..dbfea17a
--- /dev/null
+++ b/world/map/npc/magic/level2-happy-curse.txt
@@ -0,0 +1,44 @@
+-|script|happy-curse|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 13) end;
+ set .@level, getskilllv(.school);
+ if (.@level < .level) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (.@level <= 3 && countitem("GingerBreadMan") >= 1) delitem "GingerBreadMan", 1;
+ elif (.@level <= 3) end;
+ set @target_id, getcharid(3, @args$);
+ if (@target_id < 1 || !(isloggedin(@target_id)) || get(INVISIBLE, @target_id))
+ set @target_id, BL_ID; // fallback to self
+
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 1000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 13;
+ misceffect FX_MAGIC_GREEN, strcharinfo(0);
+ callfunc "magic_exp";
+
+ if (distance(BL_ID, @target_id) >= (@spellpower/100)+1) set @target_id, BL_ID;
+ if (BL_ID == @target_id) set @args$, strcharinfo(0);
+ set @joyplim_count, 1, @target_id;
+ set @joyplim_emote, if_then_else(getskilllv(SKILL_MAGIC_DARK) > 1, EMOTE_EVIL, EMOTE_HAPPY), @target_id;
+ set @joyplim_total, (@spellpower/10), @target_id;
+ if (attachrid(@target_id) != 1) end;
+ emotion @joyplim_emote, "self";
+ addtimer 500, strnpcinfo(0)+"::OnEmote";
+ end;
+
+OnEmote:
+ emotion @joyplim_emote, "self";
+ set @joyplim_count, @joyplim_count + 1;
+ if (@joyplim_count < @joyplim_total) addtimer 500, strnpcinfo(0)+"::OnEmote";
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_NATURE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "joyplim"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 2;
+ set .exp_gain, 1;
+ end;
+}
diff --git a/world/map/npc/magic/level2-hide.txt b/world/map/npc/magic/level2-hide.txt
new file mode 100644
index 00000000..ff67e6a5
--- /dev/null
+++ b/world/map/npc/magic/level2-hide.txt
@@ -0,0 +1,46 @@
+-|script|spell-hide|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 11) end;
+ set .@level, getskilllv(.school);
+ if (.@level < .level) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (.@level <= 3 && countitem("CottonCloth") >= 1) delitem "CottonCloth", 1;
+ elif (.@level <= 3) end;
+ set @target_id, getcharid(3, @args$);
+ if (@target_id < 1 || !(isloggedin(@target_id)) || get(INVISIBLE, @target_id))
+ set @target_id, BL_ID; // fallback to self
+
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 1000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 11;
+ misceffect FX_MAGIC_BLUE, strcharinfo(0);
+ callfunc "magic_exp";
+
+ if (distance(BL_ID, @target_id) >= (@spellpower/30)+2) set @target_id, BL_ID;
+ if (BL_ID == @target_id) set @args$, strcharinfo(0);
+ if (BL_ID != @target_id) misceffect FX_MAGIC_DEFAULT, @args$;
+ set .@time, (@spellpower*2500)+5000;
+ set @anwiltyp_time, .@time, @target_id;
+ sc_start SC_HIDE, .@time, 0, @target_id;
+ message @args$, "Magic : You are hidden!";
+ if (BL_ID != @target_id) message strcharinfo(0), "Magic : You hid someone!";
+ if (attachrid(@target_id) != 1) end;
+ addtimer @anwiltyp_time, strnpcinfo(0)+"::OnEnd";
+ end;
+
+OnEnd:
+ if (sc_check(SC_HIDE) != 1) end;
+ message strcharinfo(0), "Magic : You are no longer hidden.";
+ misceffect FX_MAGIC_GENERIC, strcharinfo(0);
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_ASTRAL;
+ set .invocation$, chr(MAGIC_SYMBOL) + "anwiltyp"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 2;
+ set .exp_gain, 2;
+ end;
+}
diff --git a/world/map/npc/magic/level2-lay-on-hands.txt b/world/map/npc/magic/level2-lay-on-hands.txt
new file mode 100644
index 00000000..60c2fc12
--- /dev/null
+++ b/world/map/npc/magic/level2-lay-on-hands.txt
@@ -0,0 +1,61 @@
+-|script|lay-on-hands|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 10) end;
+ if (getskilllv(.school) < .level) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (@args$ == "Mouboo" || @args$ == "mouboo") goto L_Mouboo;
+ set @target_id, getcharid(3, @args$);
+ if (@target_id < 1 || !(isloggedin(@target_id)) || get(INVISIBLE, @target_id)) end;
+ if (Hp <= get(MaxHp, @target_id) / 20) end; // hp needs to be > 1/20 * target hp
+ callfunc "adjust_spellpower";
+ if (distance(BL_ID, @target_id) >= (((sqrt(@spellpower)*12)+@spellpower)/100)+2) end;
+ if (sc_check(SC_HALT_REGENERATE,@target_id)) end;
+ if (getequipid(equip_head, @args$) == 888) end; // magic gm top hat
+ set .@needed, get(MaxHp, @target_id) - get(Hp, @target_id);
+ goto L_Pay;
+
+L_Pay:
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 500, "Magic Timer::OnClear"; // XXX should this be 0 ?
+ set Sp, Sp - 10;
+ misceffect FX_MAGIC_WHITE, strcharinfo(0); // on caster
+ misceffect FX_MAGIC_WHITE, @args$; // on target
+
+ set .@fraction, max(80, 200 - (Vit + (@spellpower/10))); // pay at least 40%
+ set .@payment, (.@needed * .@fraction) / 200;
+ set .@available, Hp - (MaxHp / 20);
+ set .@heal_value, if_then_else(.@payment < .@available, .@needed+1-1, (.@available * 200) / .@fraction); // FIXME / XXX why the f do I need to do +1-1 ?
+ if (.@payment > .@available) set .@payment, .@available;
+
+ set @inma_power, .@heal_value, @target_id;
+
+ set @mexp, min(.exp_gain, .@payment/100);
+ callfunc "gain_heal_xp";
+ callfunc "magic_exp";
+
+ set .@dark, getskilllv(SKILL_MAGIC_DARK) >= 2; // true if dark magic user
+ set .@bad, (MaxHp/20)*(0-1);
+ if (.@dark) heal .@bad, 0;
+ sc_start SC_HALT_REGENERATE, if_then_else(.@dark, 5000, 10000), 0;
+
+ if (attachrid(@target_id) != 1) end;
+ if (!(isdead())) heal @inma_power, 0;
+ end;
+
+L_Mouboo:
+ set @spell, 1;
+ callfunc "QuestMoubooHeal";
+ set .@needed, 1000;
+ goto L_Pay;
+
+OnInit:
+ set .school, SKILL_MAGIC_LIFE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "inma"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 2;
+ set .exp_gain, 1; // this is MAX possible exp
+ set .heal_xp_value_divisor, 1;
+ set .base_exp_factor, 3;
+ end;
+}
diff --git a/world/map/npc/magic/level2-lightning-strike.txt b/world/map/npc/magic/level2-lightning-strike.txt
new file mode 100644
index 00000000..cf30a627
--- /dev/null
+++ b/world/map/npc/magic/level2-lightning-strike.txt
@@ -0,0 +1,80 @@
+-|script|lightning-strike|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 20) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ set .@level, getskilllv(.school);
+ if (.@level < .level) end;
+ if (.@level <= 3 && countitem("IronPowder") >= 1) delitem "IronPowder", 1;
+ elif (.@level <= 3) end;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 1000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 20;
+ misceffect FX_MAGIC_BLACK, strcharinfo(0);
+ setarray @ingravspell[0],
+ @spellpower,
+ Luk,
+ ((@spellpower/90)+1), // charges
+ (((200 - Agi) * 3000) / 200), // delay
+ 0, // in_rain
+ 0; // target id (tmp)
+
+ callfunc "magic_exp";
+ goto L_FreeRecast;
+
+OnAttack:
+ if (target(BL_ID, @target_id, 22) != 22) goto L_FreeRecast; // 0x10 | 0x02 | 0x04
+
+ set .@p, get(.max_radius, "rain") + 1;
+ set @ingravspell[5], @target_id; // store it because foreach overwrites it
+ foreach 1, getmap(), POS_X-.@p, POS_Y-.@p, POS_X+.@p, POS_Y+.@p, strnpcinfo(0)+"::OnNpc";
+ set @target_id, @ingravspell[5]; // now restore it
+
+ set @ingravspell[2], @ingravspell[2] - 1;
+ if (@ingravspell[4] & 1) goto L_InRain;
+ void call("elt_damage", @ingravspell[0], (@ingravspell[0]/2)+1, ELT_EARTH, ELT_WIND, FX_LIGHTNING1 + rand(3));
+ goto L_FreeRecast;
+
+L_FreeRecast:
+ if (@ingravspell[2] > 0)
+ addtimer 0, strnpcinfo(0) + "::OnSetRecast";
+ end;
+
+OnSetRecast:
+ overrideattack 1, @ingravspell[3], 8, ATTACK_ICON_GENERIC, 31, strnpcinfo(0)+"::OnAttack";
+ end;
+
+OnNpc:
+ set .@name$, strnpcinfo(0,@target_id);
+ explode .@nearby$[0], .@name$, "#";
+ if (.@nearby$[0] != "rain" && .@nearby$[1] != "rain") end;
+ setarray .@l[0], getnpcx(.@name$), getnpcy(.@name$), get(.radius, @target_id); // kaflosh x, y, radius
+ setarray @ingravspell[6], .@l[0]-.@l[2], .@l[1]-.@l[2], .@l[0]+.@l[2], .@l[1]+.@l[2]; // kaflosh x1, y1, x2, y2 <= this is "area"
+ if (POS_X >= @ingravspell[6] && POS_Y >= @ingravspell[7] && POS_X <= @ingravspell[8] && POS_Y <= @ingravspell[9])
+ set @ingravspell[4], @ingravspell[4] | 1;
+ end;
+
+L_InRain:
+ set @ingravspell[10], 0;
+ foreach 0, getmap(), @ingravspell[6], @ingravspell[7], @ingravspell[8], @ingravspell[9], strnpcinfo(0)+"::OnEntityInRain";
+ if (@ingravspell[10] >= 1 && (@ingravspell[1] + rand(200)) >= 150) goto L_FreeRecast;
+ misceffect FX_LIGHTNING1 + rand(3), strcharinfo(0);
+ heal 0 - @ingravspell[0], 0;
+ goto L_FreeRecast;
+
+OnEntityInRain:
+ if (target(BL_ID, @target_id, 16) != 16) end; // 0x10
+ if (@ingravspell[1] + rand(200) <= 175) end;
+ set @ingravspell[10], @ingravspell[10] + 1;
+ void call("elt_damage", @ingravspell[0]/6, (((@ingravspell[0]/2)+1)/3)+1, ELT_EARTH, ELT_WIND, FX_LIGHTNING1 + rand(3));
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_WAR;
+ set .invocation$, chr(MAGIC_SYMBOL) + "ingrav"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 2;
+ set .exp_gain, 2;
+ end;
+}
diff --git a/world/map/npc/magic/level2-magic-knuckles.txt b/world/map/npc/magic/level2-magic-knuckles.txt
new file mode 100644
index 00000000..0984a7fd
--- /dev/null
+++ b/world/map/npc/magic/level2-magic-knuckles.txt
@@ -0,0 +1,45 @@
+-|script|magic-knuckles|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 20) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ set .@level, getskilllv(.school);
+ if (.@level < .level) 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
+ addtimer 500, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 20;
+ misceffect FX_MAGIC_BLACK, 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
+ callfunc "magic_exp";
+ goto L_FreeRecast;
+
+OnAttack:
+ 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)));
+ set @upmarmuspell[1], @upmarmuspell[1] - 1;
+ goto L_FreeRecast;
+
+L_FreeRecast:
+ if (@upmarmuspell[1] > 0)
+ addtimer 0, strnpcinfo(0) + "::OnSetRecast";
+ end;
+
+OnSetRecast:
+ overrideattack 1, @upmarmuspell[2], 1, ATTACK_ICON_GENERIC, 34, strnpcinfo(0)+"::OnAttack";
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_WAR;
+ set .invocation$, chr(MAGIC_SYMBOL) + "upmarmu"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 2;
+ set .exp_gain, 1;
+ end;
+}
diff --git a/world/map/npc/magic/level2-make-arrows.txt b/world/map/npc/magic/level2-make-arrows.txt
new file mode 100644
index 00000000..5bad035b
--- /dev/null
+++ b/world/map/npc/magic/level2-make-arrows.txt
@@ -0,0 +1,27 @@
+-|script|make-arrows|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 8) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (getskilllv(.school) < .level) end;
+ if (countitem("RawLog") < 1) end;
+ delitem "RawLog", 1;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 5000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 8;
+ misceffect FX_MAGIC_RED, strcharinfo(0);
+ setarray @create_params[0], (@spellpower/40)+1+(rand(max(1,(800-@spellpower)))/80), 500;
+ setarray @create_items$[0], "Arrow", "WarpedLog";
+ callfunc "magic_create_item";
+ callfunc "magic_exp";
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_TRANSMUTE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "kularzufrill"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 2;
+ set .exp_gain, 1;
+ end;
+}
diff --git a/world/map/npc/magic/level2-make-iron-powder.txt b/world/map/npc/magic/level2-make-iron-powder.txt
new file mode 100644
index 00000000..55bdd0b9
--- /dev/null
+++ b/world/map/npc/magic/level2-make-iron-powder.txt
@@ -0,0 +1,27 @@
+-|script|make-iron-powder|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 8) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (getskilllv(.school) < .level) end;
+ if (countitem("IronOre") < 1) end;
+ delitem "IronOre", 1;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 5000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 8;
+ misceffect FX_MAGIC_RED, strcharinfo(0);
+ setarray @create_params[0], (@spellpower/140)+1+(rand(max(1,(900-@spellpower)))/220), 700;
+ setarray @create_items$[0], "IronPowder", "IronOre";
+ callfunc "magic_create_item";
+ callfunc "magic_exp";
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_TRANSMUTE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "zukminbirf"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 2;
+ set .exp_gain, 3;
+ end;
+}
diff --git a/world/map/npc/magic/level2-make-shirt.txt b/world/map/npc/magic/level2-make-shirt.txt
new file mode 100644
index 00000000..b7a1570f
--- /dev/null
+++ b/world/map/npc/magic/level2-make-shirt.txt
@@ -0,0 +1,25 @@
+-|script|make-shirt|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 25) end;
+ if (getskilllv(.school) < .level) end;
+ if (countitem("CottonCloth") >= 5) delitem "CottonCloth", 5; else end;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 5000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 25;
+ misceffect FX_MAGIC_RED, strcharinfo(0);
+ setarray @create_params[0], 1, 425;
+ setarray @create_items$[0], "CottonShirt", "CottonCloth";
+ callfunc "magic_create_item";
+ callfunc "magic_exp";
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_TRANSMUTE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "patmuploo"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 2;
+ set .exp_gain, 2;
+ end;
+}
diff --git a/world/map/npc/magic/level2-make-short-tanktop.txt b/world/map/npc/magic/level2-make-short-tanktop.txt
new file mode 100644
index 00000000..eee48425
--- /dev/null
+++ b/world/map/npc/magic/level2-make-short-tanktop.txt
@@ -0,0 +1,25 @@
+-|script|make-short-tanktop|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 25) end;
+ if (getskilllv(.school) < .level) end;
+ if (countitem("CottonCloth") >= 3) delitem "CottonCloth", 3; else end;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 5000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 25;
+ misceffect FX_MAGIC_RED, strcharinfo(0);
+ setarray @create_params[0], 1, 250;
+ setarray @create_items$[0], "ShortTankTop", "CottonCloth";
+ callfunc "magic_create_item";
+ callfunc "magic_exp";
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_TRANSMUTE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "patviloree"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 2;
+ set .exp_gain, 2;
+ end;
+}
diff --git a/world/map/npc/magic/level2-make-tanktop.txt b/world/map/npc/magic/level2-make-tanktop.txt
new file mode 100644
index 00000000..678cf650
--- /dev/null
+++ b/world/map/npc/magic/level2-make-tanktop.txt
@@ -0,0 +1,25 @@
+-|script|make-tanktop|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 25) end;
+ if (getskilllv(.school) < .level) end;
+ if (countitem("CottonCloth") >= 4) delitem "CottonCloth", 4; else end;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 5000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 25;
+ misceffect FX_MAGIC_RED, strcharinfo(0);
+ setarray @create_params[0], 1, 350;
+ setarray @create_items$[0], "TankTop", "CottonCloth";
+ callfunc "magic_create_item";
+ callfunc "magic_exp";
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_TRANSMUTE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "patloree"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 2;
+ set .exp_gain, 2;
+ end;
+}
diff --git a/world/map/npc/magic/level2-protect.txt b/world/map/npc/magic/level2-protect.txt
new file mode 100644
index 00000000..a3096ad7
--- /dev/null
+++ b/world/map/npc/magic/level2-protect.txt
@@ -0,0 +1,51 @@
+-|script|protect|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 14) end;
+ set .@level, getskilllv(.school);
+ if (.@level < .level) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (.@level <= 3 && countitem("HardSpike") >= 1) delitem "HardSpike", 1;
+ elif (.@level <= 3) end;
+ set @target_id, getcharid(3, @args$);
+ if (@target_id < 1 || !(isloggedin(@target_id)) || get(INVISIBLE, @target_id))
+ set @target_id, BL_ID; // fallback to self
+
+ set @betsanc_caster, BL_ID, @target_id;
+ if (attachrid(@target_id) != 1) end;
+ set @target_hat, getequipid(equip_head), @betsanc_caster;
+ if (attachrid(@betsanc_caster) != 1) end;
+ if (@target_hat == 888) end; // FIXME: this whole 5 line block could be done with only one line if we modify getequipid
+
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 1500, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 14;
+ misceffect FX_MAGIC_GREEN, strcharinfo(0);
+ callfunc "magic_exp";
+
+ if (distance(BL_ID, @target_id) >= (@spellpower/30)+2) set @target_id, BL_ID;
+ if (BL_ID == @target_id) set @args$, strcharinfo(0);
+ misceffect FX_MAGIC_SHIELD, @args$;
+ set .@time, (@spellpower*1000)+5000;
+ set @betsanc_time, .@time, @target_id;
+ sc_start SC_PHYS_SHIELD, .@time, max(15,(@spellpower/20))+5, @target_id;
+ message @args$, "Shield : You feel more protected.";
+ if (attachrid(@target_id) != 1) end;
+ addtimer @betsanc_time, strnpcinfo(0)+"::OnEnd";
+ end;
+
+OnEnd:
+ if (sc_check(SC_PHYS_SHIELD) != 1) end;
+ message strcharinfo(0), "Shield : You feel less protected.";
+ misceffect FX_MAGIC_SHIELD_ENDS, strcharinfo(0);
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_NATURE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "betsanc"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 2;
+ set .exp_gain, 2;
+ end;
+}
diff --git a/world/map/npc/magic/level2-rain.txt b/world/map/npc/magic/level2-rain.txt
new file mode 100644
index 00000000..d3718170
--- /dev/null
+++ b/world/map/npc/magic/level2-rain.txt
@@ -0,0 +1,104 @@
+-|script|rain|32767
+{
+ // we can not start here because for the puppets this is OnClick
+ end;
+
+OnCast:
+ if(call("magic_checks")) end;
+ if (getskilllv(.school) < .level) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (Sp < 17) end;
+ explode .@map_ext[0], getmap(), "-";
+ if (.@map_ext[1] != 1) end; // XXX this is fugly, in the future let's use MF_OUTSIDE to detect if a map is "outside" or "inside"
+ if (getmapflag(getmap(), MF_TOWN)) end;
+ if (getskilllv(.school) < 4 && countitem("BottleOfWater") >= 1) delitem "BottleOfWater", 1;
+ elif (getskilllv(.school) < 4) end;
+ set Sp, Sp - 17;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 3000, "Magic Timer::OnClear"; // set the new debuff
+
+ callfunc "adjust_spellpower";
+ set @krad, min(.max_radius,(min(@spellpower,200)/30)+3); // kaflosh radius
+
+ set @nearby, 0;
+ foreach 1, getmap(), POS_X - .max_radius, POS_Y - .max_radius, POS_X + .max_radius, POS_Y + .max_radius,
+ strnpcinfo(0) + "::OnNearbyNpc";
+ if (@nearby) goto L_Absorb;
+
+ set @new_npc_name$, "#" + strnpcinfo(0) + "#" + getcharid(3); // make a unique puppet name for every player
+ callfunc "magic_exp";
+ misceffect FX_MAGIC_GREEN, strcharinfo(0);
+ set @spell_npc, puppet(getmap(), POS_X, POS_Y, @new_npc_name$, 127); // clone npc => get puppet id
+ set .caster, getcharid(3), @spell_npc; // tell the puppet who controls it
+ set .radius, @krad, @spell_npc; // this is also used by ingrav, don't rename
+ set .initial_x, POS_X, @spell_npc;
+ set .initial_y, POS_Y, @spell_npc;
+ set .max, @spellpower/3, @spell_npc;
+ set .max_launch, min(200,@spellpower/2)/100, @spell_npc;
+ donpcevent @new_npc_name$+"::OnLaunch"; // start
+ addnpctimer 30000, @new_npc_name$+"::OnDestroy"; // this is just a failsafe in case the npc is not properly destroyed
+ if(isin("011-1", 85, 31, 103, 45)) goto L_Pumpkins;
+ end;
+
+L_Absorb:
+ message strcharinfo(0), "##3Rain : ##BA nearby raincloud absorbs your magic.";
+ end;
+
+OnNearbyNpc:
+ explode .@nearby$[0], strnpcinfo(0,@target_id), "#";
+ if(.@nearby$[1] == "DruidTree0" || .@nearby$[1] == "DruidTree0") goto L_Tree;
+ if(.@nearby$[0] == "rain" || .@nearby$[1] == "rain")
+ set @nearby, @nearby + 1;
+ end;
+
+L_Pumpkins:
+ callfunc "HalloweenQuestWaterPumpkins";
+ end;
+
+L_Tree:
+ set .@x, get(POS_X, @target_id); set .@y, get(POS_Y, @target_id);
+ if (.@x < POS_X-@krad || .@y < POS_Y-@krad || .@x > POS_X+@krad || .@y > POS_Y+@krad) end; // in max radius but not in puppet area
+ set @flag, 1;
+ callfunc "QuestTreeTrigger";
+ close;
+
+OnLaunch:
+ if(attachrid(.caster) != 1) destroy; // destroy if caster is missing
+ if(getmap() != strnpcinfo(3)) destroy; // destroy if caster left the map
+ set .count, .count + 1;
+ if(.count > .max) destroy;
+ set .launch, 0;
+ callsub S_Launch;
+ addnpctimer 400 + rand(100), strnpcinfo(0)+"::OnLaunch"; // loop until max
+ end;
+
+S_Launch:
+ npcareawarp .initial_x - .radius, .initial_y - .radius, .initial_x + .radius, .initial_y + .radius, 0, strnpcinfo(0);
+ misceffect FX_RAIN;
+ foreach 2, strnpcinfo(3), getnpcx()-1, getnpcy()-1, getnpcx()+1, getnpcy()+1, strnpcinfo(0) + "::OnHit";
+ set .launch, .launch + 1;
+ if(.launch < .max_launch) goto S_Launch;
+ return;
+
+OnHit:
+ if(attachrid(.caster) != 1) destroy; // destroy if caster is missing
+ if(getmap() != strnpcinfo(3)) destroy; // destroy if caster left the map
+ if(target(.caster, @target_id, 16) != 16 && .caster != @target_id) end;
+ if((get(BL_TYPE, @target_id) & 1) == 0) end; // either mob or pc
+ if(get(ELTTYPE, @target_id) == ELT_FIRE)
+ injure .caster, @target_id, rand((@spellpower/15)+5)+2;
+ end;
+
+OnDestroy:
+ debugmes "kaflosh timeout! [this shouldn't happen]";
+ destroy;
+
+OnInit:
+ set .school, SKILL_MAGIC_NATURE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "kaflosh"; // used in npcs that refer to this spell
+ void call("magic_register", "OnCast");
+ set .level, 2;
+ set .exp_gain, 1;
+ set .max_radius, 15;
+ end;
+}
diff --git a/world/map/npc/magic/level2-shear.txt b/world/map/npc/magic/level2-shear.txt
new file mode 100644
index 00000000..af825727
--- /dev/null
+++ b/world/map/npc/magic/level2-shear.txt
@@ -0,0 +1,60 @@
+-|script|shear|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 23) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (getskilllv(.school) < .level) end;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 1000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 23;
+ misceffect FX_MAGIC_GREEN, strcharinfo(0);
+ setarray @chipchipspell[0],
+ @spellpower,
+ (((200 - Agi) * 2000) / 200); //delay
+ overrideattack 1, @chipchipspell[1], 1, ATTACK_ICON_SHEARING, 30, strnpcinfo(0)+"::OnAttack";
+ callfunc "magic_exp";
+ end;
+
+OnAttack:
+ if (isloggedin(@target_id)) goto L_FreeRecast; // can not shear a player
+ if (sc_check(SC_SHEARED, @target_id)) goto L_FreeRecast; // mob already sheared
+ if (target(BL_ID, @target_id, 22) != 22) goto L_FreeRecast; // 0x10 | 0x02 | 0x04
+ sc_start SC_SHEARED, 600000, 0, @target_id;
+ set .@score, rand(1000 - rand(@chipchipspell[0]));
+ set .@id, get(Class, @target_id); // get the mob ID
+
+ if (.@id == 1020 && .@score < 300) set .@item$, "WhiteFur"; // Fluffy
+ elif (.@id == 1027 && .@score < 300) set .@item$, "WhiteFur"; // EasterFluffy
+ elif (.@id == 1019 && .@score < 250) set .@item$, "HardSpike"; // SpikyMushroom
+ elif (.@id == 1028 && .@score < 175) set .@item$, "CottonCloth"; // Mouboo
+ elif (.@id == 1029 && .@score < 700) set .@item$, "MauveHerb"; // MauvePlant
+ elif (.@id == 1030 && .@score < 700) set .@item$, "CobaltHerb"; // CobaltPlant
+ elif (.@id == 1031 && .@score < 700) set .@item$, "GambogeHerb"; // GambogePlant
+ elif (.@id == 1032 && .@score < 700) set .@item$, "AlizarinHerb"; // AlizarinPlant
+ elif (.@id == 1035 && .@score < 300) set .@item$, "SilkCocoon"; // SilkWorm
+ elif (.@id == 1018 && .@score < 180) set .@item$, "PinkAntenna"; // Pinkie
+ else end;
+ makeitem .@item$, 1, getmap(), rand(POS_X - 1, POS_X + 1), rand(POS_Y - 1, POS_Y + 1);
+
+ if (.@id != 1020 && .@id != 1028 && .@id != 1018 && rand(2) != 1) end;
+ set @value, 1;
+ callfunc "QuestSagathaHappy";
+ end;
+
+L_FreeRecast:
+ addtimer 0, strnpcinfo(0) + "::OnSetRecast"; // we can't do it while already overridden, until it reaches a script terminator
+ end;
+
+OnSetRecast:
+ overrideattack 1, @chipchipspell[1], 1, ATTACK_ICON_SHEARING, 30, strnpcinfo(0)+"::OnAttack";
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_NATURE;
+ set .invocation$, chr(MAGIC_SYMBOL) + "chipchip"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 2;
+ set .exp_gain, 0;
+ end;
+}
diff --git a/world/map/npc/magic/level2-summon-fluffies.txt b/world/map/npc/magic/level2-summon-fluffies.txt
new file mode 100644
index 00000000..cd754e33
--- /dev/null
+++ b/world/map/npc/magic/level2-summon-fluffies.txt
@@ -0,0 +1,54 @@
+-|script|smfluffies|32767
+{
+ end;
+
+OnCast:
+ if(call("magic_checks")) end;
+ if (Sp < 39) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (getskilllv(.school) < .level) end;
+ if (countitem("WhiteFur") < 1 || countitem("Root") < 1) end;
+ delitem "WhiteFur", 1;
+ delitem "Root", 1;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 20000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 39;
+ misceffect FX_MAGIC_BLUE, strcharinfo(0);
+ misceffect FX_PENTAGRAM_BUILDUP, strcharinfo(0);
+ callfunc "magic_exp";
+ set .@puppet$, "#"+strnpcinfo(0)+"#"+BL_ID;
+ set .@puppet, puppet(getmap(), POS_X, POS_Y, .@puppet$, 127);
+ set .count, (@spellpower/170)+1+(@spellpower/430), .@puppet;
+ set .master, BL_ID, .@puppet;
+ set .lifetime, @spellpower*350, .@puppet;
+ addnpctimer 5000-(@spellpower*8), .@puppet$+"::OnSummon";
+ addnpctimer 6000, .@puppet$+"::OnDestroy";
+ end;
+
+OnSummon:
+ specialeffect FX_PENTAGRAM_BURST;
+ set .@i, 0;
+ set .@x, getnpcx();
+ set .@y, getnpcy();
+ set .@map$, strnpcinfo(3);
+ callsub S_SummonAll;
+ end;
+
+OnDestroy:
+ destroy;
+
+S_SummonAll:
+ summon .@map$, rand(.@x-2,.@x+2), rand(.@y-2,.@y+2), .master, 1020, 2, .lifetime;
+ set .@i, .@i + 1;
+ if (.@i < .count) goto S_SummonAll;
+ return;
+
+OnInit:
+ set .school, SKILL_MAGIC_ASTRAL;
+ set .invocation$, chr(MAGIC_SYMBOL) + "kalakarenk"; // used in npcs that refer to this spell
+ void call("magic_register", "OnCast");
+ set .level, 2;
+ set .exp_gain, 1;
+ end;
+}
diff --git a/world/map/npc/magic/level2-summon-mouboo.txt b/world/map/npc/magic/level2-summon-mouboo.txt
new file mode 100644
index 00000000..8eb074c6
--- /dev/null
+++ b/world/map/npc/magic/level2-summon-mouboo.txt
@@ -0,0 +1,54 @@
+-|script|smmouboo|32767
+{
+ end;
+
+OnCast:
+ if(call("magic_checks")) end;
+ if (Sp < 35) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (getskilllv(.school) < .level) end;
+ if (countitem("MoubooFigurine") < 1 || countitem("Root") < 1) end;
+ delitem "MoubooFigurine", 1;
+ delitem "Root", 1;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 20000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 35;
+ misceffect FX_MAGIC_BLUE, strcharinfo(0);
+ misceffect FX_PENTAGRAM_BUILDUP, strcharinfo(0);
+ callfunc "magic_exp";
+ set .@puppet$, "#"+strnpcinfo(0)+"#"+BL_ID;
+ set .@puppet, puppet(getmap(), POS_X, POS_Y, .@puppet$, 127);
+ set .count, (@spellpower/270)+1, .@puppet;
+ set .master, BL_ID, .@puppet;
+ set .lifetime, @spellpower*100, .@puppet;
+ addnpctimer 4000-(@spellpower*9), .@puppet$+"::OnSummon";
+ addnpctimer 6000, .@puppet$+"::OnDestroy";
+ end;
+
+OnSummon:
+ specialeffect FX_PENTAGRAM_BURST;
+ set .@i, 0;
+ set .@x, getnpcx();
+ set .@y, getnpcy();
+ set .@map$, strnpcinfo(3);
+ callsub S_SummonAll;
+ end;
+
+OnDestroy:
+ destroy;
+
+S_SummonAll:
+ summon .@map$, rand(.@x-2,.@x+2), rand(.@y-2,.@y+2), .master, 1028, 2, .lifetime;
+ set .@i, .@i + 1;
+ if (.@i < .count) goto S_SummonAll;
+ return;
+
+OnInit:
+ set .school, SKILL_MAGIC_ASTRAL;
+ set .invocation$, chr(MAGIC_SYMBOL) + "kalboo"; // used in npcs that refer to this spell
+ void call("magic_register", "OnCast");
+ set .level, 2;
+ set .exp_gain, 2;
+ end;
+}
diff --git a/world/map/npc/magic/level2-summon-pinkie.txt b/world/map/npc/magic/level2-summon-pinkie.txt
new file mode 100644
index 00000000..b91ec1d9
--- /dev/null
+++ b/world/map/npc/magic/level2-summon-pinkie.txt
@@ -0,0 +1,54 @@
+-|script|smpinkie|32767
+{
+ end;
+
+OnCast:
+ if(call("magic_checks")) end;
+ if (Sp < 35) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (getskilllv(.school) < .level) end;
+ if (countitem("PinkAntenna") < 1 || countitem("Root") < 1) end;
+ delitem "PinkAntenna", 1;
+ delitem "Root", 1;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 20000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 35;
+ misceffect FX_MAGIC_BLUE, strcharinfo(0);
+ misceffect FX_PENTAGRAM_BUILDUP, strcharinfo(0);
+ callfunc "magic_exp";
+ set .@puppet$, "#"+strnpcinfo(0)+"#"+BL_ID;
+ set .@puppet, puppet(getmap(), POS_X, POS_Y, .@puppet$, 127);
+ set .count, (@spellpower/120)+1, .@puppet;
+ set .master, BL_ID, .@puppet;
+ set .lifetime, @spellpower*150, .@puppet;
+ addnpctimer 5000-(@spellpower*9), .@puppet$+"::OnSummon";
+ addnpctimer 6000, .@puppet$+"::OnDestroy";
+ end;
+
+OnSummon:
+ specialeffect FX_PENTAGRAM_BURST;
+ set .@i, 0;
+ set .@x, getnpcx();
+ set .@y, getnpcy();
+ set .@map$, strnpcinfo(3);
+ callsub S_SummonAll;
+ end;
+
+OnDestroy:
+ destroy;
+
+S_SummonAll:
+ summon .@map$, rand(.@x-2,.@x+2), rand(.@y-2,.@y+2), .master, 1018, 2, .lifetime;
+ set .@i, .@i + 1;
+ if (.@i < .count) goto S_SummonAll;
+ return;
+
+OnInit:
+ set .school, SKILL_MAGIC_ASTRAL;
+ set .invocation$, chr(MAGIC_SYMBOL) + "kalgina"; // used in npcs that refer to this spell
+ void call("magic_register", "OnCast");
+ set .level, 2;
+ set .exp_gain, 2;
+ end;
+}
diff --git a/world/map/npc/magic/level2-summon-snakes.txt b/world/map/npc/magic/level2-summon-snakes.txt
new file mode 100644
index 00000000..7490c506
--- /dev/null
+++ b/world/map/npc/magic/level2-summon-snakes.txt
@@ -0,0 +1,55 @@
+-|script|summon-snakes|32767
+{
+ end;
+
+OnCast:
+ if(call("magic_checks")) end;
+ if (Sp < 40) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (getskilllv(.school) < .level) end;
+ if (countitem("DarkCrystal") < 1 || countitem("SnakeEgg") < 1) end;
+ if (OrumQuest <= 40) end;
+ delitem "DarkCrystal", 1;
+ delitem "SnakeEgg", 1;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 15000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 40;
+ misceffect FX_MAGIC_DARKRED, strcharinfo(0);
+ misceffect FX_PENTAGRAM_BUILDUP, strcharinfo(0);
+ callfunc "magic_exp";
+ set .@puppet$, "#"+strnpcinfo(0)+"#"+BL_ID;
+ set .@puppet, puppet(getmap(), POS_X, POS_Y, .@puppet$, 127);
+ set .count, (@spellpower/300)+1, .@puppet;
+ set .master, BL_ID, .@puppet;
+ set .lifetime, @spellpower*80, .@puppet;
+ addnpctimer 4000-(@spellpower*9), .@puppet$+"::OnSummon";
+ addnpctimer 6000, .@puppet$+"::OnDestroy";
+ end;
+
+OnSummon:
+ specialeffect FX_PENTAGRAM_BURST;
+ set .@i, 0;
+ set .@x, getnpcx();
+ set .@y, getnpcy();
+ set .@map$, strnpcinfo(3);
+ callsub S_SummonAll;
+ end;
+
+OnDestroy:
+ destroy;
+
+S_SummonAll:
+ summon .@map$, rand(.@x-2,.@x+2), rand(.@y-2,.@y+2), .master, 1010, 2, .lifetime;
+ set .@i, .@i + 1;
+ if (.@i < .count) goto S_SummonAll;
+ return;
+
+OnInit:
+ set .school, SKILL_MAGIC_DARK;
+ set .invocation$, chr(MAGIC_SYMBOL) + "halhiss"; // used in npcs that refer to this spell
+ void call("magic_register", "OnCast");
+ set .level, 2;
+ set .exp_gain, 3;
+ end;
+}
diff --git a/world/map/npc/magic/level2-summon-spiky-mushroom.txt b/world/map/npc/magic/level2-summon-spiky-mushroom.txt
new file mode 100644
index 00000000..39ad9ecd
--- /dev/null
+++ b/world/map/npc/magic/level2-summon-spiky-mushroom.txt
@@ -0,0 +1,54 @@
+-|script|smsmushrooms|32767
+{
+ end;
+
+OnCast:
+ if(call("magic_checks")) end;
+ if (Sp < 33) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (getskilllv(.school) < .level) end;
+ if (countitem("HardSpike") < 1 || countitem("Root") < 1) end;
+ delitem "HardSpike", 1;
+ delitem "Root", 1;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 20000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 33;
+ misceffect FX_MAGIC_BLUE, strcharinfo(0);
+ misceffect FX_PENTAGRAM_BUILDUP, strcharinfo(0);
+ callfunc "magic_exp";
+ set .@puppet$, "#"+strnpcinfo(0)+"#"+BL_ID;
+ set .@puppet, puppet(getmap(), POS_X, POS_Y, .@puppet$, 127);
+ set .count, (@spellpower/120)+1, .@puppet;
+ set .master, BL_ID, .@puppet;
+ set .lifetime, @spellpower*400, .@puppet;
+ addnpctimer 5000-(@spellpower*9), .@puppet$+"::OnSummon";
+ addnpctimer 6000, .@puppet$+"::OnDestroy";
+ end;
+
+OnSummon:
+ specialeffect FX_PENTAGRAM_BURST;
+ set .@i, 0;
+ set .@x, getnpcx();
+ set .@y, getnpcy();
+ set .@map$, strnpcinfo(3);
+ callsub S_SummonAll;
+ end;
+
+OnDestroy:
+ destroy;
+
+S_SummonAll:
+ summon .@map$, rand(.@x-2,.@x+2), rand(.@y-2,.@y+2), .master, 1019, 2, .lifetime;
+ set .@i, .@i + 1;
+ if (.@i < .count) goto S_SummonAll;
+ return;
+
+OnInit:
+ set .school, SKILL_MAGIC_ASTRAL;
+ set .invocation$, chr(MAGIC_SYMBOL) + "kalrenk"; // used in npcs that refer to this spell
+ void call("magic_register", "OnCast");
+ set .level, 2;
+ set .exp_gain, 1;
+ end;
+}
diff --git a/world/map/npc/magic/level2-summon-wickedmushroom.txt b/world/map/npc/magic/level2-summon-wickedmushroom.txt
new file mode 100644
index 00000000..df17742f
--- /dev/null
+++ b/world/map/npc/magic/level2-summon-wickedmushroom.txt
@@ -0,0 +1,55 @@
+-|script|smwmushroom|32767
+{
+ end;
+
+OnCast:
+ if(call("magic_checks")) end;
+ if (Sp < 35) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ if (getskilllv(.school) < .level) end;
+ if (countitem("DarkCrystal") < 1 || countitem("SmallMushroom") < 1) end;
+ if (OrumQuest <= 36) end;
+ delitem "DarkCrystal", 1;
+ delitem "SmallMushroom", 1;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 15000, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 35;
+ misceffect FX_MAGIC_DARKRED, strcharinfo(0);
+ misceffect FX_PENTAGRAM_BUILDUP, strcharinfo(0);
+ callfunc "magic_exp";
+ set .@puppet$, "#"+strnpcinfo(0)+"#"+BL_ID;
+ set .@puppet, puppet(getmap(), POS_X, POS_Y, .@puppet$, 127);
+ set .count, (@spellpower/250)+1, .@puppet;
+ set .master, BL_ID, .@puppet;
+ set .lifetime, @spellpower*80, .@puppet;
+ addnpctimer 4000-(@spellpower*9), .@puppet$+"::OnSummon";
+ addnpctimer 6000, .@puppet$+"::OnDestroy";
+ end;
+
+OnSummon:
+ specialeffect FX_PENTAGRAM_BURST;
+ set .@i, 0;
+ set .@x, getnpcx();
+ set .@y, getnpcy();
+ set .@map$, strnpcinfo(3);
+ callsub S_SummonAll;
+ end;
+
+OnDestroy:
+ destroy;
+
+S_SummonAll:
+ summon .@map$, rand(.@x-2,.@x+2), rand(.@y-2,.@y+2), .master, 1106, 2, .lifetime;
+ set .@i, .@i + 1;
+ if (.@i < .count) goto S_SummonAll;
+ return;
+
+OnInit:
+ set .school, SKILL_MAGIC_DARK;
+ set .invocation$, chr(MAGIC_SYMBOL) + "helorp"; // used in npcs that refer to this spell
+ void call("magic_register", "OnCast");
+ set .level, 2;
+ set .exp_gain, 3;
+ end;
+}
diff --git a/world/map/npc/magic/level2-toxic-dart.txt b/world/map/npc/magic/level2-toxic-dart.txt
new file mode 100644
index 00000000..357ae32b
--- /dev/null
+++ b/world/map/npc/magic/level2-toxic-dart.txt
@@ -0,0 +1,51 @@
+-|script|toxic-dart|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 15) end;
+ set .@level, getskilllv(.school);
+ if (.@level < .level) end;
+ if (OrumQuest <= 37) end;
+ if (.@level <= 2 && countitem("Root") >= 2) delitem "Root", 2;
+ elif (.@level <= 2) end;
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 500, "Magic Timer::OnClear"; // set the new debuff
+ callfunc "adjust_spellpower";
+ set Sp, Sp - 15;
+ misceffect FX_MAGIC_DARKRED, strcharinfo(0);
+ setarray @phlexspell[0],
+ (sqrt(@spellpower) * 5), // elt damage
+ ((BaseLevel/3) + 5), // elt damage bonus
+ (((200 - Agi) * 1200) / 200), // delay
+ ((@spellpower/75) + 3), // charges
+ (5000+(@spellpower*1200)), // poison duration
+ (max(15,@spellpower/15)+5); // poison strength
+
+ callfunc "magic_exp";
+ goto L_FreeRecast;
+
+OnAttack:
+ if (target(BL_ID, @target_id, 50) != 50) goto L_FreeRecast; // 0x20 | 0x02 | 0x10
+ misceffect FX_MAGIC_DARKRED, strcharinfo(0);
+ void call("elt_damage", @phlexspell[0], @phlexspell[1], ELT_NEUTRAL, ELT_POISON, FX_FIRE_BURST);
+ if(@target_id != BL_ID && isloggedin(@target_id)) // this is a dirty trick to check if the target is a player
+ sc_start sc_poison, @phlexspell[4], @phlexspell[5], @target_id;
+ set @phlexspell[3], @phlexspell[3] - 1;
+ goto L_FreeRecast;
+
+L_FreeRecast:
+ if (@phlexspell[3] > 0)
+ addtimer 0, strnpcinfo(0) + "::OnSetRecast";
+ end;
+
+OnSetRecast:
+ overrideattack 1, @phlexspell[2], 4, ATTACK_ICON_GENERIC, 31, strnpcinfo(0)+"::OnAttack";
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_DARK;
+ set .invocation$, chr(MAGIC_SYMBOL) + "phlex"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 2;
+ set .exp_gain, 3;
+ end;
+}
diff --git a/world/map/npc/magic/level3-necromancy.txt b/world/map/npc/magic/level3-necromancy.txt
new file mode 100644
index 00000000..57f5a6cc
--- /dev/null
+++ b/world/map/npc/magic/level3-necromancy.txt
@@ -0,0 +1,55 @@
+// see https://tmworld.uservoice.com/forums/255809-general/suggestions/6051818-sacrifice
+// author: gumi
+-|script|necromancy|32767
+{
+ if(call("magic_checks")) end;
+ if (Sp < 50) end;
+ if (getskilllv(.school) < .level) end;
+ if (getskilllv(SKILL_MAGIC) < .level) end;
+ set @target_id, getcharid(3, @args$);
+ if (@target_id < 1 || !(isloggedin(@target_id)) || get(INVISIBLE, @target_id)) end;
+ if (get(Hp, @target_id) > 0) end;
+ if (Hp < (get(MaxHp, @target_id) / 3)) end; // hp must be at least a third of the max hp of the target
+ callfunc "adjust_spellpower";
+ if (distance(BL_ID, @target_id) >= (((sqrt(@spellpower)*12)+@spellpower)/100)+2) end;
+ if (get(@necromancer, @target_id) > 0) end; // someone else is already trying to resurrect this player
+ if (getmapflag(getmap(), MF_NOSAVE)) end; // do not allow for maps like illia or candor
+ if (countitem("Soul") >= 1) delitem "Soul", 1; else end;
+
+ set @_M_BLOCK, 1; // block casting, until the timer clears it
+ addtimer 20000, "Magic Timer::OnClear";
+ set Sp, Sp - 50;
+ misceffect FX_MAGIC_DARKRED, strcharinfo(0); // on caster
+ misceffect FX_PENTAGRAM_BUILDUP, @args$; // on target
+
+ set @necromancer, CHAR_ID, @target_id; // tell the target who is reviving them
+
+ if (attachrid(@target_id) != 1) end;
+ addtimer 6000, strnpcinfo(0)+"::OnRevive"; // TODO: make it take more or less time depending on the spell power
+ end;
+
+OnRevive:
+ set .@necro, get(BL_ID, @necromancer);
+ if (.@necro < 1) goto L_Clean;
+ if (get(Hp, .@necro) < 1) end;
+ misceffect FX_PENTAGRAM_BURST, strcharinfo(0);
+ misceffect FX_CRITICAL, strcharinfo(0, .@necro);
+ heal 1, 0; // revive
+ set Hp, 1;
+ set Sp, 0;
+ set Hp, 1, .@necro;
+ set Sp, 0, .@necro;
+ goto L_Clean;
+
+L_Clean:
+ set @necromancer, 0;
+ end;
+
+OnInit:
+ set .school, SKILL_MAGIC_DARK;
+ set .invocation$, chr(MAGIC_SYMBOL) + "nevela"; // used in npcs that refer to this spell
+ void call("magic_register");
+ set .level, 3;
+ set .exp_gain, 1;
+ end;
+}
diff --git a/world/map/npc/scripts.conf b/world/map/npc/scripts.conf
index e9bceb20..0935f246 100644
--- a/world/map/npc/scripts.conf
+++ b/world/map/npc/scripts.conf
@@ -14,12 +14,9 @@ npc: npc/functions/mob_points.txt
npc: npc/functions/process_equip.txt
npc: npc/functions/slot_machine.txt
npc: npc/functions/soul_menhir.txt
-npc: npc/functions/strangerquiz.txt
npc: npc/functions/time.txt
npc: npc/functions/water_bottle.txt
npc: npc/functions/evil_obelisk.txt
-npc: npc/functions/debug.txt
-npc: npc/functions/superdebug.txt
npc: npc/functions/announcements.txt
npc: npc/functions/lockpicking.txt
npc: npc/functions/default_npc_checks.txt
@@ -32,9 +29,9 @@ npc: npc/functions/dynamic_menu.txt
npc: npc/functions/DyeConfig.txt
npc: npc/functions/motd.txt
npc: npc/functions/motdconfig.txt
+npc: npc/functions/hug.txt
// Item Functions
-npc: npc/items/magic_gm_top_hat.txt
npc: npc/items/purification_potion.txt
npc: npc/items/scissors.txt
npc: npc/items/pickled_beets.txt
@@ -50,6 +47,12 @@ npc: npc/items/mirror.txt
npc: npc/items/rubber_bat.txt
import: npc/_import.txt
+// magic
+import: npc/magic/_import.txt
+
+// GM commands
+import: npc/commands/_import.txt
+
// GM Events
npc: npc/functions/gm_island.txt
// Annuals Framework